fast_gettext 1.6.0 → 2.1.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
- SHA1:
3
- metadata.gz: 902a77bc80c4d7a349d121874e157d902d8927a1
4
- data.tar.gz: 57e2ab68b62cb0abaa8657332b381306df515aea
2
+ SHA256:
3
+ metadata.gz: 91bc0d49ead2bfbfad8065858e52255dfcd9938cb547f0b20984bb12cc202380
4
+ data.tar.gz: 45c2e546d2041e36b82a4d82593d4b1c014d46da561996037a76d6e911ed2cdb
5
5
  SHA512:
6
- metadata.gz: c584454d8a8802e63c02f1d28d7ae4168f1f78335f9c052a077926c5f4828c70ff906df6f0fffd7603965fca9964a5c5fc82df462fd293ed78ee0b5be09cf952
7
- data.tar.gz: 71f4ec7049fdfa4c0b98ffe4344ca5d929529ff580001ea816210ba0329ebe1c11dab179962c2f9cabf683425bd03d304af7327033a41e6262cf8530a49e04f4
6
+ metadata.gz: 1120024578b173fb99e2bf879b22654723efede889a98d7d950c8201aef11261566f6c70a6247f8ce937fef9f7ec88fe1a6dc9a874331e6cc41fbed55cc651f2
7
+ data.tar.gz: 6cdbf2dcec813b6fb0c0da4b87af33c372a2f87ea177fdafd0203cf3f45f565a5fe64b4e41fe4fedcd4450ec1a7196d4c5a015df35470b4cfdb8b21e4037b137
data/CHANGELOG CHANGED
@@ -1,11 +1,12 @@
1
+ 2.0.0 -- Changed p_ separator to \0004 https://github.com/grosser/fast_gettext/pull/107 add np and add gettext aliases
1
2
  1.6.0 -- Remove restrictions around yaml file names
2
3
  1.1.0 -- translations are no longer eager loaded for improved startup performance, pass `eager_load: true` to preload for example in preforked web server
3
4
  1.0.0 -- do not enforce attr_accessible unless ProtectedAttributes are loaded
4
- 0.9.0 -- reworked internals of caching to be plugable
5
+ 0.9.0 -- reworked internals of caching to be pluggable
5
6
  0.7.0 -- set_locale resets to default locale if none of the available locales was tried to set
6
- 0.6.0 -- plurals use singular translations as fallack e.g. you translated 'Axis' then n_('Axis','Axis',1) would return the translation for 'Axis' if no plural translation was found
7
+ 0.6.0 -- plurals use singular translations as fallback e.g. you translated 'Axis' then n_('Axis','Axis',1) would return the translation for 'Axis' if no plural translation was found
7
8
  0.4.14 -- "" is translated as "", not as gettext meta information
8
- 0.4.0 -- pluralisation_rules is no longer stored in each repository, only retrived. Added Chain and Logger repository.
9
+ 0.4.0 -- pluralisation_rules is no longer stored in each repository, only retrieved. Added Chain and Logger repository.
9
10
  0.3.6 -- FastGettext.default_locale=
10
11
  0.3.5 -- FastGettext.default_text_domain=
11
12
  0.3.4 -- Exceptions are thrown, not returned when translating without text domain
data/Readme.md CHANGED
@@ -1,11 +1,12 @@
1
1
  FastGettext
2
2
  ===========
3
- GetText but 3.5 x faster, 560 x less memory, simple, clean namespace (7 vs 34) and threadsafe!
3
+ GetText but 12 x faster, 530 x less garbage, clean namespace (8 vs 26), simple and threadsafe!
4
4
 
5
5
  It supports multiple backends (.mo, .po, .yml files, Database(ActiveRecord + any other), Chain, Loggers) and can easily be extended.
6
6
 
