gettext 2.3.3 → 2.3.4

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.
Files changed (79) hide show
  1. data/doc/text/news.md +37 -0
  2. data/gettext.gemspec +1 -0
  3. data/lib/gettext/runtime/mo.rb +382 -0
  4. data/lib/gettext/runtime/mofile.rb +24 -366
  5. data/lib/gettext/runtime/textdomain.rb +17 -17
  6. data/lib/gettext/tools.rb +1 -1
  7. data/lib/gettext/tools/msgfmt.rb +2 -2
  8. data/lib/gettext/tools/msginit.rb +16 -15
  9. data/lib/gettext/tools/msgmerge.rb +258 -255
  10. data/lib/gettext/tools/parser/ruby.rb +24 -24
  11. data/lib/gettext/tools/po.rb +256 -0
  12. data/lib/gettext/tools/po_entry.rb +355 -0
  13. data/lib/gettext/tools/poparser.rb +118 -16
  14. data/lib/gettext/tools/xgettext.rb +56 -58
  15. data/lib/gettext/version.rb +1 -1
  16. data/samples/po/hello.pot +3 -3
  17. data/samples/po/hello2.pot +3 -3
  18. data/samples/po/hello_glade2.pot +3 -3
  19. data/samples/po/hello_gtk2.pot +3 -3
  20. data/samples/po/hello_noop.pot +3 -3
  21. data/samples/po/hello_plural.pot +3 -3
  22. data/samples/po/hello_tk.pot +3 -3
  23. data/src/poparser.ry +111 -9
  24. data/test/parser/test_ruby.rb +17 -13
  25. data/test/po/_.pot +3 -3
  26. data/test/po/backslash.pot +3 -3
  27. data/test/po/non_ascii.pot +3 -3
  28. data/test/po/np_.pot +5 -4
  29. data/test/po/ns_.pot +3 -3
  30. data/test/po/p_.pot +3 -3
  31. data/test/po/s_.pot +3 -3
  32. data/test/po/untranslated.pot +3 -3
  33. data/test/{test_mofile.rb → test_mo.rb} +3 -3
  34. data/test/test_parser.rb +13 -12
  35. data/test/test_po_entry.rb +329 -0
  36. data/test/test_po_parser.rb +209 -8
  37. data/test/tools/test_msginit.rb +0 -2
  38. data/test/tools/test_msgmerge.rb +427 -50
  39. data/test/tools/test_po.rb +487 -0
  40. data/test/tools/test_xgettext.rb +1 -1
  41. metadata +28 -45
  42. data/data/locale/de/LC_MESSAGES/gettext.mo +0 -0
  43. data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
  44. data/data/locale/el/LC_MESSAGES/gettext.mo +0 -0
  45. data/data/locale/el/LC_MESSAGES/rgettext.mo +0 -0
  46. data/data/locale/sr/LC_MESSAGES/gettext.mo +0 -0
  47. data/data/locale/sr/LC_MESSAGES/rgettext.mo +0 -0
  48. data/data/locale/uk/LC_MESSAGES/gettext.mo +0 -0
  49. data/data/locale/uk/LC_MESSAGES/rgettext.mo +0 -0
  50. data/lib/gettext/tools/pomessage.rb +0 -232
  51. data/samples/locale/bg/LC_MESSAGES/hello_gtk.mo +0 -0
  52. data/samples/locale/bs/LC_MESSAGES/hello_gtk.mo +0 -0
  53. data/samples/locale/ca/LC_MESSAGES/hello_gtk.mo +0 -0
  54. data/samples/locale/cs/LC_MESSAGES/hello_gtk.mo +0 -0
  55. data/samples/locale/de/LC_MESSAGES/hello_gtk.mo +0 -0
  56. data/samples/locale/el/LC_MESSAGES/hello_gtk.mo +0 -0
  57. data/samples/locale/eo/LC_MESSAGES/hello_gtk.mo +0 -0
  58. data/samples/locale/es/LC_MESSAGES/hello_gtk.mo +0 -0
  59. data/samples/locale/fr/LC_MESSAGES/hello_gtk.mo +0 -0
  60. data/samples/locale/hr/LC_MESSAGES/hello_gtk.mo +0 -0
  61. data/samples/locale/hu/LC_MESSAGES/hello_gtk.mo +0 -0
  62. data/samples/locale/it/LC_MESSAGES/hello_gtk.mo +0 -0
  63. data/samples/locale/ja/LC_MESSAGES/hello_gtk.mo +0 -0
  64. data/samples/locale/ko/LC_MESSAGES/hello_gtk.mo +0 -0
  65. data/samples/locale/lv/LC_MESSAGES/hello_gtk.mo +0 -0
  66. data/samples/locale/nb/LC_MESSAGES/hello_gtk.mo +0 -0
  67. data/samples/locale/nl/LC_MESSAGES/hello_gtk.mo +0 -0
  68. data/samples/locale/pt_BR/LC_MESSAGES/hello_gtk.mo +0 -0
  69. data/samples/locale/ru/LC_MESSAGES/hello_gtk.mo +0 -0
  70. data/samples/locale/sr/LC_MESSAGES/hello_gtk.mo +0 -0
  71. data/samples/locale/sv/LC_MESSAGES/hello_gtk.mo +0 -0
  72. data/samples/locale/uk/LC_MESSAGES/hello_gtk.mo +0 -0
  73. data/samples/locale/vi/LC_MESSAGES/hello_gtk.mo +0 -0
  74. data/samples/locale/zh/LC_MESSAGES/hello_gtk.mo +0 -0
  75. data/samples/locale/zh_TW/LC_MESSAGES/hello_gtk.mo +0 -0
  76. data/test/po/ascii.pot +0 -23
  77. data/test/po/no_exist_msgid.pot +0 -20
  78. data/test/po/not_existed_msgid.pot +0 -20
  79. data/test/test_po_message.rb +0 -118
