fast_gettext 1.1.2 → 1.2.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
  SHA1:
3
- metadata.gz: 36f41bf872f76a6c0c9b26ba498a0fecc968c230
4
- data.tar.gz: d5e0c0eaad54bb0b3d7853e23873bdaca80f9280
3
+ metadata.gz: f47483365d8998f016a8c092875a4b92cc281264
4
+ data.tar.gz: e3cdfa1fd0ca9ffc4b7ba397c10f7de01e6099d4
5
5
  SHA512:
6
- metadata.gz: 228f8ed4f8ef424374fd922b6788576471ab3912b0535a1614ca560dd38ce240d2dd65138202f68f1f5eec120477967f67d12d63f495cd51622a6ea9a9c8f42c
7
- data.tar.gz: dfa66187d06d380817522c75ac0903ef9fb9141773d6414a0748dd4c56e7239759367f0483b344a7ed8c35fb99cf69ea98efe839ed85b5a80c65e84469c276cd
6
+ metadata.gz: cf39c69120683117225d63aed75e3d4e451d89ef863edebee55055155b16dc5ed37413d183cd98e5edca4c63fe758652664f3afa0574c40a58eb70bc859a5280
7
+ data.tar.gz: 14ddb2652d36ce7b9f9dc22bdfbcc36341446d5e623b1df41f33087cd75507194b567aabd96cab384573c94344084122297846f7b920b84746b8ac1a25a79b8d
data/CHANGELOG CHANGED
@@ -1,3 +1,4 @@
1
+ 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
1
2
  1.0.0 -- do not enforce attr_accessible unless ProtectedAttributes are loaded
2
3
  0.9.0 -- reworked internals of caching to be plugable
3
4
  0.7.0 -- set_locale resets to default locale if none of the available locales was tried to set
data/Readme.md CHANGED
@@ -50,24 +50,24 @@ Setup
50
50
 
51
51
  From mo files (traditional/default)
52
52
 
53
- FastGettext.add_text_domain('my_app',:path => 'locale')
53
+ FastGettext.add_text_domain('my_app', path: 'locale')
54
54
 
55
55
  Or po files (less maintenance than mo)
56
56
 
57
- FastGettext.add_text_domain('my_app',:path => 'locale', :type => :po)
57
+ FastGettext.add_text_domain('my_app', path: 'locale', type: :po)
58
58
  # :ignore_fuzzy => true to not use fuzzy translations
59
59
  # :report_warning => false to hide warnings about obsolete/fuzzy translations
60
60
 
61
61
  Or yaml files (use I18n syntax/indentation)
62
62
 
63
- FastGettext.add_text_domain('my_app', :path => 'config/locales', :type => :yaml)
63
+ FastGettext.add_text_domain('my_app', path: 'config/locales', type: :yaml)
64
64
 
65
65
  Or database (scaleable, good for many locales/translators)
66
66
 
67
67
  # db access is cached <-> only first lookup hits the db
68
68
  require "fast_gettext/translation_repository/db"
69
69
  FastGettext::TranslationRepository::Db.require_models #load and include default models
70
- FastGettext.add_text_domain('my_app', :type => :db, :model => TranslationKey)
70
+ FastGettext.add_text_domain('my_app', type: :db, model: TranslationKey)
71
71
 
72
72
  ### 3. Choose text domain and locale for translation
73
73
  Do this once in every Thread. (e.g. Rails -> ApplicationController)
@@ -83,7 +83,7 @@ Do this once in every Thread. (e.g. Rails -> ApplicationController)
83
83
  _('not-found') == 'not-found'
84
84
  s_('Namespace|not-found') == 'not-found'
85
85
  n_('Axis','Axis',3) == 'Achsen' #German plural of Axis
86
- _('Hello %{name}!') % {:name => "Pete"} == 'Hello Pete!'
86
+ _('Hello %{name}!') % {name: "Pete"} == 'Hello Pete!'
87
87
 
88
88
 
89
89
  Managing translations
@@ -93,7 +93,7 @@ Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_r
93
93
 
94
94
  Tell Gettext where your .mo or .po files lie, e.g. for locale/de/my_app.po and locale/de/LC_MESSAGES/my_app.mo
95
95
 
96
- FastGettext.add_text_domain('my_app',:path=>'locale')
96
+ FastGettext.add_text_domain('my_app', path: 'locale')
97
97
 
