gettext 3.3.9 → 3.4.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/Rakefile +1 -3
  4. data/doc/text/news.md +121 -0
  5. data/gettext.gemspec +4 -2
  6. data/lib/gettext/mo.rb +5 -14
  7. data/lib/gettext/po_entry.rb +31 -21
  8. data/lib/gettext/po_parser.rb +65 -59
  9. data/lib/gettext/text_domain_manager.rb +6 -5
  10. data/lib/gettext/tools/msgcat.rb +9 -2
  11. data/lib/gettext/tools/msgmerge.rb +11 -6
  12. data/lib/gettext/tools/parser/erubi.rb +88 -0
  13. data/lib/gettext/tools/task.rb +3 -5
  14. data/lib/gettext/tools/xgettext.rb +15 -4
  15. data/lib/gettext/version.rb +3 -3
  16. data/locale/ja/LC_MESSAGES/gettext.mo +0 -0
  17. data/po/bg/gettext.edit.po +65 -60
  18. data/po/bg/gettext.po +6 -0
  19. data/po/bs/gettext.edit.po +65 -60
  20. data/po/bs/gettext.po +6 -0
  21. data/po/ca/gettext.edit.po +65 -60
  22. data/po/ca/gettext.po +6 -0
  23. data/po/cs/gettext.edit.po +65 -60
  24. data/po/cs/gettext.po +6 -0
  25. data/po/de/gettext.edit.po +65 -60
  26. data/po/de/gettext.po +6 -0
  27. data/po/el/gettext.edit.po +65 -60
  28. data/po/el/gettext.po +6 -0
  29. data/po/eo/gettext.edit.po +65 -60
  30. data/po/eo/gettext.po +6 -0
  31. data/po/es/gettext.edit.po +65 -60
  32. data/po/es/gettext.po +6 -0
  33. data/po/et/gettext.edit.po +65 -60
  34. data/po/et/gettext.po +6 -0
  35. data/po/fr/gettext.edit.po +65 -60
  36. data/po/fr/gettext.po +6 -0
  37. data/po/gettext.pot +77 -68
  38. data/po/hr/gettext.edit.po +65 -60
  39. data/po/hr/gettext.po +6 -0
  40. data/po/hu/gettext.edit.po +65 -60
  41. data/po/hu/gettext.po +6 -0
  42. data/po/it/gettext.edit.po +65 -60
  43. data/po/it/gettext.po +6 -0
  44. data/po/ja/gettext.edit.po +66 -61
  45. data/po/ja/gettext.po +7 -1
  46. data/po/ko/gettext.edit.po +65 -60
  47. data/po/ko/gettext.po +6 -0
  48. data/po/lv/gettext.edit.po +65 -60
  49. data/po/lv/gettext.po +6 -0
  50. data/po/nb/gettext.edit.po +65 -60
  51. data/po/nb/gettext.po +6 -0
  52. data/po/nl/gettext.edit.po +65 -60
  53. data/po/nl/gettext.po +6 -0
  54. data/po/pt_BR/gettext.edit.po +65 -60
  55. data/po/pt_BR/gettext.po +6 -0
  56. data/po/ru/gettext.edit.po +65 -60
  57. data/po/ru/gettext.po +6 -0
  58. data/po/sr/gettext.edit.po +65 -60
  59. data/po/sr/gettext.po +6 -0
  60. data/po/sv/gettext.edit.po +65 -57
  61. data/po/sv/gettext.po +6 -0
  62. data/po/uk/gettext.edit.po +65 -60
  63. data/po/uk/gettext.po +6 -0
  64. data/po/vi/gettext.edit.po +65 -60
  65. data/po/vi/gettext.po +6 -0
  66. data/po/zh/gettext.edit.po +65 -60
  67. data/po/zh/gettext.po +6 -0
  68. data/po/zh_TW/gettext.edit.po +65 -60
  69. data/po/zh_TW/gettext.po +6 -0
  70. data/samples/cgi/po/helloerb1.pot +3 -3
  71. data/samples/cgi/po/helloerb2.pot +3 -3
  72. data/samples/cgi/po/hellolib.pot +3 -3
  73. data/samples/cgi/po/main.pot +3 -3
  74. data/samples/po/bg/hello_gtk_builder.edit.po +15 -0
  75. data/samples/po/bg/hello_gtk_builder.po +12 -0
  76. data/samples/po/bs/hello_gtk_builder.edit.po +15 -0
  77. data/samples/po/bs/hello_gtk_builder.po +12 -0
  78. data/samples/po/ca/hello_gtk_builder.edit.po +15 -0
  79. data/samples/po/ca/hello_gtk_builder.po +12 -0
  80. data/samples/po/cs/hello_gtk_builder.edit.po +15 -0
  81. data/samples/po/cs/hello_gtk_builder.po +12 -0
  82. data/samples/po/de/hello_gtk_builder.edit.po +15 -0
  83. data/samples/po/de/hello_gtk_builder.po +12 -0
  84. data/samples/po/el/hello_gtk_builder.edit.po +15 -0
  85. data/samples/po/el/hello_gtk_builder.po +12 -0
  86. data/samples/po/eo/hello_gtk_builder.edit.po +15 -0
  87. data/samples/po/eo/hello_gtk_builder.po +12 -0
  88. data/samples/po/es/hello_gtk_builder.edit.po +15 -0
  89. data/samples/po/es/hello_gtk_builder.po +12 -0
  90. data/samples/po/fr/hello_gtk_builder.edit.po +15 -0
  91. data/samples/po/fr/hello_gtk_builder.po +12 -0
  92. data/samples/po/hello.pot +3 -3
  93. data/samples/po/hello2.pot +4 -4
  94. data/samples/po/hello_glade2.pot +8 -5
  95. data/samples/po/hello_gtk2.pot +4 -4
  96. data/samples/po/hello_gtk_builder.pot +18 -4
  97. data/samples/po/hello_noop.pot +4 -4
  98. data/samples/po/hello_plural.pot +4 -4
  99. data/samples/po/hello_tk.pot +4 -4
  100. data/samples/po/hr/hello_gtk_builder.edit.po +15 -0
  101. data/samples/po/hr/hello_gtk_builder.po +12 -0
  102. data/samples/po/hu/hello_gtk_builder.edit.po +15 -0
  103. data/samples/po/hu/hello_gtk_builder.po +12 -0
  104. data/samples/po/it/hello_gtk_builder.edit.po +15 -0
  105. data/samples/po/it/hello_gtk_builder.po +12 -0
  106. data/samples/po/ja/hello_gtk_builder.edit.po +15 -0
  107. data/samples/po/ja/hello_gtk_builder.po +12 -0
  108. data/samples/po/ko/hello_gtk_builder.edit.po +15 -0
  109. data/samples/po/ko/hello_gtk_builder.po +12 -0
  110. data/samples/po/lv/hello_gtk_builder.edit.po +15 -0
  111. data/samples/po/lv/hello_gtk_builder.po +12 -0
  112. data/samples/po/nb/hello_gtk_builder.edit.po +15 -0
  113. data/samples/po/nb/hello_gtk_builder.po +12 -0
  114. data/samples/po/nl/hello_gtk_builder.edit.po +15 -0
  115. data/samples/po/nl/hello_gtk_builder.po +12 -0
  116. data/samples/po/pt_BR/hello_gtk_builder.edit.po +15 -0
  117. data/samples/po/pt_BR/hello_gtk_builder.po +12 -0
  118. data/samples/po/ru/hello_gtk_builder.edit.po +15 -0
  119. data/samples/po/ru/hello_gtk_builder.po +12 -0
  120. data/samples/po/sr/hello_gtk_builder.edit.po +15 -0
  121. data/samples/po/sr/hello_gtk_builder.po +12 -0
  122. data/samples/po/sv/hello_gtk_builder.edit.po +15 -0
  123. data/samples/po/sv/hello_gtk_builder.po +12 -0
  124. data/samples/po/uk/hello_gtk_builder.edit.po +15 -0
  125. data/samples/po/uk/hello_gtk_builder.po +12 -0
  126. data/samples/po/vi/hello_gtk_builder.edit.po +15 -0
  127. data/samples/po/vi/hello_gtk_builder.po +12 -0
  128. data/samples/po/zh/hello_gtk_builder.edit.po +15 -0
  129. data/samples/po/zh/hello_gtk_builder.po +12 -0
  130. data/samples/po/zh_TW/hello_gtk_builder.edit.po +15 -0
  131. data/samples/po/zh_TW/hello_gtk_builder.po +12 -0
  132. data/src/po_parser.ry +48 -42
  133. data/test/fixtures/erb/case.rhtml +16 -0
  134. data/test/fixtures/simple.rb +4 -0
  135. data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
  136. data/test/locale/fr_BE/LC_MESSAGES/test1.mo +0 -0
  137. data/test/locale/fr_BE_Foo/LC_MESSAGES/test1.mo +0 -0
  138. data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
  139. data/test/po/_.pot +3 -3
  140. data/test/po/backslash.pot +6 -4
  141. data/test/po/fr/test1.po +7 -0
  142. data/test/po/fr_BE/test1.po +24 -0
  143. data/test/po/fr_BE_Foo/test1.po +20 -0
  144. data/test/po/hello.pot +3 -3
  145. data/test/po/ja/_.edit.po +3 -3
  146. data/test/po/ja/_.po +15 -0
  147. data/test/po/ja/hello.edit.po +0 -1
  148. data/test/po/non_ascii.pot +4 -4
  149. data/test/po/np_.pot +3 -3
  150. data/test/po/ns_.pot +3 -3
  151. data/test/po/p_.pot +3 -3
  152. data/test/po/s_.pot +3 -3
  153. data/test/po/untranslated.pot +4 -4
  154. data/test/test_gettext.rb +23 -0
  155. data/test/test_locale_path.rb +12 -4
  156. data/test/test_parser.rb +62 -0
  157. data/test/test_po_entry.rb +20 -4
  158. data/test/test_po_parser.rb +44 -1
  159. data/test/tools/test_msgcat.rb +21 -1
  160. data/test/tools/test_msginit.rb +7 -2
  161. data/test/tools/test_msgmerge.rb +41 -3
  162. data/test/tools/test_xgettext.rb +100 -3
  163. metadata +48 -14
  164. data/test/fixtures/gtk_builder_ui_definitions.ui~ +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf480f5774043884c6583daea1fc41264e3ce96c90c287f61a5336054f69f428
