gettext 3.3.7 → 3.3.8
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.
- checksums.yaml +4 -4
- data/Rakefile +4 -0
- data/doc/text/news.md +25 -0
- data/gettext.gemspec +1 -0
- data/lib/gettext/mo.rb +7 -5
- data/lib/gettext/tools/msginit.rb +216 -50
- 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/version.rb +2 -2
- 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 +19 -537
- data/po/bg/gettext.po +0 -423
- data/po/bs/gettext.edit.po +19 -537
- data/po/bs/gettext.po +0 -423
- data/po/ca/gettext.edit.po +19 -537
- data/po/ca/gettext.po +0 -423
- data/po/cs/gettext.edit.po +19 -537
- data/po/cs/gettext.po +0 -423
- data/po/de/gettext.edit.po +19 -537
- data/po/de/gettext.po +0 -423
- data/po/el/gettext.edit.po +19 -537
- data/po/el/gettext.po +0 -423
- data/po/eo/gettext.edit.po +19 -537
- data/po/eo/gettext.po +0 -423
- data/po/es/gettext.edit.po +19 -537
- data/po/es/gettext.po +0 -423
- data/po/et/gettext.edit.po +19 -537
- data/po/et/gettext.po +0 -423
- data/po/fr/gettext.edit.po +19 -537
- data/po/fr/gettext.po +0 -423
- data/po/gettext.pot +20 -602
- data/po/hr/gettext.edit.po +19 -537
- data/po/hr/gettext.po +0 -423
- data/po/hu/gettext.edit.po +19 -537
- data/po/hu/gettext.po +0 -423
- data/po/it/gettext.edit.po +19 -537
- data/po/it/gettext.po +0 -423
- data/po/ja/gettext.edit.po +19 -537
- data/po/ja/gettext.po +0 -423
- data/po/ko/gettext.edit.po +19 -537
- data/po/ko/gettext.po +0 -423
- data/po/lv/gettext.edit.po +19 -537
- data/po/lv/gettext.po +0 -423
- data/po/nb/gettext.edit.po +19 -537
- data/po/nb/gettext.po +0 -423
- data/po/nl/gettext.edit.po +19 -537
- data/po/nl/gettext.po +0 -423
- data/po/pt_BR/gettext.edit.po +19 -537
- data/po/pt_BR/gettext.po +0 -423
- data/po/ru/gettext.edit.po +19 -537
- data/po/ru/gettext.po +0 -423
- data/po/sr/gettext.edit.po +19 -537
- data/po/sr/gettext.po +0 -423
- data/po/sv/gettext.edit.po +17 -538
- data/po/sv/gettext.po +0 -423
- data/po/uk/gettext.edit.po +19 -537
- data/po/uk/gettext.po +0 -423
- data/po/vi/gettext.edit.po +19 -537
- data/po/vi/gettext.po +0 -423
- data/po/zh/gettext.edit.po +19 -537
- data/po/zh/gettext.po +0 -423
- data/po/zh_TW/gettext.edit.po +19 -537
- data/po/zh_TW/gettext.po +0 -423
- data/test/fixtures/_.rb +1 -1
- data/test/fixtures/{gladeparser.glade → glade/2.glade} +0 -0
- data/test/fixtures/glade/3.glade +63 -0
- 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/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
- data/test/fixtures/s_.rb +1 -1
- data/test/fixtures/simple.rb +1 -1
- data/test/fixtures/upper_nn_.rb +77 -0
- data/test/po/_.pot +20 -4
- data/test/po/ja/_.edit.po +24 -0
- 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/test_parser.rb +35 -17
- 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_msginit.rb +77 -3
- metadata +24 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 854c34e40028ef9e71045cbd1c8f77a4846c5f668de2cef716017b52d05515b2
|
4
|
+
data.tar.gz: bc0a5bcb8a1a30ed0b5de8272bae275a996f5ef5e6533a281997a67bf99f3f95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6978df6c5a2e52c5eb9b1101bb89fd2ec3febec663bf1418b054929572a333935cd02cfba15b93818ae3b89971b2fb442b2f8f48c0370fd516bacd7085eac915
|
7
|
+
data.tar.gz: a7fbb7a6b3e93a374440ad2ae3c69f43aeb238c54479825c45e8b14f5f90408fa05b2c06db05078af531defecc7b181bda30e0a2e53068718422ba66bbd7ae94
|
data/Rakefile
CHANGED
@@ -86,6 +86,10 @@ end
|
|
86
86
|
xgettext_options = ["--add-comments=TRANSLATORS:"]
|
87
87
|
GetText::Tools::Task.define do |task|
|
88
88
|
task.spec = spec
|
89
|
+
task.files = task.files.reject do |file|
|
90
|
+
file.start_with?("samples/") or
|
91
|
+
file.start_with?("test/")
|
92
|
+
end
|
89
93
|
task.xgettext_options.concat(xgettext_options)
|
90
94
|
end
|
91
95
|
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 3.3.8: 2021-06-09 {#version-3-3-8}
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* msginit: Added support for generating plural forms with
|
8
|
+
Unicode's CLDR plural rules data.
|
9
|
+
[GitHub#85][Suggested by Michaël Hoste]
|
10
|
+
|
11
|
+
* rxgettext ui: Added support for GtkBuilder UI definitions format
|
12
|
+
with `.glade` extension.
|
13
|
+
[GitHub#74][Reported by dorle-o]
|
14
|
+
|
15
|
+
### Fixes
|
16
|
+
|
17
|
+
* rxgettext ruby: Fixed a bug that `Nn_` isn't extracted.
|
18
|
+
[GitHub#86][Reported by Kai Ramuenke]
|
19
|
+
|
20
|
+
### Thanks
|
21
|
+
|
22
|
+
* Kai Ramuenke
|
23
|
+
|
24
|
+
* Michaël Hoste
|
25
|
+
|
26
|
+
* dorle-o
|
27
|
+
|
3
28
|
## 3.3.7: 2021-01-18 {#version-3-3-7}
|
4
29
|
|
5
30
|
### Improvements
|
data/gettext.gemspec
CHANGED
@@ -30,6 +30,7 @@ So you can use GNU gettext tools for maintaining.
|
|
30
30
|
s.required_ruby_version = ">= 2.5.0"
|
31
31
|
|
32
32
|
s.add_runtime_dependency("locale", ">= 2.0.5")
|
33
|
+
s.add_runtime_dependency("red-datasets")
|
33
34
|
s.add_runtime_dependency("text", ">= 1.3.0")
|
34
35
|
s.add_development_dependency("rake")
|
35
36
|
s.add_development_dependency("racc")
|
data/lib/gettext/mo.rb
CHANGED
@@ -278,11 +278,13 @@ module GetText
|
|
278
278
|
|
279
279
|
def load_from_file(filename)
|
280
280
|
@filename = filename
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
e
|
285
|
-
|
281
|
+
File.open(filename, 'rb') do |f|
|
282
|
+
begin
|
283
|
+
load_from_stream(f)
|
284
|
+
rescue => e
|
285
|
+
e.set_backtrace(["#{filename}:#{f.lineno}"] + e.backtrace)
|
286
|
+
raise e
|
287
|
+
end
|
286
288
|
end
|
287
289
|
end
|
288
290
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
3
|
# Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
-
# Copyright (C) 2012-
|
4
|
+
# Copyright (C) 2012-2021 Sutou Kouhei <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# License: Ruby's or LGPL
|
7
7
|
#
|
@@ -19,11 +19,14 @@
|
|
19
19
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
20
20
|
|
21
21
|
require "etc"
|
22
|
+
require "optparse"
|
23
|
+
|
24
|
+
require "datasets"
|
25
|
+
require "locale/info"
|
26
|
+
|
22
27
|
require "gettext"
|
23
28
|
require "gettext/po_parser"
|
24
29
|
require "gettext/tools/msgmerge"
|
25
|
-
require "locale/info"
|
26
|
-
require "optparse"
|
27
30
|
|
28
31
|
module GetText
|
29
32
|
module Tools
|
@@ -320,53 +323,8 @@ module GetText
|
|
320
323
|
end
|
321
324
|
|
322
325
|
def plural_forms(language)
|
323
|
-
|
324
|
-
|
325
|
-
nplural = "1"
|
326
|
-
plural_expression = "0"
|
327
|
-
when "en", "de", "nl", "sv", "da", "no", "fo", "es", "pt",
|
328
|
-
"it", "bg", "el", "fi", "et", "he", "eo", "hu", "tr",
|
329
|
-
"ca", "nb"
|
330
|
-
nplural = "2"
|
331
|
-
plural_expression = "n != 1"
|
332
|
-
when "pt_BR", "fr"
|
333
|
-
nplural = "2"
|
334
|
-
plural_expression = "n>1"
|
335
|
-
when "lv"
|
336
|
-
nplural = "3"
|
337
|
-
plural_expression = "n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2"
|
338
|
-
when "ga"
|
339
|
-
nplural = "3"
|
340
|
-
plural_expression = "n==1 ? 0 : n==2 ? 1 : 2"
|
341
|
-
when "ro"
|
342
|
-
nplural = "3"
|
343
|
-
plural_expression = "n==1 ? 0 : " +
|
344
|
-
"(n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2"
|
345
|
-
when "lt", "bs"
|
346
|
-
nplural = "3"
|
347
|
-
plural_expression = "n%10==1 && n%100!=11 ? 0 : " +
|
348
|
-
"n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2"
|
349
|
-
when "ru", "uk", "sr", "hr"
|
350
|
-
nplural = "3"
|
351
|
-
plural_expression = "n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +
|
352
|
-
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2"
|
353
|
-
when "cs", "sk"
|
354
|
-
nplural = "3"
|
355
|
-
plural_expression = "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2"
|
356
|
-
when "pl"
|
357
|
-
nplural = "3"
|
358
|
-
plural_expression = "n==1 ? 0 : n%10>=2 && " +
|
359
|
-
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2"
|
360
|
-
when "sl"
|
361
|
-
nplural = "4"
|
362
|
-
plural_expression = "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +
|
363
|
-
"|| n%100==4 ? 2 : 3"
|
364
|
-
else
|
365
|
-
nplural = nil
|
366
|
-
plural_expression = nil
|
367
|
-
end
|
368
|
-
|
369
|
-
"nplurals=#{nplural}; plural=#{plural_expression};"
|
326
|
+
converter = CLDRPluralsConverter.new(language)
|
327
|
+
converter.convert
|
370
328
|
end
|
371
329
|
|
372
330
|
DESCRIPTION_TITLE = /^SOME DESCRIPTIVE TITLE\.$/
|
@@ -408,6 +366,214 @@ module GetText
|
|
408
366
|
def year
|
409
367
|
now.year
|
410
368
|
end
|
369
|
+
|
370
|
+
class CLDRPluralsConverter
|
371
|
+
def initialize(language)
|
372
|
+
@language = language
|
373
|
+
|
374
|
+
end
|
375
|
+
|
376
|
+
def convert
|
377
|
+
n_plurals = nil
|
378
|
+
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
|
384
|
+
end
|
385
|
+
"nplurals=#{n_plurals}; plural=#{expression};"
|
386
|
+
end
|
387
|
+
|
388
|
+
private
|
389
|
+
def convert_plural_rules(rules)
|
390
|
+
n_plurals = 1
|
391
|
+
conditions = []
|
392
|
+
order = [
|
393
|
+
"one",
|
394
|
+
"zero",
|
395
|
+
"two",
|
396
|
+
"few",
|
397
|
+
"many",
|
398
|
+
"other",
|
399
|
+
]
|
400
|
+
rules = rules.reject do |rule|
|
401
|
+
rule.integer_samples.nil?
|
402
|
+
end
|
403
|
+
rules = rules.sort_by do |rule|
|
404
|
+
order.index(rule.count)
|
405
|
+
end
|
406
|
+
rules[0..-2].each do |rule|
|
407
|
+
next if rule.condition.nil?
|
408
|
+
condition = convert_plural_condition(rule.condition)
|
409
|
+
next if condition.nil?
|
410
|
+
next if condition == false
|
411
|
+
n_plurals += 1
|
412
|
+
conditions << condition
|
413
|
+
end
|
414
|
+
expression = ""
|
415
|
+
case conditions.size
|
416
|
+
when 0
|
417
|
+
expression << "0"
|
418
|
+
when 1
|
419
|
+
condition = conditions[0]
|
420
|
+
case condition
|
421
|
+
when "(n == 1)"
|
422
|
+
expression << "n != 1"
|
423
|
+
when "(n <= 1)"
|
424
|
+
expression << "n > 1"
|
425
|
+
else
|
426
|
+
expression << "#{condition} ? 1 : 0"
|
427
|
+
end
|
428
|
+
else
|
429
|
+
(conditions.size + 1).times do |i|
|
430
|
+
if i == conditions.size
|
431
|
+
expression << i.to_s
|
432
|
+
else
|
433
|
+
condition = conditions[i]
|
434
|
+
expression << "#{condition} ? #{i} : "
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
[n_plurals, expression]
|
439
|
+
end
|
440
|
+
|
441
|
+
def convert_plural_condition(condition)
|
442
|
+
case condition[0]
|
443
|
+
when :and
|
444
|
+
gettext_condition = nil
|
445
|
+
condition[1..-1].each do |sub_condition|
|
446
|
+
sub_gettext_condition = convert_plural_condition(sub_condition)
|
447
|
+
case sub_gettext_condition
|
448
|
+
when String
|
449
|
+
if gettext_condition.is_a?(String)
|
450
|
+
gettext_condition << " && #{sub_gettext_condition}"
|
451
|
+
else
|
452
|
+
gettext_condition = sub_gettext_condition
|
453
|
+
end
|
454
|
+
when TrueClass
|
455
|
+
unless gettext_condition.is_a?(String)
|
456
|
+
gettext_condition = true
|
457
|
+
end
|
458
|
+
when FalseClass
|
459
|
+
return false
|
460
|
+
else
|
461
|
+
raise "unknown value #{sub_gettext_condition.inspect}"
|
462
|
+
end
|
463
|
+
end
|
464
|
+
gettext_condition
|
465
|
+
when :or
|
466
|
+
gettext_condition = false
|
467
|
+
condition[1..-1].each do |sub_condition|
|
468
|
+
sub_gettext_condition = convert_plural_condition(sub_condition)
|
469
|
+
case sub_gettext_condition
|
470
|
+
when String
|
471
|
+
if gettext_condition.is_a?(String)
|
472
|
+
gettext_condition << " || #{sub_gettext_condition}"
|
473
|
+
else
|
474
|
+
gettext_condition = sub_gettext_condition
|
475
|
+
end
|
476
|
+
when TrueClass
|
477
|
+
return true
|
478
|
+
when FalseClass
|
479
|
+
else
|
480
|
+
raise "unknown value #{sub_gettext_condition.inspect}"
|
481
|
+
end
|
482
|
+
end
|
483
|
+
gettext_condition
|
484
|
+
when :equal
|
485
|
+
left = convert_plural_condition(condition[1])
|
486
|
+
right = condition[2]
|
487
|
+
case left
|
488
|
+
when String
|
489
|
+
right = compact_equal_values(right)
|
490
|
+
gettext_conditions = right.collect do |right_value|
|
491
|
+
case right_value
|
492
|
+
when Range
|
493
|
+
if right_value.begin.zero?
|
494
|
+
"(#{left} <= #{right_value.end})"
|
495
|
+
else
|
496
|
+
"(#{left} >= #{right_value.begin} && " +
|
497
|
+
"#{left} <= #{right_value.end})"
|
498
|
+
end
|
499
|
+
else
|
500
|
+
"(#{left} == #{right_value})"
|
501
|
+
end
|
502
|
+
end
|
503
|
+
if gettext_conditions.size == 1
|
504
|
+
gettext_conditions[0]
|
505
|
+
else
|
506
|
+
gettext_conditions.join(" || ")
|
507
|
+
end
|
508
|
+
when 0
|
509
|
+
if right.include?(0)
|
510
|
+
true
|
511
|
+
else
|
512
|
+
false
|
513
|
+
end
|
514
|
+
else
|
515
|
+
false
|
516
|
+
end
|
517
|
+
when :not_equal
|
518
|
+
left = convert_plural_condition(condition[1])
|
519
|
+
right = condition[2]
|
520
|
+
case left
|
521
|
+
when String
|
522
|
+
right = compact_equal_values(right)
|
523
|
+
gettext_conditions = right.collect do |right_value|
|
524
|
+
case right_value
|
525
|
+
when Range
|
526
|
+
"(#{left} < #{right_value.begin} || " +
|
527
|
+
"#{left} > #{right_value.end})"
|
528
|
+
else
|
529
|
+
"(#{left} != #{right_value})"
|
530
|
+
end
|
531
|
+
end
|
532
|
+
if gettext_conditions.size == 1
|
533
|
+
gettext_conditions[0]
|
534
|
+
else
|
535
|
+
gettext_conditions = gettext_conditions.collect do |gettext_condition|
|
536
|
+
"(#{gettext_condition})"
|
537
|
+
end
|
538
|
+
gettext_conditions.join(" && ")
|
539
|
+
end
|
540
|
+
when 0
|
541
|
+
if right.include?(0)
|
542
|
+
false
|
543
|
+
else
|
544
|
+
true
|
545
|
+
end
|
546
|
+
else
|
547
|
+
false
|
548
|
+
end
|
549
|
+
when :mod
|
550
|
+
left = convert_plural_condition(condition[1])
|
551
|
+
right = condition[2]
|
552
|
+
case left
|
553
|
+
when "n"
|
554
|
+
"(n % #{right})"
|
555
|
+
else
|
556
|
+
false
|
557
|
+
end
|
558
|
+
when "n", "i"
|
559
|
+
"n"
|
560
|
+
when "v", "w"
|
561
|
+
0
|
562
|
+
when "f", "t", "c", "e"
|
563
|
+
false
|
564
|
+
else
|
565
|
+
raise "unknown operator: #{condition[0].inspect}"
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
def compact_equal_values(values)
|
570
|
+
if values == [0, 1]
|
571
|
+
[0..1]
|
572
|
+
else
|
573
|
+
values
|
574
|
+
end
|
575
|
+
end
|
576
|
+
end
|
411
577
|
end
|
412
578
|
end
|
413
579
|
end
|
@@ -1,14 +1,20 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
# Copyright (C) 2004,2005 Masao Mutoh
|
2
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
#
|
4
|
+
# License: Ruby's or LGPL
|
5
|
+
#
|
6
|
+
# This library is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
12
18
|
|
13
19
|
require 'cgi'
|
14
20
|
require 'gettext'
|
@@ -24,15 +30,11 @@ module GetText
|
|
24
30
|
GLADE_RE = /glade-2.0.dtd/
|
25
31
|
|
26
32
|
def target?(file) # :nodoc:
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
raise _("`%{file}' is not glade-2.0 format.") % {:file => file}
|
33
|
-
end
|
34
|
-
false
|
35
|
-
end
|
33
|
+
return false unless File.extname(file) == ".glade"
|
34
|
+
data = File.read(file)
|
35
|
+
return false unless data.include?("<?xml")
|
36
|
+
return false unless data.include?("glade-2.0.dtd")
|
37
|
+
true
|
36
38
|
end
|
37
39
|
|
38
40
|
def parse(path, options={})
|
@@ -57,7 +59,7 @@ module GetText
|
|
57
59
|
|
58
60
|
private
|
59
61
|
def parse_source(input) # :nodoc:
|
60
|
-
|
62
|
+
po = []
|
61
63
|
target = false
|
62
64
|
start_line_no = nil
|
63
65
|
val = nil
|
@@ -69,14 +71,14 @@ module GetText
|
|
69
71
|
target = true
|
70
72
|
if TARGET2 =~ $1
|
71
73
|
val = $1
|
72
|
-
|
74
|
+
add_po_entry(po, val, start_line_no)
|
73
75
|
val = nil
|
74
76
|
target = false
|
75
77
|
end
|
76
78
|
elsif target
|
77
79
|
if TARGET2 =~ line
|
78
80
|
val << $1
|
79
|
-
|
81
|
+
add_po_entry(po, val, start_line_no)
|
80
82
|
val = nil
|
81
83
|
target = false
|
82
84
|
else
|
@@ -84,26 +86,22 @@ module GetText
|
|
84
86
|
end
|
85
87
|
end
|
86
88
|
end
|
87
|
-
|
89
|
+
po
|
88
90
|
end
|
89
91
|
|
90
|
-
def
|
91
|
-
return
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
else
|
97
|
-
targets << [val.gsub(/\n/, '\n'), "#{@path}:#{line_no}"]
|
92
|
+
def add_po_entry(po, value, line_no) # :nodoc:
|
93
|
+
return if value.empty?
|
94
|
+
value = CGI.unescapeHTML(value)
|
95
|
+
value = value.gsub(/\n/, "\n")
|
96
|
+
po_entry = po.find do |entry|
|
97
|
+
entry.msgid == value
|
98
98
|
end
|
99
|
-
|
99
|
+
if po_entry.nil?
|
100
|
+
po_entry = POEntry.new(:normal)
|
101
|
+
po_entry.msgid = value
|
102
|
+
po << po_entry
|
103
|
+
end
|
104
|
+
po_entry.references << "#{@path}:#{line_no}"
|
100
105
|
end
|
101
106
|
end
|
102
107
|
end
|
103
|
-
|
104
|
-
if __FILE__ == $0
|
105
|
-
# ex) ruby glade.rb foo.glade bar.glade
|
106
|
-
ARGV.each do |file|
|
107
|
-
p GetText::GladeParser.parse(file)
|
108
|
-
end
|
109
|
-
end
|