gettext 3.4.6 → 3.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/doc/text/news.md +44 -0
- data/lib/gettext/po_entry.rb +5 -4
- data/lib/gettext/po_parser.rb +33 -29
- data/lib/gettext/tools/task.rb +3 -5
- data/lib/gettext/version.rb +3 -3
- data/po/gettext.pot +3 -3
- data/src/po_parser.ry +29 -25
- data/test/test_po_entry.rb +14 -0
- data/test/test_po_parser.rb +34 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 935189b8e4a67d110df2c1e21b89bab5f70057772c31861d58c1d71935e4ace3
|
4
|
+
data.tar.gz: ee204b53fee909a7a23921a814fc3046312fe8fc6f3f576b7b883a2920896d02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a91c277a26e46db88ff1d67c85a2d0932a22cf0043d74cec373119dea8431614dfd35a2ddaef7ed18b557c07bdd27b60c3e8bf6fe79e7da80e42160f30883786
|
7
|
+
data.tar.gz: 00cd6a8ba2be7a06b9b9c7d5d8cc6e5f92bfbe768a32237dfcb029a105cd1b6508db88fb8988027c639d7bc385f43246d79513d5d4cc912d5e632ecbb5014c28
|
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
|
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
|
251
|
+
_("Your account is %{account_state}.") % { account_state: _(status) }
|
252
252
|
```
|
253
253
|
|
254
254
|
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 3.4.8: 2023-10-22 {#version-3-4-8}
|
4
|
+
|
5
|
+
### Fixes
|
6
|
+
|
7
|
+
* doc: Fixed a wrong description for interpolation.
|
8
|
+
* GH-102
|
9
|
+
* Patch by Ilmari Karonen
|
10
|
+
|
11
|
+
* po: Fixed a parser bug that flags aren't parsed correctly. If a
|
12
|
+
normal comment has "fuzzy", the entry is also treated as a fuzzy
|
13
|
+
entry.
|
14
|
+
|
15
|
+
* po: Fixed an output bug that flags aren't formatted correctly.
|
16
|
+
* GH-105
|
17
|
+
* Patch by Yoshikazu Nojima
|
18
|
+
|
19
|
+
### Thanks
|
20
|
+
|
21
|
+
* Ilmari Karonen
|
22
|
+
|
23
|
+
* Yoshikazu Nojima
|
24
|
+
|
25
|
+
## 3.4.7: 2023-08-17 {#version-3-4-7}
|
26
|
+
|
27
|
+
### Fixes
|
28
|
+
|
29
|
+
* po: Fixed a parser bug that it may add a `fuzzy` flag to non-fuzzy
|
30
|
+
entry with `ignore_fuzzy: true`.
|
31
|
+
|
32
|
+
Example PO:
|
33
|
+
|
34
|
+
```po
|
35
|
+
#, fuzzy
|
36
|
+
#: file.rb:10
|
37
|
+
msgid "hello"
|
38
|
+
msgstr "bonjour"
|
39
|
+
|
40
|
+
msgid "non-fuzzy"
|
41
|
+
msgstr "non-fuzzy string"
|
42
|
+
```
|
43
|
+
|
44
|
+
`hello` entry is ignored because `ignore_fuzzy` is `true`. The
|
45
|
+
`fuzzy` flag in the `hello` entry is added to `non-fuzzy` entry.
|
46
|
+
|
3
47
|
## 3.4.6: 2023-07-12 {#version-3-4-6}
|
4
48
|
|
5
49
|
### Fixes
|
data/lib/gettext/po_entry.rb
CHANGED
@@ -428,11 +428,12 @@ module GetText
|
|
428
428
|
end
|
429
429
|
|
430
430
|
def format_flag_comment
|
431
|
-
|
432
|
-
|
433
|
-
|
431
|
+
if @entry.flags.empty?
|
432
|
+
String.new
|
433
|
+
else
|
434
|
+
joined_flags = @entry.flags.join(", ")
|
435
|
+
format_comment(FLAG_MARK, joined_flags)
|
434
436
|
end
|
435
|
-
formatted_flags
|
436
437
|
end
|
437
438
|
|
438
439
|
def format_previous_comment
|
data/lib/gettext/po_parser.rb
CHANGED
@@ -19,7 +19,7 @@ require "gettext/po"
|
|
19
19
|
module GetText
|
20
20
|
class POParser < Racc::Parser
|
21
21
|
|
22
|
-
module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry',
|
22
|
+
module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 126)
|
23
23
|
if GetText.respond_to?(:bindtextdomain)
|
24
24
|
include GetText
|
25
25
|
GetText.bindtextdomain("gettext")
|
@@ -62,16 +62,8 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
|
|
62
62
|
private :unescape
|
63
63
|
|
64
64
|
def parse(str, data)
|
65
|
-
|
66
|
-
@extracted_comments = []
|
67
|
-
@references = []
|
68
|
-
@flags = []
|
69
|
-
@previous = []
|
70
|
-
@comments = []
|
65
|
+
clear
|
71
66
|
@data = data
|
72
|
-
@fuzzy = false
|
73
|
-
@msgctxt = nil
|
74
|
-
@msgid_plural = nil
|
75
67
|
|
76
68
|
str = str.strip
|
77
69
|
@q = []
|
@@ -157,15 +149,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
|
|
157
149
|
@data.set_comment(msgid, format_comment(@comments))
|
158
150
|
end
|
159
151
|
|
160
|
-
|
161
|
-
@extracted_comments = []
|
162
|
-
@references = []
|
163
|
-
@flags = []
|
164
|
-
@previous = []
|
165
|
-
@references = []
|
166
|
-
@comments.clear
|
167
|
-
@msgctxt = nil
|
168
|
-
@msgid_plural = nil
|
152
|
+
clear
|
169
153
|
end
|
170
154
|
|
171
155
|
def format_comment(comments)
|
@@ -177,7 +161,11 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
|
|
177
161
|
end
|
178
162
|
|
179
163
|
def on_comment(comment)
|
180
|
-
|
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
|
181
169
|
if @data.instance_of?(PO)
|
182
170
|
if comment == "#"
|
183
171
|
@translator_comments << ""
|
@@ -192,7 +180,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
|
|
192
180
|
when POFormat::REFERENCE_COMMENT_MARK
|
193
181
|
@references.concat(parse_references_line(content))
|
194
182
|
when POFormat::FLAG_MARK
|
195
|
-
@flags.concat(
|
183
|
+
@flags.concat(flags)
|
196
184
|
when POFormat::PREVIOUS_COMMENT_MARK
|
197
185
|
@previous << content
|
198
186
|
else
|
@@ -261,7 +249,19 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
|
|
261
249
|
end
|
262
250
|
|
263
251
|
def parse_flags_line(line)
|
264
|
-
line.split(
|
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
|
265
265
|
end
|
266
266
|
...end po_parser.ry/module_eval...
|
267
267
|
##### State transition tables begin ###
|
@@ -417,14 +417,18 @@ module_eval(<<'.,.,', 'po_parser.ry', 38)
|
|
417
417
|
end
|
418
418
|
end
|
419
419
|
@fuzzy = false
|
420
|
-
|
420
|
+
if use_message_p
|
421
|
+
on_message(msgid, msgstr)
|
422
|
+
else
|
423
|
+
clear
|
424
|
+
end
|
421
425
|
result = ""
|
422
426
|
|
423
427
|
result
|
424
428
|
end
|
425
429
|
.,.,
|
426
430
|
|
427
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
431
|
+
module_eval(<<'.,.,', 'po_parser.ry', 64)
|
428
432
|
def _reduce_9(val, _values, result)
|
429
433
|
if @fuzzy and ignore_fuzzy?
|
430
434
|
if val[1] != ""
|
@@ -446,7 +450,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 60)
|
|
446
450
|
end
|
447
451
|
.,.,
|
448
452
|
|
449
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
453
|
+
module_eval(<<'.,.,', 'po_parser.ry', 85)
|
450
454
|
def _reduce_10(val, _values, result)
|
451
455
|
if val[0].size > 0
|
452
456
|
result = val[0] + "\000" + val[1]
|
@@ -460,7 +464,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 81)
|
|
460
464
|
|
461
465
|
# reduce 11 omitted
|
462
466
|
|
463
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
467
|
+
module_eval(<<'.,.,', 'po_parser.ry', 97)
|
464
468
|
def _reduce_12(val, _values, result)
|
465
469
|
result = val[2]
|
466
470
|
|
@@ -468,7 +472,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 93)
|
|
468
472
|
end
|
469
473
|
.,.,
|
470
474
|
|
471
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
475
|
+
module_eval(<<'.,.,', 'po_parser.ry', 104)
|
472
476
|
def _reduce_13(val, _values, result)
|
473
477
|
on_comment(val[0])
|
474
478
|
|
@@ -476,7 +480,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 100)
|
|
476
480
|
end
|
477
481
|
.,.,
|
478
482
|
|
479
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
483
|
+
module_eval(<<'.,.,', 'po_parser.ry', 112)
|
480
484
|
def _reduce_14(val, _values, result)
|
481
485
|
result = val.delete_if{|item| item == ""}.join
|
482
486
|
|
@@ -484,7 +488,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 108)
|
|
484
488
|
end
|
485
489
|
.,.,
|
486
490
|
|
487
|
-
module_eval(<<'.,.,', 'po_parser.ry',
|
491
|
+
module_eval(<<'.,.,', 'po_parser.ry', 116)
|
488
492
|
def _reduce_15(val, _values, result)
|
489
493
|
result = val[0]
|
490
494
|
|
data/lib/gettext/tools/task.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2012-2014 Kouhei Sutou <kou@clear-code.com>
|
1
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
|
4
2
|
#
|
5
3
|
# License: Ruby's or LGPL
|
6
4
|
#
|
@@ -452,8 +450,8 @@ module GetText
|
|
452
450
|
locale = args.locale || ENV["LOCALE"]
|
453
451
|
if locale.nil?
|
454
452
|
raise "specify locale name by " +
|
455
|
-
|
456
|
-
|
453
|
+
"rake '#{_task.name}[${LOCALE}]' or " +
|
454
|
+
"rake #{_task.name} LOCALE=${LOCALE}'"
|
457
455
|
end
|
458
456
|
define_edit_po_file_task(locale)
|
459
457
|
define_po_file_task(locale)
|
data/lib/gettext/version.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
=begin
|
2
2
|
version - version information of gettext
|
3
3
|
|
4
|
-
Copyright (C) 2012-2023
|
5
|
-
Copyright (C) 2005-2009
|
4
|
+
Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
|
5
|
+
Copyright (C) 2005-2009 Masao Mutoh
|
6
6
|
|
7
7
|
You may redistribute it and/or modify it under the same
|
8
8
|
license terms as Ruby or LGPL.
|
9
9
|
=end
|
10
10
|
|
11
11
|
module GetText
|
12
|
-
VERSION = "3.4.
|
12
|
+
VERSION = "3.4.8"
|
13
13
|
end
|
data/po/gettext.pot
CHANGED
@@ -6,10 +6,10 @@
|
|
6
6
|
#, fuzzy
|
7
7
|
msgid ""
|
8
8
|
msgstr ""
|
9
|
-
"Project-Id-Version: gettext 3.4.
|
9
|
+
"Project-Id-Version: gettext 3.4.8\n"
|
10
10
|
"Report-Msgid-Bugs-To: \n"
|
11
|
-
"POT-Creation-Date: 2023-
|
12
|
-
"PO-Revision-Date: 2023-
|
11
|
+
"POT-Creation-Date: 2023-10-22 06:20+0900\n"
|
12
|
+
"PO-Revision-Date: 2023-10-22 06:20+0900\n"
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15
15
|
"Language: \n"
|
data/src/po_parser.ry
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
#
|
3
3
|
# po_parser.ry - ruby version of msgfmt
|
4
4
|
#
|
5
|
-
# Copyright (C) 2002-2008
|
6
|
-
# Copyright (C) 2012-
|
7
|
-
# Copyright (C) 2012-2013
|
5
|
+
# Copyright (C) 2002-2008 Masao Mutoh <mutomasa at gmail.com>
|
6
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
|
7
|
+
# Copyright (C) 2012-2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
8
8
|
#
|
9
9
|
# You may redistribute it and/or modify it under the same
|
10
10
|
# license terms as Ruby or LGPL.
|
@@ -51,7 +51,11 @@ class GetText::POParser
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
@fuzzy = false
|
54
|
-
|
54
|
+
if use_message_p
|
55
|
+
on_message(msgid, msgstr)
|
56
|
+
else
|
57
|
+
clear
|
58
|
+
end
|
55
59
|
result = ""
|
56
60
|
}
|
57
61
|
|
@@ -161,16 +165,8 @@ require "gettext/po"
|
|
161
165
|
private :unescape
|
162
166
|
|
163
167
|
def parse(str, data)
|
164
|
-
|
165
|
-
@extracted_comments = []
|
166
|
-
@references = []
|
167
|
-
@flags = []
|
168
|
-
@previous = []
|
169
|
-
@comments = []
|
168
|
+
clear
|
170
169
|
@data = data
|
171
|
-
@fuzzy = false
|
172
|
-
@msgctxt = nil
|
173
|
-
@msgid_plural = nil
|
174
170
|
|
175
171
|
str = str.strip
|
176
172
|
@q = []
|
@@ -256,15 +252,7 @@ require "gettext/po"
|
|
256
252
|
@data.set_comment(msgid, format_comment(@comments))
|
257
253
|
end
|
258
254
|
|
259
|
-
|
260
|
-
@extracted_comments = []
|
261
|
-
@references = []
|
262
|
-
@flags = []
|
263
|
-
@previous = []
|
264
|
-
@references = []
|
265
|
-
@comments.clear
|
266
|
-
@msgctxt = nil
|
267
|
-
@msgid_plural = nil
|
255
|
+
clear
|
268
256
|
end
|
269
257
|
|
270
258
|
def format_comment(comments)
|
@@ -276,7 +264,11 @@ require "gettext/po"
|
|
276
264
|
end
|
277
265
|
|
278
266
|
def on_comment(comment)
|
279
|
-
|
267
|
+
if comment.start_with?(POFormat::FLAG_MARK)
|
268
|
+
content = comment[POFormat::FLAG_MARK.size..-1]
|
269
|
+
flags = parse_flags_line(content)
|
270
|
+
@fuzzy = flags.include?("fuzzy")
|
271
|
+
end
|
280
272
|
if @data.instance_of?(PO)
|
281
273
|
if comment == "#"
|
282
274
|
@translator_comments << ""
|
@@ -291,7 +283,7 @@ require "gettext/po"
|
|
291
283
|
when POFormat::REFERENCE_COMMENT_MARK
|
292
284
|
@references.concat(parse_references_line(content))
|
293
285
|
when POFormat::FLAG_MARK
|
294
|
-
@flags.concat(
|
286
|
+
@flags.concat(flags)
|
295
287
|
when POFormat::PREVIOUS_COMMENT_MARK
|
296
288
|
@previous << content
|
297
289
|
else
|
@@ -360,7 +352,19 @@ require "gettext/po"
|
|
360
352
|
end
|
361
353
|
|
362
354
|
def parse_flags_line(line)
|
363
|
-
line.split(
|
355
|
+
line.split(",").collect(&:strip)
|
356
|
+
end
|
357
|
+
|
358
|
+
def clear
|
359
|
+
@translator_comments = []
|
360
|
+
@extracted_comments = []
|
361
|
+
@references = []
|
362
|
+
@flags = []
|
363
|
+
@previous = []
|
364
|
+
@references = []
|
365
|
+
@comments = []
|
366
|
+
@msgctxt = nil
|
367
|
+
@msgid_plural = nil
|
364
368
|
end
|
365
369
|
---- footer
|
366
370
|
|
data/test/test_po_entry.rb
CHANGED
@@ -344,6 +344,20 @@ EOP
|
|
344
344
|
assert_equal(expected_po, entry.to_s)
|
345
345
|
end
|
346
346
|
|
347
|
+
def test_multiple_flags
|
348
|
+
entry = GetText::POEntry.new(:normal)
|
349
|
+
entry.msgid = "msgid"
|
350
|
+
entry.msgstr = "msgstr"
|
351
|
+
entry.flags = ["It's the flag.", "fuzzy"]
|
352
|
+
|
353
|
+
expected_po = <<-EOP
|
354
|
+
#, It's the flag., fuzzy
|
355
|
+
msgid "msgid"
|
356
|
+
msgstr "msgstr"
|
357
|
+
EOP
|
358
|
+
assert_equal(expected_po, entry.to_s)
|
359
|
+
end
|
360
|
+
|
347
361
|
def test_previous
|
348
362
|
entry = GetText::POEntry.new(:normal)
|
349
363
|
entry.msgid = "msgid"
|
data/test/test_po_parser.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
|
2
2
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
3
3
|
#
|
4
4
|
# License: Ruby's or LGPL
|
@@ -238,6 +238,39 @@ EOP
|
|
238
238
|
assert_equal("fuzzy", entries["hello"].flag)
|
239
239
|
end
|
240
240
|
|
241
|
+
def test_fuzzy_ignore
|
242
|
+
po_file = create_po_file(<<-PO)
|
243
|
+
#, fuzzy
|
244
|
+
#: file.rb:10
|
245
|
+
msgid "hello"
|
246
|
+
msgstr "bonjour"
|
247
|
+
|
248
|
+
#, c-format, fuzzy , no-sh-format
|
249
|
+
#: file.rb:11
|
250
|
+
msgid "world"
|
251
|
+
msgstr "monde"
|
252
|
+
|
253
|
+
# This is not fuzzy
|
254
|
+
msgid "non-fuzzy"
|
255
|
+
msgstr "non-fuzzy string"
|
256
|
+
PO
|
257
|
+
entries = suppress_warning do
|
258
|
+
parse_po_file(po_file)
|
259
|
+
end
|
260
|
+
|
261
|
+
actual = entries.collect do |entry|
|
262
|
+
[
|
263
|
+
entry.msgid,
|
264
|
+
entry.msgstr,
|
265
|
+
entry.flags,
|
266
|
+
]
|
267
|
+
end
|
268
|
+
assert_equal([
|
269
|
+
["non-fuzzy", "non-fuzzy string", []],
|
270
|
+
],
|
271
|
+
actual)
|
272
|
+
end
|
273
|
+
|
241
274
|
private
|
242
275
|
def parse_po_file(po_file, options={:ignore_fuzzy => true})
|
243
276
|
ignore_fuzzy = options[:ignore_fuzzy]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: erubi
|