gettext 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/README.rdoc +10 -6
  2. data/Rakefile +15 -66
  3. data/data/locale/bg/LC_MESSAGES/rgettext.mo +0 -0
  4. data/data/locale/bs/LC_MESSAGES/rgettext.mo +0 -0
  5. data/data/locale/ca/LC_MESSAGES/rgettext.mo +0 -0
  6. data/data/locale/cs/LC_MESSAGES/rgettext.mo +0 -0
  7. data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
  8. data/data/locale/el/LC_MESSAGES/rgettext.mo +0 -0
  9. data/data/locale/eo/LC_MESSAGES/rgettext.mo +0 -0
  10. data/data/locale/es/LC_MESSAGES/rgettext.mo +0 -0
  11. data/data/locale/et/LC_MESSAGES/rgettext.mo +0 -0
  12. data/data/locale/fr/LC_MESSAGES/rgettext.mo +0 -0
  13. data/data/locale/hr/LC_MESSAGES/rgettext.mo +0 -0
  14. data/data/locale/hu/LC_MESSAGES/rgettext.mo +0 -0
  15. data/data/locale/it/LC_MESSAGES/rgettext.mo +0 -0
  16. data/data/locale/ja/LC_MESSAGES/rgettext.mo +0 -0
  17. data/data/locale/ko/LC_MESSAGES/rgettext.mo +0 -0
  18. data/data/locale/lv/LC_MESSAGES/rgettext.mo +0 -0
  19. data/data/locale/nb/LC_MESSAGES/rgettext.mo +0 -0
  20. data/data/locale/nl/LC_MESSAGES/rgettext.mo +0 -0
  21. data/data/locale/pt_BR/LC_MESSAGES/rgettext.mo +0 -0
  22. data/data/locale/ru/LC_MESSAGES/rgettext.mo +0 -0
  23. data/data/locale/sr/LC_MESSAGES/rgettext.mo +0 -0
  24. data/data/locale/sv/LC_MESSAGES/rgettext.mo +0 -0
  25. data/data/locale/uk/LC_MESSAGES/rgettext.mo +0 -0
  26. data/data/locale/vi/LC_MESSAGES/rgettext.mo +0 -0
  27. data/data/locale/zh/LC_MESSAGES/rgettext.mo +0 -0
  28. data/data/locale/zh_TW/LC_MESSAGES/rgettext.mo +0 -0
  29. data/doc/text/news.md +30 -0
  30. data/gettext.gemspec +26 -34
  31. data/lib/gettext.rb +26 -24
  32. data/lib/gettext/cgi.rb +2 -0
  33. data/lib/gettext/core_ext/iconv.rb +7 -7
  34. data/lib/gettext/core_ext/string.rb +8 -6
  35. data/lib/gettext/parser/erb.rb +2 -0
  36. data/lib/gettext/parser/glade.rb +2 -0
  37. data/lib/gettext/parser/ruby.rb +12 -12
  38. data/lib/gettext/runtime/class_info.rb +5 -3
  39. data/lib/gettext/runtime/locale_path.rb +20 -22
  40. data/lib/gettext/runtime/mofile.rb +45 -18
  41. data/lib/gettext/runtime/textdomain.rb +6 -4
  42. data/lib/gettext/runtime/textdomain_group.rb +3 -1
  43. data/lib/gettext/runtime/textdomain_manager.rb +29 -26
  44. data/lib/gettext/tools.rb +15 -13
  45. data/lib/gettext/tools/parser/erb.rb +5 -3
  46. data/lib/gettext/tools/parser/glade.rb +16 -14
  47. data/lib/gettext/tools/parser/ruby.rb +16 -16
  48. data/lib/gettext/tools/pomessage.rb +9 -7
  49. data/lib/gettext/tools/poparser.rb +38 -36
  50. data/lib/gettext/tools/rgettext.rb +38 -13
  51. data/lib/gettext/tools/rmsgfmt.rb +7 -5
  52. data/lib/gettext/tools/rmsgmerge.rb +116 -114
  53. data/lib/gettext/utils.rb +2 -0
  54. data/lib/gettext/version.rb +3 -3
  55. data/po/bg/rgettext.po +17 -12
  56. data/po/bs/rgettext.po +16 -12
  57. data/po/ca/rgettext.po +17 -12
  58. data/po/cs/rgettext.po +16 -12
  59. data/po/de/rgettext.po +17 -12
  60. data/po/el/rgettext.po +17 -12
  61. data/po/eo/rgettext.po +17 -12
  62. data/po/es/rgettext.po +17 -12
  63. data/po/et/rgettext.po +17 -12
  64. data/po/fr/rgettext.po +17 -12
  65. data/po/hr/rgettext.po +19 -15
  66. data/po/hu/rgettext.po +17 -12
  67. data/po/it/rgettext.po +16 -12
  68. data/po/ja/rgettext.po +21 -15
  69. data/po/ko/rgettext.po +16 -12
  70. data/po/lv/rgettext.po +17 -12
  71. data/po/nb/rgettext.po +17 -12
  72. data/po/nl/rgettext.po +16 -12
  73. data/po/pt_BR/rgettext.po +17 -12
  74. data/po/rgettext.pot +16 -12
  75. data/po/ru/rgettext.po +17 -12
  76. data/po/sr/rgettext.po +17 -12
  77. data/po/sv/rgettext.po +16 -12
  78. data/po/{ua → uk}/rgettext.po +17 -12
  79. data/po/vi/rgettext.po +17 -12
  80. data/po/zh/rgettext.po +17 -12
  81. data/po/zh_TW/rgettext.po +17 -12
  82. data/samples/cgi/hellolib.rb +1 -1
  83. data/samples/cgi/http.rb +5 -5
  84. data/samples/cgi/locale/{ua → uk}/LC_MESSAGES/helloerb1.mo +0 -0
  85. data/samples/cgi/locale/{ua → uk}/LC_MESSAGES/helloerb2.mo +0 -0
  86. data/samples/cgi/locale/{ua → uk}/LC_MESSAGES/hellolib.mo +0 -0
  87. data/samples/cgi/locale/{ua → uk}/LC_MESSAGES/main.mo +0 -0
  88. data/samples/cgi/po/{ua → uk}/helloerb1.po +0 -0
  89. data/samples/cgi/po/{ua → uk}/helloerb2.po +0 -0
  90. data/samples/cgi/po/{ua → uk}/hellolib.po +0 -0
  91. data/samples/cgi/po/{ua → uk}/main.po +0 -0
  92. data/samples/hello.rb +1 -1
  93. data/samples/hello_gtk2.rb +1 -1
  94. data/samples/hello_noop.rb +1 -1
  95. data/samples/locale/{ua → uk}/LC_MESSAGES/hello.mo +0 -0
  96. data/samples/locale/{ua → uk}/LC_MESSAGES/hello2.mo +0 -0
  97. data/samples/locale/{ua → uk}/LC_MESSAGES/hello_glade2.mo +0 -0
  98. data/samples/locale/{ua → uk}/LC_MESSAGES/hello_gtk.mo +0 -0
  99. data/samples/locale/{ua → uk}/LC_MESSAGES/hello_noop.mo +0 -0
  100. data/samples/locale/{ua → uk}/LC_MESSAGES/hello_plural.mo +0 -0
  101. data/samples/locale/{ua → uk}/LC_MESSAGES/hello_tk.mo +0 -0
  102. data/samples/makemo.rb +2 -0
  103. data/samples/po/test.rb +2 -0
  104. data/samples/po/{ua → uk}/hello.po +0 -0
  105. data/samples/po/{ua → uk}/hello2.po +0 -0
  106. data/samples/po/{ua → uk}/hello_glade2.po +0 -0
  107. data/samples/po/{ua → uk}/hello_gtk.po +0 -0
  108. data/samples/po/{ua → uk}/hello_noop.po +0 -0
  109. data/samples/po/{ua → uk}/hello_plural.po +0 -0
  110. data/samples/po/{ua → uk}/hello_tk.po +0 -0
  111. data/test/Rakefile +1 -1
  112. data/test/test_class_info.rb +5 -0
  113. data/test/test_gettext.rb +12 -1
  114. data/test/test_locale_path.rb +29 -3
  115. data/test/test_parser.rb +61 -59
  116. data/test/test_po_generation.rb +3 -1
  117. data/test/test_pomessage.rb +4 -2
  118. data/test/test_string.rb +2 -0
  119. data/test/test_textdomain_bind.rb +2 -0
  120. data/test/test_textdomain_multi.rb +2 -0
  121. data/test/test_textdomain_toplevel.rb +2 -0
  122. data/test/test_thread.rb +4 -2
  123. data/test/testlib/N_.rb +5 -3
  124. data/test/testlib/gettext.rb +4 -2
  125. data/test/testlib/helper.rb +2 -0
  126. data/test/testlib/multi_textdomain.rb +2 -0
  127. data/test/testlib/ngettext.rb +10 -8
  128. data/test/testlib/npgettext.rb +9 -7
  129. data/test/testlib/nsgettext.rb +4 -2
  130. data/test/testlib/pgettext.rb +4 -2
  131. data/test/testlib/sgettext.rb +4 -2
  132. data/test/testlib/simple.rb +2 -0
  133. data/test/tools/files/simple_translation.rb +3 -1
  134. data/test/tools/test_tools.rb +3 -1
  135. metadata +772 -737
  136. data/ChangeLog +0 -78
  137. data/ChangeLog-1 +0 -2016
  138. data/NEWS-1 +0 -414
  139. data/benchmark/1.93.0.txt +0 -8
  140. data/benchmark/2.0.0.txt +0 -8
  141. data/benchmark/2.0.4.txt +0 -11
  142. data/benchmark/2.1.0.txt +0 -11
  143. data/benchmark/benchmark.rb +0 -68
  144. data/benchmark/test.rb +0 -28
  145. data/data/locale/ua/LC_MESSAGES/rgettext.mo +0 -0
  146. data/replace.rb +0 -8
  147. data/samples/cgi/po/bg/#main.po# +0 -84
  148. data/test.rb +0 -33
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  module GetText
2
4
  class ParseError < StandardError
