i18n 0.4.0 → 1.14.4

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +0 -0
  3. data/README.md +127 -0
  4. data/lib/i18n/backend/base.rb +189 -111
  5. data/lib/i18n/backend/cache.rb +58 -22
  6. data/lib/i18n/backend/cache_file.rb +36 -0
  7. data/lib/i18n/backend/cascade.rb +9 -10
  8. data/lib/i18n/backend/chain.rb +95 -42
  9. data/lib/i18n/backend/fallbacks.rb +68 -22
  10. data/lib/i18n/backend/flatten.rb +13 -8
  11. data/lib/i18n/backend/gettext.rb +33 -25
  12. data/lib/i18n/backend/interpolation_compiler.rb +12 -14
  13. data/lib/i18n/backend/key_value.rb +112 -10
  14. data/lib/i18n/backend/lazy_loadable.rb +184 -0
  15. data/lib/i18n/backend/memoize.rb +13 -7
  16. data/lib/i18n/backend/metadata.rb +12 -6
  17. data/lib/i18n/backend/pluralization.rb +64 -25
  18. data/lib/i18n/backend/simple.rb +44 -18
  19. data/lib/i18n/backend/transliterator.rb +43 -33
  20. data/lib/i18n/backend.rb +5 -3
  21. data/lib/i18n/config.rb +91 -10
  22. data/lib/i18n/exceptions.rb +118 -22
  23. data/lib/i18n/gettext/helpers.rb +14 -4
  24. data/lib/i18n/gettext/po_parser.rb +7 -7
  25. data/lib/i18n/gettext.rb +6 -5
  26. data/lib/i18n/interpolate/ruby.rb +53 -0
  27. data/lib/i18n/locale/fallbacks.rb +33 -26
  28. data/lib/i18n/locale/tag/parents.rb +8 -8
  29. data/lib/i18n/locale/tag/rfc4646.rb +0 -2
  30. data/lib/i18n/locale/tag/simple.rb +2 -4
  31. data/lib/i18n/locale.rb +2 -0
  32. data/lib/i18n/middleware.rb +17 -0
  33. data/lib/i18n/tests/basics.rb +58 -0
  34. data/lib/i18n/tests/defaults.rb +52 -0
  35. data/lib/i18n/tests/interpolation.rb +167 -0
  36. data/lib/i18n/tests/link.rb +66 -0
  37. data/lib/i18n/tests/localization/date.rb +122 -0
  38. data/lib/i18n/tests/localization/date_time.rb +103 -0
  39. data/lib/i18n/tests/localization/procs.rb +118 -0
  40. data/lib/i18n/tests/localization/time.rb +103 -0
  41. data/lib/i18n/tests/localization.rb +19 -0
  42. data/lib/i18n/tests/lookup.rb +81 -0
  43. data/lib/i18n/tests/pluralization.rb +35 -0
  44. data/lib/i18n/tests/procs.rb +66 -0
  45. data/lib/i18n/tests.rb +14 -0
  46. data/lib/i18n/utils.rb +55 -0
  47. data/lib/i18n/version.rb +3 -1
  48. data/lib/i18n.rb +200 -87
  49. metadata +64 -56
  50. data/CHANGELOG.textile +0 -135
  51. data/README.textile +0 -93
  52. data/lib/i18n/backend/active_record/missing.rb +0 -65
  53. data/lib/i18n/backend/active_record/store_procs.rb +0 -38
  54. data/lib/i18n/backend/active_record/translation.rb +0 -93
  55. data/lib/i18n/backend/active_record.rb +0 -61
  56. data/lib/i18n/backend/cldr.rb +0 -100
  57. data/lib/i18n/core_ext/hash.rb +0 -29
  58. data/lib/i18n/core_ext/string/interpolate.rb +0 -98
