gettext 3.2.9 → 3.4.9

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 (237) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +276 -198
  3. data/Rakefile +7 -4
  4. data/doc/text/news.md +451 -0
  5. data/gettext.gemspec +10 -7
  6. data/lib/gettext/locale_path.rb +17 -9
  7. data/lib/gettext/mo.rb +12 -19
  8. data/lib/gettext/po.rb +4 -4
  9. data/lib/gettext/po_entry.rb +47 -27
  10. data/lib/gettext/po_parser.rb +65 -59
  11. data/lib/gettext/text_domain.rb +1 -1
  12. data/lib/gettext/text_domain_manager.rb +6 -5
  13. data/lib/gettext/tools/msgcat.rb +9 -2
  14. data/lib/gettext/tools/msginit.rb +226 -54
  15. data/lib/gettext/tools/msgmerge.rb +24 -6
  16. data/lib/gettext/tools/parser/erb.rb +9 -1
  17. data/lib/gettext/tools/parser/erubi.rb +88 -0
  18. data/lib/gettext/tools/parser/glade.rb +38 -40
  19. data/lib/gettext/tools/parser/gtk_builder_ui_definitions.rb +129 -0
  20. data/lib/gettext/tools/parser/ruby.rb +288 -221
  21. data/lib/gettext/tools/task.rb +4 -5
  22. data/lib/gettext/tools/xgettext.rb +21 -10
  23. data/lib/gettext/version.rb +3 -3
  24. data/locale/bg/LC_MESSAGES/gettext.mo +0 -0
  25. data/locale/bs/LC_MESSAGES/gettext.mo +0 -0
  26. data/locale/ca/LC_MESSAGES/gettext.mo +0 -0
  27. data/locale/cs/LC_MESSAGES/gettext.mo +0 -0
  28. data/locale/de/LC_MESSAGES/gettext.mo +0 -0
  29. data/locale/el/LC_MESSAGES/gettext.mo +0 -0
  30. data/locale/eo/LC_MESSAGES/gettext.mo +0 -0
  31. data/locale/es/LC_MESSAGES/gettext.mo +0 -0
  32. data/locale/et/LC_MESSAGES/gettext.mo +0 -0
  33. data/locale/fr/LC_MESSAGES/gettext.mo +0 -0
  34. data/locale/hr/LC_MESSAGES/gettext.mo +0 -0
  35. data/locale/hu/LC_MESSAGES/gettext.mo +0 -0
  36. data/locale/it/LC_MESSAGES/gettext.mo +0 -0
  37. data/locale/ja/LC_MESSAGES/gettext.mo +0 -0
  38. data/locale/ko/LC_MESSAGES/gettext.mo +0 -0
  39. data/locale/lv/LC_MESSAGES/gettext.mo +0 -0
  40. data/locale/nb/LC_MESSAGES/gettext.mo +0 -0
  41. data/locale/nl/LC_MESSAGES/gettext.mo +0 -0
  42. data/locale/pt_BR/LC_MESSAGES/gettext.mo +0 -0
  43. data/locale/ru/LC_MESSAGES/gettext.mo +0 -0
  44. data/locale/sr/LC_MESSAGES/gettext.mo +0 -0
  45. data/locale/uk/LC_MESSAGES/gettext.mo +0 -0
  46. data/locale/vi/LC_MESSAGES/gettext.mo +0 -0
  47. data/locale/zh/LC_MESSAGES/gettext.mo +0 -0
  48. data/locale/zh_TW/LC_MESSAGES/gettext.mo +0 -0
  49. data/po/bg/gettext.edit.po +81 -572
  50. data/po/bg/gettext.po +7 -409
  51. data/po/bs/gettext.edit.po +81 -572
  52. data/po/bs/gettext.po +7 -409
  53. data/po/ca/gettext.edit.po +81 -572
  54. data/po/ca/gettext.po +7 -409
  55. data/po/cs/gettext.edit.po +81 -572
  56. data/po/cs/gettext.po +7 -409
  57. data/po/de/gettext.edit.po +81 -572
  58. data/po/de/gettext.po +7 -409
  59. data/po/el/gettext.edit.po +81 -572
  60. data/po/el/gettext.po +7 -409
  61. data/po/eo/gettext.edit.po +81 -572
  62. data/po/eo/gettext.po +7 -409
  63. data/po/es/gettext.edit.po +81 -572
  64. data/po/es/gettext.po +7 -409
  65. data/po/et/gettext.edit.po +81 -572
  66. data/po/et/gettext.po +7 -409
  67. data/po/fr/gettext.edit.po +81 -572
  68. data/po/fr/gettext.po +7 -409
  69. data/po/gettext.pot +93 -645
  70. data/po/hr/gettext.edit.po +81 -572
  71. data/po/hr/gettext.po +7 -409
  72. data/po/hu/gettext.edit.po +81 -572
  73. data/po/hu/gettext.po +7 -409
  74. data/po/it/gettext.edit.po +81 -572
  75. data/po/it/gettext.po +7 -409
  76. data/po/ja/gettext.edit.po +83 -574
  77. data/po/ja/gettext.po +9 -411
  78. data/po/ko/gettext.edit.po +81 -572
  79. data/po/ko/gettext.po +7 -409
  80. data/po/lv/gettext.edit.po +81 -572
  81. data/po/lv/gettext.po +7 -409
  82. data/po/nb/gettext.edit.po +81 -572
  83. data/po/nb/gettext.po +7 -409
  84. data/po/nl/gettext.edit.po +81 -572
  85. data/po/nl/gettext.po +7 -409
  86. data/po/pt_BR/gettext.edit.po +81 -572
  87. data/po/pt_BR/gettext.po +7 -409
  88. data/po/ru/gettext.edit.po +81 -572
  89. data/po/ru/gettext.po +7 -409
  90. data/po/sr/gettext.edit.po +81 -572
  91. data/po/sr/gettext.po +7 -409
  92. data/po/sv/gettext.edit.po +81 -572
  93. data/po/sv/gettext.po +7 -409
  94. data/po/uk/gettext.edit.po +81 -572
  95. data/po/uk/gettext.po +7 -409
  96. data/po/vi/gettext.edit.po +81 -572
  97. data/po/vi/gettext.po +7 -409
  98. data/po/zh/gettext.edit.po +81 -572
  99. data/po/zh/gettext.po +7 -409
  100. data/po/zh_TW/gettext.edit.po +81 -572
  101. data/po/zh_TW/gettext.po +7 -409
  102. data/samples/cgi/po/helloerb1.pot +3 -3
  103. data/samples/cgi/po/helloerb2.pot +3 -3
  104. data/samples/cgi/po/hellolib.pot +3 -3
  105. data/samples/cgi/po/main.pot +3 -3
  106. data/samples/po/bg/hello_gtk_builder.edit.po +15 -0
  107. data/samples/po/bg/hello_gtk_builder.po +12 -0
  108. data/samples/po/bs/hello_gtk_builder.edit.po +15 -0
  109. data/samples/po/bs/hello_gtk_builder.po +12 -0
  110. data/samples/po/ca/hello_gtk_builder.edit.po +15 -0
  111. data/samples/po/ca/hello_gtk_builder.po +12 -0
  112. data/samples/po/cs/hello_gtk_builder.edit.po +15 -0
  113. data/samples/po/cs/hello_gtk_builder.po +12 -0
  114. data/samples/po/de/hello_gtk_builder.edit.po +15 -0
  115. data/samples/po/de/hello_gtk_builder.po +12 -0
  116. data/samples/po/el/hello_gtk_builder.edit.po +15 -0
  117. data/samples/po/el/hello_gtk_builder.po +12 -0
  118. data/samples/po/eo/hello_gtk_builder.edit.po +15 -0
  119. data/samples/po/eo/hello_gtk_builder.po +12 -0
  120. data/samples/po/es/hello_gtk_builder.edit.po +15 -0
  121. data/samples/po/es/hello_gtk_builder.po +12 -0
  122. data/samples/po/fr/hello_gtk_builder.edit.po +15 -0
  123. data/samples/po/fr/hello_gtk_builder.po +12 -0
  124. data/samples/po/hello.pot +3 -3
  125. data/samples/po/hello2.pot +4 -4
  126. data/samples/po/hello_glade2.pot +8 -5
  127. data/samples/po/hello_gtk2.pot +4 -4
  128. data/samples/po/hello_gtk_builder.pot +18 -4
  129. data/samples/po/hello_noop.pot +4 -4
  130. data/samples/po/hello_plural.pot +4 -4
  131. data/samples/po/hello_tk.pot +4 -4
  132. data/samples/po/hr/hello_gtk_builder.edit.po +15 -0
  133. data/samples/po/hr/hello_gtk_builder.po +12 -0
  134. data/samples/po/hu/hello_gtk_builder.edit.po +15 -0
  135. data/samples/po/hu/hello_gtk_builder.po +12 -0
  136. data/samples/po/it/hello_gtk_builder.edit.po +15 -0
  137. data/samples/po/it/hello_gtk_builder.po +12 -0
  138. data/samples/po/ja/hello_gtk_builder.edit.po +15 -0
  139. data/samples/po/ja/hello_gtk_builder.po +12 -0
  140. data/samples/po/ko/hello_gtk_builder.edit.po +15 -0
  141. data/samples/po/ko/hello_gtk_builder.po +12 -0
  142. data/samples/po/lv/hello_gtk_builder.edit.po +15 -0
  143. data/samples/po/lv/hello_gtk_builder.po +12 -0
  144. data/samples/po/nb/hello_gtk_builder.edit.po +15 -0
  145. data/samples/po/nb/hello_gtk_builder.po +12 -0
  146. data/samples/po/nl/hello_gtk_builder.edit.po +15 -0
  147. data/samples/po/nl/hello_gtk_builder.po +12 -0
  148. data/samples/po/pt_BR/hello_gtk_builder.edit.po +15 -0
  149. data/samples/po/pt_BR/hello_gtk_builder.po +12 -0
  150. data/samples/po/ru/hello_gtk_builder.edit.po +15 -0
  151. data/samples/po/ru/hello_gtk_builder.po +12 -0
  152. data/samples/po/sr/hello_gtk_builder.edit.po +15 -0
  153. data/samples/po/sr/hello_gtk_builder.po +12 -0
  154. data/samples/po/sv/hello_gtk_builder.edit.po +15 -0
  155. data/samples/po/sv/hello_gtk_builder.po +12 -0
  156. data/samples/po/uk/hello_gtk_builder.edit.po +15 -0
  157. data/samples/po/uk/hello_gtk_builder.po +12 -0
  158. data/samples/po/vi/hello_gtk_builder.edit.po +15 -0
  159. data/samples/po/vi/hello_gtk_builder.po +12 -0
  160. data/samples/po/zh/hello_gtk_builder.edit.po +15 -0
  161. data/samples/po/zh/hello_gtk_builder.po +12 -0
  162. data/samples/po/zh_TW/hello_gtk_builder.edit.po +15 -0
  163. data/samples/po/zh_TW/hello_gtk_builder.po +12 -0
  164. data/src/po_parser.ry +48 -42
  165. data/test/fixtures/_/backtick.rb +30 -0
  166. data/test/fixtures/_/block_parameter.rb +2 -2
  167. data/test/fixtures/_/double_quote_in_double_quote.rb +2 -2
  168. data/test/fixtures/_/double_quote_in_single_quote.rb +2 -2
  169. data/test/fixtures/_/literal_concatenation_with_continuation_line.rb +2 -2
  170. data/test/fixtures/_/middle_new_line.rb +2 -2
  171. data/test/fixtures/_/multiple_lines_literal.rb +2 -2
  172. data/test/fixtures/_/multiple_messages_in_same_line.rb +2 -2
  173. data/test/fixtures/_/multiple_same_messages.rb +2 -2
  174. data/test/fixtures/_/one_line.rb +2 -2
  175. data/test/fixtures/_/one_new_line.rb +2 -2
  176. data/test/fixtures/_/percent_strings.rb +55 -0
  177. data/test/fixtures/_/pipe.rb +32 -0
  178. data/test/{gettext-test-utils.rb → fixtures/_/quoted_symbol.rb} +13 -23
  179. data/test/fixtures/_.rb +10 -1
  180. data/test/fixtures/erb/case.rhtml +16 -0
  181. data/test/fixtures/erb/minus.rhtml +12 -0
  182. data/test/fixtures/erb/non_ascii.rhtml +1 -0
  183. data/test/fixtures/glade/3.glade +63 -0
  184. data/test/fixtures/gtk_builder_ui_definitions.ui +68 -0
  185. data/test/fixtures/multi_text_domain.rb +12 -12
  186. data/test/fixtures/np_.rb +1 -1
  187. data/test/fixtures/ns_/custom.rb +2 -2
  188. data/test/fixtures/ns_.rb +1 -1
  189. data/test/fixtures/p_.rb +1 -1
  190. data/test/fixtures/ruby/percent_lower_i.rb +1 -0
  191. data/test/fixtures/ruby/percent_lower_w.rb +1 -0
  192. data/test/fixtures/ruby/percent_upper_i.rb +1 -0
  193. data/test/fixtures/ruby/percent_upper_w.rb +1 -0
  194. data/test/fixtures/s_/custom.rb +2 -2
  195. data/test/fixtures/s_.rb +1 -1
  196. data/test/fixtures/simple.rb +5 -1
  197. data/test/fixtures/upper_nn_.rb +77 -0
  198. data/test/helper.rb +99 -0
  199. data/test/locale/fr/LC_MESSAGES/plural_error.mo +0 -0
  200. data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
  201. data/test/locale/fr_BE/LC_MESSAGES/test1.mo +0 -0
  202. data/test/locale/fr_BE_Foo/LC_MESSAGES/test1.mo +0 -0
  203. data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
  204. data/test/po/_.pot +28 -4
  205. data/test/po/backslash.pot +6 -4
  206. data/test/po/fr/plural_error.po +7 -0
  207. data/test/po/fr/test1.po +7 -0
  208. data/test/po/fr_BE/test1.po +24 -0
  209. data/test/po/fr_BE_Foo/test1.po +20 -0
  210. data/test/po/hello.pot +3 -3
  211. data/test/po/ja/_.edit.po +27 -3
  212. data/test/po/ja/_.po +20 -2
  213. data/test/po/ja/hello.edit.po +0 -1
  214. data/test/po/non_ascii.pot +4 -4
  215. data/test/po/np_.pot +8 -5
  216. data/test/po/ns_.pot +6 -4
  217. data/test/po/p_.pot +3 -3
  218. data/test/po/s_.pot +6 -4
  219. data/test/po/untranslated.pot +4 -4
  220. data/test/run-test.rb +2 -3
  221. data/test/test_class_info.rb +8 -9
  222. data/test/test_gettext.rb +30 -1
  223. data/test/test_locale_path.rb +12 -4
  224. data/test/test_parser.rb +113 -25
  225. data/test/test_po_entry.rb +21 -17
  226. data/test/test_po_parser.rb +49 -4
  227. data/test/test_string.rb +9 -5
  228. data/test/tools/parser/test_glade.rb +91 -0
  229. data/test/tools/parser/test_gtk_builder_ui_definitions.rb +63 -0
  230. data/test/tools/parser/test_ruby.rb +76 -39
  231. data/test/tools/test_msgcat.rb +21 -1
  232. data/test/tools/test_msginit.rb +82 -3
  233. data/test/tools/test_msgmerge.rb +81 -6
  234. data/test/tools/test_xgettext.rb +106 -5
  235. metadata +82 -34
  236. data/lib/gettext/tools/parser/haml.rb +0 -61
  237. /data/test/fixtures/{gladeparser.glade → glade/2.glade} +0 -0
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2018 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2014-2023 Sutou Kouhei <kou@clear-code.com>
2
2
  #