3
5
  end
@@ -25,7 +27,7 @@ module GetText
25
27
  end
26
28
 
27
29
  # Required
28
- attr_accessor :type # :normal, :plural, :msgctxt, :msgctxt_plural
30
+ attr_accessor :type # :normal, :plural, :msgctxt, :msgctxt_plural
29
31
  attr_accessor :msgid
30
32
  # Options
31
33
  attr_accessor :msgid_plural
@@ -33,7 +35,7 @@ module GetText
33
35
  attr_accessor :sources # ["file1:line1", "file2:line2", ...]
34
36
  attr_accessor :comment
35
37
 
36
- # Create the object. +type+ should be :normal, :plural, :msgctxt or :msgctxt_plural.
38
+ # Create the object. +type+ should be :normal, :plural, :msgctxt or :msgctxt_plural.
37
39
  def initialize(type)
38
40
  @type = type
39
41
  @sources = []
@@ -60,7 +62,7 @@ module GetText
60
62
  # Checks if the other translation target is mergeable with
61
63
  # the current one. Relevant are msgid and translation context (msgctxt).
62
64
  def ==(other)
63
- other.msgid == self.msgid && other.msgctxt == self.msgctxt
65
+ other && other.msgid == self.msgid && other.msgctxt == self.msgctxt
64
66
  end