data/lib/i18n.rb CHANGED
@@ -1,22 +1,57 @@
1
- # encoding: utf-8
2
-
3
- # Authors:: Sven Fuchs (http://www.artweb-design.de),
4
- # Joshua Harvey (http://www.workingwithrails.com/person/759-joshua-harvey),
5
- # Stephan Soller (http://www.arkanis-development.de/),
6
- # Saimon Moore (http://saimonmoore.net),
7
- # Matt Aimonetti (http://railsontherun.com/)
8
- # Copyright:: Copyright (c) 2008 The Ruby i18n Team
9
- # License:: MIT
1
+ # frozen_string_literal: true
2
+
3
+ require 'concurrent/map'
4
+ require 'concurrent/hash'
5
+
6
+ require 'i18n/version'
7
+ require 'i18n/utils'
10
8
  require 'i18n/exceptions'
11
- require 'i18n/core_ext/string/interpolate'
9
+ require 'i18n/interpolate/ruby'
12
10
 
13
11
  module I18n
14
12
  autoload :Backend, 'i18n/backend'
15
13
  autoload :Config, 'i18n/config'
16
14
  autoload :Gettext, 'i18n/gettext'
17
15
  autoload :Locale, 'i18n/locale'
16
+ autoload :Tests, 'i18n/tests'
17
+ autoload :Middleware, 'i18n/middleware'
18
+
19
+ RESERVED_KEYS = %i[
20
+ cascade
21
+ deep_interpolation
22
+ default
23
+ exception_handler
24
+ fallback
25
+ fallback_in_progress
26
+ fallback_original_locale
27
+ format
28
+ object
29
+ raise
30
+ resolve
31
+ scope
32
+ separator
33
+ throw
34
+ ]
35
+ EMPTY_HASH = {}.freeze
36
+
37
+ def self.new_double_nested_cache # :nodoc:
38
+ Concurrent::Map.new { |h, k| h[k] = Concurrent::Map.new }
39
+ end
40
+
41
+ # Marks a key as reserved. Reserved keys are used internally,
42
+ # and can't also be used for interpolation. If you are using any
43
+ # extra keys as I18n options, you should call I18n.reserve_key
44
+ # before any I18n.translate (etc) calls are made.
45
+ def self.reserve_key(key)
46
+ RESERVED_KEYS << key.to_sym
47
+ @reserved_keys_pattern = nil
48
+ end
18
49
 
