globalize2 0.1.0 → 0.2.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.
- data/.gitignore +2 -1
- data/README.textile +27 -143
- data/VERSION +1 -1
- data/generators/templates/db_backend_migration.rb +3 -3
- data/globalize2.gemspec +30 -49
- data/init.rb +1 -8
- data/lib/globalize.rb +15 -0
- data/lib/globalize/active_record.rb +195 -0
- data/lib/globalize/active_record/adapter.rb +80 -0
- data/lib/globalize/active_record/attributes.rb +25 -0
- data/lib/globalize/active_record/migration.rb +40 -0
- data/lib/{globalize/i18n → i18n}/missing_translations_log_handler.rb +8 -8
- data/lib/{globalize/i18n → i18n}/missing_translations_raise_handler.rb +3 -5
- data/test/active_record/fallbacks_test.rb +102 -0
- data/test/{model/active_record → active_record}/migration_test.rb +21 -26
- data/test/{model/active_record → active_record}/sti_translated_test.rb +4 -30
- data/test/active_record/translates_test.rb +87 -0
- data/test/active_record/translation_class_test.rb +30 -0
- data/test/active_record/validation_tests.rb +75 -0
- data/test/active_record_test.rb +451 -0
- data/test/data/models.rb +16 -0
- data/test/data/schema.rb +23 -7
- data/test/i18n/missing_translations_test.rb +6 -6
- data/test/test_helper.rb +55 -15
- metadata +33 -46
- data/lib/globalize/backend/chain.rb +0 -102
- data/lib/globalize/backend/pluralizing.rb +0 -37
- data/lib/globalize/backend/static.rb +0 -61
- data/lib/globalize/load_path.rb +0 -63
- data/lib/globalize/locale/fallbacks.rb +0 -63
- data/lib/globalize/locale/language_tag.rb +0 -81
- data/lib/globalize/model/active_record.rb +0 -56
- data/lib/globalize/model/active_record/adapter.rb +0 -100
- data/lib/globalize/model/active_record/translated.rb +0 -174
- data/lib/globalize/translation.rb +0 -32
- data/lib/locale/root.yml +0 -3
- data/lib/rails_edge_load_path_patch.rb +0 -40
- data/notes.textile +0 -51
- data/test/backends/chained_test.rb +0 -175
- data/test/backends/pluralizing_test.rb +0 -63
- data/test/backends/static_test.rb +0 -147
- data/test/data/locale/all.yml +0 -2
- data/test/data/locale/de-DE.yml +0 -2
- data/test/data/locale/en-US.yml +0 -2
- data/test/data/locale/en-US/module.yml +0 -2
- data/test/data/locale/fi-FI/module.yml +0 -2
- data/test/data/locale/root.yml +0 -0
- data/test/load_path_test.rb +0 -49
- data/test/locale/fallbacks_test.rb +0 -154
- data/test/locale/language_tag_test.rb +0 -130
- data/test/model/active_record/translated_test.rb +0 -487
- data/test/translation_test.rb +0 -54
data/test/data/locale/all.yml
DELETED
data/test/data/locale/de-DE.yml
DELETED
data/test/data/locale/en-US.yml
DELETED
data/test/data/locale/root.yml
DELETED
File without changes
|
data/test/load_path_test.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), 'test_helper' )
|
2
|
-
require 'globalize/load_path'
|
3
|
-
|
4
|
-
class LoadPathTest < ActiveSupport::TestCase
|
5
|
-
def setup
|
6
|
-
@plugin_dir = "#{File.dirname(__FILE__)}/.."
|
7
|
-
@locale_dir = "#{File.dirname(__FILE__)}/data/locale"
|
8
|
-
@load_path = Globalize::LoadPath.new
|
9
|
-
end
|
10
|
-
|
11
|
-
test "returns glob patterns for all locales and ruby + yaml files by default" do
|
12
|
-
patterns = %w(locales/all.rb
|
13
|
-
locales/*.rb
|
14
|
-
locales/*/**/*.rb
|
15
|
-
locales/all.yml
|
16
|
-
locales/*.yml
|
17
|
-
locales/*/**/*.yml)
|
18
|
-
assert_equal patterns, @load_path.send(:patterns, 'locales')
|
19
|
-
end
|
20
|
-
|
21
|
-
test "returns the glob patterns for registered locales and extensions" do
|
22
|
-
@load_path.locales = [:en, :de]
|
23
|
-
@load_path.extensions = [:sql]
|
24
|
-
patterns = %w(locales/all.sql
|
25
|
-
locales/en.sql
|
26
|
-
locales/en/**/*.sql
|
27
|
-
locales/de.sql
|
28
|
-
locales/de/**/*.sql)
|
29
|
-
assert_equal patterns, @load_path.send(:patterns, 'locales')
|
30
|
-
end
|
31
|
-
|
32
|
-
test "expands paths using yml as a default file extension" do
|
33
|
-
@load_path << @locale_dir
|
34
|
-
expected = %w(all.yml de-DE.yml en-US.yml en-US/module.yml fi-FI/module.yml root.yml)
|
35
|
-
assert_equal expected, @load_path.map{|path| path.sub("#{@locale_dir}\/", '')}
|
36
|
-
end
|
37
|
-
|
38
|
-
test "appends new paths to the collection so earlier collected paths preceed later collected ones" do
|
39
|
-
@load_path.locales = [:root]
|
40
|
-
@load_path << "#{@plugin_dir}/lib/locale"
|
41
|
-
@load_path << @locale_dir
|
42
|
-
|
43
|
-
expected = %W(#{@plugin_dir}/lib/locale/root.yml
|
44
|
-
#{@locale_dir}/all.yml
|
45
|
-
#{@locale_dir}/root.yml)
|
46
|
-
assert_equal expected, @load_path
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
@@ -1,154 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), '..', 'test_helper' )
|
2
|
-
require 'globalize/locale/fallbacks'
|
3
|
-
|
4
|
-
include Globalize::Locale
|
5
|
-
I18n.default_locale = :'en-US' # This has to be set explicitly, no longer default for I18n
|
6
|
-
|
7
|
-
class FallbacksTest < ActiveSupport::TestCase
|
8
|
-
def setup
|
9
|
-
I18n.fallbacks = Fallbacks.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def teardown
|
13
|
-
I18n.default_locale = :'en-US'
|
14
|
-
end
|
15
|
-
|
16
|
-
test "#[] caches computed results" do
|
17
|
-
I18n.fallbacks['en']
|
18
|
-
assert_equal( { :en => [:en, :"en-US", :root] }, I18n.fallbacks )
|
19
|
-
end
|
20
|
-
|
21
|
-
test "#defaults always reflect the I18n.default_locale if no default has been set manually" do
|
22
|
-
I18n.default_locale = :'en-US'
|
23
|
-
assert_equal( [:'en-US', :en, :root], I18n.fallbacks.defaults )
|
24
|
-
end
|
25
|
-
|
26
|
-
test "#defaults always reflect a manually passed default locale if any" do
|
27
|
-
I18n.fallbacks = Fallbacks.new(:'fi-FI')
|
28
|
-
assert_equal( [:'fi-FI', :fi, :root], I18n.fallbacks.defaults )
|
29
|
-
I18n.default_locale = :'de-DE'
|
30
|
-
assert_equal( [:'fi-FI', :fi, :root], I18n.fallbacks.defaults )
|
31
|
-
end
|
32
|
-
|
33
|
-
test "#defaults allows to set multiple defaults" do
|
34
|
-
I18n.fallbacks = Fallbacks.new(:'fi-FI', :'se-FI')
|
35
|
-
assert_equal( [:'fi-FI', :fi, :'se-FI', :se, :root], I18n.fallbacks.defaults )
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class NoMappingFallbacksTest < ActiveSupport::TestCase
|
40
|
-
def setup
|
41
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
42
|
-
end
|
43
|
-
|
44
|
-
test "returns [:es, :en-US, :root] for :es" do
|
45
|
-
assert_equal [:es, :"en-US", :en, :root], @fallbacks[:es]
|
46
|
-
end
|
47
|
-
|
48
|
-
test "returns [:es-ES, :es, :en-US, :root] for :es-ES" do
|
49
|
-
assert_equal [:"es-ES", :es, :"en-US", :en, :root], @fallbacks[:"es-ES"]
|
50
|
-
end
|
51
|
-
|
52
|
-
test "returns [:es-MX, :es, :en-US, :root] for :es-MX" do
|
53
|
-
assert_equal [:"es-MX", :es, :"en-US", :en, :root], @fallbacks[:"es-MX"]
|
54
|
-
end
|
55
|
-
|
56
|
-
test "returns [:es-Latn-ES, :es-Latn, :es, :en-US, :root] for :es-Latn-ES" do
|
57
|
-
assert_equal [:"es-Latn-ES", :"es-Latn", :es, :"en-US", :en, :root], @fallbacks[:'es-Latn-ES']
|
58
|
-
end
|
59
|
-
|
60
|
-
test "returns [:en, :en-US, :root] for :en" do
|
61
|
-
assert_equal [:en, :"en-US", :root], @fallbacks[:en]
|
62
|
-
end
|
63
|
-
|
64
|
-
test "returns [:en-US, :en, :root] for :en-US (special case: locale == default)" do
|
65
|
-
assert_equal [:"en-US", :en, :root], @fallbacks[:"en-US"]
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
class CaMappingFallbacksTest < ActiveSupport::TestCase
|
70
|
-
# Most people who speak Catalan also live in Spain, so test is safe to assume
|
71
|
-
# that they also speak Spanish as spoken in Spain.
|
72
|
-
def setup
|
73
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
74
|
-
@fallbacks.map :ca => :"es-ES"
|
75
|
-
end
|
76
|
-
|
77
|
-
test "returns [:ca, :es-ES, :es, :en-US, :root] for :ca" do
|
78
|
-
assert_equal [:ca, :"es-ES", :es, :"en-US", :en, :root], @fallbacks[:ca]
|
79
|
-
end
|
80
|
-
|
81
|
-
test "returns [:ca-ES, :ca, :es-ES, :es, :en-US, :root] for :ca-ES" do
|
82
|
-
assert_equal [:"ca-ES", :ca, :"es-ES", :es, :"en-US", :en, :root], @fallbacks[:"ca-ES"]
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
class ArMappingFallbacksTest < ActiveSupport::TestCase
|
87
|
-
# People who speak Arabic as spoken in Palestine often times also speak
|
88
|
-
# Hebrew as spoken in Israel. However test is in no way safe to assume that
|
89
|
-
# everybody who speaks Arabic also speaks Hebrew.
|
90
|
-
def setup
|
91
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
92
|
-
@fallbacks.map :"ar-PS" => :"he-IL"
|
93
|
-
end
|
94
|
-
|
95
|
-
test "returns [:ar, :en-US, :root] for :ar" do
|
96
|
-
assert_equal [:ar, :"en-US", :en, :root], @fallbacks[:ar]
|
97
|
-
end
|
98
|
-
|
99
|
-
test "returns [:ar-EG, :ar, :en-US, :root] for :ar-EG" do
|
100
|
-
assert_equal [:"ar-EG", :ar, :"en-US", :en, :root], @fallbacks[:"ar-EG"]
|
101
|
-
end
|
102
|
-
|
103
|
-
test "returns [:ar-PS, :ar, :he-IL, :he, :en-US, :root] for :ar-PS" do
|
104
|
-
assert_equal [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en, :root], @fallbacks[:"ar-PS"]
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
class SmsMappingFallbacksTest < ActiveSupport::TestCase
|
109
|
-
# Sami people live in several scandinavian countries. In Finnland many people
|
110
|
-
# know Swedish and Finnish. Thus, test can be assumed that Sami living in
|
111
|
-
# Finnland also speak Swedish and Finnish.
|
112
|
-
def setup
|
113
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
114
|
-
@fallbacks.map :sms => [:"se-FI", :"fi-FI"]
|
115
|
-
end
|
116
|
-
|
117
|
-
test "returns [:sms-FI, :sms, :se-FI, :se, :fi-FI, :fi, :en-US, :root] for :sms-FI" do
|
118
|
-
assert_equal [:"sms-FI", :sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en, :root], @fallbacks[:"sms-FI"]
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
class DeAtMappingFallbacksTest < ActiveSupport::TestCase
|
123
|
-
def setup
|
124
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
125
|
-
@fallbacks.map :"de-AT" => :"de-DE"
|
126
|
-
end
|
127
|
-
|
128
|
-
test "returns [:de, :en-US, :root] for de" do
|
129
|
-
assert_equal [:de, :"en-US", :en, :root], @fallbacks[:"de"]
|
130
|
-
end
|
131
|
-
|
132
|
-
test "returns [:de-DE, :de, :en-US, :root] for de-DE" do
|
133
|
-
assert_equal [:"de-DE", :de, :"en-US", :en, :root], @fallbacks[:"de-DE"]
|
134
|
-
end
|
135
|
-
|
136
|
-
test "returns [:de-AT, :de, :de-DE, :en-US, :root] for de-AT" do
|
137
|
-
assert_equal [:"de-AT", :de, :"de-DE", :"en-US", :en, :root], @fallbacks[:"de-AT"]
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
class DeMappingFallbacksTest < ActiveSupport::TestCase
|
142
|
-
def setup
|
143
|
-
@fallbacks = Fallbacks.new(:'en-US')
|
144
|
-
@fallbacks.map :de => :en, :he => :en
|
145
|
-
end
|
146
|
-
|
147
|
-
test "returns [:de, :en, :root] for :de" do
|
148
|
-
assert_equal [:de, :en, :"en-US", :root], @fallbacks[:de]
|
149
|
-
end
|
150
|
-
|
151
|
-
test "returns [:he, :en, :root] for :de" do
|
152
|
-
assert_equal [:he, :en, :"en-US", :root], @fallbacks[:he]
|
153
|
-
end
|
154
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), '..', 'test_helper' )
|
2
|
-
require 'globalize/locale/language_tag'
|
3
|
-
|
4
|
-
include Globalize::Locale
|
5
|
-
|
6
|
-
class LanguageTagTest < ActiveSupport::TestCase
|
7
|
-
test "given a valid tag 'de' returns an LanguageTag from #tag" do
|
8
|
-
assert_instance_of LanguageTag, LanguageTag.tag('de')
|
9
|
-
end
|
10
|
-
|
11
|
-
test "given a valid tag 'de' returns an array of subtags" do
|
12
|
-
assert_equal ['de', nil, nil, nil, nil, nil, nil], LanguageTag::SimpleParser.match('de')
|
13
|
-
end
|
14
|
-
|
15
|
-
test "given a valid tag 'de-DE' returns an array of subtags" do
|
16
|
-
assert_equal ['de', nil, 'DE', nil, nil, nil, nil], LanguageTag::SimpleParser.match('de-DE')
|
17
|
-
end
|
18
|
-
|
19
|
-
test "given a valid lowercase tag 'de-latn-de-variant-x-phonebk' returns an array of subtags" do
|
20
|
-
assert_equal ['de', 'latn', 'de', 'variant', nil, 'x-phonebk', nil],
|
21
|
-
LanguageTag::SimpleParser.match('de-latn-de-variant-x-phonebk')
|
22
|
-
end
|
23
|
-
|
24
|
-
test "given a valid uppercase tag 'DE-LATN-DE-VARIANT-X-PHONEBK' returns an array of subtags" do
|
25
|
-
assert_equal ['DE', 'LATN', 'DE', 'VARIANT', nil, 'X-PHONEBK', nil],
|
26
|
-
LanguageTag::SimpleParser.match('DE-LATN-DE-VARIANT-X-PHONEBK')
|
27
|
-
end
|
28
|
-
|
29
|
-
test "given an invalid tag 'a-DE' test returns false" do
|
30
|
-
assert !LanguageTag::SimpleParser.match('a-DE')
|
31
|
-
end
|
32
|
-
|
33
|
-
test "given an invalid tag 'de-419-DE' test returns false" do
|
34
|
-
assert !LanguageTag::SimpleParser.match('de-419-DE')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class DeLatnLanguageTagTest < ActiveSupport::TestCase
|
39
|
-
def setup
|
40
|
-
subtags = %w(de Latn DE variant a-ext x-phonebk i-klingon)
|
41
|
-
@tag = LanguageTag.new *subtags
|
42
|
-
end
|
43
|
-
|
44
|
-
test "returns 'de' as the language subtag in lowercase" do
|
45
|
-
assert_equal 'de', @tag.language
|
46
|
-
end
|
47
|
-
|
48
|
-
test "returns 'Latn' as the script subtag in titlecase" do
|
49
|
-
assert_equal 'Latn', @tag.script
|
50
|
-
end
|
51
|
-
|
52
|
-
test "returns 'DE' as the region subtag in uppercase" do
|
53
|
-
assert_equal 'DE', @tag.region
|
54
|
-
end
|
55
|
-
|
56
|
-
test "returns 'variant' as the variant subtag in lowercase" do
|
57
|
-
assert_equal 'variant', @tag.variant
|
58
|
-
end
|
59
|
-
|
60
|
-
test "returns 'a-ext' as the extension subtag" do
|
61
|
-
assert_equal 'a-ext', @tag.extension
|
62
|
-
end
|
63
|
-
|
64
|
-
test "returns 'x-phonebk' as the privateuse subtag" do
|
65
|
-
assert_equal 'x-phonebk', @tag.privateuse
|
66
|
-
end
|
67
|
-
|
68
|
-
test "returns 'i-klingon' as the grandfathered subtag" do
|
69
|
-
assert_equal 'i-klingon', @tag.grandfathered
|
70
|
-
end
|
71
|
-
|
72
|
-
test "returns a formatted tag string from #to_s" do
|
73
|
-
assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon', @tag.to_s
|
74
|
-
end
|
75
|
-
|
76
|
-
test "returns an array containing the formatted subtags from #to_a" do
|
77
|
-
assert_equal %w(de Latn DE variant a-ext x-phonebk i-klingon), @tag.to_a
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class InheritanceLanguageTagTest < ActiveSupport::TestCase
|
82
|
-
test "returns 'de-Latn-DE-variant-a-ext-x-phonebk' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do
|
83
|
-
tag = LanguageTag.new *%w(de Latn DE variant a-ext x-phonebk i-klingon)
|
84
|
-
assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk', tag.parent.to_s
|
85
|
-
end
|
86
|
-
|
87
|
-
test "returns 'de-Latn-DE-variant-a-ext' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk'" do
|
88
|
-
tag = LanguageTag.new *%w(de Latn DE variant a-ext x-phonebk)
|
89
|
-
assert_equal 'de-Latn-DE-variant-a-ext', tag.parent.to_s
|
90
|
-
end
|
91
|
-
|
92
|
-
test "returns 'de-Latn-DE-variant' as the parent of 'de-Latn-DE-variant-a-ext'" do
|
93
|
-
tag = LanguageTag.new *%w(de Latn DE variant a-ext)
|
94
|
-
assert_equal 'de-Latn-DE-variant', tag.parent.to_s
|
95
|
-
end
|
96
|
-
|
97
|
-
test "returns 'de-Latn-DE' as the parent of 'de-Latn-DE-variant'" do
|
98
|
-
tag = LanguageTag.new *%w(de Latn DE variant)
|
99
|
-
assert_equal 'de-Latn-DE', tag.parent.to_s
|
100
|
-
end
|
101
|
-
|
102
|
-
test "returns 'de-Latn' as the parent of 'de-Latn-DE'" do
|
103
|
-
tag = LanguageTag.new *%w(de Latn DE)
|
104
|
-
assert_equal 'de-Latn', tag.parent.to_s
|
105
|
-
end
|
106
|
-
|
107
|
-
test "returns 'de' as the parent of 'de-Latn'" do
|
108
|
-
tag = LanguageTag.new *%w(de Latn)
|
109
|
-
assert_equal 'de', tag.parent.to_s
|
110
|
-
end
|
111
|
-
|
112
|
-
# TODO RFC4647 says: "If no language tag matches the request, the "default" value is returned."
|
113
|
-
# where should we set the default language?
|
114
|
-
# test "returns '' as the parent of 'de'" do
|
115
|
-
# tag = LanguageTag.new *%w(de)
|
116
|
-
# assert_equal '', tag.parent.to_s
|
117
|
-
# end
|
118
|
-
|
119
|
-
test "returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do
|
120
|
-
parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon
|
121
|
-
de-Latn-DE-variant-a-ext-x-phonebk
|
122
|
-
de-Latn-DE-variant-a-ext
|
123
|
-
de-Latn-DE-variant
|
124
|
-
de-Latn-DE
|
125
|
-
de-Latn
|
126
|
-
de)
|
127
|
-
tag = LanguageTag.new *%w(de Latn DE variant a-ext x-phonebk i-klingon)
|
128
|
-
assert_equal parents, tag.parents.map{|tag| tag.to_s}
|
129
|
-
end
|
130
|
-
end
|
@@ -1,487 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), '..', '..', 'test_helper' )
|
2
|
-
require 'active_record'
|
3
|
-
require 'globalize/model/active_record'
|
4
|
-
|
5
|
-
# Hook up model translation
|
6
|
-
ActiveRecord::Base.send(:include, Globalize::Model::ActiveRecord::Translated)
|
7
|
-
|
8
|
-
# Load Post model
|
9
|
-
require File.join( File.dirname(__FILE__), '..', '..', 'data', 'models' )
|
10
|
-
|
11
|
-
class TranslatedTest < ActiveSupport::TestCase
|
12
|
-
def setup
|
13
|
-
I18n.locale = :'en-US'
|
14
|
-
I18n.fallbacks.clear
|
15
|
-
reset_db! File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'schema.rb'))
|
16
|
-
ActiveRecord::Base.locale = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
def teardown
|
20
|
-
I18n.fallbacks.clear
|
21
|
-
end
|
22
|
-
|
23
|
-
test "modifiying translated fields" do
|
24
|
-
post = Post.create :subject => 'foo'
|
25
|
-
assert_equal 'foo', post.subject
|
26
|
-
post.subject = 'bar'
|
27
|
-
assert_equal 'bar', post.subject
|
28
|
-
end
|
29
|
-
|
30
|
-
test "modifiying translated fields while switching locales" do
|
31
|
-
post = Post.create :subject => 'foo'
|
32
|
-
assert_equal 'foo', post.subject
|
33
|
-
I18n.locale = :'de-DE'
|
34
|
-
post.subject = 'bar'
|
35
|
-
assert_equal 'bar', post.subject
|
36
|
-
I18n.locale = :'en-US'
|
37
|
-
assert_equal 'foo', post.subject
|
38
|
-
I18n.locale = :'de-DE'
|
39
|
-
post.subject = 'bar'
|
40
|
-
end
|
41
|
-
|
42
|
-
test "has post_translations" do
|
43
|
-
post = Post.create
|
44
|
-
assert_nothing_raised { post.globalize_translations }
|
45
|
-
end
|
46
|
-
|
47
|
-
test "has German post_translations" do
|
48
|
-
I18n.locale = :de
|
49
|
-
post = Post.create :subject => 'foo'
|
50
|
-
assert_equal 1, post.globalize_translations.size
|
51
|
-
I18n.locale = :en
|
52
|
-
assert_equal 1, post.globalize_translations.size
|
53
|
-
end
|
54
|
-
|
55
|
-
test "returns the value passed to :subject" do
|
56
|
-
post = Post.new
|
57
|
-
assert_equal 'foo', (post.subject = 'foo')
|
58
|
-
end
|
59
|
-
|
60
|
-
test "translates subject and content into en-US" do
|
61
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
62
|
-
assert_equal 'foo', post.subject
|
63
|
-
assert_equal 'bar', post.content
|
64
|
-
assert post.save
|
65
|
-
post.reload
|
66
|
-
assert_equal 'foo', post.subject
|
67
|
-
assert_equal 'bar', post.content
|
68
|
-
end
|
69
|
-
|
70
|
-
test "finds a German post" do
|
71
|
-
post = Post.create :subject => 'foo (en)', :content => 'bar'
|
72
|
-
I18n.locale = 'de-DE'
|
73
|
-
post = Post.first
|
74
|
-
post.subject = 'baz (de)'
|
75
|
-
post.save
|
76
|
-
assert_equal 'baz (de)', Post.first.subject
|
77
|
-
I18n.locale = :'en-US'
|
78
|
-
assert_equal 'foo (en)', Post.first.subject
|
79
|
-
end
|
80
|
-
|
81
|
-
test "saves an English post and loads test correctly" do
|
82
|
-
assert_nil Post.first
|
83
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
84
|
-
assert post.save
|
85
|
-
post = Post.first
|
86
|
-
assert_equal 'foo', post.subject
|
87
|
-
assert_equal 'bar', post.content
|
88
|
-
end
|
89
|
-
|
90
|
-
test "updates an attribute" do
|
91
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
92
|
-
post.update_attribute :subject, 'baz'
|
93
|
-
assert_equal 'baz', Post.first.subject
|
94
|
-
end
|
95
|
-
|
96
|
-
test "update_attributes failure" do
|
97
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
98
|
-
assert !post.update_attributes( { :subject => '' } )
|
99
|
-
assert_nil post.reload.attributes['subject']
|
100
|
-
assert_equal 'foo', post.subject
|
101
|
-
end
|
102
|
-
|
103
|
-
test "validates presence of :subject" do
|
104
|
-
post = Post.new
|
105
|
-
assert !post.save
|
106
|
-
|
107
|
-
post = Post.new :subject => 'foo'
|
108
|
-
assert post.save
|
109
|
-
end
|
110
|
-
|
111
|
-
test "returns the value for the correct locale, after locale switching" do
|
112
|
-
post = Post.create :subject => 'foo'
|
113
|
-
I18n.locale = 'de-DE'
|
114
|
-
post.subject = 'bar'
|
115
|
-
post.save
|
116
|
-
I18n.locale = 'en-US'
|
117
|
-
post = Post.first
|
118
|
-
assert_equal 'foo', post.subject
|
119
|
-
I18n.locale = 'de-DE'
|
120
|
-
assert_equal 'bar', post.subject
|
121
|
-
end
|
122
|
-
|
123
|
-
test "keeping one field in new locale when other field is changed" do
|
124
|
-
I18n.fallbacks.map 'de-DE' => [ 'en-US' ]
|
125
|
-
post = Post.create :subject => 'foo'
|
126
|
-
I18n.locale = 'de-DE'
|
127
|
-
post.content = 'bar'
|
128
|
-
assert_equal 'foo', post.subject
|
129
|
-
end
|
130
|
-
|
131
|
-
test "modifying non-required field in a new locale" do
|
132
|
-
I18n.fallbacks.map 'de-DE' => [ 'en-US' ]
|
133
|
-
post = Post.create :subject => 'foo'
|
134
|
-
I18n.locale = 'de-DE'
|
135
|
-
post.content = 'bar'
|
136
|
-
assert post.save
|
137
|
-
end
|
138
|
-
|
139
|
-
test "returns the value for the correct locale, after locale switching, without saving" do
|
140
|
-
post = Post.create :subject => 'foo'
|
141
|
-
I18n.locale = 'de-DE'
|
142
|
-
post.subject = 'bar'
|
143
|
-
I18n.locale = 'en-US'
|
144
|
-
assert_equal 'foo', post.subject
|
145
|
-
I18n.locale = 'de-DE'
|
146
|
-
assert_equal 'bar', post.subject
|
147
|
-
end
|
148
|
-
|
149
|
-
test "saves all locales, even after locale switching" do
|
150
|
-
post = Post.new :subject => 'foo'
|
151
|
-
I18n.locale = 'de-DE'
|
152
|
-
post.subject = 'bar'
|
153
|
-
I18n.locale = 'he-IL'
|
154
|
-
post.subject = 'baz'
|
155
|
-
post.save
|
156
|
-
I18n.locale = 'en-US'
|
157
|
-
post = Post.first
|
158
|
-
assert_equal 'foo', post.subject
|
159
|
-
I18n.locale = 'de-DE'
|
160
|
-
assert_equal 'bar', post.subject
|
161
|
-
I18n.locale = 'he-IL'
|
162
|
-
assert_equal 'baz', post.subject
|
163
|
-
end
|
164
|
-
|
165
|
-
test "resolves a simple fallback" do
|
166
|
-
I18n.locale = 'de-DE'
|
167
|
-
post = Post.create :subject => 'foo'
|
168
|
-
I18n.locale = 'de'
|
169
|
-
post.subject = 'baz'
|
170
|
-
post.content = 'bar'
|
171
|
-
post.save
|
172
|
-
I18n.locale = 'de-DE'
|
173
|
-
assert_equal 'foo', post.subject
|
174
|
-
assert_equal 'bar', post.content
|
175
|
-
end
|
176
|
-
|
177
|
-
test "resolves a simple fallback without reloading" do
|
178
|
-
I18n.locale = 'de-DE'
|
179
|
-
post = Post.new :subject => 'foo'
|
180
|
-
I18n.locale = 'de'
|
181
|
-
post.subject = 'baz'
|
182
|
-
post.content = 'bar'
|
183
|
-
I18n.locale = 'de-DE'
|
184
|
-
assert_equal 'foo', post.subject
|
185
|
-
assert_equal 'bar', post.content
|
186
|
-
end
|
187
|
-
|
188
|
-
test "resolves a complex fallback without reloading" do
|
189
|
-
I18n.fallbacks.map 'de' => %w(en he)
|
190
|
-
I18n.locale = 'de'
|
191
|
-
post = Post.new
|
192
|
-
I18n.locale = 'en'
|
193
|
-
post.subject = 'foo'
|
194
|
-
I18n.locale = 'he'
|
195
|
-
post.subject = 'baz'
|
196
|
-
post.content = 'bar'
|
197
|
-
I18n.locale = 'de'
|
198
|
-
assert_equal 'foo', post.subject
|
199
|
-
assert_equal 'bar', post.content
|
200
|
-
end
|
201
|
-
|
202
|
-
test "returns nil if no translations are found" do
|
203
|
-
post = Post.new :subject => 'foo'
|
204
|
-
assert_equal 'foo', post.subject
|
205
|
-
assert_nil post.content
|
206
|
-
end
|
207
|
-
|
208
|
-
test "returns nil if no translations are found; reloaded" do
|
209
|
-
post = Post.create :subject => 'foo'
|
210
|
-
post = Post.first
|
211
|
-
assert_equal 'foo', post.subject
|
212
|
-
assert_nil post.content
|
213
|
-
end
|
214
|
-
|
215
|
-
test "works with associations" do
|
216
|
-
blog = Blog.create
|
217
|
-
post1 = blog.posts.create :subject => 'foo'
|
218
|
-
I18n.locale = 'de-DE'
|
219
|
-
post2 = blog.posts.create :subject => 'bar'
|
220
|
-
assert_equal 2, blog.posts.size
|
221
|
-
I18n.locale = 'en-US'
|
222
|
-
assert_equal 'foo', blog.posts.first.subject
|
223
|
-
assert_nil blog.posts.last.subject
|
224
|
-
I18n.locale = 'de-DE'
|
225
|
-
assert_equal 'bar', blog.posts.last.subject
|
226
|
-
end
|
227
|
-
|
228
|
-
test "works with simple dynamic finders" do
|
229
|
-
foo = Post.create :subject => 'foo'
|
230
|
-
Post.create :subject => 'bar'
|
231
|
-
post = Post.find_by_subject('foo')
|
232
|
-
assert_equal foo, post
|
233
|
-
end
|
234
|
-
|
235
|
-
test 'change attribute on globalized model' do
|
236
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
237
|
-
assert_equal [], post.changed
|
238
|
-
post.subject = 'baz'
|
239
|
-
assert_equal [ 'subject' ], post.changed
|
240
|
-
post.content = 'quux'
|
241
|
-
assert_member 'subject', post.changed
|
242
|
-
assert_member 'content', post.changed
|
243
|
-
end
|
244
|
-
|
245
|
-
test 'change attribute on globalized model after locale switching' do
|
246
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
247
|
-
assert_equal [], post.changed
|
248
|
-
post.subject = 'baz'
|
249
|
-
I18n.locale = :de
|
250
|
-
assert_equal [ 'subject' ], post.changed
|
251
|
-
end
|
252
|
-
|
253
|
-
test 'fallbacks with lots of locale switching' do
|
254
|
-
I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
|
255
|
-
post = Post.create :subject => 'foo'
|
256
|
-
|
257
|
-
I18n.locale = :'de-DE'
|
258
|
-
assert_equal 'foo', post.subject
|
259
|
-
|
260
|
-
I18n.locale = :'en-US'
|
261
|
-
post.update_attribute :subject, 'bar'
|
262
|
-
|
263
|
-
I18n.locale = :'de-DE'
|
264
|
-
assert_equal 'bar', post.subject
|
265
|
-
end
|
266
|
-
|
267
|
-
test 'reload' do
|
268
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
269
|
-
post.subject = 'baz'
|
270
|
-
assert_equal 'foo', post.reload.subject
|
271
|
-
end
|
272
|
-
|
273
|
-
test 'complex writing and stashing' do
|
274
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
275
|
-
post.subject = nil
|
276
|
-
assert_nil post.subject
|
277
|
-
assert !post.valid?
|
278
|
-
end
|
279
|
-
|
280
|
-
test 'translated class locale setting' do
|
281
|
-
assert ActiveRecord::Base.respond_to?(:locale)
|
282
|
-
assert_equal :'en-US', I18n.locale
|
283
|
-
assert_equal :'en-US', ActiveRecord::Base.locale
|
284
|
-
I18n.locale = :de
|
285
|
-
assert_equal :de, I18n.locale
|
286
|
-
assert_equal :de, ActiveRecord::Base.locale
|
287
|
-
ActiveRecord::Base.locale = :es
|
288
|
-
assert_equal :de, I18n.locale
|
289
|
-
assert_equal :es, ActiveRecord::Base.locale
|
290
|
-
I18n.locale = :fr
|
291
|
-
assert_equal :fr, I18n.locale
|
292
|
-
assert_equal :es, ActiveRecord::Base.locale
|
293
|
-
end
|
294
|
-
|
295
|
-
test "untranslated class responds to locale" do
|
296
|
-
assert Blog.respond_to?(:locale)
|
297
|
-
end
|
298
|
-
|
299
|
-
test "to ensure locales in different classes are the same" do
|
300
|
-
ActiveRecord::Base.locale = :de
|
301
|
-
assert_equal :de, ActiveRecord::Base.locale
|
302
|
-
assert_equal :de, Parent.locale
|
303
|
-
Parent.locale = :es
|
304
|
-
assert_equal :es, ActiveRecord::Base.locale
|
305
|
-
assert_equal :es, Parent.locale
|
306
|
-
end
|
307
|
-
|
308
|
-
test "attribute saving goes by content locale and not global locale" do
|
309
|
-
ActiveRecord::Base.locale = :de
|
310
|
-
assert_equal :'en-US', I18n.locale
|
311
|
-
Post.create :subject => 'foo'
|
312
|
-
assert_equal :de, Post.first.globalize_translations.first.locale
|
313
|
-
end
|
314
|
-
|
315
|
-
test "attribute loading goes by content locale and not global locale" do
|
316
|
-
post = Post.create :subject => 'foo'
|
317
|
-
assert_equal :'en-US', ActiveRecord::Base.locale
|
318
|
-
ActiveRecord::Base.locale = :de
|
319
|
-
assert_equal :'en-US', I18n.locale
|
320
|
-
post.update_attribute :subject, 'foo [de]'
|
321
|
-
assert_equal 'foo [de]', Post.first.subject
|
322
|
-
ActiveRecord::Base.locale = :'en-US'
|
323
|
-
assert_equal 'foo', Post.first.subject
|
324
|
-
end
|
325
|
-
|
326
|
-
test "access content locale before setting" do
|
327
|
-
Globalize::Model::ActiveRecord::Translated::ActMethods.class_eval "remove_class_variable(:@@locale)"
|
328
|
-
assert_nothing_raised { ActiveRecord::Base.locale }
|
329
|
-
end
|
330
|
-
|
331
|
-
test "translated_locales" do
|
332
|
-
Post.locale = :de
|
333
|
-
post = Post.create :subject => 'foo'
|
334
|
-
Post.locale = :es
|
335
|
-
post.update_attribute :subject, 'bar'
|
336
|
-
Post.locale = :fr
|
337
|
-
post.update_attribute :subject, 'baz'
|
338
|
-
assert_equal [ :de, :es, :fr ], post.translated_locales
|
339
|
-
assert_equal [ :de, :es, :fr ], Post.first.translated_locales
|
340
|
-
end
|
341
|
-
|
342
|
-
test "saving record correctly after post-save reload" do
|
343
|
-
reloader = Reloader.create :content => 'foo'
|
344
|
-
assert_equal 'foo', reloader.content
|
345
|
-
end
|
346
|
-
|
347
|
-
test "including globalize_translations" do
|
348
|
-
I18n.locale = :de
|
349
|
-
Post.create :subject => "Foo1", :content => "Bar1"
|
350
|
-
Post.create :subject => "Foo2", :content => "Bar2"
|
351
|
-
|
352
|
-
class << Post
|
353
|
-
def tranlsations_included
|
354
|
-
self.all(:include => :globalize_translations)
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
default = Post.all.map {|x| [x.subject, x.content]}
|
359
|
-
with_include = Post.tranlsations_included.map {|x| [x.subject, x.content]}
|
360
|
-
assert_equal default, with_include
|
361
|
-
end
|
362
|
-
|
363
|
-
test "setting multiple translations at once with options hash" do
|
364
|
-
Post.locale = :de
|
365
|
-
post = Post.create :subject => "foo1", :content => "foo1"
|
366
|
-
Post.locale = :en
|
367
|
-
post.update_attributes( :subject => "bar1", :content => "bar1" )
|
368
|
-
|
369
|
-
options = { :de => {:subject => "foo2", :content => "foo2"},
|
370
|
-
:en => {:subject => "bar2", :content => "bar2"} }
|
371
|
-
post.set_translations options
|
372
|
-
post.reload
|
373
|
-
|
374
|
-
assert ["bar2", "bar2"], [post.subject, post.content]
|
375
|
-
Post.locale = :de
|
376
|
-
assert ["foo2", "foo2"], [post.subject, post.content]
|
377
|
-
end
|
378
|
-
|
379
|
-
test "setting only one translation with set_translations" do
|
380
|
-
Post.locale = :de
|
381
|
-
post = Post.create :subject => "foo1", :content => "foo1"
|
382
|
-
Post.locale = :en
|
383
|
-
post.update_attributes( :subject => "bar1", :content => "bar1" )
|
384
|
-
|
385
|
-
options = { :en => {:subject => "bar2", :content => "bar2"} }
|
386
|
-
post.set_translations options
|
387
|
-
post.reload
|
388
|
-
|
389
|
-
assert ["bar2", "bar2"], [post.subject, post.content]
|
390
|
-
Post.locale = :de
|
391
|
-
assert ["foo1", "foo1"], [post.subject, post.content]
|
392
|
-
end
|
393
|
-
|
394
|
-
test "setting only selected attributes with set_translations" do
|
395
|
-
Post.locale = :de
|
396
|
-
post = Post.create :subject => "foo1", :content => "foo1"
|
397
|
-
Post.locale = :en
|
398
|
-
post.update_attributes( :subject => "bar1", :content => "bar1" )
|
399
|
-
|
400
|
-
options = { :de => {:content => "foo2"}, :en => {:subject => "bar2"} }
|
401
|
-
post.set_translations options
|
402
|
-
post.reload
|
403
|
-
|
404
|
-
assert ["bar2", "bar1"], [post.subject, post.content]
|
405
|
-
Post.locale = :de
|
406
|
-
assert ["foo1", "foo2"], [post.subject, post.content]
|
407
|
-
end
|
408
|
-
|
409
|
-
test "setting invalid attributes raises ArgumentError" do
|
410
|
-
Post.locale = :de
|
411
|
-
post = Post.create :subject => "foo1", :content => "foo1"
|
412
|
-
Post.locale = :en
|
413
|
-
post.update_attributes( :subject => "bar1", :content => "bar1" )
|
414
|
-
|
415
|
-
options = { :de => {:fake => "foo2"} }
|
416
|
-
exception = assert_raise(ActiveRecord::UnknownAttributeError) do
|
417
|
-
post.set_translations options
|
418
|
-
end
|
419
|
-
assert_equal "unknown attribute: fake", exception.message
|
420
|
-
end
|
421
|
-
|
422
|
-
test "reload accepting find options" do
|
423
|
-
p = Post.create :subject => "Foo", :content => "Bar"
|
424
|
-
assert p.reload(:readonly => true, :lock => true)
|
425
|
-
assert_raise(ArgumentError) { p.reload(:foo => :bar) }
|
426
|
-
end
|
427
|
-
|
428
|
-
test "dependent destroy of translation" do
|
429
|
-
p = Post.create :subject => "Foo", :content => "Bar"
|
430
|
-
assert_equal 1, PostTranslation.count
|
431
|
-
p.destroy
|
432
|
-
assert_equal 0, PostTranslation.count
|
433
|
-
end
|
434
|
-
|
435
|
-
test "translating subclass of untranslated comment model" do
|
436
|
-
translated_comment = TranslatedComment.create(:post => @post)
|
437
|
-
assert_nothing_raised { translated_comment.globalize_translations }
|
438
|
-
end
|
439
|
-
|
440
|
-
test "modifiying translated comments works as expected" do
|
441
|
-
I18n.locale = :en
|
442
|
-
translated_comment = TranslatedComment.create(:post => @post, :content => 'foo')
|
443
|
-
assert_equal 'foo', translated_comment.content
|
444
|
-
|
445
|
-
I18n.locale = :de
|
446
|
-
translated_comment.content = 'bar'
|
447
|
-
assert translated_comment.save
|
448
|
-
assert_equal 'bar', translated_comment.content
|
449
|
-
|
450
|
-
I18n.locale = :en
|
451
|
-
assert_equal 'foo', translated_comment.content
|
452
|
-
|
453
|
-
assert_equal 2, translated_comment.globalize_translations.size
|
454
|
-
end
|
455
|
-
|
456
|
-
test "can create a proxy class for a namespaced model" do
|
457
|
-
module Foo
|
458
|
-
module Bar
|
459
|
-
class Baz < ActiveRecord::Base
|
460
|
-
translates :bumm
|
461
|
-
end
|
462
|
-
end
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
|
-
test "attribute translated before type cast" do
|
467
|
-
Post.locale = :en
|
468
|
-
post = Post.create :subject => 'foo', :content => 'bar'
|
469
|
-
Post.locale = :de
|
470
|
-
post.update_attribute :subject, "German foo"
|
471
|
-
assert_equal 'German foo', post.subject_before_type_cast
|
472
|
-
Post.locale = :en
|
473
|
-
assert_equal 'foo', post.subject_before_type_cast
|
474
|
-
end
|
475
|
-
|
476
|
-
test "don't override existing translation model" do
|
477
|
-
assert PostTranslation.new.respond_to?(:existing_method)
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
|
-
# TODO should validate_presence_of take fallbacks into account? maybe we need
|
482
|
-
# an extra validation call, or more options for validate_presence_of.
|
483
|
-
# TODO error checking for fields that exist in main table, don't exist in
|
484
|
-
# proxy table, aren't strings or text
|
485
|
-
#
|
486
|
-
# TODO allow finding by translated attributes in conditions?
|
487
|
-
# TODO generate advanced dynamic finders?
|