65
67
 
66
68
  # Merges two translation targets with the same msgid and returns the merged
@@ -125,7 +127,7 @@ module GetText
125
127
  end
126
128
 
127
129
  # Returns true if the type is kind of msgctxt.
128
- # And if this is a kind of msgctxt and msgctxt property
130
+ # And if this is a kind of msgctxt and msgctxt property
129
131
  # is nil, then raise an RuntimeException.
130
132
  def msgctxt?
131
133
  if [:msgctxt, :msgctxt_plural].include? @type
@@ -135,7 +137,7 @@ module GetText
135
137
  end
136
138
 
137
139
  # Returns true if the type is kind of plural.
138
- # And if this is a kind of plural and msgid_plural property
140
+ # And if this is a kind of plural and msgid_plural property
139
141
  # is nil, then raise an RuntimeException.
140
142
  def plural?
141
143
  if [:plural, :msgctxt_plural].include? @type
@@ -164,7 +166,7 @@ module GetText
164
166
  type = :normal
165
167
  msgctxt = nil
166
168
  msgid_plural = nil
167
-
169
+
168
170
  if msgid.include? "\004"
169
171
  msgctxt, msgid = msgid.split(/\004/)
170
172
  type = :msgctxt
@@ -193,5 +195,5 @@ module GetText
193
195
  send param
194
196
  end
195
197
  end
196
-
198
+
197
199
  end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  =begin
2
4
  poparser.rb - Generate a .mo
3
5
 
@@ -28,7 +30,7 @@ module_eval(<<'...end poparser.ry/module_eval...', 'poparser.ry', 108)
28
30
  ret.gsub!(/\\"/, "\"")
29
31
  ret
30
32
  end
31
-
33
+
32
34
  def parse(str, data, ignore_fuzzy = true)
33
35
  @comments = []
34
36
  @data = data
@@ -41,39 +43,39 @@ module_eval(<<'...end poparser.ry/module_eval...', 'poparser.ry', 108)
41
43
  until str.empty? do
42
44
  case str
43
45
  when /\A\s+/
44
- str = $'
46
+ str = $'
45
47
  when /\Amsgctxt/
46
- @q.push [:MSGCTXT, $&]
47
- str = $'
48
+ @q.push [:MSGCTXT, $&]
49
+ str = $'
48
50
  when /\Amsgid_plural/
49
- @q.push [:MSGID_PLURAL, $&]
50
- str = $'
51
+ @q.push [:MSGID_PLURAL, $&]
52
+ str = $'
51
53
  when /\Amsgid/
52
- @q.push [:MSGID, $&]
53
- str = $'
54
+ @q.push [:MSGID, $&]
55
+ str = $'
54
56
  when /\Amsgstr/
55
- @q.push [:MSGSTR, $&]
56
- str = $'
57
+ @q.push [:MSGSTR, $&]
58
+ str = $'
57
59
  when /\A\[(\d+)\]/
58
- @q.push [:PLURAL_NUM, $1]
59
- str = $'
60
+ @q.push [:PLURAL_NUM, $1]
61
+ str = $'
60
62
  when /\A\#~(.*)/
61
- $stderr.print _("Warning: obsolete msgid exists.\n")
62
- $stderr.print " #{$&}\n"
63
- @q.push [:COMMENT, $&]
64
- str = $'
63
+ $stderr.print _("Warning: obsolete msgid exists.\n")
64
+ $stderr.print " #{$&}\n"
65
+ @q.push [:COMMENT, $&]
66
+ str = $'
65
67
  when /\A\#(.*)/
66
- @q.push [:COMMENT, $&]
67
- str = $'
68
+ @q.push [:COMMENT, $&]
69
+ str = $'
68
70
  when /\A\"(.*)\"/
69
- @q.push [:STRING, $1]
70
- str = $'
71
+ @q.push [:STRING, $1]
72
+ str = $'
71
73
  else
72
- #c = str[0,1]
73
- #@q.push [:STRING, c]
74
- str = str[1..-1]
74
+ #c = str[0,1]
75
+ #@q.push [:STRING, c]
76
+ str = str[1..-1]
75
77
  end
76
- end
78
+ end
77
79
  @q.push [false, '$end']
78
80
  if $DEBUG
79
81
  @q.each do |a,b|
@@ -88,7 +90,7 @@ module_eval(<<'...end poparser.ry/module_eval...', 'poparser.ry', 108)
88
90
  end
89
91
  @data
90
92
  end
91
-
93
+
92
94
  def next_token
93
95
  @q.shift
94
96
  end
@@ -101,11 +103,11 @@ module_eval(<<'...end poparser.ry/module_eval...', 'poparser.ry', 108)
101
103
  @comments.clear
102
104
  @msgctxt = ""
103
105
  end
104
-
106
+
105
107
  def on_comment(comment)
106
108
  @fuzzy = true if (/fuzzy/ =~ comment)
107
109
  @comments << comment
108
- end
110
+ end
109
111
 
