lolita-translation 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +13 -1
- data/README.md +4 -4
- data/Rakefile +3 -1
- data/app/assets/javascripts/lolita/translation/application.js +1 -2
- data/lib/lolita-translation/builder/abstract_builder.rb +5 -5
- data/lib/lolita-translation/builder/active_record_builder.rb +13 -14
- data/lib/lolita-translation/configuration.rb +4 -4
- data/lib/lolita-translation/locales.rb +2 -2
- data/lib/lolita-translation/lolita/component_hooks.rb +6 -6
- data/lib/lolita-translation/record.rb +9 -9
- data/lib/lolita-translation/version.rb +2 -2
- data/lolita-translation.gemspec +2 -13
- data/spec/features/record_language_switch_spec.rb +13 -0
- data/spec/{requests → features}/record_saving_spec.rb +10 -10
- data/spec/integrations/active_record_integration_spec.rb +38 -39
- data/spec/lolita-translation/builder/abstract_builder_spec.rb +6 -14
- data/spec/lolita-translation/builder/active_record_builder_spec.rb +6 -12
- data/spec/lolita-translation/configuration_spec.rb +16 -20
- data/spec/lolita-translation/locales_spec.rb +6 -6
- data/spec/lolita-translation/lolita/tab_extension_spec.rb +2 -2
- data/spec/lolita-translation/migrator_spec.rb +11 -16
- data/spec/lolita-translation/migrators/active_record_migrator_spec.rb +7 -12
- data/spec/rails_helper.rb +2 -2
- data/spec/spec_helper.rb +9 -23
- data/spec/tasks/lolita_translation_spec.rb +5 -10
- data/spec/test_app/app/models/post.rb +1 -0
- metadata +11 -165
- data/spec/requests/record_language_switch_spec.rb +0 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fc20174ac98f712d9ee2a4f45973cc8cca9e0286
|
4
|
+
data.tar.gz: cc14813d6a22f407017347e9e4cb467368e859c2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b90088d1f9c8cbc0b7ef7e296da256847a64c39ca0132dcad28e1198fc26cb5ba6282ec22cc9e8757e8b5a89765112261a90e5a77f7cbadbd5956e293170c4e2
|
7
|
+
data.tar.gz: b1bcdf5e21767e1fb38c6d476fa9570619be40c5e47bb8829b24061753e5b6793d918bd4b10a503faac03681ef36b6eadf411e7f3931cc0de3413b2d29ee2565
|
data/Gemfile
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
-
source
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
2
3
|
gemspec
|
3
4
|
|
5
|
+
group :test do
|
6
|
+
gem 'rails', '~> 3.2.12'
|
7
|
+
gem 'rspec-rails', '~> 2.14'
|
8
|
+
gem 'ffaker', '~> 1.16.2'
|
9
|
+
gem 'capybara', '~> 2.1'
|
10
|
+
gem 'selenium-webdriver', '~> 2.33.0'
|
11
|
+
gem 'sqlite3', '~> 1.3.7'
|
12
|
+
gem 'byebug'
|
13
|
+
gem 'cover_me'
|
14
|
+
gem "coffee-rails"
|
15
|
+
end
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
gem "lolita-translation"
|
7
7
|
|
8
8
|
### Usage
|
9
|
-
|
9
|
+
|
10
10
|
1. Add `include Lolita::Translation` in your model.
|
11
11
|
2. Call `translate :title, :body` in your model and pass column names to translate.
|
12
12
|
3. Add `Article.sync_translation_table!` to your `db/seeds.rb` and run it.
|
@@ -20,7 +20,7 @@ Translations table holds only translations, but not the original data from defau
|
|
20
20
|
|
21
21
|
I18n.default_locale = :en
|
22
22
|
I18n.locale = :lv
|
23
|
-
|
23
|
+
|
24
24
|
a = Article.create :title => "Title in EN"
|
25
25
|
a.title # returns blank, because current locale is LV and there is no translation in it
|
26
26
|
#=> ""
|
@@ -29,7 +29,7 @@ Translations table holds only translations, but not the original data from defau
|
|
29
29
|
#=> "Title in EN"
|
30
30
|
a.translations.create :title => "Title in LV", :locale => 'lv'
|
31
31
|
I18n.locale = :lv
|
32
|
-
a.title
|
32
|
+
a.title
|
33
33
|
#=> "Title in LV"
|
34
34
|
|
35
35
|
When a "find" is executed and current language is not the same as default language then `:translations` are added to `:includes` to pre fetch all translations.
|
@@ -41,6 +41,6 @@ The `ModelNameTranslation` class is created for you automaticly with all validat
|
|
41
41
|
|
42
42
|
Inspired by http://github.com/dmitry/has_translations
|
43
43
|
|
44
|
-
### License
|
44
|
+
### License
|
45
45
|
|
46
46
|
Copyright © 2011 ITHouse. See LICENSE.txt for further details.
|
data/Rakefile
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
$(function(){
|
2
|
-
$(".tab-language-switch li").
|
2
|
+
$(".tab-language-switch li").on("click",function(){
|
3
3
|
$(this).parent().children("li").removeClass("active");
|
4
|
-
//$(".tab-language-switch li").removeClass("active");
|
5
4
|
$(this).addClass("active");
|
6
5
|
var locale = $(this).data("locale"),
|
7
6
|
tab_name = $(this).data("tab"),
|
@@ -43,13 +43,13 @@ module Lolita
|
|
43
43
|
def override_klass_attributes method_names
|
44
44
|
method_names.each do |method_name, attribute|
|
45
45
|
validate_attribute_method_and_attribute(method_name, attribute)
|
46
|
-
base_klass.instance_eval do
|
47
|
-
define_method(method_name) do
|
46
|
+
base_klass.instance_eval do
|
47
|
+
define_method(method_name) do
|
48
48
|
translation_record.attribute(attribute)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
-
end
|
52
|
+
end
|
53
53
|
|
54
54
|
private
|
55
55
|
|
@@ -59,7 +59,7 @@ module Lolita
|
|
59
59
|
|
60
60
|
def validate_attribute_method_and_attribute(method_name, attribute)
|
61
61
|
raise ArgumentError.new("#{method_name} is not valid attribute reader name") unless method_name
|
62
|
-
raise ArgumentError.new("#{attribute} is not valid attribute name") unless attribute
|
62
|
+
raise ArgumentError.new("#{attribute} is not valid attribute name") unless attribute
|
63
63
|
end
|
64
64
|
|
65
65
|
def implementation_warn
|
@@ -100,4 +100,4 @@ module Lolita
|
|
100
100
|
|
101
101
|
end
|
102
102
|
end
|
103
|
-
end
|
103
|
+
end
|
@@ -20,8 +20,8 @@ module Lolita
|
|
20
20
|
|
21
21
|
def override_klass_attributes(attributes)
|
22
22
|
add_ar_klass_attr_accessible(attributes + default_attributes)
|
23
|
-
expanded_attributes = attributes.inject({}){|hsh,attribute|
|
24
|
-
hsh[attribute] = attribute
|
23
|
+
expanded_attributes = attributes.inject({}){|hsh,attribute|
|
24
|
+
hsh[attribute] = attribute
|
25
25
|
hsh
|
26
26
|
}
|
27
27
|
super(expanded_attributes)
|
@@ -34,14 +34,14 @@ module Lolita
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def add_ar_klass_attr_accessible attributes
|
37
|
-
klass.class_eval do
|
37
|
+
klass.class_eval do
|
38
38
|
attr_accessible :locale, *attributes
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def add_ar_klass_associations
|
43
43
|
if self.configuration
|
44
|
-
klass.belongs_to association_name
|
44
|
+
klass.belongs_to association_name
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -50,13 +50,13 @@ module Lolita
|
|
50
50
|
ar_translation_builder = self
|
51
51
|
|
52
52
|
klass.validates(:locale,{
|
53
|
-
:presence => true,
|
53
|
+
:presence => true,
|
54
54
|
:uniqueness => {:scope => association_key},
|
55
55
|
})
|
56
56
|
klass.validates(association_name, :presence => true, :on => :update)
|
57
57
|
klass.validates_each(:locale) do |record, attr, value|
|
58
58
|
original_record = record.send(ar_translation_builder.association_name)
|
59
|
-
if original_record && original_record.original_locale.to_s == value.to_s
|
59
|
+
if original_record && original_record.original_locale.to_s == value.to_s
|
60
60
|
record.errors.add(attr, 'is used as default locale')
|
61
61
|
end
|
62
62
|
end
|
@@ -65,8 +65,8 @@ module Lolita
|
|
65
65
|
|
66
66
|
def add_ar_klass_class_methods
|
67
67
|
ar_translation_builder = self
|
68
|
-
klass.singleton_class.instance_eval do
|
69
|
-
define_method(:table_name) do
|
68
|
+
klass.singleton_class.instance_eval do
|
69
|
+
define_method(:table_name) do
|
70
70
|
ar_translation_builder.table_name
|
71
71
|
end
|
72
72
|
end
|
@@ -75,10 +75,9 @@ module Lolita
|
|
75
75
|
def call_base_klass_class_methods
|
76
76
|
if self.configuration
|
77
77
|
base_klass.has_many(translations_association_name, {
|
78
|
-
:class_name => class_name,
|
79
|
-
:foreign_key => association_key,
|
80
|
-
:dependent => :destroy
|
81
|
-
:inverse_of => association_name
|
78
|
+
:class_name => class_name,
|
79
|
+
:foreign_key => association_key,
|
80
|
+
:dependent => :destroy
|
82
81
|
})
|
83
82
|
base_klass.accepts_nested_attributes_for translations_association_name, :allow_destroy => true, :reject_if => nested_attributes_rejection_proc
|
84
83
|
base_klass.attr_accessible :translations_attributes, locale_field_name
|
@@ -94,11 +93,11 @@ module Lolita
|
|
94
93
|
def add_validations_to_base_klass
|
95
94
|
if base_klass.column_names.include?(locale_field_name.to_s)
|
96
95
|
base_klass.validates locale_field_name, :presence => true
|
97
|
-
base_klass.before_validation do
|
96
|
+
base_klass.before_validation do
|
98
97
|
def_locale = self.send(self.translations_configuration.locale_field_name)
|
99
98
|
unless def_locale
|
100
99
|
self.send(:"#{self.translations_configuration.locale_field_name}=",self.translation_record.system_current_locale)
|
101
|
-
end
|
100
|
+
end
|
102
101
|
end
|
103
102
|
end
|
104
103
|
end
|
@@ -4,7 +4,7 @@ module Lolita
|
|
4
4
|
|
5
5
|
def self.included(base)
|
6
6
|
base.extend(Lolita::Translation::ORM::ClassMethods)
|
7
|
-
base.class_eval do
|
7
|
+
base.class_eval do
|
8
8
|
include Lolita::Translation::ORM::InstanceMethods
|
9
9
|
end
|
10
10
|
end
|
@@ -30,7 +30,7 @@ module Lolita
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def locales
|
33
|
-
if options[:locales]
|
33
|
+
if options[:locales]
|
34
34
|
Lolita::Translation::Locales.new(options[:locales])
|
35
35
|
else
|
36
36
|
Lolita::Translation.locales
|
@@ -54,7 +54,7 @@ module Lolita
|
|
54
54
|
end
|
55
55
|
|
56
56
|
private
|
57
|
-
|
57
|
+
|
58
58
|
def build_translation_class
|
59
59
|
@builder = Lolita::Translation::TranslationClassBuilder.new(self.klass, self)
|
60
60
|
@translation_class = @builder.build_class
|
@@ -64,4 +64,4 @@ module Lolita
|
|
64
64
|
end
|
65
65
|
|
66
66
|
end
|
67
|
-
end
|
67
|
+
end
|
@@ -25,7 +25,7 @@ module Lolita
|
|
25
25
|
else
|
26
26
|
result.push(locale)
|
27
27
|
end
|
28
|
-
result
|
28
|
+
result
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -50,7 +50,7 @@ module Lolita
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def populate_locales!
|
53
|
-
unless @locales
|
53
|
+
unless @locales
|
54
54
|
@locales = locale_names.map do |locale_name|
|
55
55
|
Lolita::Translation::Locale.new(locale_name)
|
56
56
|
end
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
|
8
8
|
Lolita::Hooks.component(:"/lolita/configuration/tab/fields").after do
|
9
9
|
tab = self.component_locals[:tab]
|
10
|
-
if tab.translatable?
|
10
|
+
if tab.translatable?
|
11
11
|
self.render_component tab.build_translations_nested_form(self.resource)
|
12
12
|
end
|
13
13
|
end
|
@@ -16,12 +16,12 @@ Lolita::Hooks.component(:"/lolita/configuration/tab/fields").around do
|
|
16
16
|
tab = self.component_locals[:tab]
|
17
17
|
if tab.translatable?
|
18
18
|
content = nil
|
19
|
-
resource.in(resource.original_locale) do
|
19
|
+
resource.in(resource.original_locale) do
|
20
20
|
content = let_content
|
21
21
|
end
|
22
22
|
self.send(:render_component,"lolita/translation",:language_wrap, {
|
23
|
-
:tab => tab,
|
24
|
-
:content => content,
|
23
|
+
:tab => tab,
|
24
|
+
:content => content,
|
25
25
|
:active => true,
|
26
26
|
:translation_locale => resource.original_locale
|
27
27
|
})
|
@@ -34,8 +34,8 @@ Lolita::Hooks.component(:"/lolita/configuration/nested_form/fields").around do
|
|
34
34
|
tab = self.component_locals[:nested_form].parent
|
35
35
|
if tab.translatable? && current_form.object.respond_to?(:locale)
|
36
36
|
self.send(:render_component,"lolita/translation",:language_wrap, {
|
37
|
-
:tab => tab,
|
38
|
-
:content => let_content,
|
37
|
+
:tab => tab,
|
38
|
+
:content => let_content,
|
39
39
|
:active => false,
|
40
40
|
:translation_locale => current_form.object.locale
|
41
41
|
})
|
@@ -41,7 +41,7 @@ module Lolita
|
|
41
41
|
def has_translation_for?(locale)
|
42
42
|
nil
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
private
|
46
46
|
|
47
47
|
def adapter
|
@@ -80,7 +80,7 @@ module Lolita
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def locale
|
83
|
-
if has_locale_column?
|
83
|
+
if has_locale_column?
|
84
84
|
if value = orm_record.attributes[locale_field] and value.to_s.size > 0
|
85
85
|
value
|
86
86
|
else
|
@@ -88,7 +88,7 @@ module Lolita
|
|
88
88
|
end
|
89
89
|
else
|
90
90
|
system_default_locale
|
91
|
-
end
|
91
|
+
end
|
92
92
|
end
|
93
93
|
|
94
94
|
def attribute(name)
|
@@ -128,14 +128,14 @@ module Lolita
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def find_translation_by_locale given_locale
|
131
|
-
translations.detect{|translation|
|
131
|
+
translations.detect{|translation|
|
132
132
|
translation.locale.to_s == given_locale.to_s
|
133
133
|
}
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
137
|
class MongoidRecord < AbstractRecord
|
138
|
-
|
138
|
+
|
139
139
|
end
|
140
140
|
|
141
141
|
attr_reader :original_record, :default_locale, :orm_wrapper
|
@@ -158,7 +158,7 @@ module Lolita
|
|
158
158
|
|
159
159
|
def build_nested_translations
|
160
160
|
available_locales.each do |locale|
|
161
|
-
unless self.default_locale.to_s == locale.to_s
|
161
|
+
unless self.default_locale.to_s == locale.to_s
|
162
162
|
attributes = { :locale => locale.to_s }
|
163
163
|
original_record.translations.build(attributes) unless orm_wrapper.has_translation_for?(locale)
|
164
164
|
end
|
@@ -167,7 +167,7 @@ module Lolita
|
|
167
167
|
|
168
168
|
def default_locale=(value)
|
169
169
|
@orm_wrapper.default_locale = value
|
170
|
-
end
|
170
|
+
end
|
171
171
|
|
172
172
|
def in(locale)
|
173
173
|
old_locale = @record_current_locale
|
@@ -181,7 +181,7 @@ module Lolita
|
|
181
181
|
def system_current_locale
|
182
182
|
::I18n.locale
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
private
|
186
186
|
|
187
187
|
def available_locales
|
@@ -199,7 +199,7 @@ module Lolita
|
|
199
199
|
MongoidRecord.new(original_record,@configuration)
|
200
200
|
else
|
201
201
|
AbstractRecord.new(original_record,@configuration)
|
202
|
-
end
|
202
|
+
end
|
203
203
|
end
|
204
204
|
|
205
205
|
def is_mongoid_record?
|
data/lolita-translation.gemspec
CHANGED
@@ -18,19 +18,8 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.licenses = ["MIT"]
|
20
20
|
|
21
|
-
s.add_runtime_dependency(%q<lolita>, ["~> 3.2
|
22
|
-
|
23
|
-
s.add_development_dependency(%q<rails>, ["~> 3.2.3"])
|
24
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.9.0"])
|
25
|
-
s.add_development_dependency(%q<rspec-rails>, ["~> 2.9.0"])
|
26
|
-
s.add_development_dependency(%q<ffaker>, ["~> 1"])
|
27
|
-
s.add_development_dependency(%q<capybara>, ["~> 1.1.2"])
|
28
|
-
s.add_development_dependency(%q<capybara-webkit>, ["~> 0.11.0"])
|
29
|
-
s.add_development_dependency(%q<cover_me>, ["~> 1.2.0"])
|
30
|
-
s.add_development_dependency(%q<sqlite3>, ["~> 1.3.6"])
|
31
|
-
s.add_development_dependency(%q<debugger>,[">0"])
|
32
|
-
|
21
|
+
s.add_runtime_dependency(%q<lolita>, ["~> 3.2"])
|
33
22
|
s.files = `git ls-files`.split("\n")
|
34
|
-
s.test_files = `git ls-files -- {
|
23
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
35
24
|
s.require_paths = ["lib"]
|
36
25
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature "In order to translate resource As system user I want to switch from original resource to translations" do
|
4
|
+
|
5
|
+
scenario "As user in resource create form I see language switch and current language is active and I can switch to other languages" do
|
6
|
+
visit "/lolita/posts/new"
|
7
|
+
language_selector_text = page.find(".tab-language-switch").text
|
8
|
+
::I18n.available_locales.each do |locale|
|
9
|
+
language_selector_text.should match(/#{locale.to_s.capitalize}/)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
feature "In order to internationalize all content I can enter information in any language and translate to any other language", js: true do
|
4
|
+
|
5
5
|
def click_save_btn
|
6
6
|
save_btn = page.find("button[data-type='save&close']")
|
7
7
|
save_btn.click
|
@@ -12,7 +12,7 @@ describe "In order to internationalize all content I can enter information in an
|
|
12
12
|
Category.create!(default_options.merge(options))
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
scenario "As user I can enter information in same language as system uses and resource will be stored in that language" do
|
16
16
|
visit "/lolita/posts/new"
|
17
17
|
fill_in "post_title", :with => "lv-title"
|
18
18
|
fill_in "post_body", :with => "lv-body"
|
@@ -21,7 +21,7 @@ describe "In order to internationalize all content I can enter information in an
|
|
21
21
|
page.should have_content("lv-body")
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
scenario "As user I can enter information in language that I am using currently and original resource will be save in that language" do
|
25
25
|
visit "/lolita/posts/new?locale=ru"
|
26
26
|
fill_in "post_title", :with => "ru-title"
|
27
27
|
fill_in "post_body", :with => "ru-body"
|
@@ -31,8 +31,8 @@ describe "In order to internationalize all content I can enter information in an
|
|
31
31
|
page.should have_content("ru-body")
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
I18n.locale = :ru
|
34
|
+
scenario "As user I can open previously saved resource, in different language than mine, and resource will be shown in resource original language and I will see that" do
|
35
|
+
I18n.locale = :ru
|
36
36
|
category = create_category(:name => "ru-name")
|
37
37
|
visit("/lolita/categories/#{category.id}/edit?locale=lv")
|
38
38
|
page.should have_selector(".tab-language-switch li.active", :text => "Ru")
|
@@ -40,8 +40,8 @@ describe "In order to internationalize all content I can enter information in an
|
|
40
40
|
ru_content.should be_visible
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
I18n.locale = :ru
|
43
|
+
scenario "As user I can open previously saved resource, in different language than mine, and change original information and that information will be save in original resource" do
|
44
|
+
I18n.locale = :ru
|
45
45
|
category = create_category(:name => "ru-name")
|
46
46
|
visit("/lolita/categories/#{category.id}/edit?locale=lv")
|
47
47
|
page.fill_in "category_name", :with => "changed-ru-name"
|
@@ -51,9 +51,9 @@ describe "In order to internationalize all content I can enter information in an
|
|
51
51
|
name_inp.value.should eq("changed-ru-name")
|
52
52
|
end
|
53
53
|
|
54
|
-
|
54
|
+
scenario "As user I can open previously saved resource, in different language than mine, and change information for my language, and it will be saved as translation", :js => true do
|
55
55
|
pending "test gives time, should check why not error but timeout"
|
56
|
-
# I18n.locale = :ru
|
56
|
+
# I18n.locale = :ru
|
57
57
|
# category = create_category(:name => "ru-name")
|
58
58
|
# visit("/lolita/categories/#{category.id}/edit?locale=lv")
|
59
59
|
# page.execute_script(%Q{$(".tab-language-switch li[data-locale='lv']").click()})
|