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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +75 -32
  3. data/lib/i18n/backend/base.rb +93 -34
  4. data/lib/i18n/backend/cache.rb +10 -11
  5. data/lib/i18n/backend/cache_file.rb +36 -0
  6. data/lib/i18n/backend/cascade.rb +3 -1
  7. data/lib/i18n/backend/chain.rb +39 -6
  8. data/lib/i18n/backend/fallbacks.rb +48 -15
  9. data/lib/i18n/backend/flatten.rb +10 -5
  10. data/lib/i18n/backend/gettext.rb +4 -2
  11. data/lib/i18n/backend/interpolation_compiler.rb +8 -8
  12. data/lib/i18n/backend/key_value.rb +31 -4
  13. data/lib/i18n/backend/lazy_loadable.rb +184 -0
  14. data/lib/i18n/backend/memoize.rb +10 -2
  15. data/lib/i18n/backend/metadata.rb +5 -3
  16. data/lib/i18n/backend/pluralization.rb +61 -18
  17. data/lib/i18n/backend/simple.rb +44 -24
  18. data/lib/i18n/backend/transliterator.rb +26 -24
  19. data/lib/i18n/backend.rb +5 -1
  20. data/lib/i18n/config.rb +22 -4
  21. data/lib/i18n/exceptions.rb +71 -18
  22. data/lib/i18n/gettext/helpers.rb +4 -2
  23. data/lib/i18n/gettext/po_parser.rb +7 -7
  24. data/lib/i18n/gettext.rb +2 -0
  25. data/lib/i18n/interpolate/ruby.rb +22 -6
  26. data/lib/i18n/locale/fallbacks.rb +33 -22
  27. data/lib/i18n/locale/tag/parents.rb +8 -6
  28. data/lib/i18n/locale/tag/simple.rb +2 -2
  29. data/lib/i18n/locale.rb +2 -0
  30. data/lib/i18n/middleware.rb +2 -0
  31. data/lib/i18n/tests/basics.rb +5 -7
  32. data/lib/i18n/tests/defaults.rb +8 -1
  33. data/lib/i18n/tests/interpolation.rb +34 -7
  34. data/lib/i18n/tests/link.rb +11 -1
  35. data/lib/i18n/tests/localization/date.rb +37 -10
  36. data/lib/i18n/tests/localization/date_time.rb +28 -7
  37. data/lib/i18n/tests/localization/procs.rb +9 -7
  38. data/lib/i18n/tests/localization/time.rb +27 -5
  39. data/lib/i18n/tests/lookup.rb +11 -5
  40. data/lib/i18n/tests/pluralization.rb +1 -1
  41. data/lib/i18n/tests/procs.rb +23 -7
  42. data/lib/i18n/tests.rb +2 -0
  43. data/lib/i18n/utils.rb +55 -0
  44. data/lib/i18n/version.rb +3 -1
  45. data/lib/i18n.rb +179 -58
  46. metadata +16 -61
  47. data/gemfiles/Gemfile.rails-3.2.x +0 -10
  48. data/gemfiles/Gemfile.rails-4.0.x +0 -10
  49. data/gemfiles/Gemfile.rails-4.1.x +0 -10
  50. data/gemfiles/Gemfile.rails-4.2.x +0 -10
  51. data/gemfiles/Gemfile.rails-5.0.x +0 -10
  52. data/gemfiles/Gemfile.rails-5.1.x +0 -10
  53. data/gemfiles/Gemfile.rails-master +0 -10
  54. data/lib/i18n/core_ext/hash.rb +0 -29
  55. data/lib/i18n/core_ext/kernel/suppress_warnings.rb +0 -8
  56. data/lib/i18n/core_ext/string/interpolate.rb +0 -9
  57. data/test/api/all_features_test.rb +0 -58
  58. data/test/api/cascade_test.rb +0 -28
  59. data/test/api/chain_test.rb +0 -24
  60. data/test/api/fallbacks_test.rb +0 -30
  61. data/test/api/key_value_test.rb +0 -24
  62. data/test/api/memoize_test.rb +0 -56
  63. data/test/api/override_test.rb +0 -42
  64. data/test/api/pluralization_test.rb +0 -30
  65. data/test/api/simple_test.rb +0 -28
  66. data/test/backend/cache_test.rb +0 -109
  67. data/test/backend/cascade_test.rb +0 -86
  68. data/test/backend/chain_test.rb +0 -122
  69. data/test/backend/exceptions_test.rb +0 -36
  70. data/test/backend/fallbacks_test.rb +0 -219
  71. data/test/backend/interpolation_compiler_test.rb +0 -118
  72. data/test/backend/key_value_test.rb +0 -61
  73. data/test/backend/memoize_test.rb +0 -79
  74. data/test/backend/metadata_test.rb +0 -48
  75. data/test/backend/pluralization_test.rb +0 -45
  76. data/test/backend/simple_test.rb +0 -103
  77. data/test/backend/transliterator_test.rb +0 -84
  78. data/test/core_ext/hash_test.rb +0 -36
  79. data/test/gettext/api_test.rb +0 -214
  80. data/test/gettext/backend_test.rb +0 -92
  81. data/test/i18n/exceptions_test.rb +0 -117
  82. data/test/i18n/gettext_plural_keys_test.rb +0 -20
  83. data/test/i18n/interpolate_test.rb +0 -91
  84. data/test/i18n/load_path_test.rb +0 -34
  85. data/test/i18n/middleware_test.rb +0 -24
  86. data/test/i18n_test.rb +0 -462
  87. data/test/locale/fallbacks_test.rb +0 -133
  88. data/test/locale/tag/rfc4646_test.rb +0 -143
  89. data/test/locale/tag/simple_test.rb +0 -32
  90. data/test/run_all.rb +0 -20
  91. data/test/test_data/locales/de.po +0 -82
  92. data/test/test_data/locales/en.rb +0 -3
  93. data/test/test_data/locales/en.yml +0 -3
  94. data/test/test_data/locales/invalid/empty.yml +0 -0
  95. data/test/test_data/locales/invalid/syntax.yml +0 -4
  96. data/test/test_data/locales/plurals.rb +0 -113
  97. 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