i18n 1.5.3 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2348183814afaccf956b0fca212618a45c0316219912e3ac0f081fda05d401b9
4
- data.tar.gz: 17f5677585fbf70e5254f0efa6886c7a32cfb209bb807468f3458959adc9279d
3
+ metadata.gz: 2b03b84d726d3cafa7ea2ecaa6f258cb911696c338cb32c769f71b6d62ca5fb5
4
+ data.tar.gz: 7a489bf447e9fedee8fd043cc8ba324c0afc0c34701fbfeff5f15b1c1f4fa6b4
5
5
  SHA512:
6
- metadata.gz: 2e25cdc6a5e6579e47b2f839be9ccca59545204e5ca0babeba71da769704a8646445670930c4f33a251edcd9c1818dff4dc95a59924201af38245b45498893b0
7
- data.tar.gz: 9391658536ef011c92674280587f308c479b2377b49707e5d25f2dd26a90e48bbc9cbb9c15ece1076f32ed715c7f5be565ec812f19fc4bb0dc93e4b702328a79
6
+ metadata.gz: 534659c40a8df9eb3fd9a123b779de0f1b66471ecd3fb35e2083128193f51aeea95df6aad06039b6309932a6efb3426c525a8759e70c1104754fdd921732d6cd
7
+ data.tar.gz: caddebe447a797be3dde1607e74d826588ee13ee1317c6abfbb08cbd8a22d79a6aa10a84d3fd21fa45ca9348317aa0e0aafe1c408d4e1c989fbee7f09cd87606
data/README.md CHANGED
@@ -67,7 +67,7 @@ I18n.t(:test) # => "Dies ist ein Test"
67
67
  * Cache
68
68
  * Pluralization: lambda pluralizers stored as translation data
69
69
  * Locale fallbacks, RFC4647 compliant (optionally: RFC4646 locale validation)
