gettext 3.3.8 → 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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/Rakefile +1 -3
  4. data/doc/text/news.md +132 -0
  5. data/gettext.gemspec +7 -5
  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/msginit.rb +11 -6
  12. data/lib/gettext/tools/msgmerge.rb +11 -6
  13. data/lib/gettext/tools/parser/erubi.rb +88 -0
  14. data/lib/gettext/tools/task.rb +3 -5
  15. data/lib/gettext/tools/xgettext.rb +15 -4
  16. data/lib/gettext/version.rb +3 -3
  17. data/locale/ja/LC_MESSAGES/gettext.mo +0 -0
  18. data/po/bg/gettext.edit.po +80 -75
  19. data/po/bg/gettext.po +6 -0
  20. data/po/bs/gettext.edit.po +80 -75
  21. data/po/bs/gettext.po +6 -0
  22. data/po/ca/gettext.edit.po +80 -75
  23. data/po/ca/gettext.po +6 -0
  24. data/po/cs/gettext.edit.po +80 -75
  25. data/po/cs/gettext.po +6 -0
  26. data/po/de/gettext.edit.po +80 -75
  27. data/po/de/gettext.po +6 -0
  28. data/po/el/gettext.edit.po +80 -75
  29. data/po/el/gettext.po +6 -0
  30. data/po/eo/gettext.edit.po +80 -75
  31. data/po/eo/gettext.po +6 -0
  32. data/po/es/gettext.edit.po +80 -75
  33. data/po/es/gettext.po +6 -0
  34. data/po/et/gettext.edit.po +80 -75
  35. data/po/et/gettext.po +6 -0
  36. data/po/fr/gettext.edit.po +80 -75
  37. data/po/fr/gettext.po +6 -0
  38. data/po/gettext.pot +92 -83
  39. data/po/hr/gettext.edit.po +80 -75
  40. data/po/hr/gettext.po +6 -0
  41. data/po/hu/gettext.edit.po +80 -75
  42. data/po/hu/gettext.po +6 -0
  43. data/po/it/gettext.edit.po +80 -75
  44. data/po/it/gettext.po +6 -0
  45. data/po/ja/gettext.edit.po +81 -76
  46. data/po/ja/gettext.po +7 -1
  47. data/po/ko/gettext.edit.po +80 -75
  48. data/po/ko/gettext.po +6 -0
  49. data/po/lv/gettext.edit.po +80 -75
  50. data/po/lv/gettext.po +6 -0
  51. data/po/nb/gettext.edit.po +80 -75
  52. data/po/nb/gettext.po +6 -0
  53. data/po/nl/gettext.edit.po +80 -75
  54. data/po/nl/gettext.po +6 -0
  55. data/po/pt_BR/gettext.edit.po +80 -75
  56. data/po/pt_BR/gettext.po +6 -0
  57. data/po/ru/gettext.edit.po +80 -75
  58. data/po/ru/gettext.po +6 -0
  59. data/po/sr/gettext.edit.po +80 -75
  60. data/po/sr/gettext.po +6 -0
  61. data/po/sv/gettext.edit.po +80 -72
  62. data/po/sv/gettext.po +6 -0
  63. data/po/uk/gettext.edit.po +80 -75
  64. data/po/uk/gettext.po +6 -0
  65. data/po/vi/gettext.edit.po +80 -75
  66. data/po/vi/gettext.po +6 -0
  67. data/po/zh/gettext.edit.po +80 -75
  68. data/po/zh/gettext.po +6 -0
  69. data/po/zh_TW/gettext.edit.po +80 -75
  70. data/po/zh_TW/gettext.po +6 -0
  71. data/samples/cgi/po/helloerb1.pot +3 -3
  72. data/samples/cgi/po/helloerb2.pot +3 -3
  73. data/samples/cgi/po/hellolib.pot +3 -3
  74. data/samples/cgi/po/main.pot +3 -3
  75. data/samples/po/bg/hello_gtk_builder.edit.po +15 -0
  76. data/samples/po/bg/hello_gtk_builder.po +12 -0
  77. data/samples/po/bs/hello_gtk_builder.edit.po +15 -0
  78. data/samples/po/bs/hello_gtk_builder.po +12 -0
  79. data/samples/po/ca/hello_gtk_builder.edit.po +15 -0
  80. data/samples/po/ca/hello_gtk_builder.po +12 -0
  81. data/samples/po/cs/hello_gtk_builder.edit.po +15 -0
  82. data/samples/po/cs/hello_gtk_builder.po +12 -0
  83. data/samples/po/de/hello_gtk_builder.edit.po +15 -0
  84. data/samples/po/de/hello_gtk_builder.po +12 -0
  85. data/samples/po/el/hello_gtk_builder.edit.po +15 -0
  86. data/samples/po/el/hello_gtk_builder.po +12 -0
  87. data/samples/po/eo/hello_gtk_builder.edit.po +15 -0
  88. data/samples/po/eo/hello_gtk_builder.po +12 -0
  89. data/samples/po/es/hello_gtk_builder.edit.po +15 -0
  90. data/samples/po/es/hello_gtk_builder.po +12 -0
  91. data/samples/po/fr/hello_gtk_builder.edit.po +15 -0
  92. data/samples/po/fr/hello_gtk_builder.po +12 -0
  93. data/samples/po/hello.pot +3 -3
  94. data/samples/po/hello2.pot +4 -4
  95. data/samples/po/hello_glade2.pot +8 -5
  96. data/samples/po/hello_gtk2.pot +4 -4
  97. data/samples/po/hello_gtk_builder.pot +18 -4
  98. data/samples/po/hello_noop.pot +4 -4
  99. data/samples/po/hello_plural.pot +4 -4
  100. data/samples/po/hello_tk.pot +4 -4
  101. data/samples/po/hr/hello_gtk_builder.edit.po +15 -0
  102. data/samples/po/hr/hello_gtk_builder.po +12 -0
  103. data/samples/po/hu/hello_gtk_builder.edit.po +15 -0
  104. data/samples/po/hu/hello_gtk_builder.po +12 -0
  105. data/samples/po/it/hello_gtk_builder.edit.po +15 -0
  106. data/samples/po/it/hello_gtk_builder.po +12 -0
  107. data/samples/po/ja/hello_gtk_builder.edit.po +15 -0
  108. data/samples/po/ja/hello_gtk_builder.po +12 -0
  109. data/samples/po/ko/hello_gtk_builder.edit.po +15 -0
  110. data/samples/po/ko/hello_gtk_builder.po +12 -0
  111. data/samples/po/lv/hello_gtk_builder.edit.po +15 -0
  112. data/samples/po/lv/hello_gtk_builder.po +12 -0
  113. data/samples/po/nb/hello_gtk_builder.edit.po +15 -0
  114. data/samples/po/nb/hello_gtk_builder.po +12 -0
  115. data/samples/po/nl/hello_gtk_builder.edit.po +15 -0
  116. data/samples/po/nl/hello_gtk_builder.po +12 -0
  117. data/samples/po/pt_BR/hello_gtk_builder.edit.po +15 -0
  118. data/samples/po/pt_BR/hello_gtk_builder.po +12 -0
  119. data/samples/po/ru/hello_gtk_builder.edit.po +15 -0
  120. data/samples/po/ru/hello_gtk_builder.po +12 -0
  121. data/samples/po/sr/hello_gtk_builder.edit.po +15 -0
  122. data/samples/po/sr/hello_gtk_builder.po +12 -0
  123. data/samples/po/sv/hello_gtk_builder.edit.po +15 -0
  124. data/samples/po/sv/hello_gtk_builder.po +12 -0
  125. data/samples/po/uk/hello_gtk_builder.edit.po +15 -0
  126. data/samples/po/uk/hello_gtk_builder.po +12 -0
  127. data/samples/po/vi/hello_gtk_builder.edit.po +15 -0
  128. data/samples/po/vi/hello_gtk_builder.po +12 -0
  129. data/samples/po/zh/hello_gtk_builder.edit.po +15 -0
  130. data/samples/po/zh/hello_gtk_builder.po +12 -0
  131. data/samples/po/zh_TW/hello_gtk_builder.edit.po +15 -0
  132. data/samples/po/zh_TW/hello_gtk_builder.po +12 -0
  133. data/src/po_parser.ry +48 -42
  134. data/test/fixtures/erb/case.rhtml +16 -0
  135. data/test/fixtures/simple.rb +4 -0
  136. data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
  137. data/test/locale/fr_BE/LC_MESSAGES/test1.mo +0 -0
  138. data/test/locale/fr_BE_Foo/LC_MESSAGES/test1.mo +0 -0
  139. data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
  140. data/test/po/_.pot +3 -3
  141. data/test/po/backslash.pot +6 -4
  142. data/test/po/fr/test1.po +7 -0
  143. data/test/po/fr_BE/test1.po +24 -0
  144. data/test/po/fr_BE_Foo/test1.po +20 -0
  145. data/test/po/hello.pot +3 -3
  146. data/test/po/ja/_.edit.po +3 -3
  147. data/test/po/ja/_.po +15 -0
  148. data/test/po/ja/hello.edit.po +0 -1
  149. data/test/po/non_ascii.pot +4 -4
  150. data/test/po/np_.pot +3 -3
  151. data/test/po/ns_.pot +3 -3
  152. data/test/po/p_.pot +3 -3
  153. data/test/po/s_.pot +3 -3
  154. data/test/po/untranslated.pot +4 -4
  155. data/test/test_gettext.rb +23 -0
  156. data/test/test_locale_path.rb +12 -4
  157. data/test/test_parser.rb +62 -0
  158. data/test/test_po_entry.rb +20 -4
  159. data/test/test_po_parser.rb +44 -1
  160. data/test/tools/test_msgcat.rb +21 -1
  161. data/test/tools/test_msginit.rb +7 -2
  162. data/test/tools/test_msgmerge.rb +41 -3
  163. data/test/tools/test_xgettext.rb +100 -3
  164. metadata +49 -15
  165. 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: 854c34e40028ef9e71045cbd1c8f77a4846c5f668de2cef716017b52d05515b2