@@ -331,7 +331,6 @@ msgstr ""
331
331
  "Content-Type: text/plain; charset=UTF-8\\n"
332
332
  "Content-Transfer-Encoding: 8bit\\n"
333
333
  "Plural-Forms: #{plural_forms}\\n"
334
-
335
334
  EOF
336
335
  end
337
336
 
@@ -361,7 +360,6 @@ msgstr ""
361
360
  "Content-Type: text/plain; charset=UTF-8\\n"
362
361
  "Content-Transfer-Encoding: 8bit\\n"
363
362
  "Plural-Forms: #{plural_forms}\\n"
364
-
365
363
  EOF
366
364
  end
367
365
  end
@@ -26,85 +26,152 @@ class TestToolsMsgMerge < Test::Unit::TestCase
26
26
  @po_data = GetText::Tools::MsgMerge::PoData.new
27
27
  end
28
28
 
29
- def test_generate_po
30
- header_entry_comment = "# header entry comment."
31
- header_entry = "header entry"
32
- comment = "#: test.rb:10"
33
- msgid = "Hello"
34
- msgstr = "Salut"
35
- expected_po = <<EOP
29
+ def test_msgids
30
+ @po_data["hello"] = "bonjour"
31
+ @po_data["he"] = "il"
32
+
33
+ assert_equal(["he", "hello"], @po_data.msgids.sort)
34
+ end
35
+
36
+ def test_each_msgids
37
+ @po_data["hello"] = "bonjour"
38
+ @po_data["he"] = "il"
39
+ @po_data[""] = "header"
40
+ @po_data[:last] = ""
41
+
42
+ msgids = []
43
+ @po_data.each_msgid do |msgid|
44
+ msgids << msgid
45
+ end
46
+ assert_equal(["he", "hello"], msgids.sort)
47
+ end
48
+
49
+ class TestAddToExistingEntry < self
50
+ def test_msgctxt
51
+ msgctxt = "msgctxt"
52
+ msgid = "msgid"
53
+ original_string = "#{msgctxt}\004#{msgid}"
54
+ msgstr = "msgstr"
55
+
56
+ po_data = GetText::Tools::MsgMerge::PoData.new
57
+ po_data[original_string] = msgstr
58
+
59
+ assert_equal(msgctxt, po_data.po[msgctxt, msgid].msgctxt)
60
+ end
61
+
62
+ def test_msgid_plural
63
+ msgid = "msgid"
64
+ msgid_plural = "msgid_plural"
65
+ original_string = "#{msgid}\000#{msgid_plural}"
66
+ msgstr = "msgstr"
67
+
68
+ po_data = GetText::Tools::MsgMerge::PoData.new
69
+ po_data[msgid] = msgstr
70
+ assert_equal(nil, po_data.po[msgid].msgid_plural)
71
+
72
+ po_data[original_string] = msgstr
73
+ assert_equal(msgid_plural, po_data.po[msgid].msgid_plural)
74
+ end
75
+
76
+ def test_msgctxt_and_msgid_plural
77
+ msgctxt = "msgctxt"
78
+ msgid = "msgid"
79
+ msgid_plural = "msgid_plural"
80
+ original_string = "#{msgctxt}\004#{msgid}\000#{msgid_plural}"
81
+ msgstr = "msgstr"
82
+
83
+ po_data = GetText::Tools::MsgMerge::PoData.new
84
+ po_data[original_string] = msgstr
85
+
86
+ assert_equal(msgctxt, po_data.po[msgctxt, msgid].msgctxt)
87
+ assert_equal(msgid_plural, po_data.po[msgctxt, msgid].msgid_plural)
88
+ end
89
+ end
90
+
91
+ class TestGeneratePo < self
92
+ def test_comment_and_msgid_and_msgstr
93
+ header_entry_comment = "# header entry comment."
94
+ header_entry = "header\nentry\n"
95
+ comment = "#: test.rb:10"
96
+ msgid = "Hello"
97
+ msgstr = "Salut"
98
+
99
+ po = GetText::Tools::MsgMerge::PoData.new
100
+ po.set_comment("", header_entry_comment)
101
+ po[""] = header_entry
102
+ po[msgid] = msgstr
103
+ po.set_comment(msgid, comment)
104
+
105
+ expected_header_entry = ""
106
+ header_entry.each_line do |line|
107
+ expected_header_entry << "\"#{line.chomp}\\n\"\n"
108
+ end
109
+ expected_header_entry = expected_header_entry.chomp
110
+ expected_po = <<EOP
36
111
  #{header_entry_comment}