98
98
  Use the [original GetText](http://github.com/mutoh/gettext) to create and manage po/mo-files.
99
99
  (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,9 +116,9 @@ Setting `available_locales`,`text_domain` or `locale` will not work inside the `
116
116
  since it runs in a different thread then e.g. controllers, so set them inside your application_controller.
117
117
 
118
118
  #environment.rb after initializers
119
- Object.send(:include,FastGettext::Translation)
120
- FastGettext.add_text_domain('accounting',:path=>'locale')
121
- FastGettext.add_text_domain('frontend',:path=>'locale')
119
+ Object.send(:include, FastGettext::Translation)
120
+ FastGettext.add_text_domain('accounting', path: 'locale')
121
+ FastGettext.add_text_domain('frontend', path: 'locale')
122
122
  ...
123
123
 
124
124
  #application_controller.rb
@@ -165,19 +165,35 @@ You can use any number of repositories to find a translation. Simply add them to
165
165
  the first cannot translate a given key, the next is asked and so forth.
166
166
 
167
167
  repos = [
168
- FastGettext::TranslationRepository.build('new', :path=>'....'),
169
- FastGettext::TranslationRepository.build('old', :path=>'....')
168
+ FastGettext::TranslationRepository.build('new', path: '....'),
169
+ FastGettext::TranslationRepository.build('old', path: '....')
170
170
  ]
171
- FastGettext.add_text_domain 'combined', :type=>:chain, :chain=>repos
171
+ FastGettext.add_text_domain 'combined', type: :chain, :chain: repos
172
+
173
+ ###Merge
174
+ In some cases you can benefit from using merge repositories as an alternative to chains. They behave nearly the same. The difference is in the internal
175
+ data structure. While chain repos iterate over the whole chain for each translation, merge repositories select and store the first translation at the time
176
+ a subordinate repository is added. This puts the burden on the load phase and speeds up the translations.
177
+
178
+ repos = [
179
+ FastGettext::TranslationRepository.build('new', :path: '....'),
180
+ FastGettext::TranslationRepository.build('old', :path: '....')
181
+ ]
182
+ domain = FastGettext.add_text_domain 'combined', type: :merge, chain: repos
183
+
184
+ Downside of this approach is that you have to reload the merge repo each time a language is changed.
185
+
186
+ FastGettext.locale = 'de'
187
+ domain.reload
172
188
 
173
189
  ###Logger
174
190
  When you want to know which keys could not be translated or were used, add a Logger to a Chain:
175
191
 
176
192
  repos = [
177
- FastGettext::TranslationRepository.build('app', :path=>'....')
178
- FastGettext::TranslationRepository.build('logger', :type=>:logger, :callback=>lambda{|key_or_array_of_ids| ... }),
193
+ FastGettext::TranslationRepository.build('app', path: '....')
194
+ FastGettext::TranslationRepository.build('logger', type: :logger, callback: lambda{|key_or_array_of_ids| ... }),
179
195
  }
180
- FastGettext.add_text_domain 'combined', :type=>:chain, :chain=>repos
196
+ FastGettext.add_text_domain 'combined', type: :chain, chain: repos
181
197
 
182
198
  If the Logger is in position #1 it will see all translations, if it is in position #2 it will only see the unfound.
183
199
  Unfound may not always mean missing, if you choose not to translate a word because the key is a good translation, it will appear nevertheless.
@@ -223,6 +239,8 @@ order (depends on the Ruby hash implementation):
223
239
  D_("string") # finds 'string' in any domain
224
240
  # etc.
225
241
 
242
+ Alternatively you can use [merge repository](https://github.com/grosser/fast_gettext#merge) to achieve the same behaviour.
243
+
226
244
  FAQ
227
245
  ===
228
246
  - [Problems with ActiveRecord messages?](http://wiki.github.com/grosser/fast_gettext/activerecord)
@@ -30,17 +30,17 @@ module FastGettext
30
30
  nil
31
31
  end
32
32
 
33
+ def data
34
+ load_data if @data.nil?
35
+ @data
36
+ end
37
+
33
38
  def self.empty
34
39
  MoFile.new(File.join(File.dirname(__FILE__),'vendor','empty.mo'))
35
40
  end
36
41
 
37
42
  private
38
43
 
39
- def data
40
- load_data if @data.nil?
41
- @data
42
- end
43
-
44
44
  def load_data
45
45
  @data = if @filename.is_a? FastGettext::GetText::MOFile
46
46
  @filename
@@ -32,7 +32,7 @@ module FastGettext
32
32
  parser.report_warning = options.fetch(:report_warning, true)
33
33
 
34
34
  mo_file = FastGettext::GetText::MOFile.new
35
- parser.parse_file(file, mo_file)
35
+ parser.parse(File.read(file), mo_file)
36
36
  mo_file
37
37
  end
38
38
  end
@@ -0,0 +1,73 @@
1
+ require 'fast_gettext/translation_repository/po'
2
+
3
+ module FastGettext
4
+ module TranslationRepository
5
+ # Responsibility:
6
+ # - merge data from multiple repositories into one hash structure
7
+ # - can be used instead of searching for translations in multiple domains
8
+ # - requires reload when current locale is changed
9
+ class Merge < Base
10
+ def initialize(name, options={})
11
+ clear
12
+ super(name, options)
13
+ options.fetch(:chain, []).each do |repo|
14
+ add_repo(repo)
15
+ end
16
+ end
17
+
18
+ def available_locales
19
+ @repositories.flat_map(&:available_locales).uniq
20
+ end
21
+
22
+ def pluralisation_rule
23
+ @repositories.each do |r|
24
+ result = r.pluralisation_rule and return result
25
+ end
26
+ nil
27
+ end
28
+
29
+ def plural(*keys)
30
+ @repositories.each do |r|
31
+ result = r.plural(*keys)
32
+ return result unless result.compact.empty?
33
+ end
34
+ []
35
+ end
36
+
37
+ def reload
38
+ @data = {}
39
+ @repositories.each do |r|
40
+ r.reload
41
+ load_repo(r)
42
+ end
43
+ super
44
+ end
45
+
46
+ def add_repo(repo)
47
+ raise "Unsupported repository" unless repo_supported?(repo)
48
+ @repositories << repo
49
+ load_repo(repo)
50
+ true
51
+ end
52
+
53
+ def [](key)
54
+ @data[key]
55
+ end
56
+
57
+ def clear
58
+ @repositories = []
59
+ @data = {}
60
+ end
61
+
62
+ protected
63
+
64
+ def repo_supported?(repo)
65
+ repo.respond_to?(:all_translations)
66
+ end
67
+
68
+ def load_repo(r)
69
+ @data = r.all_translations.merge(@data)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -24,12 +24,16 @@ module FastGettext
24
24
  super
25
25
  end
26
26
 
27
+ def all_translations
28
+ current_translations.data
29
+ end
30
+
27
31
  protected
28
32
 
29
33
  def find_and_store_files(name,options)
30
34
  # parse all .mo files with the right name, that sit in locale/LC_MESSAGES folders
31
35
  find_files_in_locale_folders(File.join('LC_MESSAGES',"#{name}.mo"), options[:path]) do |locale,file|
32
- MoFile.new(file, :eager_load => @eager_load)
36
+ MoFile.new(file, eager_load: @eager_load)
33
37
  end
34
38
  end
35
39
 
@@ -133,7 +133,7 @@ module GetText
133
133
 
134
134
  def parse_file(po_file, data)
135
135
  args = [ po_file ]
136
- # We should not try to detect the string encoding in Ruby 1.8
136
+ # In Ruby 1.9, we must detect proper encoding of a PO file.
137
137
  if String.instance_methods.include?(:encode)
138
138
  encoding = detect_file_encoding(po_file)
139
139
  args << "r:#{encoding}"
@@ -144,7 +144,7 @@ module GetText
144
144
 
145
145
  def detect_file_encoding(po_file)
146
146
  open(po_file, :encoding => 'ASCII-8BIT') do |input|
147
- input.each_line do |line|
147
+ input.lines.each do |line|
148
148
  return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
149
149
  end
150
150
  end
@@ -1,3 +1,3 @@
1
1
  module FastGettext
2
- VERSION = Version = '1.1.2'
2
+ VERSION = Version = '1.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_gettext
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-18 00:00:00.000000000 Z
11
+ date: 2016-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -129,6 +129,7 @@ files:
129
129
  - lib/fast_gettext/translation_repository/db_models/translation_key.rb
130
130
  - lib/fast_gettext/translation_repository/db_models/translation_text.rb
131
131
  - lib/fast_gettext/translation_repository/logger.rb
132
+ - lib/fast_gettext/translation_repository/merge.rb
132
133
  - lib/fast_gettext/translation_repository/mo.rb
133
134
  - lib/fast_gettext/translation_repository/po.rb
134
135
  - lib/fast_gettext/translation_repository/yaml.rb
@@ -139,7 +140,7 @@ files:
139
140
  - lib/fast_gettext/vendor/poparser.rb
140
141
  - lib/fast_gettext/vendor/string.rb
141
142
  - lib/fast_gettext/version.rb
142
- homepage: http://github.com/grosser/fast_gettext
143
+ homepage: https://github.com/grosser/fast_gettext
143
144
  licenses:
144
145
  - MIT
145
146
  - Ruby
@@ -152,7 +153,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
153
  requirements:
153
154
  - - ">="
154
155
  - !ruby/object:Gem::Version
155
- version: '0'
156
+ version: 2.1.0
156
157
  required_rubygems_version: !ruby/object:Gem::Requirement
157
158
  requirements:
158
159
  - - ">="
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  version: '0'
161
162
  requirements: []
162
163
  rubyforge_project:
163
- rubygems_version: 2.6.14
164
+ rubygems_version: 2.5.1
164
165
  signing_key:
165
166
  specification_version: 4
166
167
  summary: A simple, fast, memory-efficient and threadsafe implementation of GetText