70
- * [Gettext support](https://github.com/svenfuchs/i18n/wiki/Gettext)
70
+ * [Gettext support](https://github.com/ruby-i18n/i18n/wiki/Gettext)
71
71
  * Translation metadata
72
72
 
73
73
  ## Alternative Backend
@@ -76,7 +76,7 @@ I18n.t(:test) # => "Dies ist ein Test"
76
76
  * ActiveRecord (optionally: ActiveRecord::Missing and ActiveRecord::StoreProcs)
77
77
  * KeyValue (uses active_support/json and cannot store procs)
78
78
 
79
- For more information and lots of resources see [the 'Resources' page on the wiki](https://github.com/svenfuchs/i18n/wiki/Resources).
79
+ For more information and lots of resources see [the 'Resources' page on the wiki](https://github.com/ruby-i18n/i18n/wiki/Resources).
80
80
 
81
81
  ## Tests
82
82
 
@@ -69,6 +69,13 @@ module I18n
69
69
  config.backend.reload!
70
70
  end
71
71
 
72
+ # Tells the backend to load translations now. Used in situations like the
73
+ # Rails production environment. Backends can implement whatever strategy
74
+ # is useful.
75
+ def eager_load!
76
+ config.backend.eager_load!
77
+ end
78
+
72
79
  # Translates, pluralizes and interpolates a given key using a given locale,
73
80
  # scope, and default, as well as interpolation values.
74
81
  #
@@ -169,15 +176,13 @@ module I18n
169
176
  # from the argument values passed to #translate. Therefor your lambdas should
170
177
  # always return the same translations/values per unique combination of argument
171
178
  # values.
172
- def translate(*args)
173
- options = args.last.is_a?(Hash) ? args.pop.dup : {}
174
- key = args.shift
175
- backend = config.backend
176
- locale = options.delete(:locale) || config.locale
177
- handling = options.delete(:throw) && :throw || options.delete(:raise) && :raise # TODO deprecate :raise
178
-
179
+ def translate(key = nil, *, throw: false, raise: false, locale: nil, **options) # TODO deprecate :raise
180
+ locale ||= config.locale
181
+ raise Disabled.new('t') if locale == false
179
182
  enforce_available_locales!(locale)
180
183
 
184
+ backend = config.backend
185
+
181
186
  result = catch(:exception) do
182
187
  if key.is_a?(Array)
183
188
  key.map { |k| backend.translate(locale, k, options) }
@@ -185,7 +190,12 @@ module I18n
185
190
  backend.translate(locale, key, options)
186
191
  end
187
192
  end
188
- result.is_a?(MissingTranslation) ? handle_exception(handling, result, locale, key, options) : result
193
+
194
+ if result.is_a?(MissingTranslation)
195
+ handle_exception((throw && :throw || raise && :raise), result, locale, key, options)
196
+ else
197
+ result
198
+ end
189
199
  end
190
200
  alias :t :translate
191
201
 
@@ -197,7 +207,9 @@ module I18n
197
207
  alias :t! :translate!
198
208
 
199
209
  # Returns true if a translation exists for a given key, otherwise returns false.
200
- def exists?(key, locale = config.locale)
210
+ def exists?(key, _locale = nil, locale: _locale)
211
+ locale ||= config.locale
212
+ raise Disabled.new('exists?') if locale == false
201
213
  raise I18n::ArgumentError if key.is_a?(String) && key.empty?
202
214
  config.backend.exists?(locale, key)
203
215
  end
@@ -253,37 +265,40 @@ module I18n
253
265
  # I18n.transliterate("Jürgen") # => "Juergen"
254
266
  # I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen"
255
267
  # I18n.transliterate("Jürgen", :locale => :de) # => "Juergen"
256
- def transliterate(*args)
257
- options = args.pop.dup if args.last.is_a?(Hash)
258
- key = args.shift
259
- locale = options && options.delete(:locale) || config.locale
260
- handling = options && (options.delete(:throw) && :throw || options.delete(:raise) && :raise)
261
- replacement = options && options.delete(:replacement)
268
+ def transliterate(key, *, throw: false, raise: false, locale: nil, replacement: nil, **options)
269
+ locale ||= config.locale
270
+ raise Disabled.new('transliterate') if locale == false
262
271
  enforce_available_locales!(locale)
272
+
263
273
  config.backend.transliterate(locale, key, replacement)
264
274
  rescue I18n::ArgumentError => exception
265
- handle_exception(handling, exception, locale, key, options || {})
275
+ handle_exception((throw && :throw || raise && :raise), exception, locale, key, options)
266
276
  end
267
277
 
268
278
  # Localizes certain objects, such as dates and numbers to local formatting.
269
- def localize(object, options = nil)
270
- options = options ? options.dup : {}
271
- locale = options.delete(:locale) || config.locale
272
- format = options.delete(:format) || :default
279
+ def localize(object, locale: nil, format: nil, **options)
280
+ locale ||= config.locale
281
+ raise Disabled.new('l') if locale == false
273
282
  enforce_available_locales!(locale)
283
+
284
+ format ||= :default
274
285
  config.backend.localize(locale, object, format, options)
275
286
  end
276
287
  alias :l :localize
277
288
 
278
289
  # Executes block with given I18n.locale set.
279
290
  def with_locale(tmp_locale = nil)
280
- if tmp_locale
291
+ if tmp_locale == nil
292
+ yield
293
+ else
281
294
  current_locale = self.locale
282
- self.locale = tmp_locale
295
+ self.locale = tmp_locale
296
+ begin
297
+ yield
298
+ ensure
299
+ self.locale = current_locale
300
+ end
283
301
  end
284
- yield
285
- ensure
286
- self.locale = current_locale if tmp_locale
287
302
  end
288
303
 
289
304
  # Merges the given locale, key and scope into a single array of keys.
@@ -307,7 +322,7 @@ module I18n
307
322
 
308
323
  # Raises an InvalidLocale exception when the passed locale is not available.
309
324
  def enforce_available_locales!(locale)
310
- if config.enforce_available_locales
325
+ if locale != false && config.enforce_available_locales
311
326
  raise I18n::InvalidLocale.new(locale) if !locale_available?(locale)
312
327
  end
313
328
  end
@@ -95,10 +95,19 @@ module I18n
95
95
  end
96
96
 
97
97
  def reload!
98
+ eager_load! if eager_loaded?
99
+ end
100
+
101
+ def eager_load!
102
+ @eager_loaded = true
98
103
  end
99
104
 
100
105
  protected
101
106
 
107
+ def eager_loaded?
108
+ @eager_loaded ||= false
109
+ end
110
+
102
111
  # The method which actually looks up for the translation in the store.
103
112
  def lookup(locale, key, scope = [], options = EMPTY_HASH)
104
113
  raise NotImplementedError
@@ -248,12 +257,16 @@ module I18n
248
257
  end
249
258
 
250
259
  def translate_localization_format(locale, object, format, options)
251
- format.to_s.gsub(/%[aAbBpP]/) do |match|
260
+ format.to_s.gsub(/%(|\^)[aAbBpP]/) do |match|
252
261
  case match
253
262
  when '%a' then I18n.t!(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday]
263
+ when '%^a' then I18n.t!(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday].upcase
254
264
  when '%A' then I18n.t!(:"date.day_names", :locale => locale, :format => format)[object.wday]
265
+ when '%^A' then I18n.t!(:"date.day_names", :locale => locale, :format => format)[object.wday].upcase
255
266
  when '%b' then I18n.t!(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon]
267
+ when '%^b' then I18n.t!(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon].upcase
256
268
  when '%B' then I18n.t!(:"date.month_names", :locale => locale, :format => format)[object.mon]
269
+ when '%^B' then I18n.t!(:"date.month_names", :locale => locale, :format => format)[object.mon].upcase
257
270
  when '%p' then I18n.t!(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).upcase if object.respond_to? :hour
258
271
  when '%P' then I18n.t!(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).downcase if object.respond_to? :hour
259
272
  end
@@ -106,7 +106,7 @@ module I18n
106
106
  private
107
107
 
108
108
  def digest_item(key)
109
- I18n.cache_key_digest ? I18n.cache_key_digest.hexdigest(key.to_s) : key.hash
109
+ I18n.cache_key_digest ? I18n.cache_key_digest.hexdigest(key.to_s) : key.to_s.hash
110
110
  end
111
111
  end
112
112
  end
@@ -41,6 +41,10 @@ module I18n
41
41
  backends.each { |backend| backend.reload! }
42
42
  end
43
43
 
44
+ def eager_load!
45
+ backends.each { |backend| backend.eager_load! }
46
+ end
47
+
44
48
  def store_translations(locale, data, options = EMPTY_HASH)
45
49
  backends.first.store_translations(locale, data, options)
46
50
  end
@@ -26,6 +26,12 @@ module I18n
26
26
  super
27
27
  end
28
28
 
29
+ def eager_load!
30
+ memoized_lookup
31
+ available_locales
32
+ super
33
+ end
34
+
29
35
  protected
30
36
 
31
37
  def lookup(locale, key, scope = nil, options = EMPTY_HASH)
@@ -63,6 +63,11 @@ module I18n
63
63
  super
64
64
  end
65
65
 
66
+ def eager_load!
67
+ init_translations unless initialized?
68
+ super
69
+ end
70
+
66
71
  def translations(do_init: false)
67
72
  # To avoid returning empty translations,
68
73
  # call `init_translations`
@@ -7,7 +7,7 @@ module I18n
7
7
  # The only configuration value that is not global and scoped to thread is :locale.
8
8
  # It defaults to the default_locale.
9
9
  def locale
10
- defined?(@locale) && @locale ? @locale : default_locale
10
+ defined?(@locale) && @locale != nil ? @locale : default_locale
11
11
  end
12
12
 
13
13
  # Sets the current locale pseudo-globally, i.e. in the Thread.current hash.
@@ -15,6 +15,20 @@ module I18n
15
15
 
16
16
  class ArgumentError < ::ArgumentError; end
17
17
 
18
+ class Disabled < ArgumentError
19
+ def initialize(method)
20
+ super(<<~MESSAGE)
21
+ I18n.#{method} is currently disabled, likely because your application is still in its loading phase.
22
+
23
+ This method is meant to display text in the user locale, so calling it before the user locale has
24
+ been set is likely to display text from the wrong locale to some users.
25
+
26
+ If you have a legitimate reason to access i18n data outside of the user flow, you can do so by passing
27
+ the desired locale explictly with the `locale` argument, e.g. `I18n.#{method}(..., locale: :en)`
28
+ MESSAGE
29
+ end
30
+ end
31
+
18
32
  class InvalidLocale < ArgumentError
19
33
  attr_reader :locale
20
34
  def initialize(locale)
@@ -11,8 +11,7 @@ module I18n
11
11
  end
12
12
 
13
13
  test "localize Date: given the short format it uses it" do
14
- # TODO should be Mrz, shouldn't it?
15
- assert_equal '01. Mar', I18n.l(@date, :format => :short, :locale => :de)
14
+ assert_equal '01. Mär', I18n.l(@date, :format => :short, :locale => :de)
16
15
  end
17
16
 
18
17
  test "localize Date: given the long format it uses it" do
@@ -27,17 +26,36 @@ module I18n
27
26
  assert_equal 'Samstag', I18n.l(@date, :format => '%A', :locale => :de)
28
27
  end
29
28
 
29
+ test "localize Date: given a uppercased day name format it returns the correct day name in upcase" do
30
+ assert_equal 'samstag'.upcase, I18n.l(@date, :format => '%^A', :locale => :de)
31
+ end
32
+
30
33
  test "localize Date: given an abbreviated day name format it returns the correct abbreviated day name" do
31
34
  assert_equal 'Sa', I18n.l(@date, :format => '%a', :locale => :de)
32
35
  end
33
36
 
37
+ test "localize Date: given an abbreviated and uppercased day name format it returns the correct abbreviated day name in upcase" do
38
+ assert_equal 'sa'.upcase, I18n.l(@date, :format => '%^a', :locale => :de)
39
+ end
40
+
34
41
  test "localize Date: given a month name format it returns the correct month name" do
35
42
  assert_equal 'März', I18n.l(@date, :format => '%B', :locale => :de)
36
43
  end
37
44
 
45
+ test "localize Date: given a uppercased month name format it returns the correct month name in upcase" do
46
+ assert_equal 'märz'.upcase, I18n.l(@date, :format => '%^B', :locale => :de)
47
+ end
48
+
38
49
  test "localize Date: given an abbreviated month name format it returns the correct abbreviated month name" do
39
- # TODO should be Mrz, shouldn't it?
40
- assert_equal 'Mar', I18n.l(@date, :format => '%b', :locale => :de)
50
+ assert_equal 'Mär', I18n.l(@date, :format => '%b', :locale => :de)
51
+ end
52
+
53
+ test "localize Date: given an abbreviated and uppercased month name format it returns the correct abbreviated month name in upcase" do
54
+ assert_equal 'mär'.upcase, I18n.l(@date, :format => '%^b', :locale => :de)
55
+ end
56
+
57
+ test "localize Date: given a date format with the month name upcased it returns the correct value" do
58
+ assert_equal '1. FEBRUAR 2008', I18n.l(::Date.new(2008, 2, 1), :format => "%-d. %^B %Y", :locale => :de)
41
59
  end
42
60
 
43
61
  test "localize Date: given missing translations it returns the correct error message" do
@@ -50,7 +68,7 @@ module I18n
50
68
 
51
69
  test "localize Date: does not modify the options hash" do
52
70
  options = { :format => '%b', :locale => :de }
53
- assert_equal 'Mar', I18n.l(@date, options)
71
+ assert_equal 'Mär', I18n.l(@date, options)
54
72
  assert_equal({ :format => '%b', :locale => :de }, options)
55
73
  assert_nothing_raised { I18n.l(@date, options.freeze) }
56
74
  end
@@ -89,7 +107,7 @@ module I18n
89
107
  :day_names => %w(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag),
90
108
  :abbr_day_names => %w(So Mo Di Mi Do Fr Sa),
91
109
  :month_names => %w(Januar Februar März April Mai Juni Juli August September Oktober November Dezember).unshift(nil),
92
- :abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil)
110
+ :abbr_month_names => %w(Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil)
93
111
  }
94
112
  }
95
113
  end
@@ -12,8 +12,7 @@ module I18n
12
12
  end
13
13
 
14
14
  test "localize DateTime: given the short format it uses it" do
15
- # TODO should be Mrz, shouldn't it?
16
- assert_equal '01. Mar 06:00', I18n.l(@datetime, :format => :short, :locale => :de)
15
+ assert_equal '01. Mär 06:00', I18n.l(@datetime, :format => :short, :locale => :de)
17
16
  end
18
17
 
19
18
  test "localize DateTime: given the long format it uses it" do
@@ -21,25 +20,43 @@ module I18n
21
20
  end
22
21
 
23
22
  test "localize DateTime: given the default format it uses it" do
24
- # TODO should be Mrz, shouldn't it?
25
- assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.l(@datetime, :format => :default, :locale => :de)
23
+ assert_equal 'Sa, 01. Mär 2008 06:00:00 +0000', I18n.l(@datetime, :format => :default, :locale => :de)
26
24
  end
27
25
 
28
26
  test "localize DateTime: given a day name format it returns the correct day name" do
29
27
  assert_equal 'Samstag', I18n.l(@datetime, :format => '%A', :locale => :de)
30
28
  end
31
29
 
30
+ test "localize DateTime: given a uppercased day name format it returns the correct day name in upcase" do
31
+ assert_equal 'samstag'.upcase, I18n.l(@datetime, :format => '%^A', :locale => :de)
32
+ end
33
+
32
34
  test "localize DateTime: given an abbreviated day name format it returns the correct abbreviated day name" do
33
35
  assert_equal 'Sa', I18n.l(@datetime, :format => '%a', :locale => :de)
34
36
  end
35
37
 
38
+ test "localize DateTime: given an abbreviated and uppercased day name format it returns the correct abbreviated day name in upcase" do
39
+ assert_equal 'sa'.upcase, I18n.l(@datetime, :format => '%^a', :locale => :de)
40
+ end
41
+
36
42
  test "localize DateTime: given a month name format it returns the correct month name" do
37
43
  assert_equal 'März', I18n.l(@datetime, :format => '%B', :locale => :de)
38
44
  end
39
45
 
46
+ test "localize DateTime: given a uppercased month name format it returns the correct month name in upcase" do
47
+ assert_equal 'märz'.upcase, I18n.l(@datetime, :format => '%^B', :locale => :de)
48
+ end
49
+
40
50
  test "localize DateTime: given an abbreviated month name format it returns the correct abbreviated month name" do
41
- # TODO should be Mrz, shouldn't it?
42
- assert_equal 'Mar', I18n.l(@datetime, :format => '%b', :locale => :de)
51
+ assert_equal 'Mär', I18n.l(@datetime, :format => '%b', :locale => :de)
52
+ end
53
+
54
+ test "localize DateTime: given an abbreviated and uppercased month name format it returns the correct abbreviated month name in upcase" do
55
+ assert_equal 'mär'.upcase, I18n.l(@datetime, :format => '%^b', :locale => :de)
56
+ end
57
+
58
+ test "localize DateTime: given a date format with the month name upcased it returns the correct value" do
59
+ assert_equal '1. FEBRUAR 2008', I18n.l(::DateTime.new(2008, 2, 1, 6), :format => "%-d. %^B %Y", :locale => :de)
43
60
  end
44
61
 
45
62
  test "localize DateTime: given missing translations it returns the correct error message" do
@@ -12,8 +12,7 @@ module I18n
12
12
  end
13
13
 
14
14
  test "localize Time: given the short format it uses it" do
15
- # TODO should be Mrz, shouldn't it?
16
- assert_equal '01. Mar 06:00', I18n.l(@time, :format => :short, :locale => :de)
15
+ assert_equal '01. Mär 06:00', I18n.l(@time, :format => :short, :locale => :de)
17
16
  end
18
17
 
19
18
  test "localize Time: given the long format it uses it" do
@@ -29,17 +28,36 @@ module I18n
29
28
  assert_equal 'Samstag', I18n.l(@time, :format => '%A', :locale => :de)
30
29
  end
31
30
 
31
+ test "localize Time: given a uppercased day name format it returns the correct day name in upcase" do
32
+ assert_equal 'samstag'.upcase, I18n.l(@time, :format => '%^A', :locale => :de)
33
+ end
34
+
32
35
  test "localize Time: given an abbreviated day name format it returns the correct abbreviated day name" do
33
36
  assert_equal 'Sa', I18n.l(@time, :format => '%a', :locale => :de)
34
37
  end
35
38
 
39
+ test "localize Time: given an abbreviated and uppercased day name format it returns the correct abbreviated day name in upcase" do
40
+ assert_equal 'sa'.upcase, I18n.l(@time, :format => '%^a', :locale => :de)
41
+ end
42
+
36
43
  test "localize Time: given a month name format it returns the correct month name" do
37
44
  assert_equal 'März', I18n.l(@time, :format => '%B', :locale => :de)
38
45
  end
39
46
 
47
+ test "localize Time: given a uppercased month name format it returns the correct month name in upcase" do
48
+ assert_equal 'märz'.upcase, I18n.l(@time, :format => '%^B', :locale => :de)
49
+ end
50
+
40
51
  test "localize Time: given an abbreviated month name format it returns the correct abbreviated month name" do
41
- # TODO should be Mrz, shouldn't it?
42
- assert_equal 'Mar', I18n.l(@time, :format => '%b', :locale => :de)
52
+ assert_equal 'Mär', I18n.l(@time, :format => '%b', :locale => :de)
53
+ end
54
+
55
+ test "localize Time: given an abbreviated and uppercased month name format it returns the correct abbreviated month name in upcase" do
56
+ assert_equal 'mär'.upcase, I18n.l(@time, :format => '%^b', :locale => :de)
57
+ end
58
+
59
+ test "localize Time: given a date format with the month name upcased it returns the correct value" do
60
+ assert_equal '1. FEBRUAR 2008', I18n.l(::Time.utc(2008, 2, 1, 6, 0), :format => "%-d. %^B %Y", :locale => :de)
43
61
  end
44
62
 
45
63
  test "localize Time: given missing translations it returns the correct error message" do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module I18n
4
- VERSION = "1.5.3"
4
+ VERSION = "1.6.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Fuchs
@@ -10,20 +10,20 @@ authors:
10
10
  - Stephan Soller
11
11
  - Saimon Moore
12
12
  - Ryan Bigg
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2019-01-21 00:00:00.000000000 Z
16
+ date: 2019-03-03 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
+ name: concurrent-ruby
19
20
  requirement: !ruby/object:Gem::Requirement
20
21
  requirements:
21
22
  - - "~>"
22
23
  - !ruby/object:Gem::Version
23
24
  version: '1.0'
24
- name: concurrent-ruby
25
- prerelease: false
26
25
  type: :runtime
26
+ prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
29
  - - "~>"
@@ -82,7 +82,7 @@ files:
82
82
  - lib/i18n/tests/pluralization.rb
83
83
  - lib/i18n/tests/procs.rb
84
84
  - lib/i18n/version.rb
85
- homepage: http://github.com/svenfuchs/i18n
85
+ homepage: http://github.com/ruby-i18n/i18n
86
86
  licenses:
87
87
  - MIT
88
88
  metadata:
@@ -117,9 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  - !ruby/object:Gem::Version
118
118
  version: 1.3.5
119
119
  requirements: []
120
- rubyforge_project: "[none]"
121
- rubygems_version: 2.7.6
122
- signing_key:
120
+ rubygems_version: 3.0.2
121
+ signing_key:
123
122
  specification_version: 4
124
123
  summary: New wave Internationalization support for Ruby
125
124
  test_files: []