3
3
  # License: Ruby's or LGPL
4
4
  #
@@ -243,6 +243,7 @@ msgstr ""
243
243
  @po = <<-PO
244
244
  # translator comment
245
245
  #: a.rb:1
246
+ #: a.rb:2
246
247
  msgid "Hello"
247
248
  msgstr ""
248
249
  PO
@@ -252,6 +253,25 @@ msgstr ""
252
253
  assert_equal(<<-PO, run_msgcat([@po], "--no-location"))
253
254
  # translator comment
254
255
  msgid "Hello"
256
+ msgstr ""
257
+ PO
258
+ end
259
+
260
+ def test_wrap
261
+ assert_equal(<<-PO, run_msgcat([@po], "--wrap"))
262
+ # translator comment
263
+ #: a.rb:1 a.rb:2
264
+ msgid "Hello"
265
+ msgstr ""
266
+ PO
267
+ end
268
+
269
+ def test_use_one_line_per_reference
270
+ assert_equal(<<-PO, run_msgcat([@po], "--wrap", "--use-one-line-per-reference"))
271
+ # translator comment
272
+ #: a.rb:1
273
+ #: a.rb:2
274
+ msgid "Hello"
255
275
  msgstr ""
256
276
  PO
257
277
  end
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
5
3
  #