4
- data.tar.gz: daa8334ee3ccecb4cf90d9ea016392068c6ae3bdf11b395df706fd4b1e5cff0d
3
+ metadata.gz: 737177cc120acfd0387fdb23761ea8bf324a490b1d4b94f8edce692d22decad7
4
+ data.tar.gz: 67e7d803c3d9fc924e47d0b612cee9ac329eec67784c8e6e63763886f4602be0
5
5
  SHA512:
6
- metadata.gz: 7040a0b37b61e221055ab90bfafb0d538b24641211c45f8a4ce04adbc08b22dba247369ba5e695f7d1565a4fffbf67a317065933f39a788c34bf8e45f3b37b3f
7
- data.tar.gz: 9d0f862577acd733cabdb1d66b90cde9b5c896d2dc468dac36b205172f72546902648e1dcaa509c7fc920ba805155d1241c79ebdc3b928d59745a309ca7c9c44
6
+ metadata.gz: f12a1f4f550947c5ed4628674f39d8a39857e56e461643ba102ded0f3344ed4015981a6ba13d10c9d411c7bfcdd7ba0c652642bfaaf3fa7a7d9e61f810e96cb3
7
+ data.tar.gz: 2db766ca9d05099d92d366b36a257c618c3524e404f6da5a2488cd401b3704373098e87424593ed200383087434e5115359e13abd90ddd25abe099b13e68620a
data/README.md CHANGED
@@ -244,11 +244,11 @@ n_(fruits, 3)
244
244
 