19
- class << self
50
+ def self.reserved_keys_pattern # :nodoc:
51
+ @reserved_keys_pattern ||= /%\{(#{RESERVED_KEYS.join("|")})\}/
52
+ end
53
+
54
+ module Base
20
55
  # Gets I18n configuration object.
21
56
  def config
22
57
  Thread.current[:i18n_config] ||= I18n::Config.new
@@ -29,7 +64,7 @@ module I18n
29
64
 
30
65
  # Write methods which delegates to the configuration object
31
66
  %w(locale backend default_locale available_locales default_separator
32
- exception_handler load_path).each do |method|
67
+ exception_handler load_path enforce_available_locales).each do |method|
33
68
  module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1
34
69
  def #{method}
35
70
  config.#{method}
@@ -45,9 +80,17 @@ module I18n
45
80
  # Rails development environment. Backends can implement whatever strategy
46
81
  # is useful.
47
82
  def reload!
83
+ config.clear_available_locales_set
48
84
  config.backend.reload!
49
85
  end
50
86
 
87
+ # Tells the backend to load translations now. Used in situations like the
88
+ # Rails production environment. Backends can implement whatever strategy
89
+ # is useful.
90
+ def eager_load!
91
+ config.backend.eager_load!
92
+ end
93
+
51
94
  # Translates, pluralizes and interpolates a given key using a given locale,
52
95
  # scope, and default, as well as interpolation values.
53
96
  #
@@ -87,7 +130,7 @@ module I18n
87
130
  # *PLURALIZATION*
88
131
  #
89
132
  # Translation data can contain pluralized translations. Pluralized translations
90
- # are arrays of singluar/plural versions of translations like <tt>['Foo', 'Foos']</tt>.
133
+ # are arrays of singular/plural versions of translations like <tt>['Foo', 'Foos']</tt>.
91
134
  #
92
135
  # Note that <tt>I18n::Backend::Simple</tt> only supports an algorithm for English
93
136
  # pluralization rules. Other algorithms can be supported by custom backends.
@@ -135,32 +178,67 @@ module I18n
135
178
  # called and passed the key and options.
136
179
  #
137
180
  # E.g. assuming the key <tt>:salutation</tt> resolves to:
138
- # lambda { |key, options| options[:gender] == 'm' ? "Mr. %{options[:name]}" : "Mrs. %{options[:name]}" }
181
+ # lambda { |key, options| options[:gender] == 'm' ? "Mr. #{options[:name]}" : "Mrs. #{options[:name]}" }
139
182
  #
140
183
  # Then <tt>I18n.t(:salutation, :gender => 'w', :name => 'Smith') will result in "Mrs. Smith".
141
184
  #
185
+ # Note that the string returned by lambda will go through string interpolation too,
186
+ # so the following lambda would give the same result:
187
+ # lambda { |key, options| options[:gender] == 'm' ? "Mr. %{name}" : "Mrs. %{name}" }
188
+ #
142
189
  # It is recommended to use/implement lambdas in an "idempotent" way. E.g. when
143
190
  # a cache layer is put in front of I18n.translate it will generate a cache key
144
- # from the argument values passed to #translate. Therefor your lambdas should
191
+ # from the argument values passed to #translate. Therefore your lambdas should
145
192
  # always return the same translations/values per unique combination of argument
146
193
  # values.
147
- def translate(*args)
148
- options = args.pop if args.last.is_a?(Hash)
149
- key = args.shift
150
- locale = options && options.delete(:locale) || config.locale
151
- raises = options && options.delete(:raise)
152
- config.backend.translate(locale, key, options || {})
153
- rescue I18n::ArgumentError => exception
154
- raise exception if raises
155
- handle_exception(exception, locale, key, options)
194
+ #
195
+ # *Ruby 2.7+ keyword arguments warning*
196
+ #
197
+ # This method uses keyword arguments.
198
+ # There is a breaking change in ruby that produces warning with ruby 2.7 and won't work as expected with ruby 3.0
199
+ # The "hash" parameter must be passed as keyword argument.
200
+ #
201
+ # Good:
202
+ # I18n.t(:salutation, :gender => 'w', :name => 'Smith')
203
+ # I18n.t(:salutation, **{ :gender => 'w', :name => 'Smith' })
204
+ # I18n.t(:salutation, **any_hash)
205
+ #
206
+ # Bad:
207
+ # I18n.t(:salutation, { :gender => 'w', :name => 'Smith' })
208
+ # I18n.t(:salutation, any_hash)
209
+ #
210
+ def translate(key = nil, throw: false, raise: false, locale: nil, **options) # TODO deprecate :raise
211
+ locale ||= config.locale
212
+ raise Disabled.new('t') if locale == false
213
+ enforce_available_locales!(locale)
214
+
215
+ backend = config.backend
216
+
217
+ if key.is_a?(Array)
218
+ key.map do |k|
219
+ translate_key(k, throw, raise, locale, backend, options)
220
+ end
221
+ else
222
+ translate_key(key, throw, raise, locale, backend, options)
223
+ end
156
224
  end
157
225
  alias :t :translate
158
226
 
159
- def translate!(key, options = {})
160
- translate(key, options.merge( :raise => true ))
227
+ # Wrapper for <tt>translate</tt> that adds <tt>:raise => true</tt>. With
228
+ # this option, if no translation is found, it will raise <tt>I18n::MissingTranslationData</tt>
229
+ def translate!(key, **options)
230
+ translate(key, **options, raise: true)
161
231
  end
162
232
  alias :t! :translate!
163
233
 
234
+ # Returns true if a translation exists for a given key, otherwise returns false.
235
+ def exists?(key, _locale = nil, locale: _locale, **options)
236
+ locale ||= config.locale
237
+ raise Disabled.new('exists?') if locale == false
238
+ raise I18n::ArgumentError if key.is_a?(String) && key.empty?
239
+ config.backend.exists?(locale, key, options)
240
+ end
241
+
164
242
  # Transliterates UTF-8 characters to ASCII. By default this method will
165
243
  # transliterate only Latin strings to an ASCII approximation:
166
244
  #
@@ -190,14 +268,14 @@ module I18n
190
268
  #
191
269
  # Setting a Hash using Ruby:
192
270
  #
193
- # store_translations(:de, :i18n => {
194
- # :transliterate => {
195
- # :rule => {
196
- # "ü" => "ue",
197
- # "ö" => "oe"
198
- # }
199
- # }
200
- # )
271
+ # store_translations(:de, i18n: {
272
+ # transliterate: {
273
+ # rule: {
274
+ # 'ü' => 'ue',
275
+ # 'ö' => 'oe'
276
+ # }
277
+ # }
278
+ # })
201
279
  #
202
280
  # Setting a Proc:
203
281
  #
@@ -212,66 +290,89 @@ module I18n
212
290
  # I18n.transliterate("Jürgen") # => "Juergen"
213
291
  # I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen"
214
292
  # I18n.transliterate("Jürgen", :locale => :de) # => "Juergen"
215
- def transliterate(*args)
216
- options = args.pop if args.last.is_a?(Hash)
217
- key = args.shift
218
- locale = options && options.delete(:locale) || config.locale
219
- raises = options && options.delete(:raise)
220
- replacement = options && options.delete(:replacement)
293
+ def transliterate(key, throw: false, raise: false, locale: nil, replacement: nil, **options)
294
+ locale ||= config.locale
295
+ raise Disabled.new('transliterate') if locale == false
296
+ enforce_available_locales!(locale)
297
+
221
298
  config.backend.transliterate(locale, key, replacement)
222
299
  rescue I18n::ArgumentError => exception
223
- raise exception if raises
224
- handle_exception(exception, locale, key, options)
300
+ handle_exception((throw && :throw || raise && :raise), exception, locale, key, options)
225
301
  end
226
302
 
227
303
  # Localizes certain objects, such as dates and numbers to local formatting.
228
- def localize(object, options = {})
229
- locale = options.delete(:locale) || config.locale
230
- format = options.delete(:format) || :default
304
+ def localize(object, locale: nil, format: nil, **options)
305
+ locale ||= config.locale
306
+ raise Disabled.new('l') if locale == false
307
+ enforce_available_locales!(locale)
308
+
309
+ format ||= :default
231
310
  config.backend.localize(locale, object, format, options)
232
311
  end
233
312
  alias :l :localize
234
313
 
235
314
  # Executes block with given I18n.locale set.
236
315
  def with_locale(tmp_locale = nil)
237
- if tmp_locale
316
+ if tmp_locale == nil
317
+ yield
318
+ else
238
319
  current_locale = self.locale
239
- self.locale = tmp_locale
320
+ self.locale = tmp_locale
321
+ begin
322
+ yield
323
+ ensure
324
+ self.locale = current_locale
325
+ end
240
326
  end
241
- yield
242
- ensure
243
- self.locale = current_locale if tmp_locale
244
327
  end
245
328
 
246
-
247
329
  # Merges the given locale, key and scope into a single array of keys.
248
330
  # Splits keys that contain dots into multiple keys. Makes sure all
249
331
  # keys are Symbols.
250
332
  def normalize_keys(locale, key, scope, separator = nil)
251
333
  separator ||= I18n.default_separator
252
334
 
253
- keys = []
254
- keys.concat normalize_key(locale, separator)
255
- keys.concat normalize_key(scope, separator)
256
- keys.concat normalize_key(key, separator)
257
- keys
335
+ [
336
+ *normalize_key(locale, separator),
337
+ *normalize_key(scope, separator),
338
+ *normalize_key(key, separator)
339
+ ]
340
+ end
341
+
342
+ # Returns true when the passed locale, which can be either a String or a
343
+ # Symbol, is in the list of available locales. Returns false otherwise.
344
+ def locale_available?(locale)
345
+ I18n.config.available_locales_set.include?(locale)
346
+ end
347
+
348
+ # Raises an InvalidLocale exception when the passed locale is not available.
349
+ def enforce_available_locales!(locale)
350
+ if locale != false && config.enforce_available_locales
351
+ raise I18n::InvalidLocale.new(locale) if !locale_available?(locale)
352
+ end
353
+ end
354
+
355
+ def available_locales_initialized?
356
+ config.available_locales_initialized?
258
357
  end
259
358
 
260
- # making these private until Ruby 1.9.2 can send to protected methods again
261
- # see http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=24280
262
359
  private
263
360
 
264
- # Handles exceptions raised in the backend. All exceptions except for
265
- # MissingTranslationData exceptions are re-raised. When a MissingTranslationData
266
- # was caught and the option :raise is not set the handler returns an error
267
- # message string containing the key/scope.
268
- def default_exception_handler(exception, locale, key, options)
269
- return exception.message if MissingTranslationData === exception
270
- raise exception
361
+ def translate_key(key, throw, raise, locale, backend, options)
362
+ result = catch(:exception) do
363
+ backend.translate(locale, key, options)
364
+ end
365
+
366
+ if result.is_a?(MissingTranslation)
367
+ handle_exception((throw && :throw || raise && :raise), result, locale, key, options)
368
+ else
369
+ result
370
+ end
271
371
  end
272
372
 
273
373
  # Any exceptions thrown in translate will be sent to the @@exception_handler
274
- # which can be a Symbol, a Proc or any other Object.
374
+ # which can be a Symbol, a Proc or any other Object unless they're forced to
375
+ # be raised or thrown (MissingTranslation).
275
376
  #
276
377
  # If exception_handler is a Symbol then it will simply be sent to I18n as
277
378
  # a method call. A Proc will simply be called. In any other case the
@@ -279,44 +380,56 @@ module I18n
279
380
  #
280
381
  # Examples:
281
382
  #
282
- # I18n.exception_handler = :default_exception_handler # this is the default
283
- # I18n.default_exception_handler(exception, locale, key, options) # will be called like this
383
+ # I18n.exception_handler = :custom_exception_handler # this is the default
384
+ # I18n.custom_exception_handler(exception, locale, key, options) # will be called like this
284
385
  #
285
386
  # I18n.exception_handler = lambda { |*args| ... } # a lambda
286
387
  # I18n.exception_handler.call(exception, locale, key, options) # will be called like this
287
388
  #
288
- # I18n.exception_handler = I18nExceptionHandler.new # an object
289
- # I18n.exception_handler.call(exception, locale, key, options) # will be called like this
290
- def handle_exception(exception, locale, key, options)
291
- case config.exception_handler
292
- when Symbol
293
- send(config.exception_handler, exception, locale, key, options)
389
+ # I18n.exception_handler = I18nExceptionHandler.new # an object
390
+ # I18n.exception_handler.call(exception, locale, key, options) # will be called like this
391
+ def handle_exception(handling, exception, locale, key, options)
392
+ case handling
393
+ when :raise
394
+ raise exception.respond_to?(:to_exception) ? exception.to_exception : exception
395
+ when :throw
396
+ throw :exception, exception
294
397
  else
295
- config.exception_handler.call(exception, locale, key, options)
398
+ case handler = options[:exception_handler] || config.exception_handler
399
+ when Symbol
400
+ send(handler, exception, locale, key, options)
401
+ else
402
+ handler.call(exception, locale, key, options)
403
+ end
296
404
  end
297
405
  end
298
406
 
299
- # Deprecated. Will raise a warning in future versions and then finally be
300
- # removed. Use I18n.normalize_keys instead.
301
- def normalize_translation_keys(locale, key, scope, separator = nil)
302
- normalize_keys(locale, key, scope, separator)
303
- end
407
+ @@normalized_key_cache = I18n.new_double_nested_cache
304
408
 
305
409
  def normalize_key(key, separator)
306
- normalized_key_cache[separator][key] ||=
410
+ @@normalized_key_cache[separator][key] ||=
307
411
  case key
308
412
  when Array
309
- key.map { |k| normalize_key(k, separator) }.flatten
413
+ key.flat_map { |k| normalize_key(k, separator) }
310
414
  else
311
415
  keys = key.to_s.split(separator)
312
416
  keys.delete('')
313
- keys.map!{ |k| k.to_sym }
417
+ keys.map! do |k|
418
+ case k
419
+ when /\A[-+]?([1-9]\d*|0)\z/ # integer
420
+ k.to_i
421
+ when 'true'
422
+ true
423
+ when 'false'
424
+ false
425
+ else
426
+ k.to_sym
427
+ end
428
+ end
314
429
  keys
315
430
  end
316
431
  end
317
-
318
- def normalized_key_cache
319
- @normalized_key_cache ||= Hash.new { |h,k| h[k] = {} }
320
- end
321
432
  end
433
+
434
+ extend Base
322
435
  end
metadata CHANGED
@@ -1,105 +1,113 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: i18n
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 4
8
- - 0
9
- version: 0.4.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.14.4
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Sven Fuchs
13
8
  - Joshua Harvey
14
9
  - Matt Aimonetti
15
10
  - Stephan Soller
16
11
  - Saimon Moore
17
- autorequire:
12
+ - Ryan Bigg
13
+ autorequire:
18
14
  bindir: bin
19
15
  cert_chain: []
20
-
21
- date: 2010-05-27 00:00:00 +02:00
22
- default_executable:
23
- dependencies: []
24
-
16
+ date: 2024-03-06 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: concurrent-ruby
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - "~>"
23
+ - !ruby/object:Gem::Version
24
+ version: '1.0'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - "~>"
30
+ - !ruby/object:Gem::Version
31
+ version: '1.0'
25
32
  description: New wave Internationalization support for Ruby.
26
33
  email: rails-i18n@googlegroups.com
27
34
  executables: []
28
-
29
35
  extensions: []
30
-
31
36
  extra_rdoc_files: []
32
-
33
- files:
37
+ files:
38
+ - MIT-LICENSE
39
+ - README.md
34
40
  - lib/i18n.rb
35
41
  - lib/i18n/backend.rb
36
- - lib/i18n/backend/active_record.rb
37
- - lib/i18n/backend/active_record/missing.rb
38
- - lib/i18n/backend/active_record/store_procs.rb
39
- - lib/i18n/backend/active_record/translation.rb
40
42
  - lib/i18n/backend/base.rb
41
43
  - lib/i18n/backend/cache.rb
44
+ - lib/i18n/backend/cache_file.rb
42
45
  - lib/i18n/backend/cascade.rb
43
46
  - lib/i18n/backend/chain.rb
44
- - lib/i18n/backend/cldr.rb
45
47
  - lib/i18n/backend/fallbacks.rb
46
48
  - lib/i18n/backend/flatten.rb
47
49
  - lib/i18n/backend/gettext.rb
48
50
  - lib/i18n/backend/interpolation_compiler.rb
49
51
  - lib/i18n/backend/key_value.rb
52
+ - lib/i18n/backend/lazy_loadable.rb
50
53
  - lib/i18n/backend/memoize.rb
51
54
  - lib/i18n/backend/metadata.rb
52
55
  - lib/i18n/backend/pluralization.rb
53
56
  - lib/i18n/backend/simple.rb
54
57
  - lib/i18n/backend/transliterator.rb
55
58
  - lib/i18n/config.rb
56
- - lib/i18n/core_ext/hash.rb
57
- - lib/i18n/core_ext/string/interpolate.rb
58
59
  - lib/i18n/exceptions.rb
59
60
  - lib/i18n/gettext.rb
60
61
  - lib/i18n/gettext/helpers.rb
61
62
  - lib/i18n/gettext/po_parser.rb
63
+ - lib/i18n/interpolate/ruby.rb
62
64
  - lib/i18n/locale.rb
63
65
  - lib/i18n/locale/fallbacks.rb
64
66
  - lib/i18n/locale/tag.rb
65
67
  - lib/i18n/locale/tag/parents.rb
66
68
  - lib/i18n/locale/tag/rfc4646.rb
67
69
  - lib/i18n/locale/tag/simple.rb
70
+ - lib/i18n/middleware.rb
71
+ - lib/i18n/tests.rb
72
+ - lib/i18n/tests/basics.rb
73
+ - lib/i18n/tests/defaults.rb
74
+ - lib/i18n/tests/interpolation.rb
75
+ - lib/i18n/tests/link.rb
76
+ - lib/i18n/tests/localization.rb
77
+ - lib/i18n/tests/localization/date.rb
78
+ - lib/i18n/tests/localization/date_time.rb
79
+ - lib/i18n/tests/localization/procs.rb
80
+ - lib/i18n/tests/localization/time.rb
81
+ - lib/i18n/tests/lookup.rb
82
+ - lib/i18n/tests/pluralization.rb
83
+ - lib/i18n/tests/procs.rb
84
+ - lib/i18n/utils.rb
68
85
  - lib/i18n/version.rb
69
- - README.textile
70
- - MIT-LICENSE
71
- - CHANGELOG.textile
72
- has_rdoc: true
73
- homepage: http://github.com/svenfuchs/i18n
74
- licenses: []
75
-
76
- post_install_message:
86
+ homepage: https://github.com/ruby-i18n/i18n
87
+ licenses:
88
+ - MIT
89
+ metadata:
90
+ bug_tracker_uri: https://github.com/ruby-i18n/i18n/issues
91
+ changelog_uri: https://github.com/ruby-i18n/i18n/releases
92
+ documentation_uri: https://guides.rubyonrails.org/i18n.html
93
+ source_code_uri: https://github.com/ruby-i18n/i18n
94
+ post_install_message:
77
95
  rdoc_options: []
78
-
79
- require_paths:
96
+ require_paths:
80
97
  - lib
81
- required_ruby_version: !ruby/object:Gem::Requirement
82
- requirements:
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
83
100
  - - ">="
84
- - !ruby/object:Gem::Version
85
- segments:
86
- - 0
87
- version: "0"
88
- required_rubygems_version: !ruby/object:Gem::Requirement
89
- requirements:
101
+ - !ruby/object:Gem::Version
102
+ version: 2.3.0
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
90
105
  - - ">="
91
- - !ruby/object:Gem::Version
92
- segments:
93
- - 1
94
- - 3
95
- - 6
96
- version: 1.3.6
106
+ - !ruby/object:Gem::Version
107
+ version: 1.3.5
97
108
  requirements: []
98
-
99
- rubyforge_project: "[none]"
100
- rubygems_version: 1.3.6
101
- signing_key:
102
- specification_version: 3
109
+ rubygems_version: 3.5.1
110
+ signing_key:
111
+ specification_version: 4
103
112
  summary: New wave Internationalization support for Ruby
104
113
  test_files: []
105
-