4
- data.tar.gz: bc0a5bcb8a1a30ed0b5de8272bae275a996f5ef5e6533a281997a67bf99f3f95
3
+ metadata.gz: 737177cc120acfd0387fdb23761ea8bf324a490b1d4b94f8edce692d22decad7
4
+ data.tar.gz: 67e7d803c3d9fc924e47d0b612cee9ac329eec67784c8e6e63763886f4602be0
5
5
  SHA512:
6
- metadata.gz: 6978df6c5a2e52c5eb9b1101bb89fd2ec3febec663bf1418b054929572a333935cd02cfba15b93818ae3b89971b2fb442b2f8f48c0370fd516bacd7085eac915
7
- data.tar.gz: a7fbb7a6b3e93a374440ad2ae3c69f43aeb238c54479825c45e8b14f5f90408fa05b2c06db05078af531defecc7b181bda30e0a2e53068718422ba66bbd7ae94
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,137 @@
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
+
124
+ ## 3.3.9: 2021-08-26 {#version-3-3-9}
125
+
126
+ ### Improvements
127
+
128
+ * msginit: Made Red Datasets dependency optional.
129
+ [GitHub:red-datatools/red-datasets#105][Suggested by Mamoru TASAKA]
130
+
131
+ ### Thanks
132
+
133
+ * Mamoru TASAKA
134
+
3
135
  ## 3.3.8: 2021-06-09 {#version-3-3-8}
4
136
 
5
137
  ### 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")
33
- s.add_runtime_dependency("red-datasets")
34
+ s.add_runtime_dependency("prime")
35
+ s.add_runtime_dependency("racc")
34
36
  s.add_runtime_dependency("text", ">= 1.3.0")
35
- s.add_development_dependency("rake")
36
- s.add_development_dependency("racc")
37
- s.add_development_dependency("yard")
38
37
  s.add_development_dependency("kramdown")
38
+ s.add_development_dependency("rake")
39
+ s.add_development_dependency("red-datasets")
39
40
  s.add_development_dependency("test-unit")
40
41
  s.add_development_dependency("test-unit-rr")
41
- s.license = "Ruby or LGPLv3+"
42
+ s.add_development_dependency("yard")
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
@@ -21,7 +21,10 @@
21
21
  require "etc"
22
22
  require "optparse"
23
23
 
24
- require "datasets"
24
+ begin
25
+ require "datasets"
26
+ rescue LoadError
27
+ end
25
28
  require "locale/info"
26
29
 
27
30
  require "gettext"
@@ -376,11 +379,13 @@ module GetText
376
379
  def convert
377
380
  n_plurals = nil
378
381
  expression = nil
379
- plurals = Datasets::CLDRPlurals.new
380
- plurals.each do |locale|
381
- next unless locale.name == @language
382
- n_plurals, expression = convert_plural_rules(locale.rules)
383
- break
382
+ if defined?(Datasets::CLDRPlurals)
383
+ plurals = Datasets::CLDRPlurals.new
384
+ plurals.each do |locale|
385
+ next unless locale.name == @language
386
+ n_plurals, expression = convert_plural_rules(locale.rules)
387
+ break
388
+ end
384
389
  end
385
390
  "nplurals=#{n_plurals}; plural=#{expression};"
386
391
  end