gettext 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +17 -0
- data/Rakefile +2 -2
- data/lib/gettext.rb +9 -2
- data/lib/gettext/cgi.rb +3 -3
- data/lib/gettext/class_info.rb +14 -5
- data/lib/gettext/core_ext/iconv.rb +6 -4
- data/lib/gettext/core_ext/string.rb +28 -11
- data/lib/gettext/locale_path.rb +3 -3
- data/lib/gettext/mofile.rb +14 -4
- data/lib/gettext/poparser.rb +20 -2
- data/lib/gettext/textdomain.rb +2 -3
- data/lib/gettext/textdomain_group.rb +2 -3
- data/lib/gettext/textdomain_manager.rb +7 -9
- data/lib/gettext/tools.rb +1 -20
- data/lib/gettext/tools/rmsgfmt.rb +1 -1
- data/lib/gettext/tools/rmsgmerge.rb +3 -7
- data/lib/gettext/utils.rb +5 -5
- data/lib/gettext/version.rb +1 -1
- data/src/poparser.ry +18 -0
- data/test/locale/da/LC_MESSAGES/plural_error.mo +0 -0
- data/test/locale/li/LC_MESSAGES/plural_error.mo +0 -0
- data/test/po/da/plural_error.po +1 -0
- data/test/po/li/plural_error.po +27 -0
- data/test/test_class_info.rb +4 -0
- data/test/test_gettext.rb +29 -3
- data/test/test_string.rb +17 -4
- data/test/test_textdomain_multi.rb +2 -1
- data/test/test_thread.rb +7 -5
- metadata +5 -3
data/ChangeLog
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
= Ruby-GetText-Package-2.0.2 (2009-05-04)
|
2
|
+
* Support ruby-1.9.1 style format string such as %<foo>d.
|
3
|
+
* Apply new Locale.set_app_language_tags and Locale.candidates.
|
4
|
+
[Suggested by Vladimir Dobriakov]
|
5
|
+
* Enhance to support ruby-1.9.x [by OZAWA Sakuro]
|
6
|
+
* poparser work with proper encoding.
|
7
|
+
* string.rb: #bytesize alias to #size in older ruby version such as 1.8.5.
|
8
|
+
* Fixed bugs
|
9
|
+
* n_() to work when Plural-Forms line in po-file is not correct.
|
10
|
+
[Reported by Sava Chankov (Bug#25570)]
|
11
|
+
* GetText::Locale.default_rules_path : $LOAD_PATH is not well parsed.
|
12
|
+
[by hallelujah]
|
13
|
+
* locale_path.rb: Fixed warning message.
|
14
|
+
|
15
|
+
Thanks to:
|
16
|
+
hallelujah, Sava Chankov, OZAWA Sakuro, Vladimir Dobriakov
|
17
|
+
|
1
18
|
= Ruby-GetText-Package-2.0.1 (2009-04-17)
|
2
19
|
* Fixed bugs
|
3
20
|
* doesn't work with ruby-1.8.5. [Reported by Dan Coutu]
|
data/Rakefile
CHANGED
@@ -172,7 +172,7 @@ spec = Gem::Specification.new do |s|
|
|
172
172
|
s.require_path = 'lib'
|
173
173
|
s.executables = Dir.entries('bin').delete_if {|item| /^\.|CVS|~$/ =~ item }
|
174
174
|
s.bindir = 'bin'
|
175
|
-
s.add_dependency('locale', '>= 2.0.
|
175
|
+
s.add_dependency('locale', '>= 2.0.2')
|
176
176
|
s.has_rdoc = true
|
177
177
|
s.description = <<-EOF
|
178
178
|
Ruby-GetText-Package is a GNU GetText-like program for Ruby.
|
@@ -222,7 +222,7 @@ Rake::RDocTask.new { |rdoc|
|
|
222
222
|
}
|
223
223
|
|
224
224
|
desc "Publish the release files to RubyForge."
|
225
|
-
task :release => [
|
225
|
+
task :release => [ :package ] do
|
226
226
|
require 'rubyforge'
|
227
227
|
|
228
228
|
rubyforge = RubyForge.new
|
data/lib/gettext.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
if respond_to? :gem
|
17
17
|
begin
|
18
18
|
begin
|
19
|
-
gem 'locale', '>=0
|
19
|
+
gem 'locale', '>=2.0'
|
20
20
|
rescue Gem::LoadError
|
21
21
|
end
|
22
22
|
rescue NoMethodError
|
@@ -58,7 +58,6 @@ module GetText
|
|
58
58
|
# * options: options as an Hash.
|
59
59
|
# * :path - the path to the mo-files. When the value is nil, it will search default paths such as
|
60
60
|
# /usr/share/locale, /usr/local/share/locale)
|
61
|
-
# * :supported_language_tags - an Array of the supported language tags for this textdomain.
|
62
61
|
# * :output_charset - The output charset. Same with GetText.set_output_charset. Usually, L10n
|
63
62
|
# library doesn't use this option. Application may use this once.
|
64
63
|
# * Returns: the GetText::TextDomainManager.
|
@@ -271,10 +270,18 @@ module GetText
|
|
271
270
|
TextDomainManager.output_charset
|
272
271
|
end
|
273
272
|
|
273
|
+
# Set the locale. This value forces the locale whole the programs.
|
274
|
+
# This method calls Locale.set_app_language_tags, Locale.default, Locale.current.
|
275
|
+
# Use Locale methods if you need to handle locales more flexible.
|
274
276
|
def set_locale(lang)
|
277
|
+
Locale.set_app_language_tags(lang)
|
275
278
|
Locale.default = lang
|
279
|
+
Locale.current = lang
|
276
280
|
end
|
277
281
|
|
282
|
+
# Set the locale to the current thread.
|
283
|
+
# Note that if #set_locale is set, this value is ignored.
|
284
|
+
# If you need, set_locale(nil); set_current_locale(lang)
|
278
285
|
def set_current_locale(lang)
|
279
286
|
Locale.current = lang
|
280
287
|
end
|
data/lib/gettext/cgi.rb
CHANGED
@@ -16,14 +16,14 @@ Locale.init(:driver => :cgi)
|
|
16
16
|
|
17
17
|
module GetText
|
18
18
|
|
19
|
-
# Sets a CGI object.
|
19
|
+
# Sets a CGI object. This methods is appeared when requiring "gettext/cgi".
|
20
20
|
# * cgi_: CGI object
|
21
21
|
# * Returns: self
|
22
22
|
def set_cgi(cgi_)
|
23
23
|
Locale.set_cgi(cgi_)
|
24
24
|
end
|
25
25
|
|
26
|
-
# Same as GetText.set_cgi.
|
26
|
+
# Same as GetText.set_cgi. This methods is appeared when requiring "gettext/cgi".
|
27
27
|
# * cgi_: CGI object
|
28
28
|
# * Returns: cgi_
|
29
29
|
def cgi=(cgi_)
|
@@ -31,7 +31,7 @@ module GetText
|
|
31
31
|
cgi_
|
32
32
|
end
|
33
33
|
|
34
|
-
# Gets the CGI object. If it is nil, returns new CGI object.
|
34
|
+
# Gets the CGI object. If it is nil, returns new CGI object. This methods is appeared when requiring "gettext/cgi".
|
35
35
|
# * Returns: the CGI object
|
36
36
|
def cgi
|
37
37
|
Locale.cgi
|
data/lib/gettext/class_info.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'locale/util/memoizable'
|
2
2
|
|
3
3
|
module GetText
|
4
|
+
# For normalize/finding the related classes/modules.
|
5
|
+
# This is used for realizing the scope of TextDomain.
|
6
|
+
# (see: http://www.yotabanana.com/hiki/ruby-gettext-scope.html)
|
4
7
|
module ClassInfo
|
5
8
|
extend self
|
6
9
|
include Locale::Util::Memoizable
|
7
10
|
|
8
|
-
# normalize the
|
11
|
+
# normalize the class name
|
9
12
|
def normalize_class(klass)
|
10
13
|
ret = (klass.kind_of? Module) ? klass : klass.class
|
11
14
|
if ret.name.to_s =~ /^\#<|^$/ or ret == GetText
|
@@ -14,12 +17,17 @@ module GetText
|
|
14
17
|
ret
|
15
18
|
end
|
16
19
|
|
20
|
+
def root_ancestors # :nodoc:
|
21
|
+
Object.ancestors
|
22
|
+
end
|
23
|
+
memoize :root_ancestors
|
24
|
+
|
17
25
|
# Internal method for related_classes.
|
18
|
-
def related_classes_internal(klass, all_classes = [], analyzed_classes = [] )
|
26
|
+
def related_classes_internal(klass, all_classes = [], analyzed_classes = [] )0
|
19
27
|
ret = []
|
20
28
|
klass = normalize_class(klass)
|
21
29
|
|
22
|
-
return [Object] if
|
30
|
+
return [Object] if root_ancestors.include? klass
|
23
31
|
|
24
32
|
ary = klass.name.split(/::/)
|
25
33
|
while(v = ary.shift)
|
@@ -31,15 +39,16 @@ module GetText
|
|
31
39
|
ret.uniq!
|
32
40
|
end
|
33
41
|
analyzed_classes << klass unless analyzed_classes.include? klass
|
42
|
+
|
34
43
|
klass.ancestors[1..-1].each do |v|
|
35
44
|
ret += related_classes_internal(v, all_classes, analyzed_classes)
|
36
45
|
ret.uniq!
|
37
46
|
end
|
38
47
|
|
39
48
|
if all_classes.size > 0
|
40
|
-
(
|
49
|
+
(ret & all_classes).uniq
|
41
50
|
else
|
42
|
-
|
51
|
+
ret.uniq
|
43
52
|
end
|
44
53
|
end
|
45
54
|
|
@@ -21,13 +21,15 @@ begin
|
|
21
21
|
rescue LoadError
|
22
22
|
# Pseudo Iconv class
|
23
23
|
#
|
24
|
-
#
|
25
|
-
# If you
|
26
|
-
#
|
24
|
+
# ==== For Matz Ruby:
|
25
|
+
# If you don't have iconv but Ruby/GLib2, this library uses Ruby/GLib2's
|
26
|
+
# iconv functions.
|
27
27
|
#
|
28
|
-
#
|
28
|
+
# Ruby/GLib is a module which is provided from Ruby-GNOME2 Project.
|
29
29
|
# You can get binaries for Win32(One-Click Ruby Installer).
|
30
30
|
# <URL: http://ruby-gnome2.sourceforge.jp/>
|
31
|
+
# ==== For JRuby:
|
32
|
+
# Use Java String class to convert strings.
|
31
33
|
class Iconv
|
32
34
|
module Failure; end
|
33
35
|
class InvalidEncoding < ArgumentError; include Failure; end
|
@@ -1,25 +1,31 @@
|
|
1
1
|
=begin
|
2
2
|
string.rb - Extension for String.
|
3
3
|
|
4
|
-
Copyright (C) 2005
|
4
|
+
Copyright (C) 2005-2009 Masao Mutoh
|
5
5
|
|
6
6
|
You may redistribute it and/or modify it under the same
|
7
7
|
license terms as Ruby.
|
8
8
|
=end
|
9
9
|
|
10
|
-
|
11
|
-
# Extension for String class. This feature is included in Ruby 1.9 or later.
|
10
|
+
# Extension for String class. This feature is included in Ruby 1.9 or later but not occur TypeError.
|
12
11
|
#
|
13
12
|
# String#% method which accept "named argument". The translator can know
|
14
13
|
# the meaning of the msgids using "named argument" instead of %s/%d style.
|
15
14
|
class String
|
16
15
|
|
17
|
-
unless
|
16
|
+
unless instance_methods.find {|m| m.to_s == 'bytesize'}
|
17
|
+
# For older ruby (such as ruby-1.8.5)
|
18
18
|
alias :bytesize :size
|
19
19
|
end
|
20
20
|
|
21
21
|
alias :_old_format_m :% # :nodoc:
|
22
|
-
|
22
|
+
|
23
|
+
PERCENT_MATCH_RE = Regexp.union(
|
24
|
+
/%%/,
|
25
|
+
/%\{(\w+)\}/,
|
26
|
+
/%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/
|
27
|
+
)
|
28
|
+
|
23
29
|
# call-seq:
|
24
30
|
# %(arg)
|
25
31
|
# %(hash)
|
@@ -38,16 +44,28 @@ class String
|
|
38
44
|
# * hash: {:key1 => value1, :key2 => value2, ... }
|
39
45
|
# * Returns: formatted String
|
40
46
|
#
|
41
|
-
# (e.g.)
|
47
|
+
# (e.g.)
|
48
|
+
# For strings.
|
49
|
+
# "%{firstname}, %{familyname}" % {:firstname => "Masao", :familyname => "Mutoh"}
|
50
|
+
#
|
51
|
+
# With field type to specify format such as d(decimal), f(float),...
|
52
|
+
# "%<age>d, %<weight>.1f" % {:age => 10, :weight => 43.4}
|
42
53
|
def %(args)
|
43
54
|
if args.kind_of?(Hash)
|
44
55
|
ret = dup
|
45
|
-
|
46
|
-
|
56
|
+
ret.gsub!(PERCENT_MATCH_RE) {|match|
|
57
|
+
if match == '%%'
|
58
|
+
'%'
|
59
|
+
elsif $1
|
60
|
+
key = $1.to_sym
|
61
|
+
args.has_key?(key) ? args[key] : match
|
62
|
+
elsif $2
|
63
|
+
key = $2.to_sym
|
64
|
+
args.has_key?(key) ? sprintf("%#{$3}", args[key]) : match
|
65
|
+
end
|
47
66
|
}
|
48
|
-
ret
|
49
67
|
else
|
50
|
-
ret = gsub(
|
68
|
+
ret = gsub(/%([{<])/, '%%\1')
|
51
69
|
begin
|
52
70
|
ret._old_format_m(args)
|
53
71
|
rescue ArgumentError => e
|
@@ -63,4 +81,3 @@ class String
|
|
63
81
|
end
|
64
82
|
end
|
65
83
|
|
66
|
-
end
|
data/lib/gettext/locale_path.rb
CHANGED
@@ -53,9 +53,9 @@ module GetText
|
|
53
53
|
|
54
54
|
load_path = $LOAD_PATH
|
55
55
|
if defined? ::Gem
|
56
|
-
load_path += Gem.all_load_paths
|
56
|
+
load_path += Gem.all_load_paths
|
57
57
|
end
|
58
|
-
|
58
|
+
load_path.map!{|v| v.match(/(.*?)(\/lib)*?$/); $1}
|
59
59
|
load_path.each {|path|
|
60
60
|
default_path_rules += [
|
61
61
|
"#{path}/data/locale/%{lang}/LC_MESSAGES/%{name}.mo",
|
@@ -112,7 +112,7 @@ module GetText
|
|
112
112
|
if $DEBUG
|
113
113
|
warn "MO file is not found in"
|
114
114
|
@locale_paths.each do |path|
|
115
|
-
warn " #{path}"
|
115
|
+
warn " #{path[1]}"
|
116
116
|
end
|
117
117
|
end
|
118
118
|
nil
|
data/lib/gettext/mofile.rb
CHANGED
@@ -54,6 +54,7 @@ module GetText
|
|
54
54
|
@last_modified = nil
|
55
55
|
@little_endian = true
|
56
56
|
@output_charset = output_charset
|
57
|
+
@plural_proc = nil
|
57
58
|
super()
|
58
59
|
end
|
59
60
|
|
@@ -162,8 +163,6 @@ module GetText
|
|
162
163
|
self
|
163
164
|
end
|
164
165
|
|
165
|
-
# Is this number a prime number ?
|
166
|
-
# http://apidock.com/ruby/Prime
|
167
166
|
def prime?(number)
|
168
167
|
('1' * number) !~ /^1?$|^(11+?)\1+$/
|
169
168
|
end
|
@@ -183,11 +182,11 @@ module GetText
|
|
183
182
|
end
|
184
183
|
end
|
185
184
|
|
185
|
+
HASHWORDBITS = 32
|
186
186
|
# From gettext-0.12.1/gettext-runtime/intl/hash-string.h
|
187
187
|
# Defines the so called `hashpjw' function by P.J. Weinberger
|
188
188
|
# [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
189
189
|
# 1986, 1987 Bell Telephone Laboratories, Inc.]
|
190
|
-
HASHWORDBITS = 32
|
191
190
|
def hash_string(str)
|
192
191
|
hval = 0
|
193
192
|
i = 0
|
@@ -204,8 +203,8 @@ module GetText
|
|
204
203
|
hval
|
205
204
|
end
|
206
205
|
|
206
|
+
#Save data as little endian format.
|
207
207
|
def save_to_stream(io)
|
208
|
-
#Save data as little endian format.
|
209
208
|
header_size = 4 * 7
|
210
209
|
table_size = 4 * 2 * size
|
211
210
|
|
@@ -289,6 +288,17 @@ module GetText
|
|
289
288
|
#Do nothing
|
290
289
|
end
|
291
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
|
292
302
|
|
293
303
|
attr_accessor :little_endian, :path, :last_modified
|
294
304
|
attr_reader :charset, :nplurals, :plural
|
data/lib/gettext/poparser.rb
CHANGED
@@ -20,7 +20,7 @@ module GetText
|
|
20
20
|
|
21
21
|
class PoParser < Racc::Parser
|
22
22
|
|
23
|
-
module_eval <<'..end src/poparser.ry modeval..
|
23
|
+
module_eval <<'..end src/poparser.ry modeval..ida5d3d657e2', 'src/poparser.ry', 108
|
24
24
|
include GetText
|
25
25
|
GetText.bindtextdomain("rgettext")
|
26
26
|
|
@@ -110,8 +110,26 @@ module_eval <<'..end src/poparser.ry modeval..id7a99570e05', 'src/poparser.ry',
|
|
110
110
|
@comments << comment
|
111
111
|
end
|
112
112
|
|
113
|
+
def parse_file(po_file, data, ignore_fuzzy = true)
|
114
|
+
args = [ po_file ]
|
115
|
+
# In Ruby 1.9, we must detect proper encoding of a PO file.
|
116
|
+
if String.instance_methods.include?(:encode)
|
117
|
+
encoding = detect_file_encoding(po_file)
|
118
|
+
args << "r:#{encoding}"
|
119
|
+
end
|
120
|
+
parse(File.open(*args) {|io| io.read }, data, ignore_fuzzy)
|
121
|
+
end
|
113
122
|
|
114
|
-
|
123
|
+
def detect_file_encoding(po_file)
|
124
|
+
open(po_file, :encoding => 'ASCII-8BIT') do |input|
|
125
|
+
input.lines.each do |line|
|
126
|
+
return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
|
127
|
+
end
|
128
|
+
end
|
129
|
+
Encoding.default_external
|
130
|
+
end
|
131
|
+
private :detect_file_encoding
|
132
|
+
..end src/poparser.ry modeval..ida5d3d657e2
|
115
133
|
|
116
134
|
##### racc 1.4.5 generates ###
|
117
135
|
|
data/lib/gettext/textdomain.rb
CHANGED
@@ -112,7 +112,7 @@ module GetText
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
DEFAULT_PLURAL_CALC = Proc.new{|n|
|
115
|
+
DEFAULT_PLURAL_CALC = Proc.new{|n| n != 1}
|
116
116
|
DEFAULT_SINGLE_CALC = Proc.new{|n| 0}
|
117
117
|
|
118
118
|
# Translates the translated string.
|
@@ -129,8 +129,7 @@ module GetText
|
|
129
129
|
elsif msg.include?("\000")
|
130
130
|
# [[msgstr[0], msgstr[1], msgstr[2],...], cond]
|
131
131
|
mofile = @mofiles[lang.to_posix.to_s]
|
132
|
-
cond = (mofile and mofile != :empty) ?
|
133
|
-
cond ||= DEFAULT_PLURAL_CALC
|
132
|
+
cond = (mofile and mofile != :empty) ? mofile.plural_as_proc : DEFAULT_PLURAL_CALC
|
134
133
|
ret = [msg.split("\000"), cond]
|
135
134
|
else
|
136
135
|
ret = [[msg], DEFAULT_SINGLE_CALC]
|
@@ -11,11 +11,10 @@
|
|
11
11
|
module GetText
|
12
12
|
|
13
13
|
class TextDomainGroup
|
14
|
-
attr_reader :textdomains
|
14
|
+
attr_reader :textdomains
|
15
15
|
|
16
|
-
def initialize
|
16
|
+
def initialize
|
17
17
|
@textdomains = []
|
18
|
-
@supported_language_tags = supported_language_tags
|
19
18
|
end
|
20
19
|
|
21
20
|
def add(textdomain)
|
@@ -70,18 +70,17 @@ module GetText
|
|
70
70
|
textdomain = create_or_find_textdomain(domainname,options[:path],charset)
|
71
71
|
|
72
72
|
target_klass = ClassInfo.normalize_class(klass)
|
73
|
-
create_or_find_textdomain_group(target_klass
|
73
|
+
create_or_find_textdomain_group(target_klass).add(textdomain)
|
74
74
|
@@gettext_classes << target_klass unless @@gettext_classes.include? target_klass
|
75
75
|
|
76
76
|
textdomain
|
77
77
|
end
|
78
78
|
|
79
79
|
def each_textdomains(klass) #:nodoc:
|
80
|
+
lang = Locale.candidates[0]
|
80
81
|
ClassInfo.related_classes(klass, @@gettext_classes).each do |target|
|
81
82
|
msg = nil
|
82
83
|
if group = @@textdomain_group_pool[target]
|
83
|
-
lang = Locale.candidates(:supported_language_tags => group.supported_language_tags,
|
84
|
-
:type => :posix)[0]
|
85
84
|
group.textdomains.each do |textdomain|
|
86
85
|
yield textdomain, lang
|
87
86
|
end
|
@@ -158,7 +157,6 @@ module GetText
|
|
158
157
|
key = [Locale.current, klass, msgid, msgid_plural, div].hash
|
159
158
|
msgs = @@plural_message_cache[key]
|
160
159
|
unless (msgs and @@cached)
|
161
|
-
|
162
160
|
# Find messages from related classes.
|
163
161
|
msgs = nil
|
164
162
|
each_textdomains(klass) do |textdomain, lang|
|
@@ -166,15 +164,15 @@ module GetText
|
|
166
164
|
break if msgs
|
167
165
|
end
|
168
166
|
|
169
|
-
msgs = [[msgid, msgid_plural],
|
170
|
-
|
167
|
+
msgs = [[msgid, msgid_plural], TextDomain::DEFAULT_PLURAL_CALC] unless msgs
|
168
|
+
|
171
169
|
msgstrs = msgs[0]
|
172
170
|
if div and msgstrs[0] == msgid and index = msgstrs[0].rindex(div)
|
173
171
|
msgstrs[0] = msgstrs[0][(index + 1)..-1]
|
174
172
|
end
|
175
173
|
@@plural_message_cache[key] = msgs
|
176
174
|
end
|
177
|
-
|
175
|
+
|
178
176
|
# Return the singular or plural message.
|
179
177
|
msgstrs = msgs[0]
|
180
178
|
plural = msgs[1].call(n)
|
@@ -191,11 +189,11 @@ module GetText
|
|
191
189
|
@@plural_message_cache = {}
|
192
190
|
end
|
193
191
|
|
194
|
-
def create_or_find_textdomain_group(klass
|
192
|
+
def create_or_find_textdomain_group(klass) #:nodoc:
|
195
193
|
group = @@textdomain_group_pool[klass]
|
196
194
|
return group if group
|
197
195
|
|
198
|
-
@@textdomain_group_pool[klass] = TextDomainGroup.new
|
196
|
+
@@textdomain_group_pool[klass] = TextDomainGroup.new
|
199
197
|
end
|
200
198
|
|
201
199
|
def create_or_find_textdomain(name, path, charset)#:nodoc:
|
data/lib/gettext/tools.rb
CHANGED
@@ -188,27 +188,8 @@ module GetText
|
|
188
188
|
mo_dir = mo_dir_rule % {:lang => lang}
|
189
189
|
File.join(mo_dir, "#{textdomain}.mo")
|
190
190
|
end
|
191
|
-
|
192
|
-
# In Ruby 1.9, we must detect proper encoding of a PO file.
|
193
|
-
def po_file_content(po_file)
|
194
|
-
args = [ po_file ]
|
195
|
-
if String.instance_methods.include?(:encode)
|
196
|
-
encoding = detect_po_file_encoding(po_file)
|
197
|
-
args << "r:#{encoding}"
|
198
|
-
end
|
199
|
-
File.open(*args) {|io| io.read }
|
200
|
-
end
|
201
|
-
|
202
|
-
def detect_po_file_encoding(po_file)
|
203
|
-
open(po_file, :encoding => 'ASCII-8BIT') do |input|
|
204
|
-
input.lines.each do |line|
|
205
|
-
return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
|
206
|
-
end
|
207
|
-
end
|
208
|
-
Encoding.default_external
|
209
|
-
end
|
210
191
|
end
|
211
192
|
|
212
193
|
if __FILE__ == $0
|
213
194
|
GetText.update_pofiles("foo", ARGV, "foo 1.1.0")
|
214
|
-
end
|
195
|
+
end
|
@@ -449,12 +449,8 @@ module GetText
|
|
449
449
|
end
|
450
450
|
|
451
451
|
parser = PoParser.new
|
452
|
-
|
453
|
-
|
454
|
-
File.open(config.defpo){|f| defstr = f.read}
|
455
|
-
File.open(config.refpot){|f| refstr = f.read}
|
456
|
-
defpo = parser.parse(defstr, PoData.new, false)
|
457
|
-
refpot = parser.parse(refstr, PoData.new, false)
|
452
|
+
defpo = parser.parse_file(config.defpo, PoData.new, false)
|
453
|
+
refpot = parser.parse_file(config.refstrrefstr, PoData.new, false)
|
458
454
|
|
459
455
|
m = Merger.new
|
460
456
|
result = m.merge(defpo, refpot)
|
@@ -499,4 +495,4 @@ if $0 == __FILE__ then
|
|
499
495
|
#pp parser.parse(ARGF.read)
|
500
496
|
|
501
497
|
GetText.rmsgmerge
|
502
|
-
end
|
498
|
+
end
|
data/lib/gettext/utils.rb
CHANGED
@@ -13,14 +13,14 @@ warn "'gettext/utils.rb' is deprecated. Use gettext/tools.rb."
|
|
13
13
|
|
14
14
|
module GetText
|
15
15
|
|
16
|
-
alias :create_mofiles_org :create_mofiles
|
17
|
-
alias :update_pofiles_org :update_pofiles
|
16
|
+
alias :create_mofiles_org :create_mofiles #:nodoc:
|
17
|
+
alias :update_pofiles_org :update_pofiles #:nodoc:
|
18
18
|
|
19
19
|
|
20
20
|
# Deprecated. Use gettext/tools instead.
|
21
21
|
def create_mofiles(verbose = false,
|
22
22
|
podir = "./po", targetdir = "./data/locale",
|
23
|
-
targetpath_rule = "%s/LC_MESSAGES")
|
23
|
+
targetpath_rule = "%s/LC_MESSAGES") # :nodoc:
|
24
24
|
warn "'gettext/utils.rb' is deprecated. Use gettext/tools.rb."
|
25
25
|
create_mofiles_org(:verbose => verbose,
|
26
26
|
:po_root => podir,
|
@@ -29,9 +29,9 @@ module GetText
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# Deprecated. Use gettext/tools instead.
|
32
|
-
def update_pofiles(textdomain, files, app_version, po_root = "po", refpot = "tmp.pot")
|
32
|
+
def update_pofiles(textdomain, files, app_version, po_root = "po", refpot = "tmp.pot") # :nodoc:
|
33
33
|
warn "'gettext/utils.rb' is deprecated. Use gettext/tools.rb."
|
34
34
|
options = {:po_root => po_root}
|
35
35
|
update_pofiles_org(textdomain, files, app_version, options)
|
36
36
|
end
|
37
|
-
end
|
37
|
+
end
|
data/lib/gettext/version.rb
CHANGED
data/src/poparser.ry
CHANGED
@@ -194,5 +194,23 @@ end
|
|
194
194
|
@comments << comment
|
195
195
|
end
|
196
196
|
|
197
|
+
def parse_file(po_file, data, ignore_fuzzy = true)
|
198
|
+
args = [ po_file ]
|
199
|
+
# In Ruby 1.9, we must detect proper encoding of a PO file.
|
200
|
+
if String.instance_methods.include?(:encode)
|
201
|
+
encoding = detect_file_encoding(po_file)
|
202
|
+
args << "r:#{encoding}"
|
203
|
+
end
|
204
|
+
parse(File.open(*args) {|io| io.read }, data, ignore_fuzzy)
|
205
|
+
end
|
197
206
|
|
207
|
+
def detect_file_encoding(po_file)
|
208
|
+
open(po_file, :encoding => 'ASCII-8BIT') do |input|
|
209
|
+
input.lines.each do |line|
|
210
|
+
return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
|
211
|
+
end
|
212
|
+
end
|
213
|
+
Encoding.default_external
|
214
|
+
end
|
215
|
+
private :detect_file_encoding
|
198
216
|
---- footer
|
Binary file
|
Binary file
|
data/test/po/da/plural_error.po
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
2
|
+
# Copyright (C) YEAR ORGANIZATION
|
3
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
4
|
+
#
|
5
|
+
#, fuzzy
|
6
|
+
msgid ""
|
7
|
+
msgstr ""
|
8
|
+
"Project-Id-Version: PACKAGE VERSION\n"
|
9
|
+
"POT-Creation-Date: 2002-10-21 15:32:15+0900\n"
|
10
|
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
11
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
12
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
13
|
+
"MIME-Version: 1.0\n"
|
14
|
+
"Content-Type: text/plain; charset=US-ASCII\n"
|
15
|
+
"Content-Transfer-Encoding: ENCODING\n"
|
16
|
+
"Plural-Forms: nplurals=0; plural=EXPRESSION;\n"
|
17
|
+
|
18
|
+
#: hello_plural.rb:11
|
19
|
+
msgid "first"
|
20
|
+
msgid_plural "second"
|
21
|
+
msgstr[0] "li_first"
|
22
|
+
|
23
|
+
#: hello_plural.rb:13
|
24
|
+
msgid "one"
|
25
|
+
msgid_plural "two"
|
26
|
+
msgstr[0] "li_one"
|
27
|
+
msgstr[1] "li_two"
|
data/test/test_class_info.rb
CHANGED
@@ -54,15 +54,19 @@ class TestClassInfo < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_related_classes
|
57
|
+
=begin
|
57
58
|
assert_equal [M1, Object], related_classes(M1)
|
58
59
|
assert_equal [M1::M3, M1, M2, Object], related_classes(M1::M3)
|
59
60
|
assert_equal [M1::M3::M4, M1::M3, M1, M2, Object], related_classes(M1::M3::M4)
|
61
|
+
=end
|
60
62
|
assert_equal [M1::M3::C1, M1::M3, M1, M2, Object], related_classes(M1::M3::C1)
|
63
|
+
=begin
|
61
64
|
assert_equal [M1::C2, M1, Object], related_classes(M1::C2)
|
62
65
|
assert_equal [M1::C2::M5::C4, M1::C2::M5, M1::C2, M1, Object], related_classes(M1::C2::M5::C4)
|
63
66
|
assert_equal [M1::C2::C3, M1::C2, M1, Object], related_classes(M1::C2::C3)
|
64
67
|
assert_equal [M1::M6, M1, M1::M3::M4, M1::M3, M2, Object], related_classes(M1::M6)
|
65
68
|
assert_equal [M1::M6::M7, M1::M6, M1, M1::M3::M4, M1::M3, M2, Object], related_classes(M1::M6::M7)
|
69
|
+
=end
|
66
70
|
end
|
67
71
|
|
68
72
|
def test_rellated_classes_with_all_classes
|
data/test/test_gettext.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# -*- coding:
|
1
|
+
# -*- coding: utf-8 -*-
|
2
2
|
require 'testlib/helper.rb'
|
3
3
|
|
4
4
|
require 'testlib/simple.rb'
|
@@ -190,14 +190,22 @@ DDD
|
|
190
190
|
assert_equal("fr_first", n_("first", "second", 0))
|
191
191
|
assert_equal("fr_first", n_("first", "second", 1))
|
192
192
|
assert_equal("fr_first", n_("first", "second", 2))
|
193
|
-
setlocale("da")
|
193
|
+
setlocale("da") # Invalid Plural-Forms.
|
194
194
|
assert_equal("da_first", n_("first", "second", 0))
|
195
195
|
assert_equal("da_first", n_("first", "second", 1))
|
196
196
|
assert_equal("da_first", n_("first", "second", 2))
|
197
|
-
setlocale("la")
|
197
|
+
setlocale("la") # wrong number of msgstr.
|
198
198
|
assert_equal("la_first", n_("first", "second", 0))
|
199
199
|
assert_equal("la_first", n_("first", "second", 1))
|
200
200
|
assert_equal("la_first", n_("first", "second", 2))
|
201
|
+
|
202
|
+
setlocale("li") # Invalid Plural-Forms: nplurals is set, but wrong plural=.
|
203
|
+
assert_equal("li_first", n_("first", "second", 0))
|
204
|
+
assert_equal("li_first", n_("first", "second", 1))
|
205
|
+
assert_equal("li_first", n_("first", "second", 2))
|
206
|
+
assert_equal("li_one", n_("one", "two", 0))
|
207
|
+
assert_equal("li_one", n_("one", "two", 1))
|
208
|
+
assert_equal("li_one", n_("one", "two", 2))
|
201
209
|
end
|
202
210
|
|
203
211
|
def test_plural_array
|
@@ -243,9 +251,11 @@ DDD
|
|
243
251
|
assert_equal("japanese", _("language"))
|
244
252
|
set_locale("en")
|
245
253
|
assert_equal("language", _("language"))
|
254
|
+
|
246
255
|
set_locale("fr")
|
247
256
|
assert_equal("french", _("language"))
|
248
257
|
|
258
|
+
set_locale(nil)
|
249
259
|
Locale.set "en"
|
250
260
|
assert_equal("language", _("language"))
|
251
261
|
|
@@ -258,6 +268,22 @@ DDD
|
|
258
268
|
assert_equal(Locale::Tag::Posix, GetText.locale.class)
|
259
269
|
end
|
260
270
|
|
271
|
+
def test_restrict_locale
|
272
|
+
bindtextdomain("test1", :path => "locale")
|
273
|
+
Locale.set_app_language_tags("ja", "en")
|
274
|
+
|
275
|
+
Locale.set_current "fr"
|
276
|
+
assert_equal("language", _("language"))
|
277
|
+
|
278
|
+
Locale.set_current "en"
|
279
|
+
assert_equal("language", _("language"))
|
280
|
+
|
281
|
+
Locale.set_current "ja"
|
282
|
+
assert_equal("japanese", _("language"))
|
283
|
+
Locale.set_app_language_tags(nil)
|
284
|
+
end
|
285
|
+
|
286
|
+
|
261
287
|
# Anonymous
|
262
288
|
@@anon = Module.new
|
263
289
|
class @@anon::I
|
data/test/test_string.rb
CHANGED
@@ -12,25 +12,38 @@ class TestGetTextString < Test::Unit::TestCase
|
|
12
12
|
assert_raise(ArgumentError) { "%-%" % [1] }
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
def test_sprintf_percent_in_replacement
|
16
|
+
assert_equal("%<not_translated>s", "%{msg}" % { :msg => '%<not_translated>s', :not_translated => 'should not happen' })
|
17
|
+
end
|
16
18
|
def test_sprintf_lack_argument
|
17
19
|
assert_equal("%{num}, test", "%{num}, %{record}" % {:record => "test"})
|
18
20
|
assert_equal("%{record}", "%{record}" % {:num => 1})
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
23
|
+
def test_sprintf_ruby19_style
|
22
24
|
assert_equal("1", "%<num>d" % {:num => 1})
|
23
|
-
assert_equal("
|
25
|
+
assert_equal("0b1", "%<num>#b" % {:num => 1})
|
24
26
|
assert_equal("foo", "%<msg>s" % {:msg => "foo"})
|
25
27
|
assert_equal("1.000000", "%<num>f" % {:num => 1.0})
|
26
28
|
assert_equal(" 1", "%<num>3.0f" % {:num => 1.0})
|
27
29
|
assert_equal("100.00", "%<num>2.2f" % {:num => 100.0})
|
28
30
|
assert_equal("0x64", "%<num>#x" % {:num => 100.0})
|
31
|
+
assert_raise { "%<num>,d" % {:num => 100} }
|
32
|
+
assert_raise { "%<num>/d" % {:num => 100} }
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_sprintf_old_style
|
36
|
+
assert_equal("foo 1.000000", "%s %f" % ["foo", 1.0])
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_sprintf_mix
|
40
|
+
assert_equal("foo 1.000000", "%{name} %<num>f" % {:name => "foo", :num => 1.0})
|
41
|
+
assert_equal("%{name} 1.000000", "%{name} %f" % [1.0])
|
29
42
|
end
|
30
43
|
|
31
44
|
def test_percent
|
32
45
|
assert_equal("% 1", "%% %<num>d" % {:num => 1.0})
|
46
|
+
assert_equal("%{num} %<num>d", "%%{num} %%<num>d" % {:num => 1})
|
33
47
|
end
|
34
|
-
=end
|
35
48
|
|
36
49
|
end
|
@@ -4,10 +4,11 @@ require 'testlib/multi_textdomain.rb'
|
|
4
4
|
class TestGetTextMulti < Test::Unit::TestCase
|
5
5
|
|
6
6
|
def setup
|
7
|
-
GetText.locale = "
|
7
|
+
GetText.locale = "ja"
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_two_domains_in_a_class
|
11
|
+
|
11
12
|
test = C11.new
|
12
13
|
assert_equal("japanese", test.test) # Use test1.po
|
13
14
|
assert_equal("JAPANESE", test.test2) # Use test2.po
|
data/test/test_thread.rb
CHANGED
@@ -18,7 +18,9 @@ class TestThread < Test::Unit::TestCase
|
|
18
18
|
GetText.current_locale = tag
|
19
19
|
}
|
20
20
|
(1..10).each do |v|
|
21
|
-
|
21
|
+
@mutex.synchronize{
|
22
|
+
assert_equal Thread.current["language"], _("language")
|
23
|
+
}
|
22
24
|
print "."
|
23
25
|
$stdout.flush
|
24
26
|
sleep sleep_time
|
@@ -27,10 +29,10 @@ class TestThread < Test::Unit::TestCase
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def test_thread
|
30
|
-
th1 = invoke_thread("ja_JP.eucJP", "japanese", 0.
|
31
|
-
th2 = invoke_thread("fr", "french", 0.
|
32
|
-
th3 = invoke_thread("en", "language", 0.
|
33
|
-
th4 = invoke_thread("zh_CN", "language", 0.
|
32
|
+
th1 = invoke_thread("ja_JP.eucJP", "japanese", 0.4)
|
33
|
+
th2 = invoke_thread("fr", "french", 0.3)
|
34
|
+
th3 = invoke_thread("en", "language", 0.1)
|
35
|
+
th4 = invoke_thread("zh_CN", "language", 0.2) # No translation.
|
34
36
|
th1.join
|
35
37
|
th2.join
|
36
38
|
th3.join
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masao Mutoh
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-09 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 2.0.
|
23
|
+
version: 2.0.2
|
24
24
|
version:
|
25
25
|
description: Ruby-GetText-Package is a GNU GetText-like program for Ruby. The catalog file(po-file) is same format with GNU GetText. So you can use GNU GetText tools for maintaining.
|
26
26
|
email: mutomasa at gmail.com
|
@@ -866,6 +866,7 @@ files:
|
|
866
866
|
- test/po/fr/test2.po
|
867
867
|
- test/po/fr/test1.po
|
868
868
|
- test/po/li
|
869
|
+
- test/po/li/plural_error.po
|
869
870
|
- test/po/li/plural.po
|
870
871
|
- test/po/ja
|
871
872
|
- test/po/ja/pgettext.po
|
@@ -908,6 +909,7 @@ files:
|
|
908
909
|
- test/locale/fr/LC_MESSAGES/test1.mo
|
909
910
|
- test/locale/li
|
910
911
|
- test/locale/li/LC_MESSAGES
|
912
|
+
- test/locale/li/LC_MESSAGES/plural_error.mo
|
911
913
|
- test/locale/li/LC_MESSAGES/plural.mo
|
912
914
|
- test/locale/ja
|
913
915
|
- test/locale/ja/LC_MESSAGES
|