110
112
  def parse_file(po_file, data, ignore_fuzzy = true)
111
113
  args = [ po_file ]
@@ -253,7 +255,7 @@ Racc_debug_parser = true
253
255
  module_eval(<<'.,.,', 'poparser.ry', 23)
254
256
  def _reduce_5(val, _values, result)
255
257
  @msgctxt = unescape(val[1]) + "\004"
256
-
258
+
257
259
  result
258
260
  end
259
261
  .,.,
@@ -264,7 +266,7 @@ module_eval(<<'.,.,', 'poparser.ry', 23)
264
266
 
265
267
  module_eval(<<'.,.,', 'poparser.ry', 35)
266
268
  def _reduce_8(val, _values, result)
267
- if @fuzzy and $ignore_fuzzy
269
+ if @fuzzy and $ignore_fuzzy
268
270
  if val[1] != ""
269
271
  $stderr.print _("Warning: fuzzy message was ignored.\n")
270
272
  $stderr.print " #{@po_file}: msgid '#{val[1]}'\n"
@@ -276,7 +278,7 @@ module_eval(<<'.,.,', 'poparser.ry', 35)
276
278
  on_message(@msgctxt + unescape(val[1]), unescape(val[3]))
277
279
  end
278
280
  result = ""
279
-
281
+
280
282
  result
281
283
  end
282
284
  .,.,
@@ -295,7 +297,7 @@ module_eval(<<'.,.,', 'poparser.ry', 52)
295
297
  on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4]))
296
298
  end
297
299
  result = ""
298
-
300
+
299
301
  result
300
302
  end
301
303
  .,.,
@@ -307,7 +309,7 @@ module_eval(<<'.,.,', 'poparser.ry', 70)
307
309
  else
308
310
  result = ""
309
311
  end
310
-
312
+
311
313
  result
312
314
  end
313
315
  .,.,
@@ -317,7 +319,7 @@ module_eval(<<'.,.,', 'poparser.ry', 70)
317
319
  module_eval(<<'.,.,', 'poparser.ry', 82)
318
320
  def _reduce_12(val, _values, result)
319
321
  result = val[2]
320
-
322
+
321
323
  result
322
324
  end
323
325
  .,.,
@@ -325,7 +327,7 @@ module_eval(<<'.,.,', 'poparser.ry', 82)
325
327
  module_eval(<<'.,.,', 'poparser.ry', 89)
326
328
  def _reduce_13(val, _values, result)
327
329
  on_comment(val[0])
328
-
330
+
329
331
  result
330
332
  end
331
333
  .,.,
@@ -333,7 +335,7 @@ module_eval(<<'.,.,', 'poparser.ry', 89)
333
335
  module_eval(<<'.,.,', 'poparser.ry', 97)
334
336
  def _reduce_14(val, _values, result)
335
337
  result = val.delete_if{|item| item == ""}.join
336
-
338
+
337
339
  result
338
340
  end
339
341
  .,.,
@@ -341,7 +343,7 @@ module_eval(<<'.,.,', 'poparser.ry', 97)
341
343
  module_eval(<<'.,.,', 'poparser.ry', 101)
342
344
  def _reduce_15(val, _values, result)
343
345
  result = val[0]
344
-
346
+
345
347
  result
346
348
  end
347
349
  .,.,
@@ -2,12 +2,12 @@
2
2
  =begin
3
3
  rgettext.rb - Generate a .pot file.
4
4
 
5
- Copyright (C) 2003-2009 Masao Mutoh
5
+ Copyright (C) 2003-2010 Masao Mutoh
6
6
  Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh
7
-
7
+
8
8
  Yasushi Shoji <yashi at atmark-techno.com>
9
9
  Masao Mutoh <mutomasa at gmail.com>
10
-
10
+
11
11
  You may redistribute it and/or modify it under the same
12
12
  license terms as Ruby or LGPL.
13
13
  =end
@@ -25,7 +25,7 @@ module GetText
25
25
 
26
26
  # constant values
27
27
  VERSION = GetText::VERSION
28
-
28
+
29
29
  @ex_parsers = []
