gettext 3.3.6 → 3.4.9
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/Rakefile +5 -3
- data/doc/text/news.md +168 -0
- data/gettext.gemspec +7 -4
- data/lib/gettext/mo.rb +12 -19
- data/lib/gettext/po_entry.rb +31 -21
- data/lib/gettext/po_parser.rb +65 -59
- data/lib/gettext/text_domain_manager.rb +6 -5
- data/lib/gettext/tools/msgcat.rb +9 -2
- data/lib/gettext/tools/msginit.rb +221 -50
- data/lib/gettext/tools/msgmerge.rb +24 -6
- data/lib/gettext/tools/parser/erubi.rb +88 -0
- data/lib/gettext/tools/parser/glade.rb +38 -40
- data/lib/gettext/tools/parser/gtk_builder_ui_definitions.rb +6 -3
- data/lib/gettext/tools/parser/ruby.rb +2 -2
- data/lib/gettext/tools/task.rb +3 -5
- data/lib/gettext/tools/xgettext.rb +15 -4
- data/lib/gettext/version.rb +3 -3
- data/locale/bg/LC_MESSAGES/gettext.mo +0 -0
- data/locale/bs/LC_MESSAGES/gettext.mo +0 -0
- data/locale/ca/LC_MESSAGES/gettext.mo +0 -0
- data/locale/cs/LC_MESSAGES/gettext.mo +0 -0
- data/locale/de/LC_MESSAGES/gettext.mo +0 -0
- data/locale/el/LC_MESSAGES/gettext.mo +0 -0
- data/locale/eo/LC_MESSAGES/gettext.mo +0 -0
- data/locale/es/LC_MESSAGES/gettext.mo +0 -0
- data/locale/et/LC_MESSAGES/gettext.mo +0 -0
- data/locale/fr/LC_MESSAGES/gettext.mo +0 -0
- data/locale/hr/LC_MESSAGES/gettext.mo +0 -0
- data/locale/hu/LC_MESSAGES/gettext.mo +0 -0
- data/locale/it/LC_MESSAGES/gettext.mo +0 -0
- data/locale/ja/LC_MESSAGES/gettext.mo +0 -0
- data/locale/ko/LC_MESSAGES/gettext.mo +0 -0
- data/locale/lv/LC_MESSAGES/gettext.mo +0 -0
- data/locale/nb/LC_MESSAGES/gettext.mo +0 -0
- data/locale/nl/LC_MESSAGES/gettext.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/gettext.mo +0 -0
- data/locale/ru/LC_MESSAGES/gettext.mo +0 -0
- data/locale/sr/LC_MESSAGES/gettext.mo +0 -0
- data/locale/uk/LC_MESSAGES/gettext.mo +0 -0
- data/locale/vi/LC_MESSAGES/gettext.mo +0 -0
- data/locale/zh/LC_MESSAGES/gettext.mo +0 -0
- data/locale/zh_TW/LC_MESSAGES/gettext.mo +0 -0
- data/po/bg/gettext.edit.po +80 -593
- data/po/bg/gettext.po +6 -423
- data/po/bs/gettext.edit.po +80 -593
- data/po/bs/gettext.po +6 -423
- data/po/ca/gettext.edit.po +80 -593
- data/po/ca/gettext.po +6 -423
- data/po/cs/gettext.edit.po +80 -593
- data/po/cs/gettext.po +6 -423
- data/po/de/gettext.edit.po +80 -593
- data/po/de/gettext.po +6 -423
- data/po/el/gettext.edit.po +80 -593
- data/po/el/gettext.po +6 -423
- data/po/eo/gettext.edit.po +80 -593
- data/po/eo/gettext.po +6 -423
- data/po/es/gettext.edit.po +80 -593
- data/po/es/gettext.po +6 -423
- data/po/et/gettext.edit.po +80 -593
- data/po/et/gettext.po +6 -423
- data/po/fr/gettext.edit.po +80 -593
- data/po/fr/gettext.po +6 -423
- data/po/gettext.pot +92 -665
- data/po/hr/gettext.edit.po +80 -593
- data/po/hr/gettext.po +6 -423
- data/po/hu/gettext.edit.po +80 -593
- data/po/hu/gettext.po +6 -423
- data/po/it/gettext.edit.po +80 -593
- data/po/it/gettext.po +6 -423
- data/po/ja/gettext.edit.po +81 -594
- data/po/ja/gettext.po +7 -424
- data/po/ko/gettext.edit.po +80 -593
- data/po/ko/gettext.po +6 -423
- data/po/lv/gettext.edit.po +80 -593
- data/po/lv/gettext.po +6 -423
- data/po/nb/gettext.edit.po +80 -593
- data/po/nb/gettext.po +6 -423
- data/po/nl/gettext.edit.po +80 -593
- data/po/nl/gettext.po +6 -423
- data/po/pt_BR/gettext.edit.po +80 -593
- data/po/pt_BR/gettext.po +6 -423
- data/po/ru/gettext.edit.po +80 -593
- data/po/ru/gettext.po +6 -423
- data/po/sr/gettext.edit.po +80 -593
- data/po/sr/gettext.po +6 -423
- data/po/sv/gettext.edit.po +80 -593
- data/po/sv/gettext.po +6 -423
- data/po/uk/gettext.edit.po +80 -593
- data/po/uk/gettext.po +6 -423
- data/po/vi/gettext.edit.po +80 -593
- data/po/vi/gettext.po +6 -423
- data/po/zh/gettext.edit.po +80 -593
- data/po/zh/gettext.po +6 -423
- data/po/zh_TW/gettext.edit.po +80 -593
- data/po/zh_TW/gettext.po +6 -423
- data/samples/cgi/po/helloerb1.pot +3 -3
- data/samples/cgi/po/helloerb2.pot +3 -3
- data/samples/cgi/po/hellolib.pot +3 -3
- data/samples/cgi/po/main.pot +3 -3
- data/samples/po/bg/hello_gtk_builder.edit.po +15 -0
- data/samples/po/bg/hello_gtk_builder.po +12 -0
- data/samples/po/bs/hello_gtk_builder.edit.po +15 -0
- data/samples/po/bs/hello_gtk_builder.po +12 -0
- data/samples/po/ca/hello_gtk_builder.edit.po +15 -0
- data/samples/po/ca/hello_gtk_builder.po +12 -0
- data/samples/po/cs/hello_gtk_builder.edit.po +15 -0
- data/samples/po/cs/hello_gtk_builder.po +12 -0
- data/samples/po/de/hello_gtk_builder.edit.po +15 -0
- data/samples/po/de/hello_gtk_builder.po +12 -0
- data/samples/po/el/hello_gtk_builder.edit.po +15 -0
- data/samples/po/el/hello_gtk_builder.po +12 -0
- data/samples/po/eo/hello_gtk_builder.edit.po +15 -0
- data/samples/po/eo/hello_gtk_builder.po +12 -0
- data/samples/po/es/hello_gtk_builder.edit.po +15 -0
- data/samples/po/es/hello_gtk_builder.po +12 -0
- data/samples/po/fr/hello_gtk_builder.edit.po +15 -0
- data/samples/po/fr/hello_gtk_builder.po +12 -0
- data/samples/po/hello.pot +3 -3
- data/samples/po/hello2.pot +4 -4
- data/samples/po/hello_glade2.pot +8 -5
- data/samples/po/hello_gtk2.pot +4 -4
- data/samples/po/hello_gtk_builder.pot +18 -4
- data/samples/po/hello_noop.pot +4 -4
- data/samples/po/hello_plural.pot +4 -4
- data/samples/po/hello_tk.pot +4 -4
- data/samples/po/hr/hello_gtk_builder.edit.po +15 -0
- data/samples/po/hr/hello_gtk_builder.po +12 -0
- data/samples/po/hu/hello_gtk_builder.edit.po +15 -0
- data/samples/po/hu/hello_gtk_builder.po +12 -0
- data/samples/po/it/hello_gtk_builder.edit.po +15 -0
- data/samples/po/it/hello_gtk_builder.po +12 -0
- data/samples/po/ja/hello_gtk_builder.edit.po +15 -0
- data/samples/po/ja/hello_gtk_builder.po +12 -0
- data/samples/po/ko/hello_gtk_builder.edit.po +15 -0
- data/samples/po/ko/hello_gtk_builder.po +12 -0
- data/samples/po/lv/hello_gtk_builder.edit.po +15 -0
- data/samples/po/lv/hello_gtk_builder.po +12 -0
- data/samples/po/nb/hello_gtk_builder.edit.po +15 -0
- data/samples/po/nb/hello_gtk_builder.po +12 -0
- data/samples/po/nl/hello_gtk_builder.edit.po +15 -0
- data/samples/po/nl/hello_gtk_builder.po +12 -0
- data/samples/po/pt_BR/hello_gtk_builder.edit.po +15 -0
- data/samples/po/pt_BR/hello_gtk_builder.po +12 -0
- data/samples/po/ru/hello_gtk_builder.edit.po +15 -0
- data/samples/po/ru/hello_gtk_builder.po +12 -0
- data/samples/po/sr/hello_gtk_builder.edit.po +15 -0
- data/samples/po/sr/hello_gtk_builder.po +12 -0
- data/samples/po/sv/hello_gtk_builder.edit.po +15 -0
- data/samples/po/sv/hello_gtk_builder.po +12 -0
- data/samples/po/uk/hello_gtk_builder.edit.po +15 -0
- data/samples/po/uk/hello_gtk_builder.po +12 -0
- data/samples/po/vi/hello_gtk_builder.edit.po +15 -0
- data/samples/po/vi/hello_gtk_builder.po +12 -0
- data/samples/po/zh/hello_gtk_builder.edit.po +15 -0
- data/samples/po/zh/hello_gtk_builder.po +12 -0
- data/samples/po/zh_TW/hello_gtk_builder.edit.po +15 -0
- data/samples/po/zh_TW/hello_gtk_builder.po +12 -0
- data/src/po_parser.ry +48 -42
- data/test/fixtures/_.rb +1 -1
- data/test/fixtures/erb/case.rhtml +16 -0
- data/test/fixtures/{gtk_builder_ui_definitions.ui~ → glade/3.glade} +12 -17
- data/test/fixtures/multi_text_domain.rb +12 -12
- data/test/fixtures/np_.rb +1 -1
- data/test/fixtures/ns_.rb +1 -1
- data/test/fixtures/p_.rb +1 -1
- data/test/fixtures/s_.rb +1 -1
- data/test/fixtures/simple.rb +5 -1
- data/test/fixtures/upper_nn_.rb +77 -0
- data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
- data/test/locale/fr_BE/LC_MESSAGES/test1.mo +0 -0
- data/test/locale/fr_BE_Foo/LC_MESSAGES/test1.mo +0 -0
- data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
- data/test/po/_.pot +20 -4
- data/test/po/backslash.pot +6 -4
- data/test/po/fr/test1.po +7 -0
- data/test/po/fr_BE/test1.po +24 -0
- data/test/po/fr_BE_Foo/test1.po +20 -0
- data/test/po/hello.pot +3 -3
- data/test/po/ja/_.edit.po +27 -3
- data/test/po/ja/_.po +15 -0
- data/test/po/ja/hello.edit.po +0 -1
- data/test/po/non_ascii.pot +4 -4
- data/test/po/np_.pot +8 -5
- data/test/po/ns_.pot +6 -4
- data/test/po/p_.pot +3 -3
- data/test/po/s_.pot +6 -4
- data/test/po/untranslated.pot +4 -4
- data/test/test_gettext.rb +23 -0
- data/test/test_locale_path.rb +12 -4
- data/test/test_parser.rb +97 -17
- data/test/test_po_entry.rb +20 -4
- data/test/test_po_parser.rb +44 -1
- data/test/tools/parser/test_glade.rb +91 -0
- data/test/tools/parser/test_gtk_builder_ui_definitions.rb +19 -1
- data/test/tools/parser/test_ruby.rb +4 -4
- data/test/tools/test_msgcat.rb +21 -1
- data/test/tools/test_msginit.rb +82 -3
- data/test/tools/test_msgmerge.rb +75 -3
- data/test/tools/test_xgettext.rb +100 -3
- metadata +70 -19
- /data/test/fixtures/{gladeparser.glade → glade/2.glade} +0 -0
- /data/test/fixtures/ruby/{percent_i.rb → percent_lower_i.rb} +0 -0
- /data/test/fixtures/ruby/{percent_w.rb → percent_lower_w.rb} +0 -0
- /data/test/fixtures/ruby/{percent_I.rb → percent_upper_i.rb} +0 -0
- /data/test/fixtures/ruby/{percent_W.rb → percent_upper_w.rb} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 737177cc120acfd0387fdb23761ea8bf324a490b1d4b94f8edce692d22decad7
|
4
|
+
data.tar.gz: 67e7d803c3d9fc924e47d0b612cee9ac329eec67784c8e6e63763886f4602be0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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/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
|
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.
|
@@ -86,6 +84,10 @@ end
|
|
86
84
|
xgettext_options = ["--add-comments=TRANSLATORS:"]
|
87
85
|
GetText::Tools::Task.define do |task|
|
88
86
|
task.spec = spec
|
87
|
+
task.files = task.files.reject do |file|
|
88
|
+
file.start_with?("samples/") or
|
89
|
+
file.start_with?("test/")
|
90
|
+
end
|
89
91
|
task.xgettext_options.concat(xgettext_options)
|
90
92
|
end
|
91
93
|
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,173 @@
|
|
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
|
+
|
135
|
+
## 3.3.8: 2021-06-09 {#version-3-3-8}
|
136
|
+
|
137
|
+
### Improvements
|
138
|
+
|
139
|
+
* msginit: Added support for generating plural forms with
|
140
|
+
Unicode's CLDR plural rules data.
|
141
|
+
[GitHub#85][Suggested by Michaël Hoste]
|
142
|
+
|
143
|
+
* rxgettext ui: Added support for GtkBuilder UI definitions format
|
144
|
+
with `.glade` extension.
|
145
|
+
[GitHub#74][Reported by dorle-o]
|
146
|
+
|
147
|
+
### Fixes
|
148
|
+
|
149
|
+
* rxgettext ruby: Fixed a bug that `Nn_` isn't extracted.
|
150
|
+
[GitHub#86][Reported by Kai Ramuenke]
|
151
|
+
|
152
|
+
### Thanks
|
153
|
+
|
154
|
+
* Kai Ramuenke
|
155
|
+
|
156
|
+
* Michaël Hoste
|
157
|
+
|
158
|
+
* dorle-o
|
159
|
+
|
160
|
+
## 3.3.7: 2021-01-18 {#version-3-3-7}
|
161
|
+
|
162
|
+
### Improvements
|
163
|
+
|
164
|
+
* msgmerge: Added `--no-report-warning` option.
|
165
|
+
[GitHub#81][Reported by Akim Demaille]
|
166
|
+
|
167
|
+
### Thanks
|
168
|
+
|
169
|
+
* Akim Demaille
|
170
|
+
|
3
171
|
## 3.3.6: 2020-08-04 {#version-3-3-6}
|
4
172
|
|
5
173
|
### Improvements
|
data/gettext.gemspec
CHANGED
@@ -29,13 +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
|
-
s.add_development_dependency("rake")
|
35
|
-
s.add_development_dependency("racc")
|
36
|
-
s.add_development_dependency("yard")
|
37
37
|
s.add_development_dependency("kramdown")
|
38
|
+
s.add_development_dependency("rake")
|
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
|
-
s.
|
42
|
+
s.add_development_dependency("yard")
|
43
|
+
s.licenses = ["Ruby", "LGPL-3.0+"]
|
41
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-
|
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
|
-
|
172
|
-
|
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
|
@@ -278,11 +269,13 @@ module GetText
|
|
278
269
|
|
279
270
|
def load_from_file(filename)
|
280
271
|
@filename = filename
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
e
|
285
|
-
|
272
|
+
File.open(filename, 'rb') do |f|
|
273
|
+
begin
|
274
|
+
load_from_stream(f)
|
275
|
+
rescue => e
|
276
|
+
e.set_backtrace(["#{filename}:#{f.lineno}"] + e.backtrace)
|
277
|
+
raise e
|
278
|
+
end
|
286
279
|
end
|
287
280
|
end
|
288
281
|
|
data/lib/gettext/po_entry.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) 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(/
|
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
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
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
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
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
|
-
|
431
|
-
|
432
|
-
|
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
|
data/lib/gettext/po_parser.rb
CHANGED
@@ -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-
|
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.
|
14
|
-
# from Racc
|
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',
|
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(
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
|
-
|
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(
|
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(
|
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 =
|
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
|
-
|
403
|
-
|
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 '#{
|
416
|
+
$stderr.print " #{@po_file}: msgid '#{msgid}'\n"
|
415
417
|
end
|
416
418
|
end
|
417
419
|
@fuzzy = false
|
418
|
-
|
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',
|
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',
|
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',
|
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',
|
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',
|
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',
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|