37
112
  msgid \"\"
38
113
  msgstr \"\"
39
- \"#{header_entry}\\n\"
114
+ #{expected_header_entry}
40
115
 
41
116
  #{comment}
42
117
  msgid \"#{msgid}\"
43
118
  msgstr \"#{msgstr}\"
44
119
  EOP
120
+ assert_equal(expected_po, po.generate_po)
121
+ end
45
122
 
46
- po = GetText::Tools::MsgMerge::PoData.new
47
- po.set_comment("", header_entry_comment)
48
- po[""] = header_entry
49
- po[msgid] = msgstr
50
- po.set_comment(msgid, comment)
51
-
52
- assert_equal(expected_po, po.generate_po)
53
- end
54
-
55
- def test_generate_po_including_obsolete_comment
56
- obsolete_comment = <<EOC
57
- #. #: test.rb:10
58
- #. msgid \"Hello\"
59
- #. msgstr \"Salut\"
123
+ def test_obsolete_comment
124
+ obsolete_comment =<<EOC
125
+ # test.rb:10
126
+ msgid \"Hello\"
127
+ msgstr \"Salut\"
60
128
  EOC
61
- obsolete_comment = obsolete_comment.chomp
129
+ header_entry_comment = "# header entry comment."
130
+ header_entry = "header entry"
131
+
132
+ po = GetText::Tools::MsgMerge::PoData.new
133
+ po.set_comment("", header_entry_comment)
134
+ po[""] = header_entry
135
+ po.set_comment(:last, obsolete_comment)
62
136
 