245
245
  ### Interpolating translations
246
246
 
247
- This is not a feature of gettext but worth noting. You can interpolate translated strings without the ruby String `%` operator.
247
+ This is not a feature of gettext but worth noting. You can interpolate translated strings with the ruby String `%` operator.
248
248
 
249
249
  ```ruby
250
250
  N_("active"); N_("inactive"); N_("paused") # possible value of status for parser to find.
251
- _("Your account is #{account_state}.") % { account_state: _(status) }
251
+ _("Your account is %{account_state}.") % { account_state: _(status) }
252
252
  ```
253
253
 
254
254
 
data/Rakefile CHANGED
@@ -56,12 +56,10 @@ file po_parser_rb_path => po_parser_ry_path do
56
56
 
57
57
  File.open(po_parser_rb_path, "w") do |po_parser_rb|
58
58
  po_parser_rb.puts(<<-EOH)
59
- # -*- coding: utf-8 -*-
60
- #
61
59
  # po_parser.rb - Generate a .mo
62
60
  #
63
61
  # Copyright (C) 2003-2009 Masao Mutoh <mutomasa at gmail.com>
64
- # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
62
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
65
63
  #
66
64
  # You may redistribute it and/or modify it under the same
67
65
  # license terms as Ruby or LGPL.
data/doc/text/news.md CHANGED
@@ -1,5 +1,126 @@
1
1
  # News
