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,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
4
2
  # Copyright (C) 2010 masone (Christian Felder) <ema@rh-productions.ch>
5
3
  # Copyright (C) 2009 Masao Mutoh
6
4
  #
@@ -210,13 +208,25 @@ module GetText
210
208
  true
211
209
  end
212
210
 
213
- def [](number)
214
- param = @param_type[number]
215
- raise ParseError, 'no more string parameters expected' unless param
216
- send param
211
+ def [](number_or_param)
212
+ __send__(resolve_param(number_or_param))
213
+ end
214
+
215
+ def []=(number_or_param, value)
216
+ __send__("#{resolve_param(number_or_param)}=", value)
217
217
  end
218
218
 
219
219
  private
220
+ def resolve_param(number_or_param)
221
+ case number_or_param
222
+ when Integer
223
+ param = @param_type[number_or_param]
224
+ raise ParseError, 'no more string parameters expected' unless param
225
+ param
226
+ else
227
+ number_or_param
228
+ end
229
+ end
220
230
 
221
231
  # sets or extends the value of a translation target params like msgid,
222
232
  # msgctxt etc.
@@ -231,11 +241,12 @@ module GetText
231
241
  def escape(string)
232
242
  return "" if string.nil?
233
243
 
234
- string.gsub(/([\\"\t\n])/) do
235
- special_character = $1
244
+ string.gsub(/[\\"\t\r\n]/) do |special_character|
236
245
  case special_character
237
246
  when "\t"
238
247
  "\\t"
248
+ when "\r"
249
+ "\\r"
239
250
  when "\n"
240
251
  "\\n"
241
252
  else
@@ -271,6 +282,9 @@ module GetText
271
282
  # Wraps long lines that is longer than the `:max_line_width`.
272
283
  # Don't break long lines if `:max_line_width` is less than 0
273
284
  # such as `-1`.
285
+ # @option options [Bool] :use_one_line_per_reference (false)
286
+ # Whether each reference comment uses one line or not. If this
287
+ # is `true`, `:max_line_width` is ignored for reference comment.
274
288
  # @option options [Encoding] :encoding (nil)
275
289
  # Encodes to the specific encoding.
276
290
  def initialize(entry, options={})
@@ -394,34 +408,40 @@ module GetText
394
408
  end
395
409
 
396
410
  def format_reference_comment
397
- max_line_width = @options[:max_line_width]
398
411
  formatted_reference = String.new
399
- if not @entry.references.nil? and not @entry.references.empty?
400
- formatted_reference << REFERENCE_COMMENT_MARK
401
- line_width = 2
402
- @entry.references.each do |reference|
403
- if max_line_width > 0 and
412
+ if @options[:use_one_line_per_reference]
413
+ @entry.references&.each do |reference|
414
+ formatted_reference << "#{REFERENCE_COMMENT_MARK} #{reference}\n"
415
+ end
416
+ else
417
+ max_line_width = @options[:max_line_width]
418
+ if not @entry.references.nil? and not @entry.references.empty?
419
+ formatted_reference << REFERENCE_COMMENT_MARK
420
+ line_width = 2
421
+ @entry.references.each do |reference|
422
+ if max_line_width > 0 and
404
423
  line_width + reference.size > max_line_width
405
- formatted_reference << "\n"
406
- formatted_reference << "#{REFERENCE_COMMENT_MARK} #{reference}"
407
- line_width = 3 + reference.size
408
- else
409
- formatted_reference << " #{reference}"
410
- line_width += 1 + reference.size
424
+ formatted_reference << "\n"
425
+ formatted_reference << "#{REFERENCE_COMMENT_MARK} #{reference}"
426
+ line_width = 3 + reference.size
427
+ else
428
+ formatted_reference << " #{reference}"
429
+ line_width += 1 + reference.size
430
+ end
411
431
  end
432
+ formatted_reference << "\n"
412
433
  end
413
-
414
- formatted_reference << "\n"
415
434
  end
416
435
  formatted_reference
417
436
  end
418
437
 
419
438
  def format_flag_comment
420
- formatted_flags = String.new
421
- @entry.flags.each do |flag|
422
- formatted_flags << format_comment(FLAG_MARK, flag)
439
+ if @entry.flags.empty?
440
+ String.new
441
+ else
442
+ joined_flags = @entry.flags.join(", ")
443
+ format_comment(FLAG_MARK, joined_flags)
423
444
  end
424
- formatted_flags
425
445
  end
426
446
 
427
447
  def format_previous_comment
@@ -1,17 +1,15 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # po_parser.rb - Generate a .mo
4
2
  #
5
3
  # Copyright (C) 2003-2009 Masao Mutoh <mutomasa at gmail.com>
6
- # Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
7
5
  #
8
6
  # You may redistribute it and/or modify it under the same
9
7
  # license terms as Ruby or LGPL.
10
8
 
11
9
  #
12
10
  # DO NOT MODIFY!!!!
13
- # This file is automatically generated by Racc 1.4.14
14
- # from Racc grammer file "".
11
+ # This file is automatically generated by Racc 1.7.1
12
+ # from Racc grammar file "".
15
13
  #
16
14
 
17
15
  require 'racc/parser.rb'
@@ -21,7 +19,7 @@ require "gettext/po"
21
19
  module GetText
22
20
  class POParser < Racc::Parser
23
21
 
24
- module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
22
+ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 126)
25
23
  if GetText.respond_to?(:bindtextdomain)
26
24
  include GetText
27
25
  GetText.bindtextdomain("gettext")
@@ -46,31 +44,26 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
46
44
  @report_warning
47
45
  end
48
46
 
49
- def unescape(orig)
50
- ret = orig.gsub(/\\n/, "\n")
51
- ret.gsub!(/\\t/, "\t")
52
- ret.gsub!(/\\r/, "\r")
53
- ret.gsub!(/\\"/, "\"")
54
- ret
47
+ def unescape(string)
48
+ string.gsub(/\\(.)/) do
49
+ escaped_character = $1
50
+ case escaped_character
51
+ when "t"
52
+ "\t"
53
+ when "r"
54
+ "\r"
55
+ when "n"
56
+ "\n"
57
+ else
58
+ escaped_character
59
+ end
60
+ end
55
61
  end
56
62
  private :unescape
57
63
 
58
- def unescape_string(string)
59
- string.gsub(/\\\\/, "\\")
60
- end
61
- private :unescape_string
62
-
63
64
  def parse(str, data)
64
- @translator_comments = []
65
- @extracted_comments = []
66
- @references = []
67
- @flags = []
68
- @previous = []
69
- @comments = []
65
+ clear
70
66
  @data = data
71
- @fuzzy = false
72
- @msgctxt = nil
73
- @msgid_plural = nil
74
67
 
75
68
  str = str.strip
76
69
  @q = []
@@ -104,7 +97,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
104
97
  @q.push [:COMMENT, $&]
105
98
  str = $'
106
99
  when /\A\"(.*)\"/
107
- @q.push [:STRING, unescape_string($1)]
100
+ @q.push [:STRING, unescape($1)]
108
101
  str = $'
109
102
  else
110
103
  #c = str[0,1]
@@ -156,15 +149,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
156
149
  @data.set_comment(msgid, format_comment(@comments))
157
150
  end
158
151
 
159
- @translator_comments = []
160
- @extracted_comments = []
161
- @references = []
162
- @flags = []
163
- @previous = []
164
- @references = []
165
- @comments.clear
166
- @msgctxt = nil
167
- @msgid_plural = nil
152
+ clear
168
153
  end
169
154
 
170
155
  def format_comment(comments)
@@ -176,7 +161,11 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
176
161
  end
177
162
 
178
163
  def on_comment(comment)
179
- @fuzzy = true if (/fuzzy/ =~ comment)
164
+ if comment.start_with?(POFormat::FLAG_MARK)
165
+ content = comment[POFormat::FLAG_MARK.size..-1]
166
+ flags = parse_flags_line(content)
167
+ @fuzzy = true if flags.include?("fuzzy")
168
+ end
180
169
  if @data.instance_of?(PO)
181
170
  if comment == "#"
182
171
  @translator_comments << ""
@@ -191,7 +180,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
191
180
  when POFormat::REFERENCE_COMMENT_MARK
192
181
  @references.concat(parse_references_line(content))
193
182
  when POFormat::FLAG_MARK
194
- @flags.concat(parse_flags_line(content))
183
+ @flags.concat(flags)
195
184
  when POFormat::PREVIOUS_COMMENT_MARK
196
185
  @previous << content
197
186
  else
@@ -260,7 +249,19 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
260
249
  end
261
250
 
262
251
  def parse_flags_line(line)
263
- line.split(/\s+/)
252
+ line.split(",").collect(&:strip)
253
+ end
254
+
255
+ def clear
256
+ @translator_comments = []
257
+ @extracted_comments = []
258
+ @references = []
259
+ @flags = []
260
+ @previous = []
261
+ @references = []
262
+ @comments = []
263
+ @msgctxt = nil
264
+ @msgid_plural = nil
264
265
  end
265
266
  ...end po_parser.ry/module_eval...
266
267
  ##### State transition tables begin ###
@@ -349,6 +350,7 @@ Racc_arg = [
349
350
  racc_shift_n,
350
351
  racc_reduce_n,
351
352
  racc_use_result_var ]
353
+ Ractor.make_shareable(Racc_arg) if defined?(Ractor)
352
354
 
353
355
  Racc_token_to_s_table = [
354
356
  "$end",
@@ -370,6 +372,7 @@ Racc_token_to_s_table = [
370
372
  "plural_message",
371
373
  "msgstr_plural",
372
374
  "msgstr_plural_line" ]
375
+ Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
373
376
 
374
377
  Racc_debug_parser = true
375
378
 
@@ -387,8 +390,8 @@ Racc_debug_parser = true
387
390
 
388
391
  module_eval(<<'.,.,', 'po_parser.ry', 26)
389
392
  def _reduce_5(val, _values, result)
390
- @msgctxt = unescape(val[1])
391
-
393
+ @msgctxt = val[1]
394
+
392
395
  result
393
396
  end
394
397
  .,.,
@@ -399,9 +402,8 @@ module_eval(<<'.,.,', 'po_parser.ry', 26)
399
402
 
400
403
  module_eval(<<'.,.,', 'po_parser.ry', 38)
401
404
  def _reduce_8(val, _values, result)
402
- msgid_raw = val[1]
403
- msgid = unescape(msgid_raw)
404
- msgstr = unescape(val[3])
405
+ msgid = val[1]
406
+ msgstr = val[3]
405
407
  use_message_p = true
406
408
  if @fuzzy and not msgid.empty?
407
409
  use_message_p = (not ignore_fuzzy?)
@@ -411,18 +413,22 @@ module_eval(<<'.,.,', 'po_parser.ry', 38)
411
413
  else
412
414
  $stderr.print _("Warning: fuzzy message was used.\n")
413
415
  end
414
- $stderr.print " #{@po_file}: msgid '#{msgid_raw}'\n"
416
+ $stderr.print " #{@po_file}: msgid '#{msgid}'\n"
415
417
  end
416
418
  end
417
419
  @fuzzy = false
418
- on_message(msgid, msgstr) if use_message_p
420
+ if use_message_p
421
+ on_message(msgid, msgstr)
422
+ else
423
+ clear
424
+ end
419
425
  result = ""
420
-
426
+
421
427
  result
422
428
  end
423
429
  .,.,
424
430
 
425
- module_eval(<<'.,.,', 'po_parser.ry', 61)
431
+ module_eval(<<'.,.,', 'po_parser.ry', 64)
426
432
  def _reduce_9(val, _values, result)
427
433
  if @fuzzy and ignore_fuzzy?
428
434
  if val[1] != ""
@@ -439,53 +445,53 @@ module_eval(<<'.,.,', 'po_parser.ry', 61)
439
445
  on_message(unescape(val[1]), unescape(val[4]))
440
446
  end
441
447
  result = ""
442
-
448
+
443
449
  result
444
450
  end
445
451
  .,.,
446
452
 
447
- module_eval(<<'.,.,', 'po_parser.ry', 82)
453
+ module_eval(<<'.,.,', 'po_parser.ry', 85)
448
454
  def _reduce_10(val, _values, result)
449
455
  if val[0].size > 0
450
456
  result = val[0] + "\000" + val[1]
451
457
  else
452
458
  result = ""
453
459
  end
454
-
460
+
455
461
  result
456
462
  end
457
463
  .,.,
458
464
 
459
465
  # reduce 11 omitted
460
466
 
461
- module_eval(<<'.,.,', 'po_parser.ry', 94)
467
+ module_eval(<<'.,.,', 'po_parser.ry', 97)
462
468
  def _reduce_12(val, _values, result)
463
469
  result = val[2]
464
-
470
+
465
471
  result
466
472
  end
467
473
  .,.,
468
474
 
469
- module_eval(<<'.,.,', 'po_parser.ry', 101)
475
+ module_eval(<<'.,.,', 'po_parser.ry', 104)
470
476
  def _reduce_13(val, _values, result)
471
477
  on_comment(val[0])
472
-
478
+
473
479
  result
474
480
  end
475
481
  .,.,
476
482
 
477
- module_eval(<<'.,.,', 'po_parser.ry', 109)
483
+ module_eval(<<'.,.,', 'po_parser.ry', 112)
478
484
  def _reduce_14(val, _values, result)
479
485
  result = val.delete_if{|item| item == ""}.join
480
-
486
+
481
487
  result
482
488
  end
483
489
  .,.,
484
490
 
485
- module_eval(<<'.,.,', 'po_parser.ry', 113)
491
+ module_eval(<<'.,.,', 'po_parser.ry', 116)
486
492
  def _reduce_15(val, _values, result)
487
493
  result = val[0]
488
-
494
+
489
495
  result
490
496
  end
491
497
  .,.,
@@ -124,7 +124,7 @@ module GetText
124
124
  # [[msgstr[0], msgstr[1], msgstr[2],...], cond]
125
125
  mo = @mofiles[lang.to_s]
126
126
  cond = (mo and mo != :empty) ? mo.plural_as_proc : DEFAULT_PLURAL_CALC
127
- ret = [msg.split("\000"), cond]
127
+ ret = [msg.split("\000", -1), cond]
128
128
  else
129
129
  ret = [[msg], DEFAULT_SINGLE_CALC]
130
130
  end
@@ -77,11 +77,12 @@ module GetText
77
77
  end
78
78
 
79
79
  def each_text_domains(klass) #:nodoc:
80
- lang = Locale.candidates[0]
81
- ClassInfo.related_classes(klass, @@gettext_classes).each do |target|
82
- if group = @@text_domain_group_pool[target]
83
- group.text_domains.each do |text_domain|
84
- yield text_domain, lang
80
+ Locale.candidates.each do |lang|
81
+ ClassInfo.related_classes(klass, @@gettext_classes).each do |target|
82
+ if group = @@text_domain_group_pool[target]
83
+ group.text_domains.each do |text_domain|
84
+ yield text_domain, lang
85
+ end
85
86
  end
86
87
  end
87
88
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 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
  #
@@ -200,7 +200,8 @@ module GetText
200
200
  @output = nil
201
201
  @order = nil
202
202
  @po_format_options = {
203
- :max_line_width => POEntry::Formatter::DEFAULT_MAX_LINE_WIDTH,
203
+ max_line_width: POEntry::Formatter::DEFAULT_MAX_LINE_WIDTH,
204
+ use_one_line_per_reference: false,
204
205
  }
205
206
  @include_fuzzy = true
206
207
  @report_warning = true
@@ -322,6 +323,12 @@ module GetText
322
323
  @po_format_options[:max_line_width] = max_line_width
323
324
  end
324
325
 
326
+ parser.on("--[no-]use-one-line-per-reference",
327
+ _("Use one line for each reference comment"),
328
+ "(#{@po_format_options[:use_one_line_per_reference]})") do |use|
329
+ @po_format_options[:use_one_line_per_reference] = use
330
+ end
331
+
325
332
  parser.on("--no-fuzzy",
326
333
  _("Ignore fuzzy entries")) do |include_fuzzy|
327
334
  @include_fuzzy = include_fuzzy