lolita-translation 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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()})
|