2
2
 
3
+ ## 3.4.9: 2023-10-22 {#version-3-4-9}
4
+
5
+ ### Improvements
6
+
7
+ * `rmsgcat`, `rmsgmerge`, `rxgettext`: Added
8
+ `--use-one-line-per-reference` option.
9
+
10
+ ## 3.4.8: 2023-10-22 {#version-3-4-8}
11
+
12
+ ### Fixes
13
+
14
+ * doc: Fixed a wrong description for interpolation.
15
+ * GH-102
16
+ * Patch by Ilmari Karonen
17
+
18
+ * po: Fixed a parser bug that flags aren't parsed correctly. If a
19
+ normal comment has "fuzzy", the entry is also treated as a fuzzy
20
+ entry.
21
+
22
+ * po: Fixed an output bug that flags aren't formatted correctly.
23
+ * GH-105
24
+ * Patch by Yoshikazu Nojima
25
+
26
+ ### Thanks
27
+
28
+ * Ilmari Karonen
29
+
30
+ * Yoshikazu Nojima
31
+
32
+ ## 3.4.7: 2023-08-17 {#version-3-4-7}
33
+
34
+ ### Fixes
35
+
36
+ * po: Fixed a parser bug that it may add a `fuzzy` flag to non-fuzzy
37
+ entry with `ignore_fuzzy: true`.
38
+
39
+ Example PO:
40
+
41
+ ```po
42
+ #, fuzzy
43
+ #: file.rb:10
44
+ msgid "hello"
45
+ msgstr "bonjour"
46
+
47
+ msgid "non-fuzzy"
48
+ msgstr "non-fuzzy string"
49
+ ```
50
+
51
+ `hello` entry is ignored because `ignore_fuzzy` is `true`. The
52
+ `fuzzy` flag in the `hello` entry is added to `non-fuzzy` entry.
53
+
54
+ ## 3.4.6: 2023-07-12 {#version-3-4-6}
55
+
56
+ ### Fixes
57
+
58
+ * po: Fixed a bug that parsed `msgid`/`msgstr`/`msgctxt` in `.po`
59
+ may be too much unescaped.
60
+
61
+ ## 3.4.5: 2023-07-12 {#version-3-4-5}
62
+
63
+ ### Improvements
64
+
65
+ * po: Added support for escaping `\r` in `msgid`/`msgstr`.
66
+
67
+ ## 3.4.4: 2023-06-11 {#version-3-4-4}
68
+
69
+ ### Improvements
70
+
71
+ * Added `racc` to runtime dependencies because Ruby 3.3 doesn't
72
+ include `racc/parser`.
73
+
74
+ ## 3.4.3: 2022-05-20 {#version-3-4-3}
75
+
76
+ ### Improvements
77
+
78
+ * Added support for Erubi to parse `.erb`
79
+ [GitHub#91][Patch by Michaël Hoste]
80
+
81
+ ### Thanks
82
+
83
+ * Michaël Hoste
84
+
85
+ ## 3.4.2: 2022-01-11 {#version-3-4-2}
86
+
87
+ ### Improvements
88
+
89
+ * Added support for fallback for specific locale.
90
+ e.g.: `fr_BE_Foo` -> `fr_BE` -> `fr`
91
+ [GitHub#90][Patch by Michaël Hoste]
92
+
93
+ * Added support for Ruby 3.1.
94
+ [GitHub#92][Reported by ahiru]
95
+
96
+ ### Thanks
97
+
98
+ * Michaël Hoste
99
+
100
+ * ahiru
101
+
102
+ ## 3.4.1: 2021-09-08 {#version-3-4-1}
103
+
104
+ ### Improvements
105
+
106
+ * Listed licenses separately in gemspec.
107
+ [GitHub#88][Patch by Josh Cooper]
108
+
109
+ ### Thanks
110
+
111
+ * Josh Cooper
112
+
113
+ ## 3.4.0: 2021-08-26 {#version-3-4-0}
114
+
115
+ ### Improvements
116
+
117
+ * test: Added missing Red Datasets availability check.
118
+ [GitHub#87][Reported by Mamoru TASAKA]
119
+
120
+ ### Thanks
121
+
122
+ * Mamoru TASAKA
123
+
3
124
  ## 3.3.9: 2021-08-26 {#version-3-3-9}
4
125
 
5
126
  ### Improvements
data/gettext.gemspec CHANGED
@@ -29,14 +29,16 @@ So you can use GNU gettext tools for maintaining.
29
29
 
30
30
  s.required_ruby_version = ">= 2.5.0"
31
31
 
32
+ s.add_runtime_dependency("erubi")
32
33
  s.add_runtime_dependency("locale", ">= 2.0.5")
34
+ s.add_runtime_dependency("prime")
35
+ s.add_runtime_dependency("racc")
33
36
  s.add_runtime_dependency("text", ">= 1.3.0")
34
37
  s.add_development_dependency("kramdown")
35
- s.add_development_dependency("racc")
36
38
  s.add_development_dependency("rake")
37
39
  s.add_development_dependency("red-datasets")
38
40
  s.add_development_dependency("test-unit")
39
41
  s.add_development_dependency("test-unit-rr")
40
42
  s.add_development_dependency("yard")
41
- s.license = "Ruby or LGPLv3+"
43
+ s.licenses = ["Ruby", "LGPL-3.0+"]
42
44
  end
data/lib/gettext/mo.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  =begin
4
4
  mo.rb - A simple class for operating GNU MO file.
5
5
 
6
- Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
6
+ Copyright (C) 2012-2022 Sutou Kouhei <kou@clear-code.com>
7
7
  Copyright (C) 2003-2009 Masao Mutoh
8
8
  Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
9
9
  Copyright (C) 2001 Masahiro Sakai
@@ -19,6 +19,8 @@
19
19
 
20
20
  require 'stringio'
21
21
 
22
+ require 'prime'
23
+
22
24
  module GetText
23
25
  class MO < Hash
24
26
  class InvalidFormat < RuntimeError; end;
@@ -168,19 +170,8 @@ module GetText
168
170
  ('1' * number) !~ /^1?$|^(11+?)\1+$/
169
171
  end
170
172
 
171
- begin
172
- require 'prime'
173
- def next_prime(seed)
174
- Prime.instance.find{|x| x > seed }
175
- end
176
- rescue LoadError
177
- def next_prime(seed)
178
- require 'mathn'
179
- prime = Prime.new
180
- while current = prime.succ
181
- return current if current > seed
182
- end
183
- end
173
+ def next_prime(seed)
174
+ Prime.instance.find{|x| x > seed }
184
175
  end
185
176
 
186
177
  HASHWORDBITS = 32
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2019 Sutou Kouhei <kou@clear-code.com>
1
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
2
2
  # Copyright (C) 2010 masone (Christian Felder) <ema@rh-productions.ch>
3
3
  # Copyright (C) 2009 Masao Mutoh
4
4
  #
@@ -241,11 +241,12 @@ module GetText
241
241
  def escape(string)
242
242
  return "" if string.nil?
243
243
 
244
- string.gsub(/([\\"\t\n])/) do
245
- special_character = $1
244
+ string.gsub(/[\\"\t\r\n]/) do |special_character|
246
245
  case special_character
247
246
  when "\t"
248
247
  "\\t"
248
+ when "\r"
249
+ "\\r"
249
250
  when "\n"
250
251
  "\\n"
251
252
  else
@@ -281,6 +282,9 @@ module GetText
281
282
  # Wraps long lines that is longer than the `:max_line_width`.
282
283
  # Don't break long lines if `:max_line_width` is less than 0
283
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.
284
288
  # @option options [Encoding] :encoding (nil)
285
289
  # Encodes to the specific encoding.
286
290
  def initialize(entry, options={})
@@ -404,34 +408,40 @@ module GetText
404
408
  end
405
409
 
406
410
  def format_reference_comment
407
- max_line_width = @options[:max_line_width]
408
411
  formatted_reference = String.new
409
- if not @entry.references.nil? and not @entry.references.empty?
410
- formatted_reference << REFERENCE_COMMENT_MARK
411
- line_width = 2
412
- @entry.references.each do |reference|
413
- 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
414
423
  line_width + reference.size > max_line_width
415
- formatted_reference << "\n"
416
- formatted_reference << "#{REFERENCE_COMMENT_MARK} #{reference}"
417
- line_width = 3 + reference.size
418
- else
419
- formatted_reference << " #{reference}"
420
- 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
421
431
  end
432
+ formatted_reference << "\n"
422
433
  end
423
-
424
- formatted_reference << "\n"
425
434
  end
426
435
  formatted_reference
427
436
  end
428
437
 
429
438
  def format_flag_comment
430
- formatted_flags = String.new
431
- @entry.flags.each do |flag|
432
- 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)
433
444
  end
434
- formatted_flags
435
445
  end
436
446
 
437
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
  .,.,
@@ -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
@@ -1,9 +1,7 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2012-2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
5
- # Copyright (C) 2005-2009 Masao Mutoh
6
- # Copyright (C) 2005,2006 speakillof
2
+ # Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
3
+ # Copyright (C) 2005-2009 Masao Mutoh
4
+ # Copyright (C) 2005,2006 speakillof
7
5
  #
8
6
  # License: Ruby's or LGPL
9
7
  #
@@ -310,7 +308,8 @@ module GetText
310
308
  @output = nil
311
309
  @order = :reference
312
310
  @po_format_options = {
313
- :max_line_width => POEntry::Formatter::DEFAULT_MAX_LINE_WIDTH,
311
+ max_line_width: POEntry::Formatter::DEFAULT_MAX_LINE_WIDTH,
312
+ use_one_line_per_reference: false,
314
313
  }
315
314
  @enable_fuzzy_matching = true
316
315
  @update = nil
@@ -424,6 +423,12 @@ module GetText
424
423
  @po_format_options[:max_line_width] = max_line_width
425
424
  end
426
425
 
426
+ parser.on("--[no-]use-one-line-per-reference",
427
+ _("Use one line for each reference comment"),
428
+ "(#{@po_format_options[:use_one_line_per_reference]})") do |use|
429
+ @po_format_options[:use_one_line_per_reference] = use
430
+ end
431
+
427
432
  parser.on("--[no-]fuzzy-matching",
428
433
  _("Disable fuzzy matching"),
429
434
  _("(enable)")) do |boolean|