7
7
  [Example Rails application](https://github.com/grosser/gettext_i18n_rails_example)
8
8
 
9
+
9
10
  Comparison
10
11
  ==========
11
12
  <table>
@@ -18,17 +19,17 @@ Comparison
18
19
  </tr>
19
20
  <tr>
20
21
  <td>Speed*</td>
21
- <td>0.82s</td>
22
- <td>1.36s</td>
23
- <td>4.88s</td>
24
- <td>21.77s</td>
22
+ <td>0.08s</td>
23
+ <td>0.14s</td>
24
+ <td>1.75s</td>
25
+ <td>3.75s</td>
25
26
  </tr>
26
27
  <tr>
27
- <td>RAM*</td>
28
- <td>4K</td>
29
- <td>8K</td>
30
- <td>4480K</td>
31
- <td>10100K</td>
28
+ <td>Objects*</td>
29
+ <td>11K</td>
30
+ <td>15K</td>
31
+ <td>8017K</td>
32
+ <td>7107K</td>
32
33
  </tr>
33
34
  <tr>
34
35
  <td>Included backends</td>
@@ -38,10 +39,12 @@ Comparison
38
39
  <td>yml (db/key-value/po/chain in other I18n backends)</td>
39
40
  </tr>
40
41
  </table>
41
- <small>*50.000 translations with ruby enterprise 1.8.6 through `rake benchmark`</small>
42
+ <small>*500.000 translations with ruby 2.5.3 through `bundle exec rake benchmark`</small>
43
+
42
44
 
43
45
  Setup
44
46
  =====
47
+
45
48
  ### 1. Install
46
49
 
47
50
  ```Bash
@@ -60,13 +63,15 @@ Or po files (less maintenance than mo)
60
63
 
61
64
  ```Ruby
62
65
  FastGettext.add_text_domain('my_app', path: 'locale', type: :po)
63
- # :ignore_fuzzy => true to not use fuzzy translations
64
- # :report_warning => false to hide warnings about obsolete/fuzzy translations
66
+ # ignore_fuzzy: true to not use fuzzy translations
67
+ # report_warning: false to hide warnings about obsolete/fuzzy translations
65
68
  ```
66
69
 
67
70
  Or yaml files (use I18n syntax/indentation)
68
71
 
69
72
  ```Ruby
73
+ # A single locale can be segmented in multiple yaml files but they all should be
74
+ # named with a `qq.yml` suffix, where `qq` is the locale name.
70
75
  FastGettext.add_text_domain('my_app', path: 'config/locales', type: :yaml)
71
76
  ```
72
77
 
@@ -75,7 +80,7 @@ Or database (scaleable, good for many locales/translators)
75
80
  ```Ruby
76
81
  # db access is cached <-> only first lookup hits the db
77
82
  require "fast_gettext/translation_repository/db"
78
- FastGettext::TranslationRepository::Db.require_models #load and include default models
83
+ FastGettext::TranslationRepository::Db.require_models # load and include default models
79
84
  FastGettext.add_text_domain('my_app', type: :db, model: TranslationKey)
80
85
  ```
81
86
 
@@ -84,24 +89,83 @@ Do this once in every Thread. (e.g. Rails -> ApplicationController)
84
89
 
85
90
  ```Ruby
86
91
  FastGettext.text_domain = 'my_app'
87
- FastGettext.available_locales = ['de','en','fr','en_US','en_UK'] # only allow these locales to be set (optional)
92
+ FastGettext.available_locales = ['de', 'en', 'fr', 'en_US', 'en_UK'] # only allow these locales to be set (optional)
88
93
  FastGettext.locale = 'de'
89
94
  ```
90
95
 
91
96
  ### 4. Start translating
92
97
 
93
- ```Ruby
94
- include FastGettext::Translation
95
- _('Car') == 'Auto'
96
- _('not-found') == 'not-found'
97
- s_('Namespace|not-found') == 'not-found'
98
- n_('Axis','Axis',3) == 'Achsen' #German plural of Axis
99
- _('Hello %{name}!') % {name: "Pete"} == 'Hello Pete!'
98
+ FastGettext supports all the translation methods of [ruby-gettext](http://github.com/ruby-gettext/gettext) with added support for block defaults.
99
+ (to get `*gettext` methods, use `FastGettext::TranslationAliased`)
100
+
101
+ #### `_()` or `gettext()`: basic translation
102
+
103
+ ```ruby
104
+ extend FastGettext::Translation
105
+ _('Car') == 'Auto' # found translation for 'Car'
106
+ _('not-found') == 'not-found' # The msgid is returned by default
107
+ ```
108
+
109
+ #### `n_()` or `ngettext()`: pluralization
110
+
111
+ ```ruby
112
+ n_('Car', 'Cars', 1) == 'Auto'
113
+ n_('Car', 'Cars', 2) == 'Autos' # German plural of Cars
114
+ ```
115
+
116
+ You'll often want to interpolate the results of `n_()` using ruby builtin `%` operator.
117
+
118
+ ```ruby
119
+ n_('Car', '%{n} Cars', 2) % { n: count } == '2 Autos'
120
+ ```
121
+
122
+ #### `p_()` or `pgettext()`: translation with context
123
+
124
+ ```ruby
125
+ p_('File', 'Open') == _("File\004Open") == "öffnen"
126
+ p_('Context', 'not-found') == 'not-found'
127
+ ```
128
+
129
+ #### `s_()` or `sgettext()`: translation with namespace
130
+
131
+ ```ruby
132
+ s_('File|Open') == _('File|Open') == "öffnen"
133
+ s_('Context|not-found') == 'not-found'
134
+ ```
135
+
136
+ The difference between `s_()` and `p_()` is largely based on how the translations
137
+ are stored. Your preference will be based on your workflow and translation editing
138
+ tools.
139
+
140
+ #### `pn_()` or `pngettext()`: context-aware pluralized
141
+
142
+ ```ruby
143
+ pn_('Fruit', 'Apple', 'Apples', 3) == 'Äpfel'
144
+ pn_('Fruit', 'Apple', 'Apples', 1) == 'Apfel'
145
+ ```
146
+
147
+ #### `sn_()` or `sngettext()`: without context pluralized
148
+
149
+ ```ruby
150
+ sn_('Fruit|Apple', 'Apples', 3) == 'Äpfel'
151
+ sn_('Fruit|Apple', 'Apples', 1) == 'Apfel'
152
+ ```
153
+
154
+ #### `N_()` and `Nn_()`: make dynamic translations available to the parser.
155
+
156
+ In many instances, your strings will not be found by the ruby parsing. These methods
157
+ allow for those strings to be discovered.
158
+
159
+ ```
160
+ N_("active"); N_("inactive"); N_("paused") # possible value of status for parser to find.
161
+ Nn_("active", "inactive", "paused") # alternative method
162
+ _("Your account is %{account_state}.") % { account_state: _(status) }
100
163
  ```
101
164
 
102
165
 
103
166
  Managing translations
104
- ============
167
+ =====================
168
+
105
169
  ### mo/po-files
106
170
  Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
107
171
 
@@ -111,12 +175,12 @@ Tell Gettext where your .mo or .po files lie, e.g. for locale/de/my_app.po and l
111
175
  FastGettext.add_text_domain('my_app', path: 'locale')
112
176
  ```
113
177
 
114
- Use the [original GetText](http://github.com/mutoh/gettext) to create and manage po/mo-files.
178
+ Use the [original GetText](http://github.com/ruby-gettext/gettext) to create and manage po/mo-files.
115
179
  (Work on a po/mo parser & reader that is easier to use has started, contributions welcome @ [get_pomo](http://github.com/grosser/get_pomo) )
116
180
 
117
181
  ### Database
118
182
  [Example migration for ActiveRecord](http://github.com/grosser/fast_gettext/blob/master/examples/db/migration.rb)<br/>
119
- The default plural seperator is `||||` but you may overwrite it (or suggest a better one..).
183
+ The default plural separator is `||||` but you may overwrite it (or suggest a better one...).
120
184
 
121
185
  This is usable with any model DataMapper/Sequel or any other(non-database) backend, the only thing you need to do is respond to the self.translation(key, locale) call.
122
186
  If you want to use your own models, have a look at the [default models](http://github.com/grosser/fast_gettext/tree/master/lib/fast_gettext/translation_repository/db_models) to see what you want/need to implement.
@@ -128,7 +192,7 @@ Rails
128
192
  Try the [gettext_i18n_rails plugin](http://github.com/grosser/gettext_i18n_rails), it simplifies the setup.<br/>
129
193
  Try the [translation_db_engine](http://github.com/grosser/translation_db_engine), to manage your translations in a db.
130
194
 
131
- Setting `available_locales`,`text_domain` or `locale` will not work inside the `evironment.rb`,
195
+ Setting `available_locales`,`text_domain` or `locale` will not work inside the `environment.rb`,
132
196
  since it runs in a different thread then e.g. controllers, so set them inside your application_controller.
133
197
 
134
198
  ```Ruby
@@ -143,7 +207,7 @@ class ApplicationController ...
143
207
  include FastGettext::Translation
144
208
  before_filter :set_locale
145
209
  def set_locale
146
- FastGettext.available_locales = ['de','en',...]
210
+ FastGettext.available_locales = ['de', 'en', ...]
147
211
  FastGettext.text_domain = 'frontend'
148
212
  FastGettext.set_locale(params[:locale] || session[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'])
149
213
  session[:locale] = I18n.locale = FastGettext.locale
@@ -153,6 +217,7 @@ class ApplicationController ...
153
217
 
154
218
  Advanced features
155
219
  =================
220
+
156
221
  ### Abnormal pluralisation
157
222
  Plurals are selected by index, think of it as `['car', 'cars'][index]`<br/>
158
223
  A pluralisation rule decides which form to use e.g. in english its `count == 1 ? 0 : 1`.<br/>
@@ -161,7 +226,7 @@ If you have any languages that do not fit this rule, you have to add a custom pl
161
226
  Via Ruby:
162
227
 
163
228
  ```Ruby
164
- FastGettext.pluralisation_rule = lambda{|count| count > 5 ? 1 : (count > 2 ? 0 : 2)}
229
+ FastGettext.pluralisation_rule = ->(count){ count > 5 ? 1 : (count > 2 ? 0 : 2)}
165
230
  ```
166
231
 
167
232
  Via mo/pofile:
@@ -177,7 +242,7 @@ If you only use one text domain, setting `FastGettext.default_text_domain = 'app
177
242
  is sufficient and no more `text_domain=` is needed
178
243
 
179
244
  ### default_locale
180
- If the simple rule of "first `availble_locale` or 'en'" is not suficcient for you, set `FastGettext.default_locale = 'de'`.
245
+ If the simple rule of "first `available_locale` or 'en'" is not sufficient for you, set `FastGettext.default_locale = 'de'`.
181
246
 
182
247
  ### default_available_locales
183
248
  Fallback when no available_locales are set
@@ -201,7 +266,7 @@ repos = [
201
266
  FastGettext::TranslationRepository.build('new', path: '....'),
202
267
  FastGettext::TranslationRepository.build('old', path: '....')
203
268
  ]
204
- FastGettext.add_text_domain 'combined', type: :chain, :chain: repos
269
+ FastGettext.add_text_domain 'combined', type: :chain, chain: repos
205
270
  ```
206
271
 
207
272
  ### Merge
@@ -211,8 +276,8 @@ a subordinate repository is added. This puts the burden on the load phase and sp
211
276
 
212
277
  ```Ruby
213
278
  repos = [
214
- FastGettext::TranslationRepository.build('new', :path: '....'),
215
- FastGettext::TranslationRepository.build('old', :path: '....')
279
+ FastGettext::TranslationRepository.build('new', path: '....'),
280
+ FastGettext::TranslationRepository.build('old', path: '....')
216
281
  ]
217
282
  domain = FastGettext.add_text_domain 'combined', type: :merge, chain: repos
218
283
  ```
@@ -230,7 +295,7 @@ When you want to know which keys could not be translated or were used, add a Log
230
295
  ```Ruby
231
296
  repos = [
232
297
  FastGettext::TranslationRepository.build('app', path: '....')
233
- FastGettext::TranslationRepository.build('logger', type: :logger, callback: lambda{|key_or_array_of_ids| ... }),
298
+ FastGettext::TranslationRepository.build('logger', type: :logger, callback: ->(key_or_array_of_ids) { ... }),
234
299
  }
235
300
  FastGettext.add_text_domain 'combined', type: :chain, chain: repos
236
301
  ```
@@ -240,11 +305,11 @@ Unfound may not always mean missing, if you choose not to translate a word becau
240
305
  A lambda or anything that responds to `call` will do as callback. A good starting point may be `examples/missing_translations_logger.rb`.
241
306
 
242
307
  ### Plugins
243
- Want a xml version ?
308
+ Want an xml version?
244
309
  Write your own TranslationRepository!
245
310
 
246
311
  ```Ruby
247
- # fast_gettext/translation_repository/xxx.rb
312
+ # fast_gettext/translation_repository/wtf.rb
248
313
  module FastGettext
249
314
  module TranslationRepository
250
315
  class Wtf
@@ -261,33 +326,65 @@ If you have more than one gettext domain, there are two sets of functions
261
326
  available:
262
327
 
263
328
  ```Ruby
264
- include FastGettext::TranslationMultidomain
329
+ extend FastGettext::TranslationMultidomain
265
330
 
266
331
  d_("domainname", "string") # finds 'string' in domain domainname
267
332
  dn_("domainname", "string", "strings", 1) # ditto
268
- # etc.
333
+ dp_("domainname", "context", "key")
334
+ ds_("domainname", "context|key")
335
+ dnp_("domainname", "context", "string", "strings")
336
+ dns_("domainname", "context|string", "strings")
269
337
  ```
270
338
 
271
339
  These are helper methods so you don't need to write:
272
340
 
273
341
  ```Ruby
274
- FastGettext.text_domain = "domainname"
275
- _("string")
342
+ FastGettext.with_domain("domainname") { _("string") }
276
343
  ```
277
344
 
278
345
  It is useful in Rails plugins in the views for example. The second set of
279
346
  functions are D functions which search for string in _all_ domains. If there
280
347
  are multiple translations in different domains, it returns them in random
281
- order (depends on the Ruby hash implementation):
348
+ order (depends on the Ruby hash implementation).
282
349
 
283
350
  ```Ruby
284
- include FastGettext::TranslationMultidomain
351
+ extend FastGettext::TranslationMultidomain
285
352
 
286
353
  D_("string") # finds 'string' in any domain
287
- # etc.
354
+ Dn_("string", "strings", 1) # ditto
355
+ Dp_("context", "key")
356
+ Ds_("context|key")
357
+ Dnp_("context", "string", "strings")
358
+ Dns_("context|string", "strings")
359
+ ```
360
+
361
+ Alternatively you can use [merge repository](https://github.com/grosser/fast_gettext#merge) to achieve the same behavior.
362
+
363
+ #### Block defaults
364
+
365
+ All the translation methods (including MultiDomain) support a block default, a feature not provided by ruby-gettext. When a translation is
366
+ not found, if a block is provided the block is always returned. Otherwise, a key is returned. Methods doing pluralization will attempt a simple translation of alternate keys.
367
+
368
+ ```ruby
369
+ _('not-found'){ "alternative default" } == alternate default
370
+ ```
371
+
372
+ This block default is useful when the default is a very long passage of text that wouldn't make a useful key. You can also instrument logging not found keys.
373
+
374
+ ```ruby
375
+ _('terms-and-conditions'){
376
+ load_terms_and_conditions
377
+ request_terms_and_conditions_translation_from_legal
378
+ }
379
+
380
+ # Override _ with logging
381
+ def _(key, &block)
382
+ result = gettext(key){ nil } # nil returned when not found
383
+ log_missing_translation_key(key) if result.nil?
384
+ result || (block ? block.call : key)
385
+ end
288
386
  ```
289
387
 
290
- Alternatively you can use [merge repository](https://github.com/grosser/fast_gettext#merge) to achieve the same behaviour.
291
388
 
292
389
  FAQ
293
390
  ===
@@ -295,13 +392,8 @@ FAQ
295
392
  - [Iconv require error in 1.9.2](http://exceptionz.wordpress.com/2010/02/03/how-to-fix-the-iconv-require-error-in-ruby-1-9)
296
393
 
297
394
 
298
- TODO
299
- ====
300
- - Add a fallback for Iconv.conv in ruby 1.9.4 -> lib/fast_gettext/vendor/iconv
301
- - YML backend that reads ActiveSupport::I18n files
302
-
303
- Author
304
- ======
395
+ Authors
396
+ =======
305
397
  Mo/Po-file parsing from Masao Mutoh, see vendor/README
306
398
 
307
399
  ### [Contributors](http://github.com/grosser/fast_gettext/contributors)
@@ -323,8 +415,11 @@ Mo/Po-file parsing from Masao Mutoh, see vendor/README
323
415
  - [Dominic Cleal](https://github.com/domcleal)
324
416
  - [Tomas Strachota](https://github.com/tstrachota)
325
417
  - [Martin Meier](https://github.com/mameier)
418
+ - [morcoteg](https://github.com/morcoteg)
419
+ - [Daniel Schepers](https://github.com/tall-dan)
420
+ - [Robert Graff](https://github.com/rgraff)
326
421
 
327
422
  [Michael Grosser](http://grosser.it)<br/>
328
423
  michael@grosser.it<br/>
329
424
  License: MIT, some vendor parts under the same license terms as Ruby (see headers)<br/>
330
- [![Build Status](https://travis-ci.org/grosser/fast_gettext.png)](https://travis-ci.org/grosser/fast_gettext)
425
+ [![CI](https://github.com/grosser/fast_gettext/actions/workflows/actions.yml/badge.svg)](https://github.com/grosser/fast_gettext/actions/workflows/actions.yml)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FastGettext
2
4
  class Cache
3
5
  def initialize
@@ -8,13 +10,13 @@ module FastGettext
8
10
  def fetch(key)
9
11
  translation = @current[key]
10
12
  if translation.nil? # uncached
11
- @current[key] = yield || false # TODO get rid of this false hack and cache :missing
13
+ @current[key] = yield || false # TODO: get rid of this false hack and cache :missing
12
14
  else
13
15
  translation
14
16
  end
15
17
  end
16
18
 
17
- # TODO only used for tests, maybe if-else around it ...
19
+ # TODO: only used for tests, maybe if-else around it ...
18
20
  def []=(key, value)
19
21
  @current[key] = value
20
22
  end
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fast_gettext/vendor/mofile'
2
4
  module FastGettext
3
5
  # Responsibility:
4
6
  # - abstract mo files for Mo Repository
5
7
  class MoFile
6
- PLURAL_SEPERATOR = "\000"
8
+ PLURAL_SEPARATOR = "\000"
9
+ CONTEXT_SEPARATOR = "\004"
7
10
 
8
11
  # file => path or FastGettext::GetText::MOFile
9
- def initialize(file, options={})
12
+ def initialize(file, options = {})
10
13
  @filename = file
14
+ @data = nil
11
15
  load_data if options[:eager_load]
12
16
  end
13
17
 
@@ -15,17 +19,21 @@ module FastGettext
15
19
  data[key]
16
20
  end
17
21
 
18
- #returns the plural forms or all singular translations that where found
22
+ # returns the plural forms or all singular translations that where found
19
23
  # Car, Cars => [Auto,Autos] or []
20
24
  def plural(*msgids)
21
- split_plurals(self[msgids*PLURAL_SEPERATOR].to_s)
25
+ split_plurals(self[msgids * PLURAL_SEPARATOR].to_s)
22
26
  end
23
27
 
24
28
  def pluralisation_rule
25
- #gettext uses 0 as default rule, which would turn off all pluralisation, very clever...
26
- #additionally parsing fails when directly accessing po files, so this line was taken from gettext/mofile
27
- (data['']||'').split("\n").each do |line|
28
- return lambda{|n|eval($2)} if /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
29
+ # gettext uses 0 as default rule, which would turn off all pluralisation, very clever...
30
+ # additionally parsing fails when directly accessing po files, so this line was taken from gettext/mofile
31
+ (data[''] || '').split("\n").each do |line|
32
+ if /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
33
+ return ->(n) do # rubocop:disable Lint/UnusedBlockArgument
34
+ eval($2) # rubocop:disable Security/Eval
35
+ end
36
+ end
29
37
  end
30
38
  nil
31
39
  end
@@ -36,35 +44,37 @@ module FastGettext
36
44
  end
37
45
 
38
46
  def self.empty
39
- MoFile.new(File.join(File.dirname(__FILE__),'vendor','empty.mo'))
47
+ MoFile.new(File.join(File.dirname(__FILE__), 'vendor', 'empty.mo'))
40
48
  end
41
49
 
42
50
  private
43
51
 
44
52
  def load_data
45
- @data = if @filename.is_a? FastGettext::GetText::MOFile
46
- @filename
47
- else
48
- FastGettext::GetText::MOFile.open(@filename, "UTF-8")
49
- end
53
+ @data =
54
+ if @filename.is_a? FastGettext::GetText::MOFile
55
+ @filename
56
+ else
57
+ FastGettext::GetText::MOFile.open(@filename, "UTF-8")
58
+ end
50
59
  make_singular_and_plural_available
51
60
  end
52
61
 
53
- #(if plural==singular, prefer singular)
62
+ # (if plural==singular, prefer singular)
54
63
  def make_singular_and_plural_available
55
64
  data = {}
56
- @data.each do |key,translation|
57
- next unless key.include? PLURAL_SEPERATOR
65
+ @data.each do |key, translation|
66
+ next unless key.include? PLURAL_SEPARATOR
67
+
58
68
  singular, plural = split_plurals(key)
59
69
  translation = split_plurals(translation)
60
70
  data[singular] ||= translation[0]
61
71
  data[plural] ||= translation[1]
62
72
  end
63
- @data.merge!(data){|key,old,new| old}
73
+ @data.merge!(data) { |_key, old, _new| old }
64
74
  end
65
75
 
66
76
  def split_plurals(singular_plural)
67
- singular_plural.split(PLURAL_SEPERATOR)
77
+ singular_plural.split(PLURAL_SEPARATOR)
68
78
  end
69
79
  end
70
80
  end