6
4
  # License: Ruby's or LGPL
7
5
  #
@@ -314,6 +312,11 @@ EOF
314
312
  end
315
313
 
316
314
  class TestPluralForms < self
315
+ def setup
316
+ super
317
+ omit("Red Datasets is required") unless defined?(Datasets::CLDRPlurals)
318
+ end
319
+
317
320
  def run_msginit(pot_header_options={})
318
321
  create_pot_file("test.pot", pot_header_options)
319
322
  po_file_path = "output.po"
@@ -327,5 +330,81 @@ EOF
327
330
  run_msginit(:have_plural_forms => false))
328
331
  end
329
332
  end
333
+
334
+ def test_ja
335
+ assert_equal("nplurals=1; plural=0;",
336
+ @msginit.__send__(:plural_forms, "ja"))
337
+ end
338
+
339
+ def test_en
340
+ assert_equal("nplurals=2; plural=n != 1;",
341
+ @msginit.__send__(:plural_forms, "en"))
342
+ end
343
+
344
+ def test_fr
345
+ assert_equal("nplurals=2; plural=n > 1;",
346
+ @msginit.__send__(:plural_forms, "fr"))
347
+ end
348
+
349
+ def test_lv
350
+ assert_equal("nplurals=3; " +
351
+ "plural=((n % 10) == 1) && ((n % 100) != 11) ? 0 : " +
352
+ "((n % 10) == 0) || ((n % 100) >= 11 && (n % 100) <= 19) " +
353
+ "? 1 : 2;",
354
+ @msginit.__send__(:plural_forms, "lv"))
355
+ end
356
+
357
+ def test_ga
358
+ assert_equal("nplurals=5; " +
359
+ "plural=(n == 1) ? 0 : (n == 2) ? 1 : " +
360
+ "(n >= 3 && n <= 6) ? 2 : (n >= 7 && n <= 10) ? 3 : 4;",
361
+ @msginit.__send__(:plural_forms, "ga"))
362
+ end
363
+
364
+ def test_ro
365
+ assert_equal("nplurals=3; " +
366
+ "plural=(n == 1) ? 0 : " +
367
+ "(n == 0) || (n != 1) && ((n % 100) >= 1 && (n % 100) <= 19) ? 1 : 2;",
368
+ @msginit.__send__(:plural_forms, "ro"))
369
+ end
370
+
371
+ def test_lt
372
+ assert_equal("nplurals=3; " +
373
+ "plural=((n % 10) == 1) && " +
374
+ "((n % 100) < 11 || (n % 100) > 19) ? 0 : " +
375
+ "((n % 10) >= 2 && (n % 10) <= 9) && " +
376
+ "((n % 100) < 11 || (n % 100) > 19) ? 1 : 2;",
377
+ @msginit.__send__(:plural_forms, "lt"))
378
+ end
379
+
380
+ def test_ru
381
+ assert_equal("nplurals=3; " +
382
+ "plural=((n % 10) == 1) && ((n % 100) != 11) ? 0 : " +
383
+ "((n % 10) >= 2 && (n % 10) <= 4) && " +
384
+ "((n % 100) < 12 || (n % 100) > 14) ? 1 : 2;",
385
+ @msginit.__send__(:plural_forms, "ru"))
386
+ end
387
+
388
+ def test_cs
389
+ assert_equal("nplurals=3; " +
390
+ "plural=(n == 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2;",
391
+ @msginit.__send__(:plural_forms, "cs"))
392
+ end
393
+
394
+ def test_pl
395
+ assert_equal("nplurals=3; " +
396
+ "plural=(n == 1) ? 0 : " +
397
+ "((n % 10) >= 2 && (n % 10) <= 4) && " +
398
+ "((n % 100) < 12 || (n % 100) > 14) ? 1 : 2;",
399
+ @msginit.__send__(:plural_forms, "pl"))
400
+ end
401
+
402
+ def test_sl
403
+ assert_equal("nplurals=4; " +
404
+ "plural=((n % 100) == 1) ? 0 : " +
405
+ "((n % 100) == 2) ? 1 : " +
406
+ "((n % 100) >= 3 && (n % 100) <= 4) ? 2 : 3;",
407
+ @msginit.__send__(:plural_forms, "sl"))
408
+ end
330
409
  end
