sayso-i18n 0.5.0.001

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG.textile +152 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +103 -0
  4. data/ci/Gemfile.no-rails +5 -0
  5. data/ci/Gemfile.no-rails.lock +14 -0
  6. data/ci/Gemfile.rails-2.3.x +9 -0
  7. data/ci/Gemfile.rails-2.3.x.lock +23 -0
  8. data/ci/Gemfile.rails-3.x +9 -0
  9. data/ci/Gemfile.rails-3.x.lock +23 -0
  10. data/lib/i18n.rb +324 -0
  11. data/lib/i18n/backend.rb +19 -0
  12. data/lib/i18n/backend/base.rb +174 -0
  13. data/lib/i18n/backend/cache.rb +102 -0
  14. data/lib/i18n/backend/cascade.rb +53 -0
  15. data/lib/i18n/backend/chain.rb +80 -0
  16. data/lib/i18n/backend/fallbacks.rb +70 -0
  17. data/lib/i18n/backend/flatten.rb +113 -0
  18. data/lib/i18n/backend/flatten_yml.rb +70 -0
  19. data/lib/i18n/backend/gettext.rb +71 -0
  20. data/lib/i18n/backend/interpolation_compiler.rb +121 -0
  21. data/lib/i18n/backend/key_value.rb +100 -0
  22. data/lib/i18n/backend/memoize.rb +46 -0
  23. data/lib/i18n/backend/metadata.rb +65 -0
  24. data/lib/i18n/backend/pluralization.rb +55 -0
  25. data/lib/i18n/backend/simple.rb +87 -0
  26. data/lib/i18n/backend/transliterator.rb +98 -0
  27. data/lib/i18n/config.rb +86 -0
  28. data/lib/i18n/core_ext/hash.rb +29 -0
  29. data/lib/i18n/core_ext/kernel/surpress_warnings.rb +9 -0
  30. data/lib/i18n/core_ext/string/interpolate.rb +105 -0
  31. data/lib/i18n/exceptions.rb +88 -0
  32. data/lib/i18n/gettext.rb +25 -0
  33. data/lib/i18n/gettext/helpers.rb +64 -0
  34. data/lib/i18n/gettext/po_parser.rb +329 -0
  35. data/lib/i18n/interpolate/ruby.rb +31 -0
  36. data/lib/i18n/locale.rb +6 -0
  37. data/lib/i18n/locale/fallbacks.rb +96 -0
  38. data/lib/i18n/locale/tag.rb +28 -0
  39. data/lib/i18n/locale/tag/parents.rb +22 -0
  40. data/lib/i18n/locale/tag/rfc4646.rb +74 -0
  41. data/lib/i18n/locale/tag/simple.rb +39 -0
  42. data/lib/i18n/tests.rb +12 -0
  43. data/lib/i18n/tests/basics.rb +54 -0
  44. data/lib/i18n/tests/defaults.rb +40 -0
  45. data/lib/i18n/tests/interpolation.rb +133 -0
  46. data/lib/i18n/tests/link.rb +56 -0
  47. data/lib/i18n/tests/localization.rb +19 -0
  48. data/lib/i18n/tests/localization/date.rb +84 -0
  49. data/lib/i18n/tests/localization/date_time.rb +77 -0
  50. data/lib/i18n/tests/localization/procs.rb +116 -0
  51. data/lib/i18n/tests/localization/time.rb +76 -0
  52. data/lib/i18n/tests/lookup.rb +74 -0
  53. data/lib/i18n/tests/pluralization.rb +35 -0
  54. data/lib/i18n/tests/procs.rb +55 -0
  55. data/lib/i18n/version.rb +3 -0
  56. data/test/all.rb +8 -0
  57. data/test/api/all_features_test.rb +58 -0
  58. data/test/api/cascade_test.rb +28 -0
  59. data/test/api/chain_test.rb +24 -0
  60. data/test/api/fallbacks_test.rb +30 -0
  61. data/test/api/flatten_yml_test.rb +32 -0
  62. data/test/api/key_value_test.rb +28 -0
  63. data/test/api/memoize_test.rb +60 -0
  64. data/test/api/pluralization_test.rb +30 -0
  65. data/test/api/simple_test.rb +28 -0
  66. data/test/backend/cache_test.rb +83 -0
  67. data/test/backend/cascade_test.rb +85 -0
  68. data/test/backend/chain_test.rb +72 -0
  69. data/test/backend/exceptions_test.rb +23 -0
  70. data/test/backend/fallbacks_test.rb +120 -0
  71. data/test/backend/flatten_yml_test.rb +49 -0
  72. data/test/backend/interpolation_compiler_test.rb +102 -0
  73. data/test/backend/key_value_test.rb +46 -0
  74. data/test/backend/memoize_test.rb +47 -0
  75. data/test/backend/metadata_test.rb +67 -0
  76. data/test/backend/pluralization_test.rb +44 -0
  77. data/test/backend/simple_test.rb +83 -0
  78. data/test/backend/transliterator_test.rb +81 -0
  79. data/test/core_ext/hash_test.rb +30 -0
  80. data/test/core_ext/string/interpolate_test.rb +99 -0
  81. data/test/gettext/api_test.rb +206 -0
  82. data/test/gettext/backend_test.rb +93 -0
  83. data/test/i18n/exceptions_test.rb +116 -0
  84. data/test/i18n/interpolate_test.rb +61 -0
  85. data/test/i18n/load_path_test.rb +26 -0
  86. data/test/i18n_test.rb +236 -0
  87. data/test/locale/fallbacks_test.rb +124 -0
  88. data/test/locale/tag/rfc4646_test.rb +142 -0
  89. data/test/locale/tag/simple_test.rb +32 -0
  90. data/test/run_all.rb +21 -0
  91. data/test/test_data/locales/de.po +72 -0
  92. data/test/test_data/locales/en.rb +3 -0
  93. data/test/test_data/locales/en.yml +3 -0
  94. data/test/test_data/locales/invalid/empty.yml +1 -0
  95. data/test/test_data/locales/plurals.rb +113 -0
  96. data/test/test_helper.rb +56 -0
  97. metadata +194 -0
