fast_gettext 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Flattr](http://api.flattr.com/button/flattr-badge-large.png)](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
|
[![Build Status](https://secure.travis-ci.org/grosser/fast_gettext.png)](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
|