331
410
  end
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
4
2
  # Copyright (C) 2010 Eddie Lau <tatonlto@gmail.com>
5
3
  #
6
4
  # License: Ruby's or LGPL
@@ -292,7 +290,6 @@ msgstr "bonjour"
292
290
  @pot[new_msgid] = ""
293
291
  merged_po = merge
294
292
 
295
- puts merged_po
296
293
  assert_equal("bonjour", merged_po[new_msgid].msgstr)
297
294
  assert_equal("fuzzy", merged_po[new_msgid].flag)
298
295
  end
@@ -364,7 +361,7 @@ EOC
364
361
  end
365
362
 
366
363
  class TestCommand < self
367
- include GetTextTestUtils
364
+ include Helper::Tmpdir
368
365
 
369
366
  def setup
370
367
  @msgmerge = GetText::Tools::MsgMerge.new
@@ -481,6 +478,8 @@ EOP
481
478
  end
482
479
 
483
480
  class TestMessage < self
481
+ include Helper::Warning
482
+
484
483
  def po_content
485
484
  <<-PO
486
485
  #{po_header(@po_formatted_time, @po_formatted_time)}
@@ -492,7 +491,9 @@ msgstr "Translated World"
492
491
  end
493
492
 
494
493
  def test_merge_metadata
