gettext 2.3.3 → 2.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/text/news.md +37 -0
- data/gettext.gemspec +1 -0
- data/lib/gettext/runtime/mo.rb +382 -0
- data/lib/gettext/runtime/mofile.rb +24 -366
- data/lib/gettext/runtime/textdomain.rb +17 -17
- data/lib/gettext/tools.rb +1 -1
- data/lib/gettext/tools/msgfmt.rb +2 -2
- data/lib/gettext/tools/msginit.rb +16 -15
- data/lib/gettext/tools/msgmerge.rb +258 -255
- data/lib/gettext/tools/parser/ruby.rb +24 -24
- data/lib/gettext/tools/po.rb +256 -0
- data/lib/gettext/tools/po_entry.rb +355 -0
- data/lib/gettext/tools/poparser.rb +118 -16
- data/lib/gettext/tools/xgettext.rb +56 -58
- data/lib/gettext/version.rb +1 -1
- data/samples/po/hello.pot +3 -3
- data/samples/po/hello2.pot +3 -3
- data/samples/po/hello_glade2.pot +3 -3
- data/samples/po/hello_gtk2.pot +3 -3
- data/samples/po/hello_noop.pot +3 -3
- data/samples/po/hello_plural.pot +3 -3
- data/samples/po/hello_tk.pot +3 -3
- data/src/poparser.ry +111 -9
- data/test/parser/test_ruby.rb +17 -13
- data/test/po/_.pot +3 -3
- data/test/po/backslash.pot +3 -3
- data/test/po/non_ascii.pot +3 -3
- data/test/po/np_.pot +5 -4
- data/test/po/ns_.pot +3 -3
- data/test/po/p_.pot +3 -3
- data/test/po/s_.pot +3 -3
- data/test/po/untranslated.pot +3 -3
- data/test/{test_mofile.rb → test_mo.rb} +3 -3
- data/test/test_parser.rb +13 -12
- data/test/test_po_entry.rb +329 -0
- data/test/test_po_parser.rb +209 -8
- data/test/tools/test_msginit.rb +0 -2
- data/test/tools/test_msgmerge.rb +427 -50
- data/test/tools/test_po.rb +487 -0
- data/test/tools/test_xgettext.rb +1 -1
- metadata +28 -45
- data/data/locale/de/LC_MESSAGES/gettext.mo +0 -0
- data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
- data/data/locale/el/LC_MESSAGES/gettext.mo +0 -0
- data/data/locale/el/LC_MESSAGES/rgettext.mo +0 -0
- data/data/locale/sr/LC_MESSAGES/gettext.mo +0 -0
- data/data/locale/sr/LC_MESSAGES/rgettext.mo +0 -0
- data/data/locale/uk/LC_MESSAGES/gettext.mo +0 -0
- data/data/locale/uk/LC_MESSAGES/rgettext.mo +0 -0
- data/lib/gettext/tools/pomessage.rb +0 -232
- data/samples/locale/bg/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/bs/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/ca/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/cs/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/de/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/el/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/eo/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/es/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/fr/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/hr/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/hu/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/it/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/ja/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/ko/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/lv/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/nb/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/nl/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/pt_BR/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/ru/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/sr/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/sv/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/uk/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/vi/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/zh/LC_MESSAGES/hello_gtk.mo +0 -0
- data/samples/locale/zh_TW/LC_MESSAGES/hello_gtk.mo +0 -0
- data/test/po/ascii.pot +0 -23
- data/test/po/no_exist_msgid.pot +0 -20
- data/test/po/not_existed_msgid.pot +0 -20
- data/test/test_po_message.rb +0 -118
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'gettext/runtime/
|
3
|
+
require 'gettext/runtime/mo'
|
4
4
|
|
5
|
-
class
|
5
|
+
class TestMo < Test::Unit::TestCase
|
6
6
|
def test_not_exist_msgid
|
7
7
|
mo = load_mo("_.mo")
|
8
8
|
assert_equal(nil, mo["notexistent"])
|
@@ -26,6 +26,6 @@ class TestMoFile < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def load_mo(file)
|
29
|
-
GetText::
|
29
|
+
GetText::MO.open("locale/ja/LC_MESSAGES/#{file}", "UTF-8")
|
30
30
|
end
|
31
31
|
end
|
data/test/test_parser.rb
CHANGED
@@ -52,8 +52,8 @@ class TestGetTextParser < Test::Unit::TestCase
|
|
52
52
|
assert_target "\\taaa", ['fixtures/_.rb:96']
|
53
53
|
assert_target "Here document1\\nHere document2\\n", ['fixtures/_.rb:100']
|
54
54
|
assert_target "Francois Pinard", ['fixtures/_.rb:119'] do |t|
|
55
|
-
assert_match(/proper name/, t.
|
56
|
-
assert_match(/Pronunciation/, t.
|
55
|
+
assert_match(/proper name/, t.extracted_comment)
|
56
|
+
assert_match(/Pronunciation/, t.extracted_comment)
|
57
57
|
end
|
58
58
|
|
59
59
|
assert_target("No TRANSLATORS comment", ["fixtures/_.rb:122"]) do |t|
|
@@ -101,7 +101,8 @@ class TestGetTextParser < Test::Unit::TestCase
|
|
101
101
|
assert_plural_target "mmmmmm", "mmm2mmm2", ['fixtures/n_.rb:80']
|
102
102
|
assert_plural_target "nnn", "nnn2", ['fixtures/n_.rb:81']
|
103
103
|
assert_plural_target "comment", "comments", ['fixtures/n_.rb:97'] do |t|
|
104
|
-
assert_equal "please provide translations for all\n the plural forms!",
|
104
|
+
assert_equal "please provide translations for all\n the plural forms!",
|
105
|
+
t.extracted_comment
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
@@ -112,7 +113,7 @@ class TestGetTextParser < Test::Unit::TestCase
|
|
112
113
|
assert_target_in_context "AAA", "CCC", ["fixtures/p_.rb:41"]
|
113
114
|
assert_target_in_context "CCC", "BBB", ["fixtures/p_.rb:45"]
|
114
115
|
assert_target_in_context "program", "name", ['fixtures/p_.rb:55'] do |t|
|
115
|
-
assert_equal "please translate 'name' in the context of 'program'.\n Hint: the translation should NOT contain the translation of 'program'.", t.
|
116
|
+
assert_equal "please translate 'name' in the context of 'program'.\n Hint: the translation should NOT contain the translation of 'program'.", t.extracted_comment
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
@@ -184,11 +185,11 @@ class TestGetTextParser < Test::Unit::TestCase
|
|
184
185
|
|
185
186
|
private
|
186
187
|
|
187
|
-
def assert_target(msgid,
|
188
|
+
def assert_target(msgid, references = nil)
|
188
189
|
t = @ary.detect {|elem| elem.msgid == msgid}
|
189
190
|
if t
|
190
|
-
if
|
191
|
-
assert_equal
|
191
|
+
if references
|
192
|
+
assert_equal references.sort, t.references.sort, 'Translation target references do not match.'
|
192
193
|
end
|
193
194
|
yield t if block_given?
|
194
195
|
else
|
@@ -196,18 +197,18 @@ class TestGetTextParser < Test::Unit::TestCase
|
|
196
197
|
end
|
197
198
|
end
|
198
199
|
|
199
|
-
def assert_plural_target(msgid, plural,
|
200
|
-
assert_target msgid,
|
200
|
+
def assert_plural_target(msgid, plural, references = nil)
|
201
|
+
assert_target msgid, references do |t|
|
201
202
|
assert_equal plural, t.msgid_plural, 'Expected plural form'
|
202
203
|
yield t if block_given?
|
203
204
|
end
|
204
205
|
end
|
205
206
|
|
206
|
-
def assert_target_in_context(msgctxt, msgid,
|
207
|
+
def assert_target_in_context(msgctxt, msgid, references = nil)
|
207
208
|
t = @ary.detect {|elem| elem.msgid == msgid && elem.msgctxt == msgctxt}
|
208
209
|
if t
|
209
|
-
if
|
210
|
-
assert_equal
|
210
|
+
if references
|
211
|
+
assert_equal references.sort, t.references.sort, 'Translation target references do not match.'
|
211
212
|
end
|
212
213
|
yield t if block_given?
|
213
214
|
else
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'gettext/tools/parser/ruby'
|
4
|
+
|
5
|
+
# Most functionality of PoMessage is thoroughly tested together
|
6
|
+
# with the parser and po file generator. Here only tests for some special
|
7
|
+
# functionality.
|
8
|
+
class TestPOEntry < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_context_match
|
11
|
+
tt1 = GetText::POEntry.new(:msgctxt)
|
12
|
+
tt1.msgid = 'hello'
|
13
|
+
tt1.msgctxt = 'world'
|
14
|
+
tt2 = GetText::POEntry.new(:normal)
|
15
|
+
tt2.msgid = 'hello'
|
16
|
+
assert_raise GetText::ParseError do
|
17
|
+
tt1.merge tt2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_attribute_accumulation
|
22
|
+
tt = GetText::POEntry.new(:plural)
|
23
|
+
tt.set_current_attribute 'long'
|
24
|
+
tt.set_current_attribute ' tail'
|
25
|
+
tt.advance_to_next_attribute
|
26
|
+
tt.set_current_attribute 'long tails'
|
27
|
+
assert_equal 'long tail', tt.msgid
|
28
|
+
assert_equal 'long tails', tt.msgid_plural
|
29
|
+
end
|
30
|
+
|
31
|
+
class TestSetType < self
|
32
|
+
def test_varid_type
|
33
|
+
entry = GetText::POEntry.new(:normal)
|
34
|
+
type = :plural
|
35
|
+
entry.type = type
|
36
|
+
assert_equal(type, entry.type)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_invalid_type
|
40
|
+
entry = GetText::POEntry.new(:normal)
|
41
|
+
type = :invalid
|
42
|
+
assert_raise(GetText::POEntry::InvalidTypeError) do
|
43
|
+
entry.type = type
|
44
|
+
end
|
45
|
+
assert_equal(:normal, entry.type)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_invalid_type_for_initializing
|
49
|
+
assert_raise(GetText::POEntry::InvalidTypeError) do
|
50
|
+
GetText::POEntry.new(:invalid)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class TestToS < self
|
56
|
+
def test_normal
|
57
|
+
po = GetText::POEntry.new(:normal)
|
58
|
+
po.msgid = 'hello'
|
59
|
+
po.references = ["file1:1", "file2:10"]
|
60
|
+
assert_equal "#: file1:1 file2:10\nmsgid \"hello\"\nmsgstr \"\"\n", po.to_s
|
61
|
+
|
62
|
+
po.msgctxt = 'context'
|
63
|
+
po.msgid_plural = 'hello2'
|
64
|
+
# Ignore these properties.
|
65
|
+
assert_equal "#: file1:1 file2:10\nmsgid \"hello\"\nmsgstr \"\"\n", po.to_s
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_plural
|
69
|
+
po = GetText::POEntry.new(:plural)
|
70
|
+
po.msgid = 'hello'
|
71
|
+
po.msgid_plural = 'hello2'
|
72
|
+
po.references = ["file1:1", "file2:10"]
|
73
|
+
assert_equal "#: file1:1 file2:10\nmsgid \"hello\"\nmsgid_plural \"hello2\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n", po.to_s
|
74
|
+
|
75
|
+
po.msgctxt = 'context'
|
76
|
+
# Ignore this property
|
77
|
+
assert_equal "#: file1:1 file2:10\nmsgid \"hello\"\nmsgid_plural \"hello2\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n", po.to_s
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_msgctxt
|
81
|
+
po = GetText::POEntry.new(:msgctxt)
|
82
|
+
po.msgctxt = 'context'
|
83
|
+
po.msgid = 'hello'
|
84
|
+
po.references = ["file1:1", "file2:10"]
|
85
|
+
assert_equal "#: file1:1 file2:10\nmsgctxt \"context\"\nmsgid \"hello\"\nmsgstr \"\"\n", po.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_msgctxt_plural
|
89
|
+
po = GetText::POEntry.new(:msgctxt_plural)
|
90
|
+
po.msgctxt = 'context'
|
91
|
+
po.msgid = 'hello'
|
92
|
+
po.msgid_plural = 'hello2'
|
93
|
+
po.references = ["file1:1", "file2:10"]
|
94
|
+
assert_equal "#: file1:1 file2:10\nmsgctxt \"context\"\nmsgid \"hello\"\nmsgid_plural \"hello2\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n", po.to_s
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_exception
|
98
|
+
po = GetText::POEntry.new(:normal)
|
99
|
+
po.references = ["file1:1", "file2:10"]
|
100
|
+
assert_raise(GetText::POEntry::NoMsgidError) {po.to_s}
|
101
|
+
|
102
|
+
po.references = nil
|
103
|
+
assert_raise(GetText::POEntry::NoMsgidError) {po.to_s}
|
104
|
+
|
105
|
+
po = GetText::POEntry.new(:plural)
|
106
|
+
po.msgid = 'hello'
|
107
|
+
po.references = ["file1:1", "file2:10"]
|
108
|
+
assert_raise(GetText::POEntry::NoMsgidPluralError) {po.to_s}
|
109
|
+
|
110
|
+
po = GetText::POEntry.new(:msgctxt)
|
111
|
+
po.msgid = 'hello'
|
112
|
+
po.references = ["file1:1", "file2:10"]
|
113
|
+
assert_raise(GetText::POEntry::NoMsgctxtError) {po.to_s}
|
114
|
+
|
115
|
+
po = GetText::POEntry.new(:msgctxt_plural)
|
116
|
+
po.msgctxt = 'context'
|
117
|
+
po.msgid = 'hello'
|
118
|
+
po.references = ["file1:1", "file2:10"]
|
119
|
+
assert_raise(GetText::POEntry::NoMsgidPluralError) {po.to_s}
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_header
|
123
|
+
po = GetText::POEntry.new(:normal)
|
124
|
+
po.msgid = ""
|
125
|
+
po.msgstr = "This is the header entry."
|
126
|
+
po.references = nil
|
127
|
+
expected_header = <<EOH
|
128
|
+
msgid ""
|
129
|
+
msgstr "This is the header entry."
|
130
|
+
EOH
|
131
|
+
assert_equal(expected_header, po.to_s)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_msgstr
|
135
|
+
po = GetText::POEntry.new(:normal)
|
136
|
+
po.msgid = "hello"
|
137
|
+
po.msgstr = "Bonjour"
|
138
|
+
po.references = ["file1:1", "file2:10"]
|
139
|
+
expected_entry = <<-EOE
|
140
|
+
#: file1:1 file2:10
|
141
|
+
msgid "hello"
|
142
|
+
msgstr "Bonjour"
|
143
|
+
EOE
|
144
|
+
assert_equal(expected_entry, po.to_s)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_escaped_msgstr
|
148
|
+
po = GetText::POEntry.new(:normal)
|
149
|
+
po.msgid = "He said \"hello.\""
|
150
|
+
po.msgstr = "Il a dit \"bonjour.\""
|
151
|
+
po.references = ["file1:1", "file2:10"]
|
152
|
+
expected_entry = <<-EOE
|
153
|
+
#: file1:1 file2:10
|
154
|
+
msgid "He said \\\"hello.\\\""
|
155
|
+
msgstr "Il a dit \\\"bonjour.\\\""
|
156
|
+
EOE
|
157
|
+
assert_equal(expected_entry, po.to_s)
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_escaped_msgstr_with_msgid_plural
|
161
|
+
po = GetText::POEntry.new(:plural)
|
162
|
+
po.msgid = "He said \"hello.\""
|
163
|
+
po.msgid_plural = "They said \"hello.\""
|
164
|
+
po.msgstr = "Il a dit \"bonjour.\"\000Ils ont dit \"bonjour.\""
|
165
|
+
po.references = ["file1:1", "file2:10"]
|
166
|
+
expected_entry = <<-EOE
|
167
|
+
#: file1:1 file2:10
|
168
|
+
msgid "He said \\\"hello.\\\""
|
169
|
+
msgid_plural "They said \\\"hello.\\\""
|
170
|
+
msgstr[0] "Il a dit \\\"bonjour.\\\""
|
171
|
+
msgstr[1] "Ils ont dit \\\"bonjour.\\\""
|
172
|
+
EOE
|
173
|
+
assert_equal(expected_entry, po.to_s)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_msgstr_with_msgid_plural
|
177
|
+
po = GetText::POEntry.new(:plural)
|
178
|
+
po.msgid = "he"
|
179
|
+
po.msgid_plural = "them"
|
180
|
+
po.msgstr = "il\000ils"
|
181
|
+
po.references = ["file1:1", "file2:10"]
|
182
|
+
expected_entry = <<-EOE
|
183
|
+
#: file1:1 file2:10
|
184
|
+
msgid "he"
|
185
|
+
msgid_plural "them"
|
186
|
+
msgstr[0] "il"
|
187
|
+
msgstr[1] "ils"
|
188
|
+
EOE
|
189
|
+
assert_equal(expected_entry, po.to_s)
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_obsolete_comment
|
193
|
+
po = GetText::POEntry.new(:normal)
|
194
|
+
po.msgid = :last
|
195
|
+
obsolete_comment =<<EOC
|
196
|
+
# test.rb:10
|
197
|
+
msgid \"hello\"
|
198
|
+
msgstr \"Salut\"
|
199
|
+
EOC
|
200
|
+
po.comment = obsolete_comment
|
201
|
+
|
202
|
+
expected_obsolete_comment = obsolete_comment.gsub(/^/, "#~ ")
|
203
|
+
assert_equal(expected_obsolete_comment, po.to_s)
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_translator_comment
|
207
|
+
po = GetText::POEntry.new(:normal)
|
208
|
+
po.msgid = "msgid"
|
209
|
+
po.msgstr = "msgstr"
|
210
|
+
po.translator_comment = "It's the translator comment."
|
211
|
+
|
212
|
+
expected_po =<<EOP
|
213
|
+
# It's the translator comment.
|
214
|
+
msgid \"msgid\"
|
215
|
+
msgstr \"msgstr\"
|
216
|
+
EOP
|
217
|
+
assert_equal(expected_po, po.to_s)
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_extracted_comment
|
221
|
+
po = GetText::POEntry.new(:normal)
|
222
|
+
po.msgid = "msgid"
|
223
|
+
po.msgstr = "msgstr"
|
224
|
+
po.extracted_comment = "It's the extracted comment."
|
225
|
+
|
226
|
+
expected_po =<<EOP
|
227
|
+
#. It's the extracted comment.
|
228
|
+
msgid \"msgid\"
|
229
|
+
msgstr \"msgstr\"
|
230
|
+
EOP
|
231
|
+
assert_equal(expected_po, po.to_s)
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_flag
|
235
|
+
po = GetText::POEntry.new(:normal)
|
236
|
+
po.msgid = "msgid"
|
237
|
+
po.msgstr = "msgstr"
|
238
|
+
po.flag = "It's the flag."
|
239
|
+
|
240
|
+
expected_po =<<EOP
|
241
|
+
#, It's the flag.
|
242
|
+
msgid \"msgid\"
|
243
|
+
msgstr \"msgstr\"
|
244
|
+
EOP
|
245
|
+
assert_equal(expected_po, po.to_s)
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_previous
|
249
|
+
po = GetText::POEntry.new(:normal)
|
250
|
+
po.msgid = "msgid"
|
251
|
+
po.msgstr = "msgstr"
|
252
|
+
po.previous = <<EOC
|
253
|
+
msgctxt previous_msgctxt
|
254
|
+
msgid previous_msgid
|
255
|
+
msgid_plural previous_msgid_plural
|
256
|
+
EOC
|
257
|
+
|
258
|
+
expected_po =<<EOP
|
259
|
+
#| msgctxt previous_msgctxt
|
260
|
+
#| msgid previous_msgid
|
261
|
+
#| msgid_plural previous_msgid_plural
|
262
|
+
msgid \"msgid\"
|
263
|
+
msgstr \"msgstr\"
|
264
|
+
EOP
|
265
|
+
assert_equal(expected_po, po.to_s)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
class TestEscape < self
|
270
|
+
def setup
|
271
|
+
@entry = GetText::POEntry.new(:normal)
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_backslash
|
275
|
+
@entry.msgid = "You should escape '\\' as '\\\\'."
|
276
|
+
assert_equal("You should escape '\\\\' as '\\\\\\\\'.",
|
277
|
+
@entry.escaped(:msgid))
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_new_line
|
281
|
+
@entry.msgid = "First\nSecond\nThird"
|
282
|
+
assert_equal("First\\nSecond\\nThird",
|
283
|
+
@entry.escaped(:msgid))
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
class TestFormatMessage < self
|
288
|
+
def setup
|
289
|
+
@entry = GetText::POEntry.new(:normal)
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_including_newline
|
293
|
+
message = "line 1\n" +
|
294
|
+
"line 2"
|
295
|
+
expected_message = "\"\"\n" +
|
296
|
+
"\"line 1\\n\"\n" +
|
297
|
+
"\"line 2\"\n"
|
298
|
+
assert_equal(expected_message, @entry.format_message(message))
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_not_existed_newline
|
302
|
+
message = "line 1"
|
303
|
+
expected_message = "\"line 1\"\n"
|
304
|
+
assert_equal(expected_message, @entry.format_message(message))
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
class TestFormatComment < self
|
309
|
+
def setup
|
310
|
+
@entry = GetText::POEntry.new(:normal)
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_one_line_comment
|
314
|
+
comment = "comment"
|
315
|
+
mark = "#"
|
316
|
+
@entry.msgid = "msgid"
|
317
|
+
expected_comment = "# #{comment}\n"
|
318
|
+
assert_equal(expected_comment, @entry.format_comment(mark, comment))
|
319
|
+
end
|
320
|
+
|
321
|
+
def test_multiline_comment
|
322
|
+
comment = "comment1\ncomment2"
|
323
|
+
mark = "#"
|
324
|
+
@entry.msgid = ""
|
325
|
+
expected_comment = "#{comment.gsub(/^/, "#{mark} ")}\n"
|
326
|
+
assert_equal(expected_comment, @entry.format_comment(mark, comment))
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
data/test/test_po_parser.rb
CHANGED
@@ -20,13 +20,13 @@
|
|
20
20
|
|
21
21
|
require "gettext/tools/poparser"
|
22
22
|
|
23
|
-
class
|
23
|
+
class TestPOParser < Test::Unit::TestCase
|
24
24
|
def test_msgstr_not_existing
|
25
25
|
po_file = create_po_file(<<-EOP)
|
26
26
|
msgid "Hello"
|
27
27
|
msgstr ""
|
28
28
|
EOP
|
29
|
-
messages = parse_po_file(po_file)
|
29
|
+
messages = parse_po_file(po_file, MO.new)
|
30
30
|
|
31
31
|
assert_equal(nil, messages["Hello"])
|
32
32
|
end
|
@@ -38,12 +38,213 @@ msgid_plural "They"
|
|
38
38
|
msgstr[0] ""
|
39
39
|
msgstr[1] ""
|
40
40
|
EOP
|
41
|
-
messages = parse_po_file(po_file)
|
41
|
+
messages = parse_po_file(po_file, MO.new)
|
42
42
|
|
43
43
|
assert_true(messages.has_key?("He\000They"))
|
44
44
|
assert_equal(nil, messages["He\000They"])
|
45
45
|
end
|
46
46
|
|
47
|
+
class TestPoData < self
|
48
|
+
def test_comment
|
49
|
+
po_file = create_po_file(<<-EOP)
|
50
|
+
#: file.rb:10
|
51
|
+
msgid "hello"
|
52
|
+
msgstr "bonjour"
|
53
|
+
EOP
|
54
|
+
entries = parse_po_file(po_file)
|
55
|
+
assert_true(entries.msgids.include?("hello"))
|
56
|
+
assert_equal("bonjour", entries["hello"])
|
57
|
+
assert_equal("#: file.rb:10", entries.comment("hello"))
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_msgctxt
|
61
|
+
po_file = create_po_file(<<-EOP)
|
62
|
+
msgctxt "pronoun"
|
63
|
+
msgid "he"
|
64
|
+
msgstr "il"
|
65
|
+
EOP
|
66
|
+
entries = parse_po_file(po_file)
|
67
|
+
assert_true(entries.msgids.include?("pronoun\004he"))
|
68
|
+
assert_equal("il", entries["pronoun\004he"])
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_msgid_plural
|
72
|
+
po_file = create_po_file(<<-EOP)
|
73
|
+
msgid "he"
|
74
|
+
msgid_plural "they"
|
75
|
+
msgstr[0] "il"
|
76
|
+
msgstr[1] "ils"
|
77
|
+
EOP
|
78
|
+
entries = parse_po_file(po_file)
|
79
|
+
|
80
|
+
assert_true(entries.msgids.include?("he\000they"))
|
81
|
+
assert_equal("il\000ils", entries["he\000they"])
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_msgctxt_and_msgid_plural
|
85
|
+
po_file = create_po_file(<<-EOP)
|
86
|
+
msgctxt "pronoun"
|
87
|
+
msgid "he"
|
88
|
+
msgid_plural "them"
|
89
|
+
msgstr[0] "il"
|
90
|
+
msgstr[1] "ils"
|
91
|
+
EOP
|
92
|
+
entries = parse_po_file(po_file)
|
93
|
+
assert_true(entries.msgids.include?("pronoun\004he\000them"))
|
94
|
+
assert_equal("il\000ils", entries["pronoun\004he\000them"])
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def parse_po_file(po_file)
|
99
|
+
super(po_file, GetText::Tools::MsgMerge::PoData.new)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class TestPO < self
|
104
|
+
def test_msgstr
|
105
|
+
po_file = create_po_file(<<-EOP)
|
106
|
+
# This is the comment.
|
107
|
+
#: file.rb:10
|
108
|
+
msgid "hello"
|
109
|
+
msgstr "bonjour"
|
110
|
+
EOP
|
111
|
+
entries = parse_po_file(po_file)
|
112
|
+
assert_true(entries.has_key?(nil, "hello"))
|
113
|
+
assert_equal("bonjour", entries["hello"].msgstr)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_references
|
117
|
+
po_file = create_po_file(<<-EOP)
|
118
|
+
# This is the comment.
|
119
|
+
#: file.rb:10
|
120
|
+
msgid "hello"
|
121
|
+
msgstr "bonjour"
|
122
|
+
EOP
|
123
|
+
entries = parse_po_file(po_file)
|
124
|
+
assert_true(entries.has_key?(nil, "hello"))
|
125
|
+
assert_equal(["file.rb:10"], entries["hello"].references)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_translator_comment
|
129
|
+
po_file = create_po_file(<<-EOP)
|
130
|
+
# This is the translator comment.
|
131
|
+
msgid "hello"
|
132
|
+
msgstr "bonjour"
|
133
|
+
EOP
|
134
|
+
entries = parse_po_file(po_file)
|
135
|
+
assert_true(entries.has_key?(nil, "hello"))
|
136
|
+
entry = entries["hello"]
|
137
|
+
assert_equal("This is the translator comment.", entry.translator_comment)
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_extracted_comment
|
141
|
+
po_file = create_po_file(<<-EOP)
|
142
|
+
#. This is the extracted comment.
|
143
|
+
msgid "hello"
|
144
|
+
msgstr "bonjour"
|
145
|
+
EOP
|
146
|
+
entries = parse_po_file(po_file)
|
147
|
+
assert_true(entries.has_key?(nil, "hello"))
|
148
|
+
entry = entries["hello"]
|
149
|
+
assert_equal("This is the extracted comment.", entry.extracted_comment)
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_flag
|
153
|
+
po_file = create_po_file(<<-EOP)
|
154
|
+
#, flag
|
155
|
+
msgid "hello"
|
156
|
+
msgstr "bonjour"
|
157
|
+
EOP
|
158
|
+
entries = parse_po_file(po_file)
|
159
|
+
assert_true(entries.has_key?(nil, "hello"))
|
160
|
+
assert_equal("flag", entries["hello"].flag)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_previous
|
164
|
+
po_file = create_po_file(<<-EOP)
|
165
|
+
#| msgctxt Normal
|
166
|
+
#| msgid He
|
167
|
+
#| msgid_plural Them
|
168
|
+
msgid "he"
|
169
|
+
msgid_plural "them"
|
170
|
+
msgstr[0] "il"
|
171
|
+
msgstr[1] "ils"
|
172
|
+
EOP
|
173
|
+
expected_previous = "msgctxt Normal\n" +
|
174
|
+
"msgid He\n" +
|
175
|
+
"msgid_plural Them"
|
176
|
+
entries = parse_po_file(po_file)
|
177
|
+
assert_true(entries.has_key?(nil, "he"))
|
178
|
+
assert_equal(expected_previous, entries["he"].previous)
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_msgid_plural
|
182
|
+
po_file = create_po_file(<<-EOP)
|
183
|
+
# This is the comment.
|
184
|
+
#: file.rb:10
|
185
|
+
msgid "he"
|
186
|
+
msgid_plural "them"
|
187
|
+
msgstr[0] "il"
|
188
|
+
msgstr[1] "ils"
|
189
|
+
EOP
|
190
|
+
entries = parse_po_file(po_file)
|
191
|
+
assert_true(entries.has_key?(nil, "he"))
|
192
|
+
assert_equal("them", entries["he"].msgid_plural)
|
193
|
+
assert_equal("il\000ils", entries["he"].msgstr)
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_msgctxt
|
197
|
+
po_file = create_po_file(<<-EOP)
|
198
|
+
# This is the comment.
|
199
|
+
#: file.rb:10
|
200
|
+
msgctxt "pronoun"
|
201
|
+
msgid "he"
|
202
|
+
msgstr "il"
|
203
|
+
EOP
|
204
|
+
entries = parse_po_file(po_file)
|
205
|
+
assert_true(entries.has_key?("pronoun", "he"))
|
206
|
+
assert_equal("pronoun", entries["pronoun", "he"].msgctxt)
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_msgctxt_with_msgid_plural
|
210
|
+
po_file = create_po_file(<<-EOP)
|
211
|
+
# This is the comment.
|
212
|
+
#: file.rb:10
|
213
|
+
msgctxt "pronoun"
|
214
|
+
msgid "he"
|
215
|
+
msgid_plural "them"
|
216
|
+
msgstr[0] "il"
|
217
|
+
msgstr[1] "ils"
|
218
|
+
EOP
|
219
|
+
entries = parse_po_file(po_file)
|
220
|
+
assert_true(entries.has_key?("pronoun", "he"))
|
221
|
+
assert_equal("pronoun", entries["pronoun", "he"].msgctxt)
|
222
|
+
assert_equal("them", entries["pronoun", "he"].msgid_plural)
|
223
|
+
assert_equal("il\000ils", entries["pronoun", "he"].msgstr)
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_fuzzy
|
227
|
+
po_file = create_po_file(<<-EOP)
|
228
|
+
#, fuzzy
|
229
|
+
#: file.rb:10
|
230
|
+
msgid "hello"
|
231
|
+
msgstr "bonjour"
|
232
|
+
EOP
|
233
|
+
entries = parse_po_file(po_file, :ignore_fuzzy => false)
|
234
|
+
|
235
|
+
assert_true(entries.has_key?("hello"))
|
236
|
+
assert_equal("fuzzy", entries["hello"].flag)
|
237
|
+
end
|
238
|
+
|
239
|
+
private
|
240
|
+
def parse_po_file(po_file, options={:ignore_fuzzy => true})
|
241
|
+
ignore_fuzzy = options[:ignore_fuzzy]
|
242
|
+
parser = GetText::POParser.new
|
243
|
+
parser.ignore_fuzzy = ignore_fuzzy
|
244
|
+
parser.parse_file(po_file.path, PO.new)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
47
248
|
private
|
48
249
|
def create_po_file(content)
|
49
250
|
po_file = Tempfile.new("hello.po")
|
@@ -52,9 +253,9 @@ EOP
|
|
52
253
|
po_file
|
53
254
|
end
|
54
255
|
|
55
|
-
def parse_po_file(po_file)
|
56
|
-
parser = GetText::
|
57
|
-
parser.parse_file(po_file.path,
|
256
|
+
def parse_po_file(po_file, parsed_entries)
|
257
|
+
parser = GetText::POParser.new
|
258
|
+
parser.parse_file(po_file.path, parsed_entries)
|
58
259
|
end
|
59
260
|
|
60
261
|
class FuzzyTest < self
|
@@ -115,13 +316,13 @@ EOP
|
|
115
316
|
|
116
317
|
private
|
117
318
|
def parse
|
118
|
-
parser = GetText::
|
319
|
+
parser = GetText::POParser.new
|
119
320
|
class << parser
|
120
321
|
def _(message_id)
|
121
322
|
message_id
|
122
323
|
end
|
123
324
|
end
|
124
|
-
messages =
|
325
|
+
messages = MO.new
|
125
326
|
yield parser
|
126
327
|
parser.parse_file(@po_file.path, messages)
|
127
328
|
messages
|