i18n 1.5.3 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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: []