495
- @msgmerge.run("--update", @po_file_path, @pot_file_path)
494
+ suppress_warning do
495
+ @msgmerge.run("--update", @po_file_path, @pot_file_path)
496
+ end
496
497
  assert_equal(<<-PO, File.read(@po_file_path))
497
498
  #{po_header(@pot_formatted_time, @po_formatted_time)}
498
499
  #: hello.rb:1
@@ -651,6 +652,46 @@ msgstr ""
651
652
  end
652
653
  end
653
654
 
655
+ class TestUseOneLinePerReference < self
656
+ def pot_content
657
+ super + <<-POT
658
+
659
+ #: hello.rb:10
660
+ #: hello.rb:20
661
+ #: hello.rb:30
662
+ msgid "Good morning"
663
+ msgstr ""
664
+ POT
665
+ end
666
+
667
+ def test_with_wrap
668
+ @msgmerge.run("--update",
669
+ "--wrap",
670
+ "--use-one-line-per-reference",
671
+ @po_file_path, @pot_file_path)
672
+ assert_equal(<<-PO, File.read(@po_file_path))
673
+ #{po_header(@pot_formatted_time, @po_formatted_time)}
674
+ #: hello.rb:1
675
+ msgid "Hello"
676
+ msgstr ""
677
+
678
+ #: hello.rb:2
679
+ msgid "World"
680
+ msgstr "Translated World"
681
+
682
+ #: hello.rb:3
683
+ msgid "Good-bye"
684
+ msgstr ""
685
+
686
+ #: hello.rb:10
687
+ #: hello.rb:20
688
+ #: hello.rb:30
689
+ msgid "Good morning"
690
+ msgstr ""
691
+ PO
692
+ end
693
+ end
694
+
654
695
  class TestWidth < self
655
696
  def pot_content
656
697
  <<-POT
@@ -781,6 +822,40 @@ msgstr ""
781
822
  end
782
823
  end
783
824
 
825
+ class TestWarning < self
826
+ def pot_content
827
+ <<-POT
828
+ msgid "Hello"
829
+ msgstr ""
830
+ POT
831
+ end
832
+
833
+ def po_content
834
+ <<-PO
835
+ #, fuzzy
836
+ msgid "Hello!"
837
+ msgstr "Bonjour!"
838
+ PO
839
+ end
840
+
841
+ def test_default
842
+ _stdout, stderr = capture_output do
843
+ @msgmerge.run(@po_file_path, @pot_file_path)
844
+ end
845
+ assert_equal(<<-STDERR, stderr)
846
+ Warning: fuzzy message was used.
847
+ #{@po_file_path}: msgid 'Hello!'
848
+ STDERR
849
+ end
850
+
851
+ def test_no_report_warning
852
+ _stdout, stderr = capture_output do
853
+ @msgmerge.run("--no-report-warning", @po_file_path, @pot_file_path)
854
+ end
855
+ assert_equal("", stderr)
856
+ end
857
+ end
858
+
784
859
  class TestObsoleteEntries < self
785
860
  def pot_content
786
861
  <<-POT
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2012-2013 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
4
2
  # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
5
3
  #
6
4
  # License: Ruby's or LGPL
@@ -22,7 +20,7 @@ require "locale"
22
20
  require "gettext/tools/xgettext"
23
21
 
24
22
  class TestToolsXGetText < Test::Unit::TestCase
25
- include GetTextTestUtils
23
+ include Helper::Tmpdir
26
24
 
27
25
  def setup
28
26
  @xgettext = GetText::Tools::XGetText.new
@@ -116,6 +114,105 @@ msgid "Hello"
116
114
  msgstr ""
117
115
  EOP
