gettext 3.0.2 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/doc/text/news.md +30 -0
- data/lib/gettext/class_info.rb +0 -6
- data/lib/gettext/locale_path.rb +0 -7
- data/lib/gettext/po_entry.rb +21 -7
- data/lib/gettext/text_domain_manager.rb +2 -2
- data/lib/gettext/tools/msgmerge.rb +123 -107
- data/lib/gettext/tools/task.rb +11 -0
- data/lib/gettext/tools/xgettext.rb +31 -24
- data/lib/gettext/version.rb +1 -1
- data/po/gettext.pot +50 -38
- data/test/test_locale_path.rb +0 -4
- data/test/test_po_entry.rb +101 -15
- data/test/tools/test_msgmerge.rb +133 -30
- data/test/tools/test_xgettext.rb +11 -2
- metadata +27 -50
data/test/tools/test_msgmerge.rb
CHANGED
@@ -23,36 +23,83 @@ require 'gettext/tools/msgmerge'
|
|
23
23
|
class TestToolsMsgMerge < Test::Unit::TestCase
|
24
24
|
class TestMerger < self
|
25
25
|
def setup
|
26
|
-
@merger = GetText::Tools::MsgMerge::Merger.new
|
27
26
|
@po = GetText::PO.new
|
28
27
|
@pot = GetText::PO.new
|
28
|
+
@config = GetText::Tools::MsgMerge::Config.new
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def parse_po(po, output)
|
32
|
+
parser = GetText::POParser.new
|
33
|
+
parser.report_warning = false
|
34
|
+
parser.parse(po, output)
|
35
|
+
end
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
def merge
|
38
|
+
merger = GetText::Tools::MsgMerge::Merger.new(@pot, @po, @config)
|
39
|
+
merger.merge
|
39
40
|
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
class TestUpdate < self
|
43
|
+
def test_msgstr
|
44
|
+
pot = <<-POT
|
45
|
+
msgid "hello"
|
46
|
+
msgstr ""
|
47
|
+
POT
|
48
|
+
po = <<-PO
|
49
|
+
msgid "hello"
|
50
|
+
msgstr "bonjour"
|
51
|
+
PO
|
52
|
+
merged_po = merge(pot, po)
|
47
53
|
|
48
|
-
|
49
|
-
|
54
|
+
assert_equal(<<-PO, merged_po)
|
55
|
+
msgid "hello"
|
56
|
+
msgstr "bonjour"
|
57
|
+
PO
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def merge(pot, po)
|
62
|
+
parse_po(pot, @pot)
|
63
|
+
parse_po(po, @po)
|
64
|
+
super().to_s
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class TestObosleteEntry < self
|
69
|
+
def test_in_po
|
70
|
+
pot = <<-POT
|
71
|
+
msgid "hello"
|
72
|
+
msgstr ""
|
73
|
+
POT
|
74
|
+
po = <<-PO
|
75
|
+
msgid "hello"
|
76
|
+
msgstr "bonjour"
|
77
|
+
|
78
|
+
#~ msgid "he"
|
79
|
+
#~ msgstr "il"
|
80
|
+
PO
|
81
|
+
|
82
|
+
assert_equal(<<-PO, merge(pot, po))
|
83
|
+
msgid "hello"
|
84
|
+
msgstr "bonjour"
|
85
|
+
|
86
|
+
#~ msgid "he"
|
87
|
+
#~ msgstr "il"
|
88
|
+
PO
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def merge(pot, po)
|
93
|
+
parse_po(pot, @pot)
|
94
|
+
parse_po(po, @po)
|
95
|
+
super().to_s
|
96
|
+
end
|
50
97
|
end
|
51
98
|
|
52
99
|
def test_different_msgstr
|
53
100
|
@po["hello"] = "salut"
|
54
101
|
@pot["hello"] = "bonjour"
|
55
|
-
merged_po =
|
102
|
+
merged_po = merge
|
56
103
|
|
57
104
|
assert_equal("salut", merged_po["hello"].msgstr)
|
58
105
|
end
|
@@ -66,7 +113,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
66
113
|
:msgstr => "",
|
67
114
|
:translator_comment => "It's comments")
|
68
115
|
|
69
|
-
merged_po =
|
116
|
+
merged_po = merge
|
70
117
|
assert_equal("bonjour", merged_po["hello"].msgstr)
|
71
118
|
assert_equal("comment", merged_po["hello"].translator_comment)
|
72
119
|
end
|
@@ -80,7 +127,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
80
127
|
:msgstr => "",
|
81
128
|
:extracted_comment => "extracted comments")
|
82
129
|
|
83
|
-
merged_po =
|
130
|
+
merged_po = merge
|
84
131
|
assert_equal("bonjour", merged_po["hello"].msgstr)
|
85
132
|
assert_equal("extracted comments", merged_po["hello"].extracted_comment)
|
86
133
|
end
|
@@ -96,7 +143,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
96
143
|
:msgstr => "",
|
97
144
|
:references => pot_references)
|
98
145
|
|
99
|
-
merged_po =
|
146
|
+
merged_po = merge
|
100
147
|
assert_equal("bonjour", merged_po["hello"].msgstr)
|
101
148
|
assert_equal(pot_references, merged_po["hello"].references)
|
102
149
|
end
|
@@ -110,7 +157,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
110
157
|
:msgstr => "",
|
111
158
|
:flag => "no-c-format")
|
112
159
|
|
113
|
-
merged_po =
|
160
|
+
merged_po = merge
|
114
161
|
assert_equal("bonjour", merged_po["hello"].msgstr)
|
115
162
|
assert_equal("no-c-format", merged_po["hello"].flag)
|
116
163
|
end
|
@@ -123,7 +170,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
123
170
|
@pot["hello"] = generate_entry(:msgid => "hello",
|
124
171
|
:msgstr => "")
|
125
172
|
|
126
|
-
merged_po =
|
173
|
+
merged_po = merge
|
127
174
|
assert_equal("bonjour", merged_po["hello"].msgstr)
|
128
175
|
assert_equal(nil, merged_po["hello"].previous)
|
129
176
|
end
|
@@ -134,7 +181,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
134
181
|
:msgstr => nil)
|
135
182
|
@pot["hello"] = generate_entry(:msgid => "hello",
|
136
183
|
:msgstr => nil)
|
137
|
-
merged_po =
|
184
|
+
merged_po = merge
|
138
185
|
assert_true(merged_po.has_key?("hello"))
|
139
186
|
assert_nil(merged_po["hello"].flag)
|
140
187
|
end
|
@@ -149,7 +196,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
149
196
|
:translator_comment => "uninitialized comment",
|
150
197
|
:flag => "fuzzy")
|
151
198
|
|
152
|
-
merged_po =
|
199
|
+
merged_po = merge
|
153
200
|
assert_equal("header\nentry", merged_po[""].msgstr)
|
154
201
|
assert_equal("header comment", merged_po[""].translator_comment)
|
155
202
|
assert_equal(nil, merged_po[""].flag)
|
@@ -168,7 +215,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
168
215
|
:translator_comment => "header comment",
|
169
216
|
:flag => "fuzzy")
|
170
217
|
|
171
|
-
merged_po =
|
218
|
+
merged_po = merge
|
172
219
|
assert_equal(pot_creation_date, merged_po[""].msgstr)
|
173
220
|
end
|
174
221
|
end
|
@@ -180,7 +227,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
180
227
|
:msgstr => "salut")
|
181
228
|
@pot["hello"] = generate_entry(:msgid => "hello",
|
182
229
|
:msgstr => "")
|
183
|
-
merged_po =
|
230
|
+
merged_po = merge
|
184
231
|
|
185
232
|
assert_false(merged_po.has_key?("normal", "hello"))
|
186
233
|
assert_true(merged_po.has_key?("hello"))
|
@@ -195,7 +242,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
195
242
|
@pot["he"] = generate_entry(:msgid => "he",
|
196
243
|
:msgid_plural => "they",
|
197
244
|
:msgstr => "")
|
198
|
-
merged_po =
|
245
|
+
merged_po = merge
|
199
246
|
|
200
247
|
assert_equal("il\000ils", merged_po["he"].msgstr)
|
201
248
|
assert_equal("they", merged_po["he"].msgid_plural)
|
@@ -205,7 +252,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
205
252
|
def test_fuzzy_matching_entry
|
206
253
|
@po["helol"] = "bonjour"
|
207
254
|
@pot["hello"] = ""
|
208
|
-
merged_po =
|
255
|
+
merged_po = merge
|
209
256
|
|
210
257
|
assert_false(merged_po.has_key?("helol"))
|
211
258
|
assert_true(merged_po.has_key?("hello"))
|
@@ -221,7 +268,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
221
268
|
@pot["hello"] = generate_entry(:msgid => "hello",
|
222
269
|
:msgstr => "")
|
223
270
|
|
224
|
-
merged_po =
|
271
|
+
merged_po = merge
|
225
272
|
assert_equal("bonjuor", merged_po["hello"].msgstr)
|
226
273
|
assert_equal("fuzzy", merged_po["hello"].flag)
|
227
274
|
end
|
@@ -230,7 +277,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
|
|
230
277
|
def test_obsolete_entry
|
231
278
|
@po["hello"] = "bonjour"
|
232
279
|
@pot["hi"] = "salut"
|
233
|
-
merged_po =
|
280
|
+
merged_po = merge
|
234
281
|
|
235
282
|
assert_equal("salut", merged_po["hi"].msgstr)
|
236
283
|
assert_false(merged_po.has_key?("hello"))
|
@@ -587,5 +634,61 @@ msgstr "Translated Hello World. This translation is very long. Yes! Very long tr
|
|
587
634
|
PO
|
588
635
|
end
|
589
636
|
end
|
637
|
+
|
638
|
+
class TestFuzzyMatching < self
|
639
|
+
def pot_content
|
640
|
+
<<-POT
|
641
|
+
msgid "Hello"
|
642
|
+
msgstr ""
|
643
|
+
POT
|
644
|
+
end
|
645
|
+
|
646
|
+
def po_content
|
647
|
+
<<-PO
|
648
|
+
msgid "Hello!"
|
649
|
+
msgstr "Bonjour!"
|
650
|
+
PO
|
651
|
+
end
|
652
|
+
|
653
|
+
def test_default
|
654
|
+
@msgmerge.run("--update",
|
655
|
+
@po_file_path, @pot_file_path)
|
656
|
+
assert_equal(<<-PO, File.read(@po_file_path))
|
657
|
+
#, fuzzy
|
658
|
+
msgid "Hello"
|
659
|
+
msgstr "Bonjour!"
|
660
|
+
|
661
|
+
#~ msgid "Hello!"
|
662
|
+
#~ msgstr "Bonjour!"
|
663
|
+
PO
|
664
|
+
end
|
665
|
+
|
666
|
+
def test_fuzzy_matching
|
667
|
+
@msgmerge.run("--update",
|
668
|
+
"--fuzzy-matching",
|
669
|
+
@po_file_path, @pot_file_path)
|
670
|
+
assert_equal(<<-PO, File.read(@po_file_path))
|
671
|
+
#, fuzzy
|
672
|
+
msgid "Hello"
|
673
|
+
msgstr "Bonjour!"
|
674
|
+
|
675
|
+
#~ msgid "Hello!"
|
676
|
+
#~ msgstr "Bonjour!"
|
677
|
+
PO
|
678
|
+
end
|
679
|
+
|
680
|
+
def test_no_fuzzy_matching
|
681
|
+
@msgmerge.run("--update",
|
682
|
+
"--no-fuzzy-matching",
|
683
|
+
@po_file_path, @pot_file_path)
|
684
|
+
assert_equal(<<-PO, File.read(@po_file_path))
|
685
|
+
msgid "Hello"
|
686
|
+
msgstr ""
|
687
|
+
|
688
|
+
#~ msgid "Hello!"
|
689
|
+
#~ msgstr "Bonjour!"
|
690
|
+
PO
|
691
|
+
end
|
692
|
+
end
|
590
693
|
end
|
591
694
|
end
|
data/test/tools/test_xgettext.rb
CHANGED
@@ -62,6 +62,7 @@ class TestToolsXGetText < Test::Unit::TestCase
|
|
62
62
|
package_name = options[:package_name] || "PACKAGE"
|
63
63
|
package_version = options[:package_version] || "VERSION"
|
64
64
|
msgid_bugs_address = options[:msgid_bugs_address] || ""
|
65
|
+
copyright_year = options[:copyright_year] || "YEAR"
|
65
66
|
copyright_holder = options[:copyright_holder] ||
|
66
67
|
"THE PACKAGE'S COPYRIGHT HOLDER"
|
67
68
|
output_encoding = options[:to_code] || "UTF-8"
|
@@ -69,9 +70,9 @@ class TestToolsXGetText < Test::Unit::TestCase
|
|
69
70
|
time = @now.strftime("%Y-%m-%d %H:%M%z")
|
70
71
|
<<-"EOH"
|
71
72
|
# SOME DESCRIPTIVE TITLE.
|
72
|
-
# Copyright (C)
|
73
|
+
# Copyright (C) #{copyright_year} #{copyright_holder}
|
73
74
|
# This file is distributed under the same license as the #{package_name} package.
|
74
|
-
# FIRST AUTHOR <EMAIL@ADDRESS>,
|
75
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, #{copyright_year}.
|
75
76
|
#
|
76
77
|
#, fuzzy
|
77
78
|
msgid ""
|
@@ -333,6 +334,14 @@ msgstr ""
|
|
333
334
|
assert_equal(header(options), pot_content)
|
334
335
|
end
|
335
336
|
|
337
|
+
def test_copyright_year
|
338
|
+
copyright_year = "2013"
|
339
|
+
pot_content = generate(":hello", "--copyright-year", copyright_year)
|
340
|
+
|
341
|
+
options = {:copyright_year => copyright_year}
|
342
|
+
assert_equal(header(options), pot_content)
|
343
|
+
end
|
344
|
+
|
336
345
|
def test_copyright_holder
|
337
346
|
copyright_holder = "me"
|
338
347
|
pot_content = generate(":hello", "--copyright-holder", copyright_holder)
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kouhei Sutou
|
@@ -10,159 +9,138 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-12-15 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: locale
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - '>='
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: 2.0.5
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- -
|
25
|
+
- - '>='
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: 2.0.5
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: text
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: rake
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: racc
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: yard
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - '>='
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - '>='
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: redcarpet
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
|
-
- -
|
88
|
+
- - '>='
|
101
89
|
- !ruby/object:Gem::Version
|
102
90
|
version: '0'
|
103
91
|
type: :development
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
|
-
- -
|
95
|
+
- - '>='
|
109
96
|
- !ruby/object:Gem::Version
|
110
97
|
version: '0'
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: test-unit
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
101
|
requirements:
|
116
|
-
- -
|
102
|
+
- - '>='
|
117
103
|
- !ruby/object:Gem::Version
|
118
104
|
version: '0'
|
119
105
|
type: :development
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
|
-
- -
|
109
|
+
- - '>='
|
125
110
|
- !ruby/object:Gem::Version
|
126
111
|
version: '0'
|
127
112
|
- !ruby/object:Gem::Dependency
|
128
113
|
name: test-unit-notify
|
129
114
|
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
115
|
requirements:
|
132
|
-
- -
|
116
|
+
- - '>='
|
133
117
|
- !ruby/object:Gem::Version
|
134
118
|
version: '0'
|
135
119
|
type: :development
|
136
120
|
prerelease: false
|
137
121
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
122
|
requirements:
|
140
|
-
- -
|
123
|
+
- - '>='
|
141
124
|
- !ruby/object:Gem::Version
|
142
125
|
version: '0'
|
143
126
|
- !ruby/object:Gem::Dependency
|
144
127
|
name: test-unit-rr
|
145
128
|
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
129
|
requirements:
|
148
|
-
- -
|
130
|
+
- - '>='
|
149
131
|
- !ruby/object:Gem::Version
|
150
132
|
version: '0'
|
151
133
|
type: :development
|
152
134
|
prerelease: false
|
153
135
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
136
|
requirements:
|
156
|
-
- -
|
137
|
+
- - '>='
|
157
138
|
- !ruby/object:Gem::Version
|
158
139
|
version: '0'
|
159
|
-
description:
|
160
|
-
|
140
|
+
description: |
|
141
|
+
Gettext is a GNU gettext-like program for Ruby.
|
161
142
|
The catalog file(po-file) is same format with GNU gettext.
|
162
|
-
|
163
143
|
So you can use GNU gettext tools for maintaining.
|
164
|
-
|
165
|
-
'
|
166
144
|
email:
|
167
145
|
- kou@clear-code.com
|
168
146
|
- mutomasa at gmail.com
|
@@ -1011,27 +989,26 @@ files:
|
|
1011
989
|
homepage: http://ruby-gettext.github.com/
|
1012
990
|
licenses:
|
1013
991
|
- Ruby or LGPLv3+
|
992
|
+
metadata: {}
|
1014
993
|
post_install_message:
|
1015
994
|
rdoc_options: []
|
1016
995
|
require_paths:
|
1017
996
|
- lib
|
1018
997
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1019
|
-
none: false
|
1020
998
|
requirements:
|
1021
|
-
- -
|
999
|
+
- - '>='
|
1022
1000
|
- !ruby/object:Gem::Version
|
1023
1001
|
version: '0'
|
1024
1002
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1025
|
-
none: false
|
1026
1003
|
requirements:
|
1027
|
-
- -
|
1004
|
+
- - '>='
|
1028
1005
|
- !ruby/object:Gem::Version
|
1029
1006
|
version: '0'
|
1030
1007
|
requirements: []
|
1031
1008
|
rubyforge_project: gettext
|
1032
|
-
rubygems_version:
|
1009
|
+
rubygems_version: 2.0.14
|
1033
1010
|
signing_key:
|
1034
|
-
specification_version:
|
1011
|
+
specification_version: 4
|
1035
1012
|
summary: Gettext is a pure Ruby libary and tools to localize messages.
|
1036
1013
|
test_files:
|
1037
1014
|
- test/test_po.rb
|