63
- header_entry_comment = "# header entry comment."
64
- header_entry = "header entry"
65
- expected_po = <<EOP
137
+ expected_obsolete_comment = obsolete_comment.gsub(/^/, "#~ ").chomp
138
+ expected_po = <<EOP
66
139
  #{header_entry_comment}
67
140
  msgid \"\"
68
- msgstr \"\"
69
- \"#{header_entry}\\n\"
141
+ msgstr \"#{header_entry}\"
70
142
 
71
- #{obsolete_comment}
143
+ #{expected_obsolete_comment}
72
144
  EOP
145
+ assert_equal(expected_po, po.generate_po)
146
+ end
73
147
 
74
- po = GetText::Tools::MsgMerge::PoData.new
75
- po.set_comment("", header_entry_comment)
76
- po[""] = header_entry
77
- po.set_comment(:last, obsolete_comment)
78
-
79
- assert_equal(expected_po, po.generate_po)
80
- end
81
-
82
- def test_generate_po_msgid_plural_and_empty_msgstr
83
- msgid = "Singular message\000Plural message"
148
+ def test_msgid_plural_and_empty_msgstr
149
+ msgid = "Singular message\000Plural message"
84
150
 
85
- @po_data[""] = "Plural-Forms: nplurals=2; plural=n != 1;\\n"
86
- @po_data[msgid] = ""
87
- @po_data.set_comment(msgid, "# plural message")
88
- actual_po = @po_data.generate_po_entry(msgid)
89
- expected_po = <<'EOE'
151
+ @po_data[""] = "Plural-Forms: nplurals=2; plural=n != 1;\\n"
152
+ @po_data[msgid] = "\000"
153
+ @po_data.set_comment(msgid, "# plural message")
154
+ actual_po = @po_data.generate_po_entry(msgid)
155
+ expected_po = <<'EOE'
90
156
  # plural message
91
157
  msgid "Singular message"
92
158
  msgid_plural "Plural message"
93
159
  msgstr[0] ""
94
160
  msgstr[1] ""
95
161
  EOE
96
- assert_equal(expected_po, actual_po)
162
+ assert_equal(expected_po, actual_po)
163
+ end
97
164
  end
98
165
 
99
- class TestGeneratePoEntry < self
166
+ class TestGeneratePOEntry < self
100
167
  def test_msgid_plural
101
168
  msgid = "Singular message\000Plural message"
102
169
 
103
170
  @po_data[msgid] = "Singular translation\000Plural translation"
104
- @po_data.set_comment(msgid, "#plural message")
171
+ @po_data.set_comment(msgid, "# plural message")
105
172
  actual_po = @po_data.generate_po_entry(msgid)
106
173
  expected_po = <<'EOE'
107
- #plural message
174
+ # plural message
108
175
  msgid "Singular message"
109
176
  msgid_plural "Plural message"
110
177
  msgstr[0] "Singular translation"
@@ -116,11 +183,11 @@ EOE
116
183
  def test_msgctxt
117
184
  msg_id = "Context\004Translation"
118
185
  @po_data[msg_id] = "Translated"
119
- @po_data.set_comment(msg_id, "#no comment")
186
+ @po_data.set_comment(msg_id, "# no comment")
120
187
 
121
188
  entry = @po_data.generate_po_entry(msg_id)
122
189
  assert_equal(<<-'EOE', entry)
123
- #no comment
190
+ # no comment
124
191
  msgctxt "Context"
125
192
  msgid "Translation"
126
193
  msgstr "Translated"
@@ -129,6 +196,316 @@ EOE
129
196
  end
130
197
  end
131
198
 