118
116
  end
117
+
118
+ def test_use_one_line_per_reference
119
+ pot_content = generate(<<-RUBY, "--use-one-line-per-reference")
120
+ _("Hello")
121
+ _("Hello")
122
+ RUBY
123
+ assert_equal(<<-POT, pot_content)
124
+ #{header}
125
+ #: ../lib/xgettext.rb:1
126
+ #: ../lib/xgettext.rb:2
127
+ msgid "Hello"
128
+ msgstr ""
129
+ POT
130
+ end
131
+ end
132
+
133
+ class TestParser < self
134
+ # Default ERB parser (don't find anything after "case")
135
+ def test_erb
136
+ rhtml = <<-EOR
137
+ <div>
138
+ <%= _('Hello') %>
139
+ <% case 1 %>
140
+ <% end %>
141
+ <%= _('World') %>
142
+ </div>
143
+ EOR
144
+
145
+ File.open(@rhtml_file_path, "w") do |rhtml_file|
146
+ rhtml_file.puts(rhtml)
147
+ end
148
+
149
+ @xgettext.run(
150
+ "--output", @pot_file_path,
151
+ @rhtml_file_path
152
+ )
153
+
154
+ pot_content = File.read(@pot_file_path)
155
+
156
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0')
157
+ expected_content = <<-EOP
158
+ #{header}
159
+ #: ../templates/xgettext.rhtml:2
160
+ msgid "Hello"
161
+ msgstr ""
162
+
163
+ #: ../templates/xgettext.rhtml:5
164
+ msgid "World"
165
+ msgstr ""
166
+ EOP
167
+ else
168
+ # "World" not detected. see PR #91
169
+ expected_content = <<-EOP
170
+ #{header}
171
+ #: ../templates/xgettext.rhtml:2
172
+ msgid "Hello"
173
+ msgstr ""
174
+ EOP
175
+ end
176
+
177
+ assert_equal(expected_content, pot_content)
178
+ end
179
+
180
+ # Optional Erubi parser (find text after "case")
181
+ def test_erubi
182
+ rhtml = <<-EOR
183
+ <div>
184
+ <%= _('Hello') %>
185
+ <% case 1 %>
186
+ <% end %>
187
+ <%= _('World') %>
188
+ </div>
189
+ EOR
190
+
191
+ File.open(@rhtml_file_path, "w") do |rhtml_file|
192
+ rhtml_file.puts(rhtml)
193
+ end
194
+
195
+ @xgettext.run(
196
+ "--output", @pot_file_path,
197
+ '--require', 'gettext/tools/parser/erubi',
198
+ '--parser', 'GetText::ErubiParser',
199
+ @rhtml_file_path
200
+ )
201
+
202
+ pot_content = File.read(@pot_file_path)
203
+ expected_content = <<-EOP
204
+ #{header}
205
+ #: ../templates/xgettext.rhtml:2
206
+ msgid "Hello"
207
+ msgstr ""
208
+
209
+ #: ../templates/xgettext.rhtml:5
210
+ msgid "World"
211
+ msgstr ""
212
+ EOP
213
+
214
+ assert_equal(expected_content, pot_content)
215
+ end
119
216
  end
120
217
 
121
218
  class TestEncoding < self
@@ -414,6 +511,7 @@ msgid "World"
414
511
  msgstr ""
415
512
 
416
513
  #: ../lib/xgettext.rb:2
514
+ msgctxt "context"
417
515
  msgid "Hello"
418
516
  msgstr ""
419
517
 
@@ -443,6 +541,7 @@ msgid "World"
443
541
  msgstr ""
444
542
 
445
543
  #: ../lib/xgettext.rb:2
544
+ msgctxt "context"
446
545
  msgid "Hello"
447
546
  msgstr ""
448
547
  POT
@@ -456,6 +555,7 @@ msgid "World"
456
555
  msgstr ""
457
556
 
458
557
  #: ../lib/xgettext.rb:2
558
+ msgctxt "context"
459
559
  msgid "Hello"
460
560
  msgstr ""
461
561
 
@@ -481,6 +581,7 @@ msgid "ABC"
481
581
  msgstr ""
482
582
 
483
583
  #: ../lib/xgettext.rb:2
584
+ msgctxt "context"
484
585
  msgid "Hello"
485
586
  msgstr ""
486
587
 
@@ -502,7 +603,7 @@ msgstr ""
502
603
  File.open(@rb_file_path, "w") do |rb_file|
503
604
  rb_file.puts(<<-RUBY)
504
605
  _('World')
505
- _('Hello')
606
+ p_('context', 'Hello')
506
607
  RUBY
507
608
  end
508
609
 
metadata CHANGED
@@ -1,16 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gettext
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.9
4
+ version: 3.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
8
8
  - Masao Mutoh
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-03-05 00:00:00.000000000 Z
12
+ date: 2023-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: erubi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: locale
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -26,27 +40,27 @@ dependencies:
26
40
  - !ruby/object:Gem::Version
27
41
  version: 2.0.5
28
42
  - !ruby/object:Gem::Dependency
29
- name: text
43
+ name: prime
30
44
  requirement: !ruby/object:Gem::Requirement
31
45
  requirements:
32
46
  - - ">="
33
47
  - !ruby/object:Gem::Version
34
- version: 1.3.0
48
+ version: '0'
35
49
  type: :runtime