30
30
  [
31
31
  ["glade.rb", "GladeParser"],
@@ -46,19 +46,45 @@ module GetText
46
46
 
47
47
  # Add an option parser
48
48
  # the option parser module requires to have target?(file) and parser(file, ary) method.
49
- #
49
+ #
50
50
  # require 'gettext/tools/rgettext'
51
51
  # module FooParser
52
52
  # module_function
53
53
  # def target?(file)
54
54
  # File.extname(file) == '.foo' # *.foo file only.
55
55
  # end
56
- # def parse(file, ary)
56
+ # def parse(file)
57
57
  # :
58
- # return ary # [["msgid1", "foo.rb:200"], ["msgid2", "bar.rb:300", "baz.rb:400"], ...]
58
+ # ary = []
59
+ # # Simple message
60
+ # po = PoMessage.new(:normal)
61
+ # po.msgid = "hello"
62
+ # po.sources = ["foo.rb:200", "bar.rb:300"]
63
+ # po.add_comment("Comment for the message")
64
+ # ary << po
65
+ # # Plural message
66
+ # po = PoMessage.new(:plural)
67
+ # po.msgid = "An apple"
68
+ # po.msgid_plural = "Apples"
69
+ # po.sources = ["foo.rb:200", "bar.rb:300"]
70
+ # ary << po
71
+ # # Simple message with the message context
72
+ # po = PoMessage.new(:msgctxt)
73
+ # po.msgctxt = "context"
74
+ # po.msgid = "hello"
75
+ # po.sources = ["foo.rb:200", "bar.rb:300"]
76
+ # ary << po
77
+ # # Plural message with the message context.
78
+ # po = PoMessage.new(:msgctxt_plural)
79
+ # po.msgctxt = "context"
80
+ # po.msgid = "An apple"
81
+ # po.msgid_plural = "Apples"
82
+ # po.sources = ["foo.rb:200", "bar.rb:300"]
83
+ # ary << po
84
+ # return ary
59
85
  # end
60
86
  # end
61
- #
87
+ #
62
88
  # GetText::RGetText.add_parser(FooParser)
63
89
  def add_parser(klass)
64
90
  @ex_parsers.insert(0, klass)
@@ -102,6 +128,7 @@ TITLE
102
128
 
103
129
  def parse(paths) # :nodoc:
104
130
  pomessages = []
131
+ paths = [paths] if paths.kind_of? String
105
132
  paths.each do |path|
106
133
  begin
107
134
  @ex_parsers.each do |klass|
@@ -119,7 +146,7 @@ TITLE
119
146
  end
120
147
 
121
148
  # Save the previous target.
122
- existing = pomessages.find_index {|t| t == pomessage}
149
+ existing = pomessages.empty? ? nil : pomessages.index(pomessages.find {|t| t == pomessage})
123
150
  if existing
124
151
  pomessage = pomessages[existing].merge(pomessage)
125
152
  pomessages[existing] = pomessage
@@ -187,11 +214,9 @@ TITLE
187
214
  elsif ! paths
188
215
  paths, out = check_options
189
216
  end
190
-
191
217
  if paths.size == 0
192
218
  raise ArgumentError, _("no input files")
193
219
  end
194
-
195
220
  if out.is_a? String
196
221
  File.open(File.expand_path(out), "w+") do |file|
197
222
  file.puts generate_pot_header
@@ -205,8 +230,8 @@ TITLE
205
230
  end
206
231
  end
207
232
  extend self
208
- # Creates a po-file from targetfiles(ruby-script-files, .rhtml files, glade-2 XML files),
209
- # then output the result to out. If no parameter is set, it behaves same as command line tools(rgettet).
233
+ # Creates a po-file from targetfiles(ruby-script-files, .rhtml files, glade-2 XML files),
234
+ # then output the result to out. If no parameter is set, it behaves same as command line tools(rgettet).
210
235
  #
211
236
  # This function is a part of GetText.create_pofiles.
212
237
  # Usually you don't need to call this function directly.
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  =begin
2
4
  rmsgfmt.rb - Generate a .mo
3
5
 
@@ -23,13 +25,13 @@ module GetText
23
25
 
24
26
  def run(targetfile = nil, output_path = nil) # :nodoc:
25
27
  unless targetfile
26
- targetfile, output_path = check_options
28
+ targetfile, output_path = check_options
27
29
  end
28
30
  unless targetfile
29
- raise ArgumentError, _("no input files")
31
+ raise ArgumentError, _("no input files")
30
32
  end
31
33
  unless output_path
32
- output_path = "messages.mo"
34
+ output_path = "messages.mo"
33
35
  end
34
36
 
35
37
  parser = PoParser.new
@@ -68,8 +70,8 @@ module GetText
68
70
  [ARGV[0], output]
69
71
  end
70
72
  end
71
-
72
- # Creates a mo-file from a targetfile(po-file), then output the result to out.
73
+
74
+ # Creates a mo-file from a targetfile(po-file), then output the result to out.
73
75
  # If no parameter is set, it behaves same as command line tools(rmsgfmt).
74
76
  # * targetfile: An Array of po-files or nil.
75
77
  # * output_path: output path.
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  =begin
2
4
  rmsgmerge.rb - Merge old .po to new .po
3
5
 
@@ -14,60 +16,60 @@ require 'gettext/tools/poparser'
14
16
  require 'rbconfig'
15
17
 
16
18
  module GetText
17
-
19
+
18
20
  module RMsgMerge
19
-
20
- class PoData #:nodoc:
21
-
21
+
22
+ class PoData #:nodoc:
23
+
22
24
  attr_reader :msgids
23
-
25
+
24
26
  def initialize
25
27
  @msgid2msgstr = {}
26
28
  @msgid2comment = {}
27
29
  @msgids = []
28
30
  end
29
-
31
+
30
32
  def set_comment(msgid_or_sym, comment)
31
- @msgid2comment[msgid_or_sym] = comment
33
+ @msgid2comment[msgid_or_sym] = comment
32
34
  end
33
-
35
+
34
36
  def msgstr(msgid)
35
37
  @msgid2msgstr[msgid]
36
38
  end
37
-
39
+
38
40
  def comment(msgid)
39
41
  @msgid2comment[msgid]
40
42
  end
41
-
43
+
42
44
  def [](msgid)
43
45
  @msgid2msgstr[msgid]
44
46
  end
45
-
47
+
46
48
  def []=(msgid, msgstr)
47
49
  # Retain the order
48
50
  unless @msgid2msgstr[msgid]
49
51
  @msgids << msgid
50
52
  end
51
-
53
+
52
54
  @msgid2msgstr[msgid] = msgstr
53
55
  end
54
-
56
+
55
57
  def each_msgid
56
58
  arr = @msgids.delete_if{|i| Symbol === i or i == ''}
57
59
  arr.each do |i|
58
60
  yield i
59
61
  end
60
62
  end
61
-
63
+
62
64
  def msgid?(msgid)
63
65
  !(Symbol === msgid) and @msgid2msgstr[msgid] and (msgid != '')
64
66
  end
65
-
67
+
66
68
  # Is it necessary to implement this method?
67
69
  def search_msgid_fuzzy(msgid, used_msgids)
68
70
  nil
69
71
  end
70
-
72
+
71
73
  def nplural
72
74
  unless @msgid2msgstr['']
73
75
  return 0
@@ -77,53 +79,53 @@ module GetText
77
79
  else
78
80
  return 0
79
81
  end
80
-
82
+
81
83
  end
82
84
  end
83
-
85
+
84
86
  def generate_po
85
87
  str = ''
86
88
  str << generate_po_header
87
-
89
+
88
90
  self.each_msgid do |id|
89
- str << self.generate_po_entry(id)
91
+ str << self.generate_po_entry(id)
90
92
  end
91
-
92
- str << @msgid2comment[:last]
93
- str
93
+
94
+ str << @msgid2comment[:last]
95
+ str
94
96
  end
95
-
97
+
96
98
  def generate_po_header
97
99
  str = ""
98
-
100
+
99
101
  str << @msgid2comment[''].strip << "\n"
100
- str << 'msgid ""' << "\n"
102
+ str << 'msgid ""' << "\n"
101
103
  str << 'msgstr ""' << "\n"
102
104
  msgstr = @msgid2msgstr[''].gsub(/"/, '\"').gsub(/\r/, '')
103
105
  msgstr = msgstr.gsub(/^(.*)$/, '"\1\n"')
104
106
  str << msgstr
105
107
  str << "\n"
106
-
108
+
107
109
  str
108
110
  end
109
-
111
+
110
112
  def generate_po_entry(msgid)
111
113
  str = ""
112
114
  str << @msgid2comment[msgid]
113
115
  if str[-1] != "\n"[0]
114
116
  str << "\n"
115
117
  end
116
-
118
+
117
119
  id = msgid.gsub(/"/, '\"').gsub(/\r/, '')
118
120
  msgstr = @msgid2msgstr[msgid].gsub(/"/, '\"').gsub(/\r/, '')
119
121
 
120
122
  if id.include?("\000")
121
- ids = id.split(/\000/)
123
+ ids = id.split(/\000/)
122
124
  str << "msgid " << __conv(ids[0]) << "\n"
123
125
  ids[1..-1].each do |single_id|
124
126
  str << "msgid_plural " << __conv(single_id) << "\n"
125
127
  end
126
-
128
+
127
129
  msgstr.split("\000").each_with_index do |m, n|
128
130
  str << "msgstr[#{n}] " << __conv(m) << "\n"
129
131
  end
@@ -131,11 +133,11 @@ module GetText
131
133
  str << "msgid " << __conv(id) << "\n"
132
134
  str << "msgstr " << __conv(msgstr) << "\n"
133
135
  end
134
-
136
+
135
137
  str << "\n"
136
138
  str
137
139
  end
138
-
140
+
139
141
  def __conv(str)
140
142
  s = ''
141
143
 
@@ -145,34 +147,34 @@ module GetText
145
147
  else
146
148
  s << '"' << str.sub("\n", "\\n") << '"'
147
149
  end
148
-
150
+
149
151
  s.rstrip
150
152
  end
151
-
153
+
152
154
  end
153
-
155
+
154
156
  class Merger #:nodoc:
155
-
157
+
156
158
  # From GNU gettext source.
157
- #
159
+ #
158
160
  # Merge the reference with the definition: take the #. and
159
- # #: comments from the reference, take the # comments from
160
- # the definition, take the msgstr from the definition. Add
161
- # this merged entry to the output message list.
161
+ # #: comments from the reference, take the # comments from
162
+ # the definition, take the msgstr from the definition. Add
163
+ # this merged entry to the output message list.
162
164
  DOT_COMMENT_RE = /\A#\./
163
165
  SEMICOLON_COMMENT_RE = /\A#\:/
164
166
  FUZZY_RE = /\A#\,/
165
167
  NOT_SPECIAL_COMMENT_RE = /\A#([^:.,]|\z)/
166
-
168
+
167
169
  CRLF_RE = /\r?\n/
168
170
  POT_DATE_EXTRACT_RE = /POT-Creation-Date:\s*(.*)?\s*$/
169
171
  POT_DATE_RE = /POT-Creation-Date:.*?$/
170
-
172
+
171
173
  def merge(definition, reference)
172
174
  # deep copy
173
- result = Marshal.load( Marshal.dump(reference) )
174
-
175
- used = []
175
+ result = Marshal.load( Marshal.dump(reference) )
176
+
177
+ used = []
176
178
  merge_header(result, definition)
177
179
 
178
180
  result.each_msgid do |msgid|
@@ -181,18 +183,18 @@ module GetText
181
183
  merge_message(msgid, result, msgid, definition)
182
184
  elsif other_msgid = definition.search_msgid_fuzzy(msgid, used)
183
185
  used << other_msgid
184
- merge_fuzzy_message(msgid, result, other_msgid, definition)
186
+ merge_fuzzy_message(msgid, result, other_msgid, definition)
185
187
  elsif msgid.index("\000") and ( reference.msgstr(msgid).gsub("\000", '') == '' )
186
188
  # plural
187
189
  result[msgid] = "\000" * definition.nplural
188
190
  else
189
191
  change_reference_comment(msgid, result)
190
- end
192
+ end
191
193
  end
192
-
194
+
193
195
  ###################################################################
194
196
  # msgids which are not used in reference are handled as obsolete. #
195
- ###################################################################
197
+ ###################################################################
196
198
  last_comment = result.comment(:last) || ''
197
199
  definition.each_msgid do |msgid|
198
200
  unless used.include?(msgid)
@@ -202,13 +204,13 @@ module GetText
202
204
  end
203
205
  end
204
206
  result.set_comment(:last, last_comment)
205
-
207
+
206
208
  result
207
209
  end
208
-
210
+
209
211
  def merge_message(msgid, target, def_msgid, definition)
210
212
  merge_comment(msgid, target, def_msgid, definition)
211
-
213
+
212
214
  ############################################
213
215
  # check mismatch of msgid and msgid_plural #
214
216
  ############################################
@@ -216,10 +218,10 @@ module GetText
216
218
  if msgid.index("\000")
217
219
  if def_msgstr.index("\000")
218
220
  # OK
219
- target[msgid] = def_msgstr
221
+ target[msgid] = def_msgstr
220
222
  else
221
223
  # NG
222
- s = ''
224
+ s = ''
223
225
  definition.nplural.times {
224
226
  s << def_msgstr
225
227
  s << "\000"
@@ -236,29 +238,29 @@ module GetText
236
238
  end
237
239
  end
238
240
  end
239
-
241
+
240
242
  # for the future
241
243
  def merge_fuzzy_message(msgid, target, def_msgid, definition)
242
244
  merge_message(msgid, target, def_msgid, definition)
243
245
  end
244
-
246
+
245
247
  def merge_comment(msgid, target, def_msgid, definition)
246
248
  ref_comment = target.comment(msgid)
247
249
  def_comment = definition.comment(def_msgid)
248
-
250
+
249
251
  normal_comment = []
250
252
  dot_comment = []
251
253
  semi_comment = []
252
254
  is_fuzzy = false
253
-
254
- def_comment.split(CRLF_RE).each do |l|
255
+
256
+ def_comment.split(CRLF_RE).each do |l|
255
257
  if NOT_SPECIAL_COMMENT_RE =~ l
256
258
  normal_comment << l
257
- end
259
+ end
258
260
  end
259
-
261
+
260
262
  ref_comment.split(CRLF_RE).each do |l|
261
- if DOT_COMMENT_RE =~ l
263
+ if DOT_COMMENT_RE =~ l
262
264
  dot_comment << l
263
265
  elsif SEMICOLON_COMMENT_RE =~ l
264
266
  semi_comment << l
@@ -266,19 +268,19 @@ module GetText
266
268
  is_fuzzy = true
267
269
  end
268
270
  end
269
-
271
+
270
272
  str = format_comment(normal_comment, dot_comment, semi_comment, is_fuzzy)
271
273
  target.set_comment(msgid, str)
272
274
  end
273
-
275
+
274
276
  def change_reference_comment(msgid, podata)
275
277
  normal_comment = []
276
278
  dot_comment = []
277
279
  semi_comment = []
278
280
  is_fuzzy = false
279
-
281
+
280
282
  podata.comment(msgid).split(CRLF_RE).each do |l|
281
- if DOT_COMMENT_RE =~ l
283
+ if DOT_COMMENT_RE =~ l
282
284
  dot_comment << l
283
285
  elsif SEMICOLON_COMMENT_RE =~ l
284
286
  semi_comment << l
@@ -288,14 +290,14 @@ module GetText
288
290
  normal_comment << l
289
291
  end
290
292
  end
291
-
293
+
292
294
  str = format_comment(normal_comment, dot_comment, semi_comment, is_fuzzy)
293
- podata.set_comment(msgid, str)
295
+ podata.set_comment(msgid, str)
294
296
  end
295
-
297
+
296
298
  def format_comment(normal_comment, dot_comment, semi_comment, is_fuzzy)
297
299
  str = ''
298
-
300
+
299
301
  str << normal_comment.join("\n").gsub(/^#(\s*)/){|sss|
300
302
  if $1 == ""
301
303
  "# "
@@ -306,7 +308,7 @@ module GetText
306
308
  if normal_comment.size > 0
307
309
  str << "\n"
308
310
  end
309
-
311
+
310
312
  str << dot_comment.join("\n").gsub(/^#.(\s*)/){|sss|
311
313
  if $1 == ""
312
314
  "#. "
@@ -317,48 +319,48 @@ module GetText
317
319
  if dot_comment.size > 0
318
320
  str << "\n"
319
321
  end
320
-
322
+
321
323
  str << semi_comment.join("\n").gsub(/^#:\s*/, "#: ")
322
324
  if semi_comment.size > 0
323
325
  str << "\n"
324
326
  end
325
-
327
+
326
328
  if is_fuzzy
327
329
  str << "#, fuzzy\n"
328
330
  end
329
-
331
+
330
332
  str
331
333
  end
332
-
334
+
333
335
  def merge_header(target, definition)
334
336
  merge_comment('', target, '', definition)
335
-
337
+
336
338
  msg = target.msgstr('')
337
339
  def_msg = definition.msgstr('')
338
340
  if POT_DATE_EXTRACT_RE =~ msg
339
341
  time = $1
340
342
  def_msg = def_msg.sub(POT_DATE_RE, "POT-Creation-Date: #{time}")
341
343
  end
342
-
344
+
343
345
  target[''] = def_msg
344
346
  end
345
-
347
+
346
348
  end
347
-
348
- end
349
-
349
+
350
+ end
351
+
350
352
  end
351
353
 
352
354
  module GetText::RMsgMerge #:nodoc:
353
355
 
354
356
  class Config #:nodoc:
355
-
357
+
356
358
  attr_accessor :defpo, :refpot, :output, :fuzzy, :update
357
-
359
+
358
360
  # update mode options
359
361
  attr_accessor :backup, :suffix
360
-
361
- =begin
362
+
363
+ =begin
362
364
  The result is written back to def.po.
363
365
  --backup=CONTROL make a backup of def.po
364
366
  --suffix=SUFFIX override the usual backup suffix
@@ -370,8 +372,8 @@ the VERSION_CONTROL environment variable. Here are the values:
370
372
  simple, never always make simple backups
371
373
  The backup suffix is `~', unless set with --suffix or the SIMPLE_BACKUP_SUFFIX
372
374
  environment variable.
373
- =end
374
-
375
+ =end
376
+
375
377
  def initialize
376
378
  @output = STDOUT
377
379
  @fuzzy = nil
@@ -380,23 +382,23 @@ environment variable.
380
382
  @suffix= ENV["SIMPLE_BACKUP_SUFFIX"] || "~"
381
383
  @input_dirs = ["."]
382
384
  end
383
-
385
+
384
386
  end
385
-
387
+
386
388
  end
387
389
 
388
390
  module GetText
389
-
391
+
390
392
  module RMsgMerge
391
393
  extend GetText
392
394
  extend self
393
395
 
394
396
  bindtextdomain("rgettext")
395
-
397
+
396
398
  # constant values
397
399
  VERSION = GetText::VERSION
398
400
  DATE = %w($Date: 2007/07/21 15:03:05 $)[1]
399
-
401
+
400
402
  def check_options(config)
401
403
  opts = OptionParser.new
402
404
  opts.banner = _("Usage: %s def.po ref.pot [-o output.pot]") % $0
@@ -405,7 +407,7 @@ module GetText
405
407
  opts.separator(_("Merges two Uniforum style .po files together. The def.po file is an existing PO file with translations. The ref.pot file is the last created PO file with up-to-date source references. ref.pot is generally created by rgettext."))
406
408
  opts.separator("")
407
409
  opts.separator(_("Specific options:"))
408
-
410
+
409
411
  opts.on("-o", "--output=FILE", _("write output to specified file")) do |out|
410
412
  unless FileTest.exist? out
411
413
  config.output = out
@@ -414,49 +416,49 @@ module GetText
414
416
  #exit 1
415
417
  end
416
418
  end
417
-
419
+
418
420
  #opts.on("-F", "--fuzzy-matching")
419
-
421
+
420
422
  opts.on_tail("--version", _("display version information and exit")) do
421
423
  puts "#{$0} #{VERSION} (#{DATE})"
422
- puts "#{File.join(::Config::CONFIG["bindir"], ::Config::CONFIG["RUBY_INSTALL_NAME"])} #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
424
+ puts "#{File.join(::Config::CONFIG["bindir"], ::Config::CONFIG["RUBY_INSTALL_NAME"])} #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
423
425
  exit
424
426
  end
425
-
427
+
426
428
  opts.parse!(ARGV)
427
-
429
+
428
430
  if ARGV.size != 2
429
431
  puts opts.help
430
432
  exit 1
431
433
  end
432
-
434
+
433
435
  config.defpo = ARGV[0]
434
436
  config.refpot = ARGV[1]
435
437
  end
436
-
438
+
437
439
  def run(reference = nil, definition = nil, out = STDOUT)
438
440
  config = GetText::RMsgMerge::Config.new
439
441
  config.refpot = reference
440
442
  config.defpo = definition
441
443
  config.output = out
442
-
444
+
443
445
  check_options(config)
444
-
446
+
445
447
  if config.defpo.nil?
446
448
  raise ArgumentError, _("definition po is not given.")
447
- elsif config.refpot.nil?
449
+ elsif config.refpot.nil?
448
450
  raise ArgumentError, _("reference pot is not given.")
449
451
  end
450
-
452
+
451
453
  parser = PoParser.new
452
454
  defpo = parser.parse_file(config.defpo, PoData.new, false)
453
455
  refpot = parser.parse_file(config.refstrrefstr, PoData.new, false)
454
-
456
+
455
457
  m = Merger.new
456
- result = m.merge(defpo, refpot)
458
+ result = m.merge(defpo, refpot)
457
459
  p result if $DEBUG
458
460
  print result.generate_po if $DEBUG
459
-
461
+
460
462
  begin
461
463
  if out.is_a? String
462
464
  File.open(File.expand_path(out), "w+") do |file|
@@ -468,16 +470,16 @@ module GetText
468
470
  ensure
469
471
  out.close
470
472
  end
471
- end
472
-
473
+ end
474
+
473
475
  end
474
-
476
+
475
477
  end
476
478
 
477
479
 
478
480
 
479
481
  module GetText
480
-
482
+
481
483
  # Experimental
482
484
  def rmsgmerge(reference = nil, definition = nil, out = STDOUT)
483
485
  RMsgMerge.run(reference, definition, out)
@@ -489,10 +491,10 @@ end
489
491
 
490
492
  if $0 == __FILE__ then
491
493
  require 'pp'
492
-
494
+
493
495
  #parser = GetText::RMsgMerge::PoParser.new;
494
496
  #parser = GetText::PoParser.new;
495
497
  #pp parser.parse(ARGF.read)
496
-
498
+
497
499
  GetText.rmsgmerge
498
500
  end