gettext 3.3.3 → 3.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -0
  3. data/doc/text/news.md +231 -0
  4. data/gettext.gemspec +1 -1
  5. data/lib/gettext/locale_path.rb +12 -8
  6. data/lib/gettext/mo.rb +7 -5
  7. data/lib/gettext/tools/msginit.rb +216 -50
  8. data/lib/gettext/tools/msgmerge.rb +13 -0
  9. data/lib/gettext/tools/parser/erb.rb +9 -1
  10. data/lib/gettext/tools/parser/glade.rb +38 -40
  11. data/lib/gettext/tools/parser/gtk_builder_ui_definitions.rb +6 -6
  12. data/lib/gettext/tools/parser/ruby.rb +50 -29
  13. data/lib/gettext/version.rb +2 -2
  14. data/locale/bg/LC_MESSAGES/gettext.mo +0 -0
  15. data/locale/bs/LC_MESSAGES/gettext.mo +0 -0
  16. data/locale/ca/LC_MESSAGES/gettext.mo +0 -0
  17. data/locale/cs/LC_MESSAGES/gettext.mo +0 -0
  18. data/locale/de/LC_MESSAGES/gettext.mo +0 -0
  19. data/locale/el/LC_MESSAGES/gettext.mo +0 -0
  20. data/locale/eo/LC_MESSAGES/gettext.mo +0 -0
  21. data/locale/es/LC_MESSAGES/gettext.mo +0 -0
  22. data/locale/et/LC_MESSAGES/gettext.mo +0 -0
  23. data/locale/fr/LC_MESSAGES/gettext.mo +0 -0
  24. data/locale/hr/LC_MESSAGES/gettext.mo +0 -0
  25. data/locale/hu/LC_MESSAGES/gettext.mo +0 -0
  26. data/locale/it/LC_MESSAGES/gettext.mo +0 -0
  27. data/locale/ja/LC_MESSAGES/gettext.mo +0 -0
  28. data/locale/ko/LC_MESSAGES/gettext.mo +0 -0
  29. data/locale/lv/LC_MESSAGES/gettext.mo +0 -0
  30. data/locale/nb/LC_MESSAGES/gettext.mo +0 -0
  31. data/locale/nl/LC_MESSAGES/gettext.mo +0 -0
  32. data/locale/pt_BR/LC_MESSAGES/gettext.mo +0 -0
  33. data/locale/ru/LC_MESSAGES/gettext.mo +0 -0
  34. data/locale/sr/LC_MESSAGES/gettext.mo +0 -0
  35. data/locale/uk/LC_MESSAGES/gettext.mo +0 -0
  36. data/locale/vi/LC_MESSAGES/gettext.mo +0 -0
  37. data/locale/zh/LC_MESSAGES/gettext.mo +0 -0
  38. data/locale/zh_TW/LC_MESSAGES/gettext.mo +0 -0
  39. data/po/bg/gettext.edit.po +36 -554
  40. data/po/bg/gettext.po +0 -423
  41. data/po/bs/gettext.edit.po +36 -554
  42. data/po/bs/gettext.po +0 -423
  43. data/po/ca/gettext.edit.po +36 -554
  44. data/po/ca/gettext.po +0 -423
  45. data/po/cs/gettext.edit.po +36 -554
  46. data/po/cs/gettext.po +0 -423
  47. data/po/de/gettext.edit.po +36 -554
  48. data/po/de/gettext.po +0 -423
  49. data/po/el/gettext.edit.po +36 -554
  50. data/po/el/gettext.po +0 -423
  51. data/po/eo/gettext.edit.po +36 -554
  52. data/po/eo/gettext.po +0 -423
  53. data/po/es/gettext.edit.po +36 -554
  54. data/po/es/gettext.po +0 -423
  55. data/po/et/gettext.edit.po +36 -554
  56. data/po/et/gettext.po +0 -423
  57. data/po/fr/gettext.edit.po +36 -554
  58. data/po/fr/gettext.po +0 -423
  59. data/po/gettext.pot +37 -619
  60. data/po/hr/gettext.edit.po +36 -554
  61. data/po/hr/gettext.po +0 -423
  62. data/po/hu/gettext.edit.po +36 -554
  63. data/po/hu/gettext.po +0 -423
  64. data/po/it/gettext.edit.po +36 -554
  65. data/po/it/gettext.po +0 -423
  66. data/po/ja/gettext.edit.po +36 -554
  67. data/po/ja/gettext.po +0 -423
  68. data/po/ko/gettext.edit.po +36 -554
  69. data/po/ko/gettext.po +0 -423
  70. data/po/lv/gettext.edit.po +36 -554
  71. data/po/lv/gettext.po +0 -423
  72. data/po/nb/gettext.edit.po +36 -554
  73. data/po/nb/gettext.po +0 -423
  74. data/po/nl/gettext.edit.po +36 -554
  75. data/po/nl/gettext.po +0 -423
  76. data/po/pt_BR/gettext.edit.po +36 -554
  77. data/po/pt_BR/gettext.po +0 -423
  78. data/po/ru/gettext.edit.po +36 -554
  79. data/po/ru/gettext.po +0 -423
  80. data/po/sr/gettext.edit.po +36 -554
  81. data/po/sr/gettext.po +0 -423
  82. data/po/sv/gettext.edit.po +34 -555
  83. data/po/sv/gettext.po +0 -423
  84. data/po/uk/gettext.edit.po +36 -554
  85. data/po/uk/gettext.po +0 -423
  86. data/po/vi/gettext.edit.po +36 -554
  87. data/po/vi/gettext.po +0 -423
  88. data/po/zh/gettext.edit.po +36 -554
  89. data/po/zh/gettext.po +0 -423
  90. data/po/zh_TW/gettext.edit.po +36 -554
  91. data/po/zh_TW/gettext.po +0 -423
  92. data/test/fixtures/_.rb +1 -1
  93. data/test/fixtures/_/pipe.rb +32 -0
  94. data/test/fixtures/erb/minus.rhtml +12 -0
  95. data/test/fixtures/{gladeparser.glade → glade/2.glade} +0 -0
  96. data/test/fixtures/glade/3.glade +63 -0
  97. data/test/fixtures/gtk_builder_ui_definitions.ui~ +68 -0
  98. data/test/fixtures/multi_text_domain.rb +12 -12
  99. data/test/fixtures/np_.rb +1 -1
  100. data/test/fixtures/ns_.rb +1 -1
  101. data/test/fixtures/p_.rb +1 -1
  102. data/test/fixtures/ruby/percent_lower_i.rb +1 -0
  103. data/test/fixtures/ruby/percent_lower_w.rb +1 -0
  104. data/test/fixtures/ruby/percent_upper_i.rb +1 -0
  105. data/test/fixtures/ruby/percent_upper_w.rb +1 -0
  106. data/test/fixtures/s_.rb +1 -1
  107. data/test/fixtures/simple.rb +1 -1
  108. data/test/fixtures/upper_nn_.rb +77 -0
  109. data/test/po/_.pot +20 -4
  110. data/test/po/ja/_.edit.po +24 -0
  111. data/test/po/np_.pot +8 -5
  112. data/test/po/ns_.pot +6 -4
  113. data/test/po/p_.pot +3 -3
  114. data/test/po/s_.pot +6 -4
  115. data/test/run-test.rb +0 -1
  116. data/test/test_parser.rb +42 -17
  117. data/test/tools/parser/test_glade.rb +91 -0
  118. data/test/tools/parser/test_gtk_builder_ui_definitions.rb +19 -1
  119. data/test/tools/parser/test_ruby.rb +42 -0
  120. data/test/tools/test_msginit.rb +77 -3
  121. data/test/tools/test_msgmerge.rb +34 -0
  122. metadata +37 -28