36
50
  prerelease: false
37
51
  version_requirements: !ruby/object:Gem::Requirement
38
52
  requirements:
39
53
  - - ">="
40
54
  - !ruby/object:Gem::Version
41
- version: 1.3.0
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
- name: rake
57
+ name: racc
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - ">="
47
61
  - !ruby/object:Gem::Version
48
62
  version: '0'
49
- type: :development
63
+ type: :runtime
50
64
  prerelease: false
51
65
  version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
@@ -54,7 +68,21 @@ dependencies:
54
68
  - !ruby/object:Gem::Version
55
69
  version: '0'
56
70
  - !ruby/object:Gem::Dependency
57
- name: racc
71
+ name: text
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 1.3.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 1.3.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: kramdown
58
86
  requirement: !ruby/object:Gem::Requirement
59
87
  requirements:
60
88
  - - ">="
@@ -68,7 +96,7 @@ dependencies:
68
96
  - !ruby/object:Gem::Version
69
97
  version: '0'
70
98
  - !ruby/object:Gem::Dependency
71
- name: yard
99
+ name: rake
72
100
  requirement: !ruby/object:Gem::Requirement
73
101
  requirements:
74
102
  - - ">="
@@ -82,7 +110,7 @@ dependencies:
82
110
  - !ruby/object:Gem::Version
83
111
  version: '0'
84
112
  - !ruby/object:Gem::Dependency
85
- name: kramdown
113
+ name: red-datasets
86
114
  requirement: !ruby/object:Gem::Requirement
87
115
  requirements:
88
116
  - - ">="
@@ -110,7 +138,7 @@ dependencies:
110
138
  - !ruby/object:Gem::Version
111
139
  version: '0'
112
140
  - !ruby/object:Gem::Dependency
113
- name: test-unit-notify
141
+ name: test-unit-rr
114
142
  requirement: !ruby/object:Gem::Requirement
115
143
  requirements:
116
144
  - - ">="
@@ -124,7 +152,7 @@ dependencies:
124
152
  - !ruby/object:Gem::Version
125
153
  version: '0'
126
154
  - !ruby/object:Gem::Dependency
127
- name: test-unit-rr
155
+ name: yard
128
156
  requirement: !ruby/object:Gem::Requirement
129
157
  requirements:
130
158
  - - ">="
@@ -145,11 +173,11 @@ email:
145
173
  - kou@clear-code.com
146
174
  - mutomasa at gmail.com
147
175
  executables:
148
- - rmsginit
149
- - rmsgfmt
150
176
  - rmsgcat
151
- - rxgettext
177
+ - rmsgfmt
178
+ - rmsginit
152
179
  - rmsgmerge
180
+ - rxgettext
153
181
  extensions: []
154
182
  extra_rdoc_files: []
155
183
  files:
@@ -184,8 +212,9 @@ files:
184
212
  - lib/gettext/tools/msginit.rb
185
213
  - lib/gettext/tools/msgmerge.rb
186
214
  - lib/gettext/tools/parser/erb.rb
215
+ - lib/gettext/tools/parser/erubi.rb
187
216
  - lib/gettext/tools/parser/glade.rb
188
- - lib/gettext/tools/parser/haml.rb
217
+ - lib/gettext/tools/parser/gtk_builder_ui_definitions.rb
189
218
  - lib/gettext/tools/parser/ruby.rb
190
219
  - lib/gettext/tools/task.rb
191
220
  - lib/gettext/tools/xgettext.rb
@@ -1514,6 +1543,7 @@ files:
1514
1543
  - samples/po/zh_TW/hello_tk.po.time_stamp
1515
1544
  - src/po_parser.ry
1516
1545
  - test/fixtures/_.rb
1546
+ - test/fixtures/_/backtick.rb
1517
1547
  - test/fixtures/_/block_parameter.rb
1518
1548
  - test/fixtures/_/double_quote_in_double_quote.rb
1519
1549
  - test/fixtures/_/double_quote_in_single_quote.rb
@@ -1524,11 +1554,18 @@ files:
1524
1554
  - test/fixtures/_/multiple_same_messages.rb
1525
1555
  - test/fixtures/_/one_line.rb
1526
1556
  - test/fixtures/_/one_new_line.rb
1557
+ - test/fixtures/_/percent_strings.rb
1558
+ - test/fixtures/_/pipe.rb
1559
+ - test/fixtures/_/quoted_symbol.rb
1527
1560
  - test/fixtures/backslash.rb
1528
1561
  - test/fixtures/erb/ascii.rhtml
1529
1562
  - test/fixtures/erb/ascii.rxml
1563
+ - test/fixtures/erb/case.rhtml
1564
+ - test/fixtures/erb/minus.rhtml
1530
1565
  - test/fixtures/erb/non_ascii.rhtml
1531
- - test/fixtures/gladeparser.glade
1566
+ - test/fixtures/glade/2.glade
1567
+ - test/fixtures/glade/3.glade
1568
+ - test/fixtures/gtk_builder_ui_definitions.ui
1532
1569
  - test/fixtures/hello.rb
1533
1570
  - test/fixtures/lower_n_.rb
1534
1571
  - test/fixtures/multi_text_domain.rb
@@ -1537,12 +1574,17 @@ files:
1537
1574
  - test/fixtures/ns_.rb
