i18n 1.0.0 → 1.14.7
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 +4 -4
- data/README.md +75 -32
- data/lib/i18n/backend/base.rb +93 -34
- data/lib/i18n/backend/cache.rb +10 -11
- data/lib/i18n/backend/cache_file.rb +36 -0
- data/lib/i18n/backend/cascade.rb +3 -1
- data/lib/i18n/backend/chain.rb +39 -6
- data/lib/i18n/backend/fallbacks.rb +48 -15
- data/lib/i18n/backend/flatten.rb +10 -5
- data/lib/i18n/backend/gettext.rb +4 -2
- data/lib/i18n/backend/interpolation_compiler.rb +8 -8
- data/lib/i18n/backend/key_value.rb +31 -4
- data/lib/i18n/backend/lazy_loadable.rb +184 -0
- data/lib/i18n/backend/memoize.rb +10 -2
- data/lib/i18n/backend/metadata.rb +5 -3
- data/lib/i18n/backend/pluralization.rb +61 -18
- data/lib/i18n/backend/simple.rb +44 -24
- data/lib/i18n/backend/transliterator.rb +26 -24
- data/lib/i18n/backend.rb +5 -1
- data/lib/i18n/config.rb +22 -4
- data/lib/i18n/exceptions.rb +71 -18
- data/lib/i18n/gettext/helpers.rb +4 -2
- data/lib/i18n/gettext/po_parser.rb +7 -7
- data/lib/i18n/gettext.rb +2 -0
- data/lib/i18n/interpolate/ruby.rb +22 -6
- data/lib/i18n/locale/fallbacks.rb +33 -22
- data/lib/i18n/locale/tag/parents.rb +8 -6
- data/lib/i18n/locale/tag/simple.rb +2 -2
- data/lib/i18n/locale.rb +2 -0
- data/lib/i18n/middleware.rb +2 -0
- data/lib/i18n/tests/basics.rb +5 -7
- data/lib/i18n/tests/defaults.rb +8 -1
- data/lib/i18n/tests/interpolation.rb +34 -7
- data/lib/i18n/tests/link.rb +11 -1
- data/lib/i18n/tests/localization/date.rb +37 -10
- data/lib/i18n/tests/localization/date_time.rb +28 -7
- data/lib/i18n/tests/localization/procs.rb +9 -7
- data/lib/i18n/tests/localization/time.rb +27 -5
- data/lib/i18n/tests/lookup.rb +11 -5
- data/lib/i18n/tests/pluralization.rb +1 -1
- data/lib/i18n/tests/procs.rb +23 -7
- data/lib/i18n/tests.rb +2 -0
- data/lib/i18n/utils.rb +55 -0
- data/lib/i18n/version.rb +3 -1
- data/lib/i18n.rb +179 -58
- metadata +16 -61
- data/gemfiles/Gemfile.rails-3.2.x +0 -10
- data/gemfiles/Gemfile.rails-4.0.x +0 -10
- data/gemfiles/Gemfile.rails-4.1.x +0 -10
- data/gemfiles/Gemfile.rails-4.2.x +0 -10
- data/gemfiles/Gemfile.rails-5.0.x +0 -10
- data/gemfiles/Gemfile.rails-5.1.x +0 -10
- data/gemfiles/Gemfile.rails-master +0 -10
- data/lib/i18n/core_ext/hash.rb +0 -29
- data/lib/i18n/core_ext/kernel/suppress_warnings.rb +0 -8
- data/lib/i18n/core_ext/string/interpolate.rb +0 -9
- data/test/api/all_features_test.rb +0 -58
- data/test/api/cascade_test.rb +0 -28
- data/test/api/chain_test.rb +0 -24
- data/test/api/fallbacks_test.rb +0 -30
- data/test/api/key_value_test.rb +0 -24
- data/test/api/memoize_test.rb +0 -56
- data/test/api/override_test.rb +0 -42
- data/test/api/pluralization_test.rb +0 -30
- data/test/api/simple_test.rb +0 -28
- data/test/backend/cache_test.rb +0 -109
- data/test/backend/cascade_test.rb +0 -86
- data/test/backend/chain_test.rb +0 -122
- data/test/backend/exceptions_test.rb +0 -36
- data/test/backend/fallbacks_test.rb +0 -219
- data/test/backend/interpolation_compiler_test.rb +0 -118
- data/test/backend/key_value_test.rb +0 -61
- data/test/backend/memoize_test.rb +0 -79
- data/test/backend/metadata_test.rb +0 -48
- data/test/backend/pluralization_test.rb +0 -45
- data/test/backend/simple_test.rb +0 -103
- data/test/backend/transliterator_test.rb +0 -84
- data/test/core_ext/hash_test.rb +0 -36
- data/test/gettext/api_test.rb +0 -214
- data/test/gettext/backend_test.rb +0 -92
- data/test/i18n/exceptions_test.rb +0 -117
- data/test/i18n/gettext_plural_keys_test.rb +0 -20
- data/test/i18n/interpolate_test.rb +0 -91
- data/test/i18n/load_path_test.rb +0 -34
- data/test/i18n/middleware_test.rb +0 -24
- data/test/i18n_test.rb +0 -462
- data/test/locale/fallbacks_test.rb +0 -133
- data/test/locale/tag/rfc4646_test.rb +0 -143
- data/test/locale/tag/simple_test.rb +0 -32
- data/test/run_all.rb +0 -20
- data/test/test_data/locales/de.po +0 -82
- data/test/test_data/locales/en.rb +0 -3
- data/test/test_data/locales/en.yml +0 -3
- data/test/test_data/locales/invalid/empty.yml +0 -0
- data/test/test_data/locales/invalid/syntax.yml +0 -4
- data/test/test_data/locales/plurals.rb +0 -113
- data/test/test_helper.rb +0 -61
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class I18nBackendExceptionsTest < I18n::TestCase
|
4
|
-
def setup
|
5
|
-
super
|
6
|
-
I18n.backend = I18n::Backend::Simple.new
|
7
|
-
end
|
8
|
-
|
9
|
-
test "throw message: MissingTranslation message from #translate includes the given scope and full key" do
|
10
|
-
exception = catch(:exception) do
|
11
|
-
I18n.t(:'baz.missing', :scope => :'foo.bar', :throw => true)
|
12
|
-
end
|
13
|
-
assert_equal "translation missing: en.foo.bar.baz.missing", exception.message
|
14
|
-
end
|
15
|
-
|
16
|
-
test "exceptions: MissingTranslationData message from #translate includes the given scope and full key" do
|
17
|
-
begin
|
18
|
-
I18n.t(:'baz.missing', :scope => :'foo.bar', :raise => true)
|
19
|
-
rescue I18n::MissingTranslationData => exception
|
20
|
-
end
|
21
|
-
assert_equal "translation missing: en.foo.bar.baz.missing", exception.message
|
22
|
-
end
|
23
|
-
|
24
|
-
test "exceptions: MissingTranslationData message from #localize includes the given scope and full key" do
|
25
|
-
begin
|
26
|
-
I18n.l(Time.now, :format => :foo)
|
27
|
-
rescue I18n::MissingTranslationData => exception
|
28
|
-
end
|
29
|
-
assert_equal "translation missing: en.time.formats.foo", exception.message
|
30
|
-
end
|
31
|
-
|
32
|
-
test "exceptions: MissingInterpolationArgument message includes missing key, provided keys and full string" do
|
33
|
-
exception = I18n::MissingInterpolationArgument.new('key', {:this => 'was given'}, 'string')
|
34
|
-
assert_equal 'missing interpolation argument "key" in "string" ({:this=>"was given"} given)', exception.message
|
35
|
-
end
|
36
|
-
end
|
@@ -1,219 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class I18nBackendFallbacksTranslateTest < I18n::TestCase
|
4
|
-
class Backend < I18n::Backend::Simple
|
5
|
-
include I18n::Backend::Fallbacks
|
6
|
-
end
|
7
|
-
|
8
|
-
def setup
|
9
|
-
super
|
10
|
-
I18n.backend = Backend.new
|
11
|
-
store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en', :buz => 'Buz in :en', :interpolate => 'Interpolate %{value}')
|
12
|
-
store_translations(:de, :bar => 'Bar in :de', :baz => 'Baz in :de')
|
13
|
-
store_translations(:'de-DE', :baz => 'Baz in :de-DE')
|
14
|
-
store_translations(:'pt-BR', :baz => 'Baz in :pt-BR')
|
15
|
-
end
|
16
|
-
|
17
|
-
test "still returns an existing translation as usual" do
|
18
|
-
assert_equal 'Foo in :en', I18n.t(:foo, :locale => :en)
|
19
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :de)
|
20
|
-
assert_equal 'Baz in :de-DE', I18n.t(:baz, :locale => :'de-DE')
|
21
|
-
end
|
22
|
-
|
23
|
-
test "returns interpolated value if no key provided" do
|
24
|
-
assert_equal 'Interpolate %{value}', I18n.t(:interpolate)
|
25
|
-
end
|
26
|
-
|
27
|
-
test "returns the :en translation for a missing :de translation" do
|
28
|
-
assert_equal 'Foo in :en', I18n.t(:foo, :locale => :de)
|
29
|
-
end
|
30
|
-
|
31
|
-
test "returns the :de translation for a missing :'de-DE' translation" do
|
32
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE')
|
33
|
-
end
|
34
|
-
|
35
|
-
test "returns the :en translation for translation missing in both :de and :'de-De'" do
|
36
|
-
assert_equal 'Buz in :en', I18n.t(:buz, :locale => :'de-DE')
|
37
|
-
end
|
38
|
-
|
39
|
-
test "returns the :de translation for a missing :'de-DE' when :default is a String" do
|
40
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => "Default Bar")
|
41
|
-
assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => "Default Bar")
|
42
|
-
end
|
43
|
-
|
44
|
-
test "returns the :de translation for a missing :'de-DE' when defaults is a Symbol (which exists in :en)" do
|
45
|
-
assert_equal "Bar in :de", I18n.t(:bar, :locale => :'de-DE', :default => [:buz])
|
46
|
-
end
|
47
|
-
|
48
|
-
test "returns the :'de-DE' default :baz translation for a missing :'de-DE' (which exists in :de)" do
|
49
|
-
assert_equal "Baz in :de-DE", I18n.t(:bar, :locale => :'de-DE', :default => [:baz])
|
50
|
-
end
|
51
|
-
|
52
|
-
test "returns the :de translation for a missing :'de-DE' when :default is a Proc" do
|
53
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" })
|
54
|
-
assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" })
|
55
|
-
end
|
56
|
-
|
57
|
-
test "returns the :de translation for a missing :'de-DE' when :default is a Hash" do
|
58
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => {})
|
59
|
-
assert_equal({}, I18n.t(:missing_bar, :locale => :'de-DE', :default => {}))
|
60
|
-
end
|
61
|
-
|
62
|
-
test "returns the :de translation for a missing :'de-DE' when :default is nil" do
|
63
|
-
assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => nil)
|
64
|
-
assert_nil I18n.t(:missing_bar, :locale => :'de-DE', :default => nil)
|
65
|
-
end
|
66
|
-
|
67
|
-
test "returns the translation missing message if the default is also missing" do
|
68
|
-
assert_equal 'translation missing: de-DE.missing_bar', I18n.t(:missing_bar, :locale => :'de-DE', :default => [:missing_baz])
|
69
|
-
end
|
70
|
-
|
71
|
-
test "returns the :'de-DE' default :baz translation for a missing :'de-DE' when defaults contains Symbol" do
|
72
|
-
assert_equal 'Baz in :de-DE', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:baz, "Default Bar"])
|
73
|
-
end
|
74
|
-
|
75
|
-
test "returns the defaults translation for a missing :'de-DE' when defaults contains a String or Proc before Symbol" do
|
76
|
-
assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, "Default Bar", :baz])
|
77
|
-
assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, Proc.new { "Default Bar" }, :baz])
|
78
|
-
end
|
79
|
-
|
80
|
-
test "returns the default translation for a missing :'de-DE' and existing :de when default is a Hash" do
|
81
|
-
assert_equal 'Default 6 Bars', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, {:other => "Default %{count} Bars"}, "Default Bar"], :count => 6)
|
82
|
-
end
|
83
|
-
|
84
|
-
test "returns the default translation for a missing :de translation even when default is a String when fallback is disabled" do
|
85
|
-
assert_equal 'Default String', I18n.t(:foo, :locale => :de, :default => 'Default String', :fallback => false)
|
86
|
-
end
|
87
|
-
|
88
|
-
test "raises I18n::MissingTranslationData exception when fallback is disabled even when fallback translation exists" do
|
89
|
-
assert_raise(I18n::MissingTranslationData) { I18n.t(:foo, :locale => :de, :fallback => false, :raise => true) }
|
90
|
-
end
|
91
|
-
|
92
|
-
test "raises I18n::MissingTranslationData exception when no translation was found" do
|
93
|
-
assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :en, :raise => true) }
|
94
|
-
assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :de, :raise => true) }
|
95
|
-
end
|
96
|
-
|
97
|
-
test "should ensure that default is not splitted on new line char" do
|
98
|
-
assert_equal "Default \n Bar", I18n.t(:missing_bar, :default => "Default \n Bar")
|
99
|
-
end
|
100
|
-
|
101
|
-
test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do
|
102
|
-
I18n.enforce_available_locales = true
|
103
|
-
begin
|
104
|
-
assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"])
|
105
|
-
ensure
|
106
|
-
I18n.enforce_available_locales = false
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class I18nBackendFallbacksLocalizeTest < I18n::TestCase
|
112
|
-
class Backend < I18n::Backend::Simple
|
113
|
-
include I18n::Backend::Fallbacks
|
114
|
-
end
|
115
|
-
|
116
|
-
def setup
|
117
|
-
super
|
118
|
-
I18n.backend = Backend.new
|
119
|
-
store_translations(:en, :date => { :formats => { :en => 'en' }, :day_names => %w(Sunday) })
|
120
|
-
store_translations(:de, :date => { :formats => { :de => 'de' } })
|
121
|
-
end
|
122
|
-
|
123
|
-
test "still uses an existing format as usual" do
|
124
|
-
assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :en)
|
125
|
-
end
|
126
|
-
|
127
|
-
test "looks up and uses a fallback locale's format for a key missing in the given locale (1)" do
|
128
|
-
assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :de)
|
129
|
-
end
|
130
|
-
|
131
|
-
test "looks up and uses a fallback locale's format for a key missing in the given locale (2)" do
|
132
|
-
assert_equal 'de', I18n.l(Date.today, :format => :de, :locale => :'de-DE')
|
133
|
-
end
|
134
|
-
|
135
|
-
test "still uses an existing day name translation as usual" do
|
136
|
-
assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :en)
|
137
|
-
end
|
138
|
-
|
139
|
-
test "uses a fallback locale's translation for a key missing in the given locale" do
|
140
|
-
assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :de)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
class I18nBackendFallbacksWithChainTest < I18n::TestCase
|
145
|
-
class Backend < I18n::Backend::Simple
|
146
|
-
include I18n::Backend::Fallbacks
|
147
|
-
end
|
148
|
-
|
149
|
-
class Chain < I18n::Backend::Chain
|
150
|
-
include I18n::Backend::Fallbacks
|
151
|
-
end
|
152
|
-
|
153
|
-
def setup
|
154
|
-
super
|
155
|
-
backend = Backend.new
|
156
|
-
backend.store_translations(:de, :foo => 'FOO')
|
157
|
-
backend.store_translations(:'pt-BR', :foo => 'Baz in :pt-BR')
|
158
|
-
I18n.backend = Chain.new(I18n::Backend::Simple.new, backend)
|
159
|
-
end
|
160
|
-
|
161
|
-
test "falls back from de-DE to de when there is no translation for de-DE available" do
|
162
|
-
assert_equal 'FOO', I18n.t(:foo, :locale => :'de-DE')
|
163
|
-
end
|
164
|
-
|
165
|
-
test "falls back from de-DE to de when there is no translation for de-DE available when using arrays, too" do
|
166
|
-
assert_equal ['FOO', 'FOO'], I18n.t([:foo, :foo], :locale => :'de-DE')
|
167
|
-
end
|
168
|
-
|
169
|
-
test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do
|
170
|
-
I18n.enforce_available_locales = true
|
171
|
-
begin
|
172
|
-
assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"])
|
173
|
-
ensure
|
174
|
-
I18n.enforce_available_locales = false
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
class I18nBackendFallbacksExistsTest < I18n::TestCase
|
180
|
-
class Backend < I18n::Backend::Simple
|
181
|
-
include I18n::Backend::Fallbacks
|
182
|
-
end
|
183
|
-
|
184
|
-
def setup
|
185
|
-
super
|
186
|
-
I18n.backend = Backend.new
|
187
|
-
store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en')
|
188
|
-
store_translations(:de, :bar => 'Bar in :de')
|
189
|
-
store_translations(:'de-DE', :baz => 'Baz in :de-DE')
|
190
|
-
end
|
191
|
-
|
192
|
-
test "exists? given an existing key will return true" do
|
193
|
-
assert_equal true, I18n.exists?(:foo)
|
194
|
-
end
|
195
|
-
|
196
|
-
test "exists? given a non-existing key will return false" do
|
197
|
-
assert_equal false, I18n.exists?(:bogus)
|
198
|
-
end
|
199
|
-
|
200
|
-
test "exists? given an existing key and an existing locale will return true" do
|
201
|
-
assert_equal true, I18n.exists?(:foo, :en)
|
202
|
-
assert_equal true, I18n.exists?(:bar, :de)
|
203
|
-
end
|
204
|
-
|
205
|
-
test "exists? given a non-existing key and an existing locale will return false" do
|
206
|
-
assert_equal false, I18n.exists?(:bogus, :en)
|
207
|
-
assert_equal false, I18n.exists?(:bogus, :de)
|
208
|
-
end
|
209
|
-
|
210
|
-
test "exists? should return true given a key which is missing from the given locale and exists in a fallback locale" do
|
211
|
-
assert_equal true, I18n.exists?(:foo, :de)
|
212
|
-
assert_equal true, I18n.exists?(:foo, :'de-DE')
|
213
|
-
end
|
214
|
-
|
215
|
-
test "exists? should return false given a key which is missing from the given locale and all its fallback locales" do
|
216
|
-
assert_equal false, I18n.exists?(:baz, :de)
|
217
|
-
assert_equal false, I18n.exists?(:bogus, :'de-DE')
|
218
|
-
end
|
219
|
-
end
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class InterpolationCompilerTest < I18n::TestCase
|
4
|
-
Compiler = I18n::Backend::InterpolationCompiler::Compiler
|
5
|
-
|
6
|
-
def compile_and_interpolate(str, values = {})
|
7
|
-
Compiler.compile_if_an_interpolation(str).i18n_interpolate(values)
|
8
|
-
end
|
9
|
-
|
10
|
-
def assert_escapes_interpolation_key(expected, malicious_str)
|
11
|
-
assert_equal(expected, Compiler.send(:escape_key_sym, malicious_str))
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_escape_key_properly_escapes
|
15
|
-
assert_escapes_interpolation_key ':"\""', '"'
|
16
|
-
assert_escapes_interpolation_key ':"\\\\"', '\\'
|
17
|
-
assert_escapes_interpolation_key ':"\\\\\""', '\\"'
|
18
|
-
assert_escapes_interpolation_key ':"\#{}"', '#{}'
|
19
|
-
assert_escapes_interpolation_key ':"\\\\\#{}"', '\#{}'
|
20
|
-
end
|
21
|
-
|
22
|
-
def assert_escapes_plain_string(expected, plain_str)
|
23
|
-
assert_equal expected, Compiler.send(:escape_plain_str, plain_str)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_escape_plain_string_properly_escapes
|
27
|
-
assert_escapes_plain_string '\\"', '"'
|
28
|
-
assert_escapes_plain_string '\'', '\''
|
29
|
-
assert_escapes_plain_string '\\#', '#'
|
30
|
-
assert_escapes_plain_string '\\#{}', '#{}'
|
31
|
-
assert_escapes_plain_string '\\\\\\"','\\"'
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_non_interpolated_strings_or_arrays_dont_get_compiled
|
35
|
-
['abc', '\\{a}}', '{a}}', []].each do |obj|
|
36
|
-
Compiler.compile_if_an_interpolation(obj)
|
37
|
-
assert_equal false, obj.respond_to?(:i18n_interpolate)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_interpolated_string_gets_compiled
|
42
|
-
assert_equal '-A-', compile_and_interpolate('-%{a}-', :a => 'A')
|
43
|
-
end
|
44
|
-
|
45
|
-
def assert_handles_key(str, key)
|
46
|
-
assert_equal 'A', compile_and_interpolate(str, key => 'A')
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_compiles_fancy_keys
|
50
|
-
assert_handles_key('%{\}', :'\\' )
|
51
|
-
assert_handles_key('%{#}', :'#' )
|
52
|
-
assert_handles_key('%{#{}', :'#{' )
|
53
|
-
assert_handles_key('%{#$SAFE}', :'#$SAFE')
|
54
|
-
assert_handles_key('%{\000}', :'\000' )
|
55
|
-
assert_handles_key('%{\'}', :'\'' )
|
56
|
-
assert_handles_key('%{\'\'}', :'\'\'' )
|
57
|
-
assert_handles_key('%{a.b}', :'a.b' )
|
58
|
-
assert_handles_key('%{ }', :' ' )
|
59
|
-
assert_handles_key('%{:}', :':' )
|
60
|
-
assert_handles_key("%{:''}", :":''" )
|
61
|
-
assert_handles_key('%{:"}', :':"' )
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_str_containing_only_escaped_interpolation_is_handled_correctly
|
65
|
-
assert_equal 'abc %{x}', compile_and_interpolate('abc %%{x}')
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_handles_weird_strings
|
69
|
-
assert_equal '#{} a', compile_and_interpolate('#{} %{a}', :a => 'a')
|
70
|
-
assert_equal '"#{abc}"', compile_and_interpolate('"#{ab%{a}c}"', :a => '' )
|
71
|
-
assert_equal 'a}', compile_and_interpolate('%{{a}}', :'{a' => 'a')
|
72
|
-
assert_equal '"', compile_and_interpolate('"%{a}', :a => '' )
|
73
|
-
assert_equal 'a%{a}', compile_and_interpolate('%{a}%%{a}', :a => 'a')
|
74
|
-
assert_equal '%%{a}', compile_and_interpolate('%%%{a}')
|
75
|
-
assert_equal '\";eval("a")', compile_and_interpolate('\";eval("%{a}")', :a => 'a')
|
76
|
-
assert_equal '\";eval("a")', compile_and_interpolate('\";eval("a")%{a}', :a => '' )
|
77
|
-
assert_equal "\na", compile_and_interpolate("\n%{a}", :a => 'a')
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_raises_exception_when_argument_is_missing
|
81
|
-
assert_raise(I18n::MissingInterpolationArgument) do
|
82
|
-
compile_and_interpolate('%{first} %{last}', :first => 'first')
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_custom_missing_interpolation_argument_handler
|
87
|
-
old_handler = I18n.config.missing_interpolation_argument_handler
|
88
|
-
I18n.config.missing_interpolation_argument_handler = lambda do |key, values, string|
|
89
|
-
"missing key is #{key}, values are #{values.inspect}, given string is '#{string}'"
|
90
|
-
end
|
91
|
-
assert_equal %|first missing key is last, values are {:first=>"first"}, given string is '%{first} %{last}'|,
|
92
|
-
compile_and_interpolate('%{first} %{last}', :first => 'first')
|
93
|
-
ensure
|
94
|
-
I18n.config.missing_interpolation_argument_handler = old_handler
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
class I18nBackendInterpolationCompilerTest < I18n::TestCase
|
99
|
-
class Backend < I18n::Backend::Simple
|
100
|
-
include I18n::Backend::InterpolationCompiler
|
101
|
-
end
|
102
|
-
|
103
|
-
include I18n::Tests::Interpolation
|
104
|
-
|
105
|
-
def setup
|
106
|
-
I18n.backend = Backend.new
|
107
|
-
super
|
108
|
-
end
|
109
|
-
|
110
|
-
# pre-compile default strings to make sure we are testing I18n::Backend::InterpolationCompiler
|
111
|
-
def interpolate(*args)
|
112
|
-
options = args.last.kind_of?(Hash) ? args.last : {}
|
113
|
-
if default_str = options[:default]
|
114
|
-
I18n::Backend::InterpolationCompiler::Compiler.compile_if_an_interpolation(default_str)
|
115
|
-
end
|
116
|
-
super
|
117
|
-
end
|
118
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class I18nBackendKeyValueTest < I18n::TestCase
|
4
|
-
def setup_backend!(subtree=true)
|
5
|
-
I18n.backend = I18n::Backend::KeyValue.new({}, subtree)
|
6
|
-
store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' })
|
7
|
-
end
|
8
|
-
|
9
|
-
def assert_flattens(expected, nested, escape=true, subtree=true)
|
10
|
-
assert_equal expected, I18n.backend.flatten_translations("en", nested, escape, subtree)
|
11
|
-
end
|
12
|
-
|
13
|
-
test "hash flattening works" do
|
14
|
-
setup_backend!
|
15
|
-
assert_flattens(
|
16
|
-
{:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}, :"b.f" => {:x=>"x"}, :"b.c"=>"c", :"b.f.x"=>"x", :"b.d"=>"d"},
|
17
|
-
{:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}}
|
18
|
-
)
|
19
|
-
assert_flattens({:a=>{:b =>['a', 'b']}, :"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}})
|
20
|
-
assert_flattens({:"a\001b" => "c"}, {:"a.b" => "c"})
|
21
|
-
assert_flattens({:"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}}, true, false)
|
22
|
-
assert_flattens({:"a.b" => "c"}, {:"a.b" => "c"}, false)
|
23
|
-
end
|
24
|
-
|
25
|
-
test "store_translations handle subtrees by default" do
|
26
|
-
setup_backend!
|
27
|
-
assert_equal({ :bar => 'bar', :baz => 'baz' }, I18n.t("foo"))
|
28
|
-
end
|
29
|
-
|
30
|
-
test "store_translations merge subtrees accordingly" do
|
31
|
-
setup_backend!
|
32
|
-
store_translations(:en, :foo => { :baz => "BAZ"})
|
33
|
-
assert_equal('BAZ', I18n.t("foo.baz"))
|
34
|
-
assert_equal({ :bar => 'bar', :baz => 'BAZ' }, I18n.t("foo"))
|
35
|
-
end
|
36
|
-
|
37
|
-
test "store_translations does not handle subtrees if desired" do
|
38
|
-
setup_backend!(false)
|
39
|
-
assert_raise I18n::MissingTranslationData do
|
40
|
-
I18n.t("foo", :raise => true)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
test "subtrees enabled: given incomplete pluralization data it raises I18n::InvalidPluralizationData" do
|
45
|
-
setup_backend!
|
46
|
-
store_translations(:en, :bar => { :one => "One" })
|
47
|
-
assert_raise(I18n::InvalidPluralizationData) { I18n.t(:bar, :count => 2) }
|
48
|
-
end
|
49
|
-
|
50
|
-
test "subtrees disabled: given incomplete pluralization data it returns an error message" do
|
51
|
-
setup_backend!(false)
|
52
|
-
store_translations(:en, :bar => { :one => "One" })
|
53
|
-
assert_equal "translation missing: en.bar", I18n.t(:bar, :count => 2)
|
54
|
-
end
|
55
|
-
|
56
|
-
test "translate handles subtrees for pluralization" do
|
57
|
-
setup_backend!(false)
|
58
|
-
store_translations(:en, :bar => { :one => "One" })
|
59
|
-
assert_equal("One", I18n.t("bar", :count => 1))
|
60
|
-
end
|
61
|
-
end if I18n::TestCase.key_value?
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
# TODO: change back to "require 'backend/simple'" when dropping support to Ruby 1.8.7.
|
3
|
-
require File.expand_path('../simple_test', __FILE__)
|
4
|
-
|
5
|
-
class I18nBackendMemoizeTest < I18nBackendSimpleTest
|
6
|
-
module MemoizeSpy
|
7
|
-
attr_accessor :spy_calls
|
8
|
-
|
9
|
-
def available_locales
|
10
|
-
self.spy_calls = (self.spy_calls || 0) + 1
|
11
|
-
super
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class MemoizeBackend < I18n::Backend::Simple
|
16
|
-
include MemoizeSpy
|
17
|
-
include I18n::Backend::Memoize
|
18
|
-
end
|
19
|
-
|
20
|
-
def setup
|
21
|
-
super
|
22
|
-
I18n.backend = MemoizeBackend.new
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_memoizes_available_locales
|
26
|
-
I18n.backend.spy_calls = 0
|
27
|
-
assert_equal I18n.available_locales, I18n.available_locales
|
28
|
-
assert_equal 1, I18n.backend.spy_calls
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_resets_available_locales_on_reload!
|
32
|
-
I18n.available_locales
|
33
|
-
I18n.backend.spy_calls = 0
|
34
|
-
I18n.reload!
|
35
|
-
assert_equal I18n.available_locales, I18n.available_locales
|
36
|
-
assert_equal 1, I18n.backend.spy_calls
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_resets_available_locales_on_store_translations
|
40
|
-
I18n.available_locales
|
41
|
-
I18n.backend.spy_calls = 0
|
42
|
-
I18n.backend.store_translations(:copa, :ca => :bana)
|
43
|
-
assert_equal I18n.available_locales, I18n.available_locales
|
44
|
-
assert I18n.available_locales.include?(:copa)
|
45
|
-
assert_equal 1, I18n.backend.spy_calls
|
46
|
-
end
|
47
|
-
|
48
|
-
module TestLookup
|
49
|
-
def lookup(locale, key, scope = [], options = {})
|
50
|
-
keys = I18n.normalize_keys(locale, key, scope, options[:separator])
|
51
|
-
keys.inspect
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_lookup_concurrent_consistency
|
56
|
-
backend_impl = Class.new(I18n::Backend::Simple) do
|
57
|
-
include TestLookup
|
58
|
-
include I18n::Backend::Memoize
|
59
|
-
end
|
60
|
-
backend = backend_impl.new
|
61
|
-
|
62
|
-
memoized_lookup = backend.send(:memoized_lookup)
|
63
|
-
|
64
|
-
assert_equal "[:foo, :scoped, :sample]", backend.translate('foo', scope = [:scoped, :sample])
|
65
|
-
|
66
|
-
results = []
|
67
|
-
30.times.inject([]) do |memo, i|
|
68
|
-
memo << Thread.new do
|
69
|
-
backend.translate('bar', scope); backend.translate(:baz, scope)
|
70
|
-
end
|
71
|
-
end.each(&:join)
|
72
|
-
|
73
|
-
memoized_lookup = backend.send(:memoized_lookup)
|
74
|
-
puts memoized_lookup.inspect if $VERBOSE
|
75
|
-
assert_equal 3, memoized_lookup.size, "NON-THREAD-SAFE lookup memoization backend: #{memoized_lookup.class}"
|
76
|
-
# if a plain Hash is used might eventually end up in a weird (inconsistent) state
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class I18nBackendMetadataTest < I18n::TestCase
|
4
|
-
class Backend < I18n::Backend::Simple
|
5
|
-
include I18n::Backend::Metadata
|
6
|
-
end
|
7
|
-
|
8
|
-
def setup
|
9
|
-
super
|
10
|
-
I18n.backend = Backend.new
|
11
|
-
store_translations(:en, :foo => 'Hi %{name}')
|
12
|
-
end
|
13
|
-
|
14
|
-
test "translation strings carry metadata" do
|
15
|
-
translation = I18n.t(:foo, :name => 'David')
|
16
|
-
assert translation.respond_to?(:translation_metadata)
|
17
|
-
assert translation.translation_metadata.is_a?(Hash)
|
18
|
-
end
|
19
|
-
|
20
|
-
test "translate adds the locale to metadata on Strings" do
|
21
|
-
assert_equal :en, I18n.t(:foo, :name => 'David', :locale => :en).translation_metadata[:locale]
|
22
|
-
end
|
23
|
-
|
24
|
-
test "translate adds the key to metadata on Strings" do
|
25
|
-
assert_equal :foo, I18n.t(:foo, :name => 'David').translation_metadata[:key]
|
26
|
-
end
|
27
|
-
|
28
|
-
test "translate adds the default to metadata on Strings" do
|
29
|
-
assert_equal 'bar', I18n.t(:foo, :default => 'bar', :name => '').translation_metadata[:default]
|
30
|
-
end
|
31
|
-
|
32
|
-
test "translation adds the interpolation values to metadata on Strings" do
|
33
|
-
assert_equal({:name => 'David'}, I18n.t(:foo, :name => 'David').translation_metadata[:values])
|
34
|
-
end
|
35
|
-
|
36
|
-
test "interpolation adds the original string to metadata on Strings" do
|
37
|
-
assert_equal('Hi %{name}', I18n.t(:foo, :name => 'David').translation_metadata[:original])
|
38
|
-
end
|
39
|
-
|
40
|
-
test "pluralization adds the count to metadata on Strings" do
|
41
|
-
assert_equal(1, I18n.t(:missing, :count => 1, :default => { :one => 'foo' }).translation_metadata[:count])
|
42
|
-
end
|
43
|
-
|
44
|
-
test "metadata works with frozen values" do
|
45
|
-
assert_equal(1, I18n.t(:missing, :count => 1, :default => 'foo'.freeze).translation_metadata[:count])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class I18nBackendPluralizationTest < I18n::TestCase
|
4
|
-
class Backend < I18n::Backend::Simple
|
5
|
-
include I18n::Backend::Pluralization
|
6
|
-
include I18n::Backend::Fallbacks
|
7
|
-
end
|
8
|
-
|
9
|
-
def setup
|
10
|
-
super
|
11
|
-
I18n.backend = Backend.new
|
12
|
-
@rule = lambda { |n| n == 1 ? :one : n == 0 || (2..10).include?(n % 100) ? :few : (11..19).include?(n % 100) ? :many : :other }
|
13
|
-
store_translations(:xx, :i18n => { :plural => { :rule => @rule } })
|
14
|
-
@entry = { :zero => 'zero', :one => 'one', :few => 'few', :many => 'many', :other => 'other' }
|
15
|
-
end
|
16
|
-
|
17
|
-
test "pluralization picks a pluralizer from :'i18n.pluralize'" do
|
18
|
-
assert_equal @rule, I18n.backend.send(:pluralizer, :xx)
|
19
|
-
end
|
20
|
-
|
21
|
-
test "pluralization picks :one for 1" do
|
22
|
-
assert_equal 'one', I18n.t(:count => 1, :default => @entry, :locale => :xx)
|
23
|
-
end
|
24
|
-
|
25
|
-
test "pluralization picks :few for 2" do
|
26
|
-
assert_equal 'few', I18n.t(:count => 2, :default => @entry, :locale => :xx)
|
27
|
-
end
|
28
|
-
|
29
|
-
test "pluralization picks :many for 11" do
|
30
|
-
assert_equal 'many', I18n.t(:count => 11, :default => @entry, :locale => :xx)
|
31
|
-
end
|
32
|
-
|
33
|
-
test "pluralization picks zero for 0 if the key is contained in the data" do
|
34
|
-
assert_equal 'zero', I18n.t(:count => 0, :default => @entry, :locale => :xx)
|
35
|
-
end
|
36
|
-
|
37
|
-
test "pluralization picks few for 0 if the key is not contained in the data" do
|
38
|
-
@entry.delete(:zero)
|
39
|
-
assert_equal 'few', I18n.t(:count => 0, :default => @entry, :locale => :xx)
|
40
|
-
end
|
41
|
-
|
42
|
-
test "Fallbacks can pick up rules from fallback locales, too" do
|
43
|
-
assert_equal @rule, I18n.backend.send(:pluralizer, :'xx-XX')
|
44
|
-
end
|
45
|
-
end
|