@@ -49,6 +49,7 @@ module GetText
49
49
  config.parse(command_line)
50
50
 
51
51
  parser = POParser.new
52
+ parser.report_warning = config.report_warning?
52
53
  parser.ignore_fuzzy = false
53
54
  definition_po = PO.new
54
55
  reference_pot = PO.new
@@ -313,6 +314,7 @@ module GetText
313
314
  }
314
315
  @enable_fuzzy_matching = true
315
316
  @update = nil
317
+ @report_warning = true
316
318
  @output_obsolete_entries = true
317
319
  @backup = ENV["VERSION_CONTROL"]
318
320
  @suffix = ENV["SIMPLE_BACKUP_SUFFIX"] || "~"
@@ -337,6 +339,12 @@ module GetText
337
339
  @enable_fuzzy_matching
338
340
  end
339
341
 
342
+ # @return [Bool] true if reporting warning is enabled,
343
+ # false otherwise.
344
+ def report_warning?
345
+ @report_warning
346
+ end
347
+
340
348
  # @return [Bool] true if outputting obsolete entries is
341
349
  # enabled, false otherwise.
342
350
  def output_obsolete_entries?
@@ -422,6 +430,11 @@ module GetText
422
430
  @enable_fuzzy_matching = boolean
423
431
  end
424
432
 
433
+ parser.on("--no-report-warning",
434
+ _("Don't report warning messages")) do |report_warning|
435
+ @report_warning = report_warning
436
+ end
437
+
425
438
  parser.on("--no-obsolete-entries",
426
439
  _("Don't output obsolete entries")) do |boolean|