1538
1575
  - test/fixtures/ns_/custom.rb
1539
1576
  - test/fixtures/p_.rb
1577
+ - test/fixtures/ruby/percent_lower_i.rb
1578
+ - test/fixtures/ruby/percent_lower_w.rb
1579
+ - test/fixtures/ruby/percent_upper_i.rb
1580
+ - test/fixtures/ruby/percent_upper_w.rb
1540
1581
  - test/fixtures/s_.rb
1541
1582
  - test/fixtures/s_/custom.rb
1542
1583
  - test/fixtures/simple.rb
1543
1584
  - test/fixtures/untranslated.rb
1544
1585
  - test/fixtures/upper_n_.rb
1545
- - test/gettext-test-utils.rb
1586
+ - test/fixtures/upper_nn_.rb
1587
+ - test/helper.rb
1546
1588
  - test/locale/cr/LC_MESSAGES/plural.mo
1547
1589
  - test/locale/da/LC_MESSAGES/plural.mo
1548
1590
  - test/locale/da/LC_MESSAGES/plural_error.mo
@@ -1550,6 +1592,8 @@ files:
1550
1592
  - test/locale/fr/LC_MESSAGES/plural_error.mo
1551
1593
  - test/locale/fr/LC_MESSAGES/test1.mo
1552
1594
  - test/locale/fr/LC_MESSAGES/test2.mo
1595
+ - test/locale/fr_BE/LC_MESSAGES/test1.mo
1596
+ - test/locale/fr_BE_Foo/LC_MESSAGES/test1.mo
1553
1597
  - test/locale/ir/LC_MESSAGES/plural.mo
1554
1598
  - test/locale/ja/LC_MESSAGES/_.mo
1555
1599
  - test/locale/ja/LC_MESSAGES/backslash.mo
@@ -1582,6 +1626,8 @@ files:
1582
1626
  - test/po/fr/plural_error.po
1583
1627
  - test/po/fr/test1.po
1584
1628
  - test/po/fr/test2.po
1629
+ - test/po/fr_BE/test1.po
1630
+ - test/po/fr_BE_Foo/test1.po
1585
1631
  - test/po/hello.pot
1586
1632
  - test/po/ir/plural.po
1587
1633
  - test/po/ja/_.edit.po
@@ -1653,6 +1699,8 @@ files:
1653
1699
  - test/tools/files/simple_2.po
1654
1700
  - test/tools/files/simple_translation.rb
1655
1701
  - test/tools/files/version.po
1702
+ - test/tools/parser/test_glade.rb
1703
+ - test/tools/parser/test_gtk_builder_ui_definitions.rb
1656
1704
  - test/tools/parser/test_ruby.rb
1657
1705
  - test/tools/test.pot
1658
1706
  - test/tools/test_msgcat.rb
@@ -1660,11 +1708,12 @@ files:
1660
1708
  - test/tools/test_msgmerge.rb
1661
1709
  - test/tools/test_task.rb
1662
1710
  - test/tools/test_xgettext.rb
1663
- homepage: http://ruby-gettext.github.com/
1711
+ homepage: https://ruby-gettext.github.io/
1664
1712
  licenses:
1665
- - Ruby or LGPLv3+
1713
+ - Ruby
1714
+ - LGPL-3.0+
1666
1715
  metadata: {}
1667
- post_install_message:
1716
+ post_install_message:
1668
1717
  rdoc_options: []
1669
1718
  require_paths:
1670
1719
  - lib
@@ -1672,30 +1721,29 @@ required_ruby_version: !ruby/object:Gem::Requirement
1672
1721
  requirements:
1673
1722
  - - ">="
1674
1723
  - !ruby/object:Gem::Version
1675
- version: '0'
1724
+ version: 2.5.0
1676
1725
  required_rubygems_version: !ruby/object:Gem::Requirement
1677
1726
  requirements:
1678
1727
  - - ">="
1679
1728
  - !ruby/object:Gem::Version
1680
1729
  version: '0'
1681
1730
  requirements: []
1682
- rubyforge_project: gettext
1683
- rubygems_version: 2.7.6
1684
- signing_key:
1731
+ rubygems_version: 3.5.0.dev
1732
+ signing_key:
1685
1733
  specification_version: 4
1686
1734
  summary: Gettext is a pure Ruby libary and tools to localize messages.
1687
1735
  test_files:
1736
+ - test/test_class_info.rb
1737
+ - test/test_gettext.rb
1688
1738
  - test/test_locale_path.rb
1739
+ - test/test_mo.rb
1689
1740
  - test/test_parser.rb
1690
- - test/test_class_info.rb
1691
- - test/test_text_domain_toplevel.rb
1741
+ - test/test_po.rb
1692
1742
  - test/test_po_entry.rb
1693
- - test/test_text_domain.rb
1694
- - test/test_mo.rb
1743
+ - test/test_po_parser.rb
1695
1744
  - test/test_string.rb
1696
- - test/test_po.rb
1697
- - test/test_gettext.rb
1745
+ - test/test_text_domain.rb
1698
1746
  - test/test_text_domain_bind.rb
1699
- - test/test_thread.rb
1700
1747
  - test/test_text_domain_multi.rb
1701
- - test/test_po_parser.rb
1748
+ - test/test_text_domain_toplevel.rb
1749
+ - test/test_thread.rb