199
+ class TestSplitMsgid < self
200
+ def test_existed_msgctxt_and_msgid_plural
201
+ msgctxt = "msgctxt"
202
+ msgid = "msgid"
203
+ msgid_plural = "msgid_plural"
204
+
205
+ assert_equal([msgctxt, msgid, msgid_plural],
206
+ split_msgid("#{msgctxt}\004#{msgid}\000#{msgid_plural}"))
207
+ end
208
+
209
+ def test_existed_msgctxt_only
210
+ msgctxt = "msgctxt"
211
+ msgid = "msgid"
212
+
213
+ assert_equal([msgctxt, msgid, nil],
214
+ split_msgid("#{msgctxt}\004#{msgid}"))
215
+ end
216
+
217
+ def test_existed_msgid_plural_only
218
+ msgid = "msgid"
219
+ msgid_plural = "msgid_plural"
220
+
221
+ assert_equal([nil, msgid, msgid_plural],
222
+ split_msgid("#{msgid}\000#{msgid_plural}"))
223
+ end
224
+
225
+ def test_not_existed
226
+ msgid = "msgid"
227
+
228
+ assert_equal([nil, msgid, nil], split_msgid(msgid))
229
+ end
230
+
231
+ def test_empty_msgid
232
+ msgid = ""
233
+
234
+ assert_equal([nil, msgid, nil], split_msgid(msgid))
235
+ end
236
+
237
+ def test_last_symbol_msgid
238
+ msgid = :last
239
+
240
+ assert_equal([nil, msgid, nil], split_msgid(msgid))
241
+ end
242
+
243
+ private
244
+ def split_msgid(msgid)
245
+ po_data = GetText::Tools::MsgMerge::PoData.new
246
+ po_data.send(:split_msgid, msgid)
247
+ end
248
+ end
249
+
250
+ class TestParseComment < self
251
+ def setup
252
+ @po_data = GetText::Tools::MsgMerge::PoData.new
253
+ @entry = @po_data.send(:generate_entry, "test")
254
+ end
255
+
256
+ def test_translator_comment
257
+ comment = "# translator comment"
258
+ parsed_comment = parse_comment(comment).translator_comment
259
+ assert_equal("translator comment\n", parsed_comment)
260
+ end
261
+
262
+ def test_extracted_comment
263
+ comment = "#. extracted comment"
264
+ parsed_comment = parse_comment(comment).extracted_comment
265
+ assert_equal("extracted comment\n", parsed_comment)
266
+ end
267
+
268
+ def test_references
269
+ comment = "#: reference.rb:10"
270
+ parsed_comment = parse_comment(comment).references
271
+ assert_equal(["reference.rb:10"], parsed_comment)
272
+ end
273
+
274
+ def test_flag
275
+ comment = "#, fuzzy"
276
+ parsed_comment = parse_comment(comment).flag
277
+ assert_equal("fuzzy\n", parsed_comment)
278
+ end
279
+
280
+ def test_previous
281
+ comment = "#| msgid the previous msgid"
282
+ parsed_comment = parse_comment(comment).previous
283
+ assert_equal("msgid the previous msgid\n", parsed_comment)
284
+ end
285
+
286
+ private
287
+ def parse_comment(comment)
288
+ @po_data.send(:parse_comment, comment, @entry)
289
+ end
290
+ end
291
+
292
+ class TestMerger < self
293
+ def setup
294
+ @merger = GetText::Tools::MsgMerge::Merger.new
295
+ @po_data = GetText::Tools::MsgMerge::PoData.new
296
+ @po = GetText::PO.new
297
+ @pot = GetText::PO.new
298
+ end
299
+
300
+ def test_add_entry
301
+ @po["hello"] = "bonjour"
302
+ @pot["hello"] = "bonjour"
303
+ @pot["he"] = "il"
304
+ merged_po = @merger.merge(@po, @pot)
305
+
306
+ assert_equal("bonjour", merged_po["hello"].msgstr)
307
+ assert_equal("il", merged_po["he"].msgstr)
308
+ end
309
+
310
+ def test_different_msgstr
311
+ @po["hello"] = "salut"
312
+ @pot["hello"] = "bonjour"
313
+ merged_po = @merger.merge(@po, @pot)
314
+
315
+ assert_equal("salut", merged_po["hello"].msgstr)
316
+ end
317
+
318
+ def test_similar_msgstr_for_fuzzy
319
+ @po["helol"] = "bonjour"
320
+ @pot["hello"] = ""
321
+ merged_po = @merger.merge(@po, @pot)
322
+
323
+ assert_false(merged_po.has_key?("helol"))
324
+ assert_true(merged_po.has_key?("hello"))
325
+ assert_equal("bonjour", merged_po["hello"].msgstr)
326
+ assert_equal("fuzzy", merged_po["hello"].flag)
327
+ end
328
+
329
+ def test_nonexistent_msgctxt
330
+ @po["normal", "hello"] = generate_entry(:msgctxt => "normal",
331
+ :msgid => "hello",
332
+ :msgstr => "salut")
333
+ @pot["hello"] = generate_entry(:msgid => "hello",
334
+ :msgstr => "")
335
+ merged_po = @merger.merge(@po, @pot)
336
+
337
+ assert_false(merged_po.has_key?("normal", "hello"))
338
+ assert_true(merged_po.has_key?("hello"))
339
+ assert_equal("salut", merged_po["hello"].msgstr)
340
+ assert_equal("fuzzy", merged_po["hello"].flag)
341
+ end
342
+
343
+ def test_msgid_plural
344
+ @po["he"] = generate_entry(:msgid => "he",
345
+ :msgid_plural => "thye",
346
+ :msgstr => "il\000ils")
347
+ @pot["he"] = generate_entry(:msgid => "he",
348
+ :msgid_plural => "they",
349
+ :msgstr => "")
350
+ merged_po = @merger.merge(@po, @pot)
351
+
352
+ assert_equal("il\000ils", merged_po["he"].msgstr)
353
+ assert_equal("they", merged_po["he"].msgid_plural)
354
+ assert_equal("fuzzy", merged_po["he"].flag)
355
+ end
356
+
357
+ def test_translator_comment
358
+ @po["hello"] = generate_entry(:msgid => "hello",
359
+ :msgstr => "bonjour",
360
+ :translator_comment => "comment")
361
+
362
+ @pot["hello"] = generate_entry(:msgid => "hello",
363
+ :msgstr => "",
364
+ :translator_comment => "It's comments")
365
+
366
+ merged_po = @merger.merge(@po, @pot)
367
+ assert_equal("bonjour", merged_po["hello"].msgstr)
368
+ assert_equal("comment", merged_po["hello"].translator_comment)
369
+ end
370
+
371
+ def test_extracted_comment
372
+ @po["hello"] = generate_entry(:msgid => "hello",
373
+ :msgstr => "bonjour",
374
+ :extracted_comment => "comment")
375
+
376
+ @pot["hello"] = generate_entry(:msgid => "hello",
377
+ :msgstr => "",
378
+ :extracted_comment => "extracted comments")
379
+
380
+ merged_po = @merger.merge(@po, @pot)
381
+ assert_equal("bonjour", merged_po["hello"].msgstr)
382
+ assert_equal("extracted comments", merged_po["hello"].extracted_comment)
383
+ end
384
+
385
+ def test_references
386
+ references = ["file.rb:10", "helper.rb:10"]
387
+ pot_references = ["file.rb:10", "test.rb:25"]
388
+ @po["hello"] = generate_entry(:msgid => "hello",
389
+ :msgstr => "bonjour",
390
+ :references => references)
391
+
392
+ @pot["hello"] = generate_entry(:msgid => "hello",
393
+ :msgstr => "",
394
+ :references => pot_references)
395
+
396
+ merged_po = @merger.merge(@po, @pot)
397
+ assert_equal("bonjour", merged_po["hello"].msgstr)
398
+ assert_equal(pot_references, merged_po["hello"].references)
399
+ end
400
+
401
+ def test_flag
402
+ @po["hello"] = generate_entry(:msgid => "hello",
403
+ :msgstr => "bonjour",
404
+ :flag => "c-format")
405
+
406
+ @pot["hello"] = generate_entry(:msgid => "hello",
407
+ :msgstr => "",
408
+ :flag => "no-c-format")
409
+
410
+ merged_po = @merger.merge(@po, @pot)
411
+ assert_equal("bonjour", merged_po["hello"].msgstr)
412
+ assert_equal("no-c-format", merged_po["hello"].flag)
413
+ end
414
+
415
+ def test_fuzzy_flag
416
+ @po["hello"] = generate_entry(:msgid => "hello",
417
+ :msgstr => "bonjuor",
418
+ :flag => "fuzzy")
419
+
420
+ @pot["hello"] = generate_entry(:msgid => "hello",
421
+ :msgstr => "")
422
+
423
+ merged_po = @merger.merge(@po, @pot)
424
+ assert_equal("bonjuor", merged_po["hello"].msgstr)
425
+ assert_equal("fuzzy", merged_po["hello"].flag)
426
+ end
427
+
428
+ def test_previous
429
+ @po["hello"] = generate_entry(:msgid => "hello",
430
+ :msgstr => "bonjour",
431
+ :previous => "hi")
432
+
433
+ @pot["hello"] = generate_entry(:msgid => "hello",
434
+ :msgstr => "")
435
+
436
+ merged_po = @merger.merge(@po, @pot)
437
+ assert_equal("bonjour", merged_po["hello"].msgstr)
438
+ assert_equal(nil, merged_po["hello"].previous)
439
+ end
440
+
441
+ def test_fuzzy_header
442
+ @po[""] = generate_entry(:msgid => "",
443
+ :msgstr => "header\nentry",
444
+ :translator_comment => "header comment")
445
+
446
+ @pot[""] = generate_entry(:msgid => "",
447
+ :msgstr => "uninitialized\ncomment",
448
+ :translator_comment => "uninitialized comment",
449
+ :flag => "fuzzy")
450
+
451
+ merged_po = @merger.merge(@po, @pot)
452
+ assert_equal("header\nentry", merged_po[""].msgstr)
453
+ assert_equal("header comment", merged_po[""].translator_comment)
454
+ assert_equal(nil, merged_po[""].flag)
455
+ end
456
+
457
+ def test_fuzzy_header_including_pot_creation_date
458
+ creation_date_mark = "POT-Creation-Date: "
459
+ po_creation_date = "#{creation_date_mark}2012-11-15 08:15+0900"
460
+ pot_creation_date = "#{creation_date_mark}2012-11-20 14:15+0900"
461
+ @po[""] = generate_entry(:msgid => "",
462
+ :msgstr => po_creation_date,
463
+ :translator_comment => "header comment")
464
+
465
+ @pot[""] = generate_entry(:msgid => "",
466
+ :msgstr => pot_creation_date,
467
+ :translator_comment => "header comment",
468
+ :flag => "fuzzy")
469
+
470
+ merged_po = @merger.merge(@po, @pot)
471
+ assert_equal(pot_creation_date, merged_po[""].msgstr)
472
+ end
473
+
474
+ def test_obsolete_entry
475
+ @po["hello"] = "bonjour"
476
+ @pot["hi"] = "salut"
477
+ merged_po = @merger.merge(@po, @pot)
478
+
479
+ assert_equal("salut", merged_po["hi"].msgstr)
480
+ assert_false(merged_po.has_key?("hello"))
481
+
482
+ obsolete_comment = <<-EOC
483
+ msgid "hello"
484
+ msgstr "bonjour"
485
+ EOC
486
+ assert_equal(obsolete_comment, merged_po[:last].comment)
487
+ end
488
+
489
+ private
490
+ def generate_entry(options)
491
+ msgctxt = options[:msgctxt]
492
+ msgid_plural = options[:msgid_plural]
493
+ type = @po_data.send(:detect_entry_type, msgctxt, msgid_plural)
494
+
495
+ entry = GetText::POEntry.new(type)
496
+ entry.translator_comment = options[:translator_comment]
497
+ entry.extracted_comment = options[:extracted_comment]
498
+ entry.references = options[:references] || []
499
+ entry.flag = options[:flag]
500
+ entry.previous = options[:previous]
501
+ entry.msgctxt = msgctxt
502
+ entry.msgid = options[:msgid]
503
+ entry.msgid_plural = msgid_plural
504
+ entry.msgstr = options[:msgstr]
505
+ entry
506
+ end
507
+ end
508
+
132
509
  class TestMerge < self
133
510
  include GetTextTestUtils
134
511