gettext 2.0.1 → 2.0.2
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/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
|