427
440
  @output_obsolete_entries = boolean
@@ -57,12 +57,20 @@ module GetText
57
57
  @options = options
58
58
  end
59
59
 
60
+ @@erb_accept_keyword_arguments =
61
+ ERB.instance_method(:initialize).parameters.any? {|type, _| type == :key}
62
+
60
63
  # Extracts messages from @path.
61
64
  #
62
65
  # @return [Array<POEntry>] Extracted messages
63
66
  def parse
64
67
  content = IO.read(@path)
65
- src = ERB.new(content).src
68
+ if @@erb_accept_keyword_arguments
69
+ erb = ERB.new(content, trim_mode: "-")
70
+ else
71
+ erb = ERB.new(content, nil, "-")
72
+ end
73
+ src = erb.src
66
74
 
67
75
  # Force the src encoding back to the encoding in magic comment
68
76
  # or original content.
@@ -1,14 +1,20 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- =begin
4
- parser/glade.rb - parser for Glade-2
5
-
6
- Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
7
- Copyright (C) 2004,2005 Masao Mutoh
8
-
9
- You may redistribute it and/or modify it under the same
10
- license terms as Ruby or LGPL.
11
- =end
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
- data = IO.readlines(file)
28
- if XML_RE =~ data[0] and GLADE_RE =~ data[1]
29
- true
30
- else
31
- if File.extname(file) == '.glade'
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
- targets = []
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
- add_target(val, start_line_no, targets)
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
- add_target(val, start_line_no, targets)
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
- targets
89
+ po
88
90
  end
89
91
 
90
- def add_target(val, line_no, targets) # :nodoc:
91
- return unless val.size > 0
92
- assoc_data = targets.assoc(val)
93
- val = CGI.unescapeHTML(val)
94
- if assoc_data
95
- targets[targets.index(assoc_data)] = assoc_data << "#{@path}:#{line_no}"
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
- targets
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
@@ -24,13 +24,14 @@ require "gettext/po_entry"
24
24
  module GetText
25
25
  class GtkBuilderUIDefinitionsParser
26
26
  @config = {
27
- :extnames => [".ui"]
27
+ :extnames => [".ui", ".glade"]
28
28
  }
29
29
 
30
30
  class << self
31
31
  # Sets some preferences to parse GtkBuilder UI definitions files.
32
32
  # * config: a Hash of the config. It can takes some values below:
33
- # * :extnames: An Array of target files extension. Default is [".ui"].
33
+ # * :extnames: An Array of target files extension.
34
+ # Default is [".ui", ".glade"].
34
35
  def init(config)
35
36
  config.each do |k, v|
36
37
  @config[k] = v
@@ -39,7 +40,9 @@ module GetText
39
40
 
40
41
  def target?(file) # :nodoc:
41
42
  @config[:extnames].each do |extname|
42
- return true if File.extname(file) == extname
43
+ next unless File.extname(file) == extname
44
+ next unless File.read(file).include?("<interface>")
45
+ return true
43
46
  end
44
47
  false
45
48
  end
@@ -50,9 +53,6 @@ module GetText
50
53
  end
51
54
  end
52
55
 
53
- TARGET1 = /<property.*translatable="yes">(.*)/
54
- TARGET2 = /(.*)<\/property>/
55
-
56
56
  def initialize(path, options={})
57
57
  @path = path
58
58
  @options = options
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  parser/ruby.rb - parser for ruby script
3
3
 
4
- Copyright (C) 2013-2019 Sutou Kouhei <kou@clear-code.com>
4
+ Copyright (C) 2013-2021 Sutou Kouhei <kou@clear-code.com>
5
5
  Copyright (C) 2003-2009 Masao Mutoh
6
6
  Copyright (C) 2005 speakillof
7
7
  Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh
@@ -28,9 +28,9 @@ module GetText
28
28
  attr_accessor :comment_tag
29
29
  def initialize(*args)
30
30
  super(*args)
31
+ @start_block = false
31
32
  @in_block_arguments = false
32
33
  @ignore_next_comma = false
33
- @context_stack = []
34
34
  @need_definition_name = false
35
35
  @current_po_entry = nil
36
36
  @current_po_entry_nth_attribute = 0
@@ -43,28 +43,31 @@ module GetText
43
43
  end
44
44
 
45
45
  def process_on_op(token, po)
46
- @in_block_arguments = !@in_block_arguments if token == "|"
46
+ if @start_block
47
+ @in_block_arguments = (token == "|")
48
+ else
49
+ if @in_block_arguments and token == "|"
50
+ @in_block_arguments = false
51
+ end
52
+ end
47
53
  po
