fast_gettext 0.6.4 → 0.6.5
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.
- data/.gitignore +2 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +6 -6
- data/Rakefile +16 -12
- data/Readme.md +14 -2
- data/fast_gettext.gemspec +9 -105
- data/lib/fast_gettext.rb +0 -1
- data/lib/fast_gettext/vendor/mofile.rb +99 -32
- data/lib/fast_gettext/version.rb +3 -0
- data/spec/fast_gettext/mo_file_spec.rb +6 -1
- data/spec/locale/de/LC_MESSAGES/test.mo +0 -0
- data/spec/locale/de/test.po +6 -0
- metadata +26 -41
- data/VERSION +0 -1
- data/lib/fast_gettext/VERSION +0 -1
data/.gitignore
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
fast_gettext (0.6.5)
|
5
|
+
|
1
6
|
GEM
|
2
7
|
remote: http://rubygems.org/
|
3
8
|
specs:
|
@@ -17,12 +22,7 @@ GEM
|
|
17
22
|
bcrypt-ruby (3.0.1)
|
18
23
|
builder (3.0.0)
|
19
24
|
diff-lcs (1.1.3)
|
20
|
-
git (1.2.5)
|
21
25
|
i18n (0.6.0)
|
22
|
-
jeweler (1.6.4)
|
23
|
-
bundler (~> 1.0)
|
24
|
-
git (>= 1.2.5)
|
25
|
-
rake
|
26
26
|
multi_json (1.0.3)
|
27
27
|
rake (0.9.2)
|
28
28
|
rspec (2.6.0)
|
@@ -41,7 +41,7 @@ PLATFORMS
|
|
41
41
|
|
42
42
|
DEPENDENCIES
|
43
43
|
activerecord
|
44
|
-
|
44
|
+
fast_gettext!
|
45
45
|
rake
|
46
46
|
rspec (~> 2)
|
47
47
|
sqlite3
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
1
3
|
task :default do
|
2
4
|
sh "AR='~>2' && (bundle || bundle install) && bundle exec rspec spec" # ActiveRecord 2
|
3
5
|
sh "AR='~>3' && (bundle || bundle install) && bundle exec rspec spec" # ActiveRecord 3
|
@@ -16,17 +18,19 @@ task :namespaces do
|
|
16
18
|
puts `ruby benchmark/namespace/fast_gettext.rb`
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
# extracted from https://github.com/grosser/project_template
|
22
|
+
rule /^version:bump:.*/ do |t|
|
23
|
+
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
24
|
+
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
25
|
+
file = 'lib/fast_gettext/version.rb'
|
26
|
+
|
27
|
+
version_file = File.read(file)
|
28
|
+
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
29
|
+
version_parts[index] = version_parts[index].to_i + 1
|
30
|
+
version_parts[2] = 0 if index < 2 # remove patch for minor
|
31
|
+
version_parts[1] = 0 if index < 1 # remove minor for major
|
32
|
+
new_version = version_parts * '.'
|
33
|
+
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
28
34
|
|
29
|
-
|
30
|
-
rescue LoadError
|
31
|
-
puts "Jeweler, or one of its dependencies, is not available. Install it with: gem install jeweler"
|
35
|
+
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
32
36
|
end
|
data/Readme.md
CHANGED
@@ -35,7 +35,7 @@ Comparison
|
|
35
35
|
<td></td>
|
36
36
|
<td>db, yml, mo, po, logger, chain</td>
|
37
37
|
<td>mo</td>
|
38
|
-
<td>yml</td>
|
38
|
+
<td>yml (db/key-value/po/chain in other I18n backends)</td>
|
39
39
|
</tr>
|
40
40
|
</table>
|
41
41
|
<small>*50.000 translations with ruby enterprise 1.8.6 through `rake benchmark`</small>
|
@@ -43,22 +43,27 @@ Comparison
|
|
43
43
|
Setup
|
44
44
|
=====
|
45
45
|
### 1. Install
|
46
|
+
|
46
47
|
sudo gem install fast_gettext
|
47
48
|
|
48
49
|
### 2. Add a translation repository
|
49
50
|
|
50
51
|
From mo files (traditional/default)
|
52
|
+
|
51
53
|
FastGettext.add_text_domain('my_app',:path=>'locale')
|
52
54
|
|
53
55
|
Or po files (less maintenance than mo)
|
56
|
+
|
54
57
|
FastGettext.add_text_domain('my_app',:path=>'locale', :type=>:po)
|
55
58
|
# :ignore_fuzzy => true to silence warnings about fuzzy translations
|
56
59
|
# :ignore_obsolete => true to silence warnings about obsolete translations
|
57
60
|
|
58
61
|
Or yaml files (use I18n syntax/indentation)
|
62
|
+
|
59
63
|
FastGettext.add_text_domain('my_app',:path=>'config/locales', :type=>:yaml)
|
60
64
|
|
61
65
|
Or database (scaleable, good for many locales/translators)
|
66
|
+
|
62
67
|
# db access is cached <-> only first lookup hits the db
|
63
68
|
require "fast_gettext/translation_repository/db"
|
64
69
|
FastGettext::TranslationRepository::Db.require_models #load and include default models
|
@@ -66,11 +71,13 @@ Or database (scaleable, good for many locales/translators)
|
|
66
71
|
|
67
72
|
### 3. Choose text domain and locale for translation
|
68
73
|
Do this once in every Thread. (e.g. Rails -> ApplicationController)
|
74
|
+
|
69
75
|
FastGettext.text_domain = 'my_app'
|
70
76
|
FastGettext.available_locales = ['de','en','fr','en_US','en_UK'] # only allow these locales to be set (optional)
|
71
77
|
FastGettext.locale = 'de'
|
72
78
|
|
73
79
|
### 4. Start translating
|
80
|
+
|
74
81
|
include FastGettext::Translation
|
75
82
|
_('Car') == 'Auto'
|
76
83
|
_('not-found') == 'not-found'
|
@@ -84,6 +91,7 @@ Managing translations
|
|
84
91
|
Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
|
85
92
|
|
86
93
|
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
|
94
|
+
|
87
95
|
FastGettext.add_text_domain('my_app',:path=>'locale')
|
88
96
|
|
89
97
|
Use the [original GetText](http://github.com/mutoh/gettext) to create and manage po/mo-files.
|
@@ -153,6 +161,7 @@ Fallback when no available_locales are set
|
|
153
161
|
###Chains
|
154
162
|
You can use any number of repositories to find a translation. Simply add them to a chain and when
|
155
163
|
the first cannot translate a given key, the next is asked and so forth.
|
164
|
+
|
156
165
|
repos = [
|
157
166
|
FastGettext::TranslationRepository.build('new', :path=>'....'),
|
158
167
|
FastGettext::TranslationRepository.build('old', :path=>'....')
|
@@ -161,11 +170,13 @@ the first cannot translate a given key, the next is asked and so forth.
|
|
161
170
|
|
162
171
|
###Logger
|
163
172
|
When you want to know which keys could not be translated or were used, add a Logger to a Chain:
|
173
|
+
|
164
174
|
repos = [
|
165
175
|
FastGettext::TranslationRepository.build('app', :path=>'....')
|
166
176
|
FastGettext::TranslationRepository.build('logger', :type=>:logger, :callback=>lamda{|key_or_array_of_ids| ... }),
|
167
177
|
}
|
168
178
|
FastGettext.add_text_domain 'combined', :type=>:chain, :chain=>repos
|
179
|
+
|
169
180
|
If the Logger is in position #1 it will see all translations, if it is in position #2 it will only see the unfound.
|
170
181
|
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.
|
171
182
|
A lambda or anything that responds to `call` will do as callback. A good starting point may be `examples/missing_translations_logger.rb`.
|
@@ -173,6 +184,7 @@ A lambda or anything that responds to `call` will do as callback. A good startin
|
|
173
184
|
###Plugins
|
174
185
|
Want a xml version ?
|
175
186
|
Write your own TranslationRepository!
|
187
|
+
|
176
188
|
#fast_gettext/translation_repository/xxx.rb
|
177
189
|
module FastGettext
|
178
190
|
module TranslationRepository
|
@@ -208,9 +220,9 @@ Mo/Po-file parsing from Masao Mutoh, see vendor/README
|
|
208
220
|
- [Ramón Cahenzli](http://www.psy-q.ch)
|
209
221
|
- [Rainux Luo](http://rainux.org)
|
210
222
|
- [Dmitry Borodaenko](https://github.com/angdraug)
|
223
|
+
- [Kouhei Sutou](https://github.com/kou)
|
211
224
|
|
212
225
|
[Michael Grosser](http://grosser.it)<br/>
|
213
226
|
michael@grosser.it<br/>
|
214
227
|
Hereby placed under public domain, do what you want, just do not hold me accountable...<br/>
|
215
|
-
[](https://flattr.com/submit/auto?user_id=grosser&url=https://github.com/grosser/fast_gettext&title=fast_gettext&language=en_GB&tags=github&category=software)
|
216
228
|
[](http://travis-ci.org/grosser/fast_gettext)
|
data/fast_gettext.gemspec
CHANGED
@@ -1,108 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
+
name = "fast_gettext"
|
3
|
+
require "#{name}/version"
|
5
4
|
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.
|
8
|
-
s.version = "0.6.4"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
5
|
+
Gem::Specification.new name, FastGettext::VERSION do |s|
|
6
|
+
s.summary = "A simple, fast, memory-efficient and threadsafe implementation of GetText"
|
11
7
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.files =
|
15
|
-
|
16
|
-
"CHANGELOG",
|
17
|
-
"Gemfile",
|
18
|
-
"Gemfile.lock",
|
19
|
-
"Rakefile",
|
20
|
-
"Readme.md",
|
21
|
-
"VERSION",
|
22
|
-
"benchmark/base.rb",
|
23
|
-
"benchmark/baseline.rb",
|
24
|
-
"benchmark/fast_gettext.rb",
|
25
|
-
"benchmark/i18n_simple.rb",
|
26
|
-
"benchmark/ideal.rb",
|
27
|
-
"benchmark/locale/de.yml",
|
28
|
-
"benchmark/locale/de/LC_MESSAGES/large.mo",
|
29
|
-
"benchmark/misc/threadsave.rb",
|
30
|
-
"benchmark/namespace/fast_gettext.rb",
|
31
|
-
"benchmark/namespace/original.rb",
|
32
|
-
"benchmark/original.rb",
|
33
|
-
"examples/db/migration.rb",
|
34
|
-
"examples/missing_translation_logger.rb",
|
35
|
-
"fast_gettext.gemspec",
|
36
|
-
"lib/fast_gettext.rb",
|
37
|
-
"lib/fast_gettext/VERSION",
|
38
|
-
"lib/fast_gettext/mo_file.rb",
|
39
|
-
"lib/fast_gettext/po_file.rb",
|
40
|
-
"lib/fast_gettext/storage.rb",
|
41
|
-
"lib/fast_gettext/translation.rb",
|
42
|
-
"lib/fast_gettext/translation_repository.rb",
|
43
|
-
"lib/fast_gettext/translation_repository/base.rb",
|
44
|
-
"lib/fast_gettext/translation_repository/chain.rb",
|
45
|
-
"lib/fast_gettext/translation_repository/db.rb",
|
46
|
-
"lib/fast_gettext/translation_repository/db_models/translation_key.rb",
|
47
|
-
"lib/fast_gettext/translation_repository/db_models/translation_text.rb",
|
48
|
-
"lib/fast_gettext/translation_repository/logger.rb",
|
49
|
-
"lib/fast_gettext/translation_repository/mo.rb",
|
50
|
-
"lib/fast_gettext/translation_repository/po.rb",
|
51
|
-
"lib/fast_gettext/translation_repository/yaml.rb",
|
52
|
-
"lib/fast_gettext/vendor/README.rdoc",
|
53
|
-
"lib/fast_gettext/vendor/empty.mo",
|
54
|
-
"lib/fast_gettext/vendor/iconv.rb",
|
55
|
-
"lib/fast_gettext/vendor/mofile.rb",
|
56
|
-
"lib/fast_gettext/vendor/poparser.rb",
|
57
|
-
"lib/fast_gettext/vendor/string.rb",
|
58
|
-
"spec/aa_unconfigued_spec.rb",
|
59
|
-
"spec/cases/fake_load_path/iconv.rb",
|
60
|
-
"spec/cases/iconv_fallback.rb",
|
61
|
-
"spec/cases/interpolate_i18n_after_fast_gettext.rb",
|
62
|
-
"spec/cases/interpolate_i18n_before_fast_gettext.rb",
|
63
|
-
"spec/cases/safe_mode_can_handle_locales.rb",
|
64
|
-
"spec/fast_gettext/mo_file_spec.rb",
|
65
|
-
"spec/fast_gettext/po_file_spec.rb",
|
66
|
-
"spec/fast_gettext/storage_spec.rb",
|
67
|
-
"spec/fast_gettext/translation_repository/base_spec.rb",
|
68
|
-
"spec/fast_gettext/translation_repository/chain_spec.rb",
|
69
|
-
"spec/fast_gettext/translation_repository/db_spec.rb",
|
70
|
-
"spec/fast_gettext/translation_repository/logger_spec.rb",
|
71
|
-
"spec/fast_gettext/translation_repository/mo_spec.rb",
|
72
|
-
"spec/fast_gettext/translation_repository/po_spec.rb",
|
73
|
-
"spec/fast_gettext/translation_repository/yaml_spec.rb",
|
74
|
-
"spec/fast_gettext/translation_repository_spec.rb",
|
75
|
-
"spec/fast_gettext/translation_spec.rb",
|
76
|
-
"spec/fast_gettext/vendor/iconv_spec.rb",
|
77
|
-
"spec/fast_gettext/vendor/string_spec.rb",
|
78
|
-
"spec/fast_gettext_spec.rb",
|
79
|
-
"spec/fuzzy_locale/de/test.po",
|
80
|
-
"spec/locale/de/LC_MESSAGES/test.mo",
|
81
|
-
"spec/locale/de/test.po",
|
82
|
-
"spec/locale/en/LC_MESSAGES/plural_test.mo",
|
83
|
-
"spec/locale/en/LC_MESSAGES/test.mo",
|
84
|
-
"spec/locale/en/plural_test.po",
|
85
|
-
"spec/locale/en/test.po",
|
86
|
-
"spec/locale/gsw_CH/LC_MESSAGES/test.mo",
|
87
|
-
"spec/locale/gsw_CH/test.po",
|
88
|
-
"spec/locale/yaml/de.yml",
|
89
|
-
"spec/locale/yaml/en.yml",
|
90
|
-
"spec/locale/yaml/notfound.yml",
|
91
|
-
"spec/obsolete_locale/de/test.po",
|
92
|
-
"spec/spec_helper.rb"
|
93
|
-
]
|
94
|
-
s.homepage = %q{http://github.com/grosser/fast_gettext}
|
95
|
-
s.require_paths = ["lib"]
|
96
|
-
s.rubygems_version = %q{1.6.2}
|
97
|
-
s.summary = %q{A simple, fast, memory-efficient and threadsafe implementation of GetText}
|
98
|
-
|
99
|
-
if s.respond_to? :specification_version then
|
100
|
-
s.specification_version = 3
|
101
|
-
|
102
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
103
|
-
else
|
104
|
-
end
|
105
|
-
else
|
106
|
-
end
|
8
|
+
s.email = "michael@grosser.it"
|
9
|
+
s.homepage = "http://github.com/grosser/#{name}"
|
10
|
+
s.files = `git ls-files`.split("\n")
|
11
|
+
s.license = "MIT"
|
107
12
|
end
|
108
|
-
|
data/lib/fast_gettext.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
=begin
|
2
4
|
mofile.rb - A simple class for operating GNU MO file.
|
3
5
|
|
4
|
-
Copyright (C)
|
6
|
+
Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
|
7
|
+
Copyright (C) 2003-2009 Masao Mutoh
|
5
8
|
Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
|
6
9
|
Copyright (C) 2001 Masahiro Sakai
|
7
10
|
|
8
11
|
Masahiro Sakai <s01397ms at sfc.keio.ac.jp>
|
9
|
-
Masao Mutoh <
|
12
|
+
Masao Mutoh <mutomasa at gmail.com>
|
10
13
|
|
11
14
|
You can redistribute this file and/or modify it under the same term
|
12
15
|
of Ruby. License of Ruby is included with Ruby distribution in
|
13
16
|
the file "README".
|
14
17
|
|
15
|
-
$Id: mo.rb,v 1.10 2008/06/17 16:40:52 mutoh Exp $
|
16
18
|
=end
|
17
19
|
|
18
|
-
|
19
|
-
require 'stringio'
|
20
|
+
# Changes: Namespaced + uses FastGettext::Icvon
|
20
21
|
|
21
|
-
|
22
|
-
# use Iconv or FastGettext::Icvon
|
22
|
+
require 'stringio'
|
23
23
|
|
24
24
|
module FastGettext
|
25
25
|
module GetText
|
@@ -48,6 +48,10 @@ module FastGettext
|
|
48
48
|
|
49
49
|
MAGIC_BIG_ENDIAN = "\x95\x04\x12\xde"
|
50
50
|
MAGIC_LITTLE_ENDIAN = "\xde\x12\x04\x95"
|
51
|
+
if "".respond_to?(:force_encoding)
|
52
|
+
MAGIC_BIG_ENDIAN.force_encoding("ASCII-8BIT")
|
53
|
+
MAGIC_LITTLE_ENDIAN.force_encoding("ASCII-8BIT")
|
54
|
+
end
|
51
55
|
|
52
56
|
def self.open(arg = nil, output_charset = nil)
|
53
57
|
result = self.new(output_charset)
|
@@ -59,6 +63,7 @@ module FastGettext
|
|
59
63
|
@last_modified = nil
|
60
64
|
@little_endian = true
|
61
65
|
@output_charset = output_charset
|
66
|
+
@plural_proc = nil
|
62
67
|
super()
|
63
68
|
end
|
64
69
|
|
@@ -149,45 +154,42 @@ module FastGettext
|
|
149
154
|
@plural = "0" unless @plural
|
150
155
|
end
|
151
156
|
else
|
152
|
-
if @output_charset
|
153
|
-
|
154
|
-
str = FastGettext::Iconv.conv(@output_charset, @charset, str) if @charset
|
155
|
-
rescue FastGettext::Iconv::Failure
|
156
|
-
if $DEBUG
|
157
|
-
warn "@charset = ", @charset
|
158
|
-
warn"@output_charset = ", @output_charset
|
159
|
-
warn "msgid = ", original_strings[i]
|
160
|
-
warn "msgstr = ", str
|
161
|
-
end
|
162
|
-
end
|
157
|
+
if @charset and @output_charset
|
158
|
+
str = convert_encoding(str, original_strings[i])
|
163
159
|
end
|
164
160
|
end
|
165
|
-
self[original_strings[i]] = str.freeze
|
161
|
+
self[convert_encoding(original_strings[i], original_strings[i])] = str.freeze
|
166
162
|
end
|
167
163
|
self
|
168
164
|
end
|
169
165
|
|
170
|
-
# Is this number a prime number ?
|
171
|
-
# http://apidock.com/ruby/Prime
|
172
166
|
def prime?(number)
|
173
167
|
('1' * number) !~ /^1?$|^(11+?)\1+$/
|
174
168
|
end
|
175
169
|
|
176
|
-
|
177
|
-
require '
|
178
|
-
|
179
|
-
|
180
|
-
|
170
|
+
begin
|
171
|
+
require 'prime'
|
172
|
+
def next_prime(seed)
|
173
|
+
Prime.instance.find{|x| x > seed }
|
174
|
+
end
|
175
|
+
rescue LoadError
|
176
|
+
def next_prime(seed)
|
177
|
+
require 'mathn'
|
178
|
+
prime = Prime.new
|
179
|
+
while current = prime.succ
|
180
|
+
return current if current > seed
|
181
|
+
end
|
181
182
|
end
|
182
183
|
end
|
183
184
|
|
185
|
+
HASHWORDBITS = 32
|
184
186
|
# From gettext-0.12.1/gettext-runtime/intl/hash-string.h
|
185
187
|
# Defines the so called `hashpjw' function by P.J. Weinberger
|
186
188
|
# [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
187
189
|
# 1986, 1987 Bell Telephone Laboratories, Inc.]
|
188
|
-
HASHWORDBITS = 32
|
189
190
|
def hash_string(str)
|
190
191
|
hval = 0
|
192
|
+
i = 0
|
191
193
|
str.each_byte do |b|
|
192
194
|
break if b == '\0'
|
193
195
|
hval <<= 4
|
@@ -201,8 +203,8 @@ module FastGettext
|
|
201
203
|
hval
|
202
204
|
end
|
203
205
|
|
206
|
+
#Save data as little endian format.
|
204
207
|
def save_to_stream(io)
|
205
|
-
#Save data as little endian format.
|
206
208
|
header_size = 4 * 7
|
207
209
|
table_size = 4 * 2 * size
|
208
210
|
|
@@ -226,17 +228,17 @@ module FastGettext
|
|
226
228
|
|
227
229
|
orig_table_data = Array.new()
|
228
230
|
ary.each{|item, _|
|
229
|
-
orig_table_data.push(item.
|
231
|
+
orig_table_data.push(item.bytesize)
|
230
232
|
orig_table_data.push(pos)
|
231
|
-
pos += item.
|
233
|
+
pos += item.bytesize + 1 # +1 is <NUL>
|
232
234
|
}
|
233
235
|
io.write(orig_table_data.pack('V*'))
|
234
236
|
|
235
237
|
trans_table_data = Array.new()
|
236
238
|
ary.each{|_, item|
|
237
|
-
trans_table_data.push(item.
|
239
|
+
trans_table_data.push(item.bytesize)
|
238
240
|
trans_table_data.push(pos)
|
239
|
-
pos += item.
|
241
|
+
pos += item.bytesize + 1 # +1 is <NUL>
|
240
242
|
}
|
241
243
|
io.write(trans_table_data.pack('V*'))
|
242
244
|
|
@@ -286,9 +288,74 @@ module FastGettext
|
|
286
288
|
#Do nothing
|
287
289
|
end
|
288
290
|
|
291
|
+
def plural_as_proc
|
292
|
+
unless @plural_proc
|
293
|
+
@plural_proc = Proc.new{|n| eval(@plural)}
|
294
|
+
begin
|
295
|
+
@plural_proc.call(1)
|
296
|
+
rescue
|
297
|
+
@plural_proc = Proc.new{|n| 0}
|
298
|
+
end
|
299
|
+
end
|
300
|
+
@plural_proc
|
301
|
+
end
|
289
302
|
|
290
303
|
attr_accessor :little_endian, :path, :last_modified
|
291
304
|
attr_reader :charset, :nplurals, :plural
|
305
|
+
|
306
|
+
private
|
307
|
+
if "".respond_to?(:encode)
|
308
|
+
def convert_encoding(string, original_string)
|
309
|
+
begin
|
310
|
+
string.encode(@output_charset, @charset)
|
311
|
+
rescue EncodingError
|
312
|
+
if $DEBUG
|
313
|
+
warn "@charset = ", @charset
|
314
|
+
warn "@output_charset = ", @output_charset
|
315
|
+
warn "msgid = ", original_string
|
316
|
+
warn "msgstr = ", string
|
317
|
+
end
|
318
|
+
string
|
319
|
+
end
|
320
|
+
end
|
321
|
+
else
|
322
|
+
require 'fast_gettext/vendor/iconv'
|
323
|
+
def convert_encoding(string, original_string)
|
324
|
+
begin
|
325
|
+
str = FastGettext::Iconv.conv(@output_charset, @charset, string)
|
326
|
+
rescue FastGettext::Iconv::Failure
|
327
|
+
if $DEBUG
|
328
|
+
warn "@charset = ", @charset
|
329
|
+
warn "@output_charset = ", @output_charset
|
330
|
+
warn "msgid = ", original_string
|
331
|
+
warn "msgstr = ", str
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
292
336
|
end
|
293
337
|
end
|
294
338
|
end
|
339
|
+
|
340
|
+
# Test
|
341
|
+
|
342
|
+
if $0 == __FILE__
|
343
|
+
if (ARGV.include? "-h") or (ARGV.include? "--help")
|
344
|
+
STDERR.puts("mo.rb [filename.mo ...]")
|
345
|
+
exit
|
346
|
+
end
|
347
|
+
|
348
|
+
ARGV.each{ |item|
|
349
|
+
mo = FastGettext::GetText::MOFile.open(item)
|
350
|
+
puts "------------------------------------------------------------------"
|
351
|
+
puts "charset = \"#{mo.charset}\""
|
352
|
+
puts "nplurals = \"#{mo.nplurals}\""
|
353
|
+
puts "plural = \"#{mo.plural}\""
|
354
|
+
puts "------------------------------------------------------------------"
|
355
|
+
mo.each do |key, value|
|
356
|
+
puts "original message = #{key.inspect}"
|
357
|
+
puts "translated message = #{value.inspect}"
|
358
|
+
puts "--------------------------------------------------------------------"
|
359
|
+
end
|
360
|
+
}
|
361
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.expand_path('spec/spec_helper')
|
2
3
|
|
3
4
|
de_file = File.join('spec','locale','de','LC_MESSAGES','test.mo')
|
@@ -13,7 +14,7 @@ describe FastGettext::MoFile do
|
|
13
14
|
end
|
14
15
|
|
15
16
|
it "stores untranslated values as nil" do
|
16
|
-
de['
|
17
|
+
de['Untranslated'].should == nil
|
17
18
|
end
|
18
19
|
|
19
20
|
it "finds pluralized values" do
|
@@ -27,4 +28,8 @@ describe FastGettext::MoFile do
|
|
27
28
|
it "can access plurals through []" do
|
28
29
|
de['Axis'].should == 'Achse' #singular
|
29
30
|
end
|
31
|
+
|
32
|
+
it "can successfully translate non-ASCII keys" do
|
33
|
+
de["Umläüte"].should == "Umlaute"
|
34
|
+
end
|
30
35
|
end
|
Binary file
|
data/spec/locale/de/test.po
CHANGED
@@ -38,6 +38,9 @@ msgstr "Auto wurde erfolgreich aktualisiert"
|
|
38
38
|
msgid "Car|Model"
|
39
39
|
msgstr "Modell"
|
40
40
|
|
41
|
+
msgid "Untranslated"
|
42
|
+
msgstr ""
|
43
|
+
|
41
44
|
#: app/views/cars/show.html.erb:3 locale/model_attributes.rb:4
|
42
45
|
msgid "Car|Wheels count"
|
43
46
|
msgstr "Räderzahl"
|
@@ -63,3 +66,6 @@ msgstr ""
|
|
63
66
|
#: locale/test_escape.rb:2
|
64
67
|
msgid "You should escape '\\' as '\\\\'."
|
65
68
|
msgstr "Du solltest '\\' als '\\\\' escapen."
|
69
|
+
|
70
|
+
msgid "Umläüte"
|
71
|
+
msgstr "Umlaute"
|
metadata
CHANGED
@@ -1,40 +1,29 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: fast_gettext
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.5
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 6
|
9
|
-
- 4
|
10
|
-
version: 0.6.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Michael Grosser
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-12-04 00:00:00 -08:00
|
19
|
-
default_executable:
|
12
|
+
date: 2012-04-01 00:00:00.000000000 Z
|
20
13
|
dependencies: []
|
21
|
-
|
22
14
|
description:
|
23
15
|
email: michael@grosser.it
|
24
16
|
executables: []
|
25
|
-
|
26
17
|
extensions: []
|
27
|
-
|
28
18
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
|
19
|
+
files:
|
20
|
+
- .gitignore
|
31
21
|
- .travis.yml
|
32
22
|
- CHANGELOG
|
33
23
|
- Gemfile
|
34
24
|
- Gemfile.lock
|
35
25
|
- Rakefile
|
36
26
|
- Readme.md
|
37
|
-
- VERSION
|
38
27
|
- benchmark/base.rb
|
39
28
|
- benchmark/baseline.rb
|
40
29
|
- benchmark/fast_gettext.rb
|
@@ -50,7 +39,6 @@ files:
|
|
50
39
|
- examples/missing_translation_logger.rb
|
51
40
|
- fast_gettext.gemspec
|
52
41
|
- lib/fast_gettext.rb
|
53
|
-
- lib/fast_gettext/VERSION
|
54
42
|
- lib/fast_gettext/mo_file.rb
|
55
43
|
- lib/fast_gettext/po_file.rb
|
56
44
|
- lib/fast_gettext/storage.rb
|
@@ -71,6 +59,7 @@ files:
|
|
71
59
|
- lib/fast_gettext/vendor/mofile.rb
|
72
60
|
- lib/fast_gettext/vendor/poparser.rb
|
73
61
|
- lib/fast_gettext/vendor/string.rb
|
62
|
+
- lib/fast_gettext/version.rb
|
74
63
|
- spec/aa_unconfigued_spec.rb
|
75
64
|
- spec/cases/fake_load_path/iconv.rb
|
76
65
|
- spec/cases/iconv_fallback.rb
|
@@ -106,39 +95,35 @@ files:
|
|
106
95
|
- spec/locale/yaml/notfound.yml
|
107
96
|
- spec/obsolete_locale/de/test.po
|
108
97
|
- spec/spec_helper.rb
|
109
|
-
has_rdoc: true
|
110
98
|
homepage: http://github.com/grosser/fast_gettext
|
111
|
-
licenses:
|
112
|
-
|
99
|
+
licenses:
|
100
|
+
- MIT
|
113
101
|
post_install_message:
|
114
102
|
rdoc_options: []
|
115
|
-
|
116
|
-
require_paths:
|
103
|
+
require_paths:
|
117
104
|
- lib
|
118
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
106
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
|
124
|
-
segments:
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
segments:
|
125
112
|
- 0
|
126
|
-
|
127
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
hash: -679116036762933784
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
115
|
none: false
|
129
|
-
requirements:
|
130
|
-
- -
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
|
133
|
-
segments:
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
segments:
|
134
121
|
- 0
|
135
|
-
|
122
|
+
hash: -679116036762933784
|
136
123
|
requirements: []
|
137
|
-
|
138
124
|
rubyforge_project:
|
139
|
-
rubygems_version: 1.
|
125
|
+
rubygems_version: 1.8.15
|
140
126
|
signing_key:
|
141
127
|
specification_version: 3
|
142
128
|
summary: A simple, fast, memory-efficient and threadsafe implementation of GetText
|
143
129
|
test_files: []
|
144
|
-
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.6.4
|
data/lib/fast_gettext/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.5.1
|