@@ -0,0 +1,206 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+ require 'i18n/gettext/helpers'
4
+
5
+ include I18n::Gettext::Helpers
6
+
7
+ class I18nGettextApiTest < Test::Unit::TestCase
8
+ def setup
9
+ I18n.locale = :en
10
+ I18n.backend.store_translations :de, {
11
+ 'Hi Gettext!' => 'Hallo Gettext!',
12
+ 'Sentence 1. Sentence 2.' => 'Satz 1. Satz 2.',
13
+ "An apple" => { :one => 'Ein Apfel', :other => '%{count} Äpfel' },
14
+ :special => { "A special apple" => { :one => 'Ein spezieller Apfel', :other => '%{count} spezielle Äpfel' } },
15
+ :foo => { :bar => 'bar-de' },
16
+ 'foo.bar' => 'Foo Bar'
17
+ }, :separator => '|'
18
+ end
19
+
20
+ # gettext
21
+ def test_gettext_uses_msg_as_default
22
+ assert_equal 'Hi Gettext!', _('Hi Gettext!')
23
+ end
24
+
25
+ def test_gettext_uses_msg_as_key
26
+ I18n.locale = :de
27
+ assert_equal 'Hallo Gettext!', gettext('Hi Gettext!')
28
+ assert_equal 'Hallo Gettext!', _('Hi Gettext!')
29
+ end
30
+
31
+ def test_gettext_uses_msg_containing_dots_as_default
32
+ assert_equal 'Sentence 1. Sentence 2.', gettext('Sentence 1. Sentence 2.')
33
+ assert_equal 'Sentence 1. Sentence 2.', _('Sentence 1. Sentence 2.')
34
+ end
35
+
36
+ def test_gettext_uses_msg_containing_dots_as_key
37
+ I18n.locale = :de
38
+ assert_equal 'Satz 1. Satz 2.', gettext('Sentence 1. Sentence 2.')
39
+ assert_equal 'Satz 1. Satz 2.', _('Sentence 1. Sentence 2.')
40
+ end
41
+
42
+ # sgettext
43
+ def test_sgettext_defaults_to_the_last_token_of_a_scoped_msgid
44
+ assert_equal 'bar', sgettext('foo|bar')
45
+ assert_equal 'bar', s_('foo|bar')
46
+ end
47
+
48
+ def test_sgettext_looks_up_a_scoped_translation
49
+ I18n.locale = :de
50
+ assert_equal 'bar-de', sgettext('foo|bar')
51
+ assert_equal 'bar-de', s_('foo|bar')
52
+ end
53
+
54
+ def test_sgettext_ignores_dots
55
+ I18n.locale = :de
56
+ assert_equal 'Foo Bar', sgettext('foo.bar')
57
+ assert_equal 'Foo Bar', s_('foo.bar')
58
+ end
59
+
60
+ # pgettext
61
+ def test_pgettext_defaults_to_msgid
62
+ assert_equal 'bar', pgettext('foo', 'bar')
63
+ assert_equal 'bar', p_('foo', 'bar')
64
+ end
65
+
66
+ def test_pgettext_looks_up_a_scoped_translation
67
+ I18n.locale = :de
68
+ assert_equal 'bar-de', pgettext('foo', 'bar')
69
+ assert_equal 'bar-de', p_('foo', 'bar')
70
+ end
71
+
72
+ # ngettext
73
+ def test_ngettext_looks_up_msg_id_as_default_singular
74
+ assert_equal 'An apple', ngettext('An apple', '%{count} apples', 1)
75
+ assert_equal 'An apple', n_('An apple', '%{count} apples', 1)
76
+ end
77
+
78
+ def test_ngettext_looks_up_msg_id_plural_as_default_plural
79
+ assert_equal '2 apples', ngettext('An apple', '%{count} apples', 2)
80
+ assert_equal '2 apples', n_('An apple', '%{count} apples', 2)
81
+ end
82
+
83
+ def test_ngettext_looks_up_a_singular
84
+ I18n.locale = :de
85
+ assert_equal 'Ein Apfel', ngettext('An apple', '%{count} apples', 1)
86
+ assert_equal 'Ein Apfel', n_('An apple', '%{count} apples', 1)
87
+ end
88
+
89
+ def test_ngettext_looks_up_a_plural
90
+ I18n.locale = :de
91
+ assert_equal '2 Äpfel', ngettext('An apple', '%{count} apples', 2)
92
+ assert_equal '2 Äpfel', n_('An apple', '%{count} apples', 2)
93
+ end
94
+
95
+ def test_ngettext_looks_up_msg_id_as_default_singular_with_alternative_syntax
96
+ assert_equal 'An apple', ngettext(['An apple', '%{count} apples'], 1)
97
+ assert_equal 'An apple', n_(['An apple', '%{count} apples'], 1)
98
+ end
99
+
100
+ def test_ngettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax
101
+ assert_equal '2 apples', ngettext(['An apple', '%{count} apples'], 2)
102
+ assert_equal '2 apples', n_(['An apple', '%{count} apples'], 2)
103
+ end
104
+
105
+ def test_ngettext_looks_up_a_singular_with_alternative_syntax
106
+ I18n.locale = :de
107
+ assert_equal 'Ein Apfel', ngettext(['An apple', '%{count} apples'], 1)
108
+ assert_equal 'Ein Apfel', n_(['An apple', '%{count} apples'], 1)
109
+ end
110
+
111
+ def test_ngettext_looks_up_a_plural_with_alternative_syntax
112
+ I18n.locale = :de
113
+ assert_equal '2 Äpfel', ngettext(['An apple', '%{count} apples'], 2)
114
+ assert_equal '2 Äpfel', n_(['An apple', '%{count} apples'], 2)
115
+ end
116
+
117
+ # nsgettext
118
+ def test_nsgettext_looks_up_msg_id_as_default_singular
119
+ assert_equal 'A special apple', nsgettext('special|A special apple', '%{count} special apples', 1)
120
+ assert_equal 'A special apple', ns_('special|A special apple', '%{count} special apples', 1)
121
+ end
122
+
123
+ def test_nsgettext_looks_up_msg_id_plural_as_default_plural
124
+ assert_equal '2 special apples', nsgettext('special|A special apple', '%{count} special apples', 2)
125
+ assert_equal '2 special apples', ns_('special|A special apple', '%{count} special apples', 2)
126
+ end
127
+
128
+ def test_nsgettext_looks_up_a_singular
129
+ I18n.locale = :de
130
+ assert_equal 'Ein spezieller Apfel', nsgettext('special|A special apple', '%{count} special apples', 1)
131
+ assert_equal 'Ein spezieller Apfel', ns_('special|A special apple', '%{count} special apples', 1)
132
+ end
133
+
134
+ def test_nsgettext_looks_up_a_plural
135
+ I18n.locale = :de
136
+ assert_equal '2 spezielle Äpfel', nsgettext('special|A special apple', '%{count} special apples', 2)
137
+ assert_equal '2 spezielle Äpfel', ns_('special|A special apple', '%{count} special apples', 2)
138
+ end
139
+
140
+ def test_nsgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax
141
+ assert_equal 'A special apple', nsgettext(['special|A special apple', '%{count} special apples'], 1)
142
+ assert_equal 'A special apple', ns_(['special|A special apple', '%{count} special apples'], 1)
143
+ end
144
+
145
+ def test_nsgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax
146
+ assert_equal '2 special apples', nsgettext(['special|A special apple', '%{count} special apples'], 2)
147
+ assert_equal '2 special apples', ns_(['special|A special apple', '%{count} special apples'], 2)
148
+ end
149
+
150
+ def test_nsgettext_looks_up_a_singular_with_alternative_syntax
151
+ I18n.locale = :de
152
+ assert_equal 'Ein spezieller Apfel', nsgettext(['special|A special apple', '%{count} special apples'], 1)
153
+ assert_equal 'Ein spezieller Apfel', ns_(['special|A special apple', '%{count} special apples'], 1)
154
+ end
155
+
156
+ def test_nsgettext_looks_up_a_plural_with_alternative_syntax
157
+ I18n.locale = :de
158
+ assert_equal '2 spezielle Äpfel', nsgettext(['special|A special apple', '%{count} special apples'], 2)
159
+ assert_equal '2 spezielle Äpfel', ns_(['special|A special apple', '%{count} special apples'], 2)
160
+ end
161
+
162
+ # npgettext
163
+ def test_npgettext_looks_up_msg_id_as_default_singular
164
+ assert_equal 'A special apple', npgettext('special', 'A special apple', '%{count} special apples', 1)
165
+ assert_equal 'A special apple', np_('special', 'A special apple', '%{count} special apples', 1)
166
+ end
167
+
168
+ def test_npgettext_looks_up_msg_id_plural_as_default_plural
169
+ assert_equal '2 special apples', npgettext('special', 'A special apple', '%{count} special apples', 2)
170
+ assert_equal '2 special apples', np_('special', 'A special apple', '%{count} special apples', 2)
171
+ end
172
+
173
+ def test_npgettext_looks_up_a_singular
174
+ I18n.locale = :de
175
+ assert_equal 'Ein spezieller Apfel', npgettext('special', 'A special apple', '%{count} special apples', 1)
176
+ assert_equal 'Ein spezieller Apfel', np_('special', 'A special apple', '%{count} special apples', 1)
177
+ end
178
+
179
+ def test_npgettext_looks_up_a_plural
180
+ I18n.locale = :de
181
+ assert_equal '2 spezielle Äpfel', npgettext('special', 'A special apple', '%{count} special apples', 2)
182
+ assert_equal '2 spezielle Äpfel', np_('special', 'A special apple', '%{count} special apples', 2)
183
+ end
184
+
185
+ def test_npgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax
186
+ assert_equal 'A special apple', npgettext('special', ['A special apple', '%{count} special apples'], 1)
187
+ assert_equal 'A special apple', np_('special', ['A special apple', '%{count} special apples'], 1)
188
+ end
189
+
190
+ def test_npgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax
191
+ assert_equal '2 special apples', npgettext('special', ['A special apple', '%{count} special apples'], 2)
192
+ assert_equal '2 special apples', np_('special', ['A special apple', '%{count} special apples'], 2)
193
+ end
194
+
195
+ def test_npgettext_looks_up_a_singular_with_alternative_syntax
196
+ I18n.locale = :de
197
+ assert_equal 'Ein spezieller Apfel', npgettext('special', ['A special apple', '%{count} special apples'], 1)
198
+ assert_equal 'Ein spezieller Apfel', np_('special', ['A special apple', '%{count} special apples'], 1)
199
+ end
200
+
201
+ def test_npgettext_looks_up_a_plural_with_alternative_syntax
202
+ I18n.locale = :de
203
+ assert_equal '2 spezielle Äpfel', npgettext('special', ['A special apple', '%{count} special apples'], 2)
204
+ assert_equal '2 spezielle Äpfel', np_('special', ['A special apple', '%{count} special apples'], 2)
205
+ end
206
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test_helper'
4
+
5
+ # apparently Ruby 1.9.1p129 has encoding problems with the gettext po parser
6
+ unless RUBY_VERSION == '1.9.1' && RUBY_PATCHLEVEL <= 129
7
+
8
+ class I18nGettextBackendTest < Test::Unit::TestCase
9
+ include I18n::Gettext::Helpers
10
+
11
+ class Backend < I18n::Backend::Simple
12
+ include I18n::Backend::Gettext
13
+ end
14
+
15
+ def setup
16
+ I18n.backend = Backend.new
17
+ I18n.locale = :en
18
+ I18n.load_path = ["#{locales_dir}/de.po"]
19
+ @old_separator, I18n.default_separator = I18n.default_separator, '|'
20
+ end
21
+
22
+ def teardown
23
+ I18n.load_path = nil
24
+ I18n.backend = nil
25
+ I18n.default_separator = @old_separator
26
+ end
27
+
28
+ def test_backend_loads_po_file
29
+ I18n.backend.send(:init_translations)
30
+ assert I18n.backend.send(:translations)[:de][:"Axis"]
31
+ end
32
+
33
+ def test_looks_up_a_translation
34
+ I18n.locale = :de
35
+ assert_equal 'Auto', gettext('car')
36
+ end
37
+
38
+ def test_uses_default_translation
39
+ assert_equal 'car', gettext('car')
40
+ end
41
+
42
+ def test_looks_up_a_namespaced_translation
43
+ I18n.locale = :de
44
+ assert_equal 'Räderzahl', sgettext('Car|Wheels count')
45
+ assert_equal 'Räderzahl', pgettext('Car', 'Wheels count')
46
+ end
47
+
48
+ def test_uses_namespaced_default_translation
49
+ assert_equal 'Wheels count', sgettext('Car|Wheels count')
50
+ assert_equal 'Wheels count', pgettext('Car', 'Wheels count')
51
+ end
52
+
53
+ def test_pluralizes_entry
54
+ I18n.locale = :de
55
+ assert_equal 'Achse', ngettext('Axis', 'Axis', 1)
56
+ assert_equal 'Achsen', ngettext('Axis', 'Axis', 2)
57
+ end
58
+
59
+ def test_pluralizes_default_entry
60
+ assert_equal 'Axis', ngettext('Axis', 'Axis', 1)
61
+ assert_equal 'Axis', ngettext('Axis', 'Axis', 2)
62
+ end
63
+
64
+ def test_pluralizes_namespaced_entry
65
+ I18n.locale = :de
66
+ assert_equal 'Rad', nsgettext('Car|wheel', 'wheels', 1)
67
+ assert_equal 'Räder', nsgettext('Car|wheel', 'wheels', 2)
68
+ assert_equal 'Rad', npgettext('Car', 'wheel', 'wheels', 1)
69
+ assert_equal 'Räder', npgettext('Car', 'wheel', 'wheels', 2)
70
+ end
71
+
72
+ def test_pluralizes_namespaced_default_entry
73
+ assert_equal 'wheel', nsgettext('Car|wheel', 'wheels', 1)
74
+ assert_equal 'wheels', nsgettext('Car|wheel', 'wheels', 2)
75
+ assert_equal 'wheel', npgettext('Car', 'wheel', 'wheels', 1)
76
+ assert_equal 'wheels', npgettext('Car', 'wheel', 'wheels', 2)
77
+ end
78
+
79
+ def test_pluralizes_namespaced_entry_with_alternative_syntax
80
+ I18n.locale = :de
81
+ assert_equal 'Rad', nsgettext(['Car|wheel', 'wheels'], 1)
82
+ assert_equal 'Räder', nsgettext(['Car|wheel', 'wheels'], 2)
83
+ assert_equal 'Rad', npgettext('Car', ['wheel', 'wheels'], 1)
84
+ assert_equal 'Räder', npgettext('Car', ['wheel', 'wheels'], 2)
85
+ end
86
+
87
+ def test_ngettextpluralizes_entry_with_dots
88
+ I18n.locale = :de
89
+ assert_equal 'Auf 1 Achse.', n_("On %{count} wheel.", "On %{count} wheels.", 1)
90
+ assert_equal 'Auf 2 Achsen.', n_("On %{count} wheel.", "On %{count} wheels.", 2)
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ class I18nExceptionsTest < Test::Unit::TestCase
4
+ def test_invalid_locale_stores_locale
5
+ force_invalid_locale
6
+ rescue I18n::ArgumentError => e
7
+ assert_nil exception.locale
8
+ end
9
+
10
+ test "passing an invalid locale raises an InvalidLocale exception" do
11
+ force_invalid_locale do |exception|
12
+ assert_equal 'nil is not a valid locale', exception.message
13
+ end
14
+ end
15
+
16
+ test "MissingTranslationData exception stores locale, key and options" do
17
+ force_missing_translation_data do |exception|
18
+ assert_equal 'de', exception.locale
19
+ assert_equal :foo, exception.key
20
+ assert_equal({:scope => :bar}, exception.options)
21
+ end
22
+ end
23
+
24
+ test "MissingTranslationData message contains the locale and scoped key" do
25
+ force_missing_translation_data do |exception|
26
+ assert_equal 'translation missing: de.bar.foo', exception.message
27
+ end
28
+ end
29
+
30
+ test "MissingTranslationData html_message is a span with the titlelized last key token" do
31
+ force_missing_translation_data do |exception|
32
+ assert_equal '<span class="translation_missing" title="translation missing: de.bar.foo">Foo</span>', exception.html_message
33
+ end
34
+ end
35
+
36
+ test "ExceptionHandler returns the html_message if :rescue_format => :html was given" do
37
+ message = force_missing_translation_data(:rescue_format => :html)
38
+ assert_equal '<span class="translation_missing" title="translation missing: de.bar.foo">Foo</span>', message
39
+ end
40
+
41
+ test "InvalidPluralizationData stores entry and count" do
42
+ force_invalid_pluralization_data do |exception|
43
+ assert_equal [:bar], exception.entry
44
+ assert_equal 1, exception.count
45
+ end
46
+ end
47
+
48
+ test "InvalidPluralizationData message contains count and data" do
49
+ force_invalid_pluralization_data do |exception|
50
+ assert_equal 'translation data [:bar] can not be used with :count => 1', exception.message
51
+ end
52
+ end
53
+
54
+ test "MissingInterpolationArgument stores key and string" do
55
+ assert_raise(I18n::MissingInterpolationArgument) { force_missing_interpolation_argument }
56
+ force_missing_interpolation_argument do |exception|
57
+ # assert_equal :bar, exception.key
58
+ assert_equal "%{bar}", exception.string
59
+ end
60
+ end
61
+
62
+ test "MissingInterpolationArgument message contains the missing and given arguments" do
63
+ force_missing_interpolation_argument do |exception|
64
+ assert_equal 'missing interpolation argument in "%{bar}" ({:baz=>"baz"} given)', exception.message
65
+ end
66
+ end
67
+
68
+ test "ReservedInterpolationKey stores key and string" do
69
+ force_reserved_interpolation_key do |exception|
70
+ assert_equal :scope, exception.key
71
+ assert_equal "%{scope}", exception.string
72
+ end
73
+ end
74
+
75
+ test "ReservedInterpolationKey message contains the reserved key" do
76
+ force_reserved_interpolation_key do |exception|
77
+ assert_equal 'reserved key :scope used in "%{scope}"', exception.message
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ def force_invalid_locale
84
+ I18n.translate(:foo, :locale => nil)
85
+ rescue I18n::ArgumentError => e
86
+ block_given? ? yield(e) : raise(e)
87
+ end
88
+
89
+ def force_missing_translation_data(options = {})
90
+ I18n.backend.store_translations('de', :bar => nil)
91
+ I18n.translate(:foo, options.merge(:scope => :bar, :locale => :de))
92
+ rescue I18n::ArgumentError => e
93
+ block_given? ? yield(e) : raise(e)
94
+ end
95
+
96
+ def force_invalid_pluralization_data
97
+ I18n.backend.store_translations('de', :foo => [:bar])
98
+ I18n.translate(:foo, :count => 1, :locale => :de)
99
+ rescue I18n::ArgumentError => e
100
+ block_given? ? yield(e) : raise(e)
101
+ end
102
+
103
+ def force_missing_interpolation_argument
104
+ I18n.backend.store_translations('de', :foo => "%{bar}")
105
+ I18n.translate(:foo, :baz => 'baz', :locale => :de)
106
+ rescue I18n::ArgumentError => e
107
+ block_given? ? yield(e) : raise(e)
108
+ end
109
+
110
+ def force_reserved_interpolation_key
111
+ I18n.backend.store_translations('de', :foo => "%{scope}")
112
+ I18n.translate(:foo, :baz => 'baz', :locale => :de)
113
+ rescue I18n::ArgumentError => e
114
+ block_given? ? yield(e) : raise(e)
115
+ end
116
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+ require 'i18n/core_ext/string/interpolate'
3
+
4
+ # thanks to Masao's String extensions, some tests taken from Masao's tests
5
+ # http://github.com/mutoh/gettext/blob/edbbe1fa8238fa12c7f26f2418403015f0270e47/test/test_string.rb
6
+
7
+ class I18nInterpolateTest < Test::Unit::TestCase
8
+ test "String interpolates a hash argument w/ named placeholders" do
9
+ assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh' )
10
+ end
11
+
12
+ test "String interpolates a hash argument w/ named placeholders (reverse order)" do
13
+ assert_equal "Mutoh, Masao", I18n.interpolate("%{last}, %{first}", :first => 'Masao', :last => 'Mutoh' )
14
+ end
15
+
16
+ test "String interpolates named placeholders with sprintf syntax" do
17
+ assert_equal "10, 43.4", I18n.interpolate("%<integer>d, %<float>.1f", :integer => 10, :float => 43.4)
18
+ end
19
+
20
+ test "String interpolates named placeholders with sprintf syntax, does not recurse" do
21
+ assert_equal "%<not_translated>s", I18n.interpolate("%{msg}", :msg => '%<not_translated>s', :not_translated => 'should not happen' )
22
+ end
23
+
24
+ test "String interpolation does not replace anything when no placeholders are given" do
25
+ assert_equal "aaa", I18n.interpolate("aaa", :num => 1)
26
+ end
27
+
28
+ test "String interpolation sprintf behaviour equals Ruby 1.9 behaviour" do
29
+ assert_equal "1", I18n.interpolate("%<num>d", :num => 1)
30
+ assert_equal "0b1", I18n.interpolate("%<num>#b", :num => 1)
31
+ assert_equal "foo", I18n.interpolate("%<msg>s", :msg => "foo")
32
+ assert_equal "1.000000", I18n.interpolate("%<num>f", :num => 1.0)
33
+ assert_equal " 1", I18n.interpolate("%<num>3.0f", :num => 1.0)
34
+ assert_equal "100.00", I18n.interpolate("%<num>2.2f", :num => 100.0)
35
+ assert_equal "0x64", I18n.interpolate("%<num>#x", :num => 100.0)
36
+ assert_raise(ArgumentError) { I18n.interpolate("%<num>,d", :num => 100) }
37
+ assert_raise(ArgumentError) { I18n.interpolate("%<num>/d", :num => 100) }
38
+ end
39
+
40
+ test "String interpolation raises an I18n::MissingInterpolationArgument when the string has extra placeholders" do
41
+ assert_raise(I18n::MissingInterpolationArgument) do # Ruby 1.9 msg: "key not found"
42
+ I18n.interpolate("%{first} %{last}", :first => 'Masao')
43
+ end
44
+ end
45
+
46
+ test "String interpolation does not raise when extra values were passed" do
47
+ assert_nothing_raised do
48
+ assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh', :salutation => 'Mr.' )
49
+ end
50
+ end
51
+
52
+ test "% acts as escape character in String interpolation" do
53
+ assert_equal "%{first}", I18n.interpolate("%%{first}", :first => 'Masao')
54
+ assert_equal "% 1", I18n.interpolate("%% %<num>d", :num => 1.0)
55
+ assert_equal "%{num} %<num>d", I18n.interpolate("%%{num} %%<num>d", :num => 1)
56
+ end
57
+
58
+ def test_sprintf_mix_unformatted_and_formatted_named_placeholders
59
+ assert_equal "foo 1.000000", I18n.interpolate("%{name} %<num>f", :name => "foo", :num => 1.0)
60
+ end
61
+ end