48
54
  end
49
55
 
50
56
  def process_on_kw(token, po)
51
57
  store_po_entry(po)
52
58
  case token
53
- when "begin", "case", "do", "for"
54
- @context_stack.push(token)
55
- when "class", "def", "module"
56
- @context_stack.push(token)
57
- when "if", "unless", "until", "while"
58
- # postfix case
59
- unless state.allbits?(Ripper::EXPR_LABEL)
60
- @context_stack.push(token)
61
- end
62
- when "end"
63
- @context_stack.pop
59
+ when "do"
60
+ @start_block = true
64
61
  end
65
62
  po
66
63
  end
67
64
 
65
+ def process_on_lbrace(token, po)
66
+ store_po_entry(po)
67
+ @start_block = (state == Ripper::EXPR_BEG)
68
+ po
69
+ end
70
+
68
71
  def process_on_ident(token, po)
69
72
  store_po_entry(po)
70
73
 
@@ -92,7 +95,7 @@ module GetText
92
95
 
93
96
  def process_on_const(token, po)
94
97
  case token
95
- when "N_"," Nn_"
98
+ when "N_", "Nn_"
96
99
  # TODO: Check the next token is :on_lparen
97
100
  process_on_ident(token, po)
98
101
  else
@@ -203,18 +206,18 @@ module GetText
203
206
  po
204
207
  end
205
208
 
206
- def process_on_embexpr_beg(token, po)
207
- @current_po_entry = nil
208
- @current_po_entry_nth_attribute = 0
209
- po
210
- end
211
-
212
209
  def process_on_regexp_end(token, po)
213
210
  @string_mark_stack.pop
214
211
  @string_stack.pop
215
212
  po
216
213
  end
217
214
 
215
+ def process_on_embexpr_beg(token, po)
216
+ @current_po_entry = nil
217
+ @current_po_entry_nth_attribute = 0
218
+ po
219
+ end
220
+
218
221
  def process_on_int(token, po)
219
222
  @ignore_next_comma = true
220
223
  po
@@ -247,14 +250,14 @@ module GetText
247
250
  po
248
251
  end
249
252
 
250
- def process_on_symbols_beg(token, po)
251
- @string_mark_stack << "\""
253
+ def process_on_backtick(token, po)
254
+ @string_mark_stack << "`"
252
255
  @string_stack << ""
253
256
  po
254
257
  end
255
258
 
256
- def process_on_backtick(token, po)
257
- @string_mark_stack << "`"
259
+ def process_on_symbols_beg(token, po)
260
+ @string_mark_stack << "\""
258
261
  @string_stack << ""
259
262
  po
260
263
  end
@@ -265,6 +268,12 @@ module GetText
265
268
  po
266
269
  end
267
270
 
271
+ def process_on_words_beg(token, po)
272
+ @string_mark_stack << "\""
273
+ @string_stack << ""
274
+ po
275
+ end
276
+
268
277
  def process_on_qwords_beg(token, po)
269
278
  @string_mark_stack << token
270
279
  @string_stack << ""
@@ -274,11 +283,14 @@ module GetText
274
283
  def on_default(event, token, po)
275
284
  trace(event, token) do
276
285
  process_method = "process_#{event}"
286
+ start_block = @start_block
277
287
  if respond_to?(process_method)
278
- __send__(process_method, token, po)
279
- else
280
- po
288
+ po = __send__(process_method, token, po)
289
+ end
290
+ if start_block and event != :on_sp
291
+ @start_block = false
281
292
  end
293
+ po
282
294
  end
283
295
  end
284
296
 
@@ -289,7 +301,16 @@ module GetText
289
301
  end
290
302
 
291
303
  def trace(event_name, token)
292
- pp [event_name, token, state, @context_stack.last] if debug?
304
+ if debug?
305
+ status = [
306
+ event_name,
307
+ token,
308
+ state,
309
+ ]
310
+ status << :start_block if @start_block
311
+ status << :in_block_arguments if @in_block_arguments
312
+ pp status
313
+ end
293
314
  yield
294
315
  end
295
316
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  version - version information of gettext
3
3
 
4
- Copyright (C) 2012-2020 Sutou Kouhei <kou@clear-code.com>
4
+ Copyright (C) 2012-2021 Sutou Kouhei <kou@clear-code.com>
5
5
  Copyright (C) 2005-2009 Masao Mutoh
6
6
 
7
7
  You may redistribute it and/or modify it under the same
@@ -9,5 +9,5 @@
9
9
  =end
10
10
 
11
11
  module GetText
12
- VERSION = "3.3.3"
12
+ VERSION = "3.3.8"
13
13
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file