gettext 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/.yardopts +6 -0
  2. data/Rakefile +7 -6
  3. data/doc/text/news.md +51 -2
  4. data/gettext.gemspec +1 -0
  5. data/lib/gettext/runtime/locale_path.rb +0 -1
  6. data/lib/gettext/runtime/mofile.rb +8 -2
  7. data/lib/gettext/runtime/textdomain.rb +19 -21
  8. data/lib/gettext/runtime/textdomain_manager.rb +0 -1
  9. data/lib/gettext/tools/msginit.rb +19 -9
  10. data/lib/gettext/tools/msgmerge.rb +28 -15
  11. data/lib/gettext/tools/parser/erb.rb +25 -5
  12. data/lib/gettext/tools/parser/glade.rb +4 -3
  13. data/lib/gettext/tools/parser/ruby.rb +23 -5
  14. data/lib/gettext/tools/poparser.rb +2 -1
  15. data/lib/gettext/tools/xgettext.rb +187 -136
  16. data/lib/gettext/version.rb +1 -1
  17. data/po/ja/gettext.po +82 -41
  18. data/samples/cgi/locale/bg/LC_MESSAGES/main.mo +0 -0
  19. data/samples/cgi/locale/bs/LC_MESSAGES/main.mo +0 -0
  20. data/samples/cgi/locale/ca/LC_MESSAGES/main.mo +0 -0
  21. data/samples/cgi/locale/cs/LC_MESSAGES/main.mo +0 -0
  22. data/samples/cgi/locale/de/LC_MESSAGES/main.mo +0 -0
  23. data/samples/cgi/locale/el/LC_MESSAGES/main.mo +0 -0
  24. data/samples/cgi/locale/eo/LC_MESSAGES/main.mo +0 -0
  25. data/samples/cgi/locale/es/LC_MESSAGES/main.mo +0 -0
  26. data/samples/po/hello.pot +3 -3
  27. data/samples/po/hello2.pot +3 -3
  28. data/samples/po/hello_glade2.pot +3 -3
  29. data/samples/po/hello_gtk2.pot +3 -3
  30. data/samples/po/hello_noop.pot +3 -3
  31. data/samples/po/hello_plural.pot +3 -3
  32. data/samples/po/hello_tk.pot +3 -3
  33. data/src/poparser.ry +1 -0
  34. data/test/fixtures/_.rb +4 -4
  35. data/test/fixtures/{erb.rhtml → erb/ascii.rhtml} +0 -0
  36. data/test/fixtures/{erb.rxml → erb/ascii.rxml} +0 -0
  37. data/test/fixtures/erb/non_ascii.rhtml +13 -0
  38. data/test/fixtures/untranslated.rb +12 -0
  39. data/test/gettext-test-utils.rb +23 -0
  40. data/test/locale/ja/LC_MESSAGES/untranslated.mo +0 -0
  41. data/test/parser/test_ruby.rb +48 -1
  42. data/test/po/_.pot +4 -4
  43. data/test/po/ascii.pot +23 -0
  44. data/test/po/backslash.pot +3 -3
  45. data/test/po/ja/untranslated.po +22 -0
  46. data/test/po/no_exist_msgid.pot +20 -0
  47. data/test/po/non_ascii.pot +3 -3
  48. data/test/po/not_existed_msgid.pot +20 -0
  49. data/test/po/np_.pot +3 -3
  50. data/test/po/ns_.pot +3 -3
  51. data/test/po/p_.pot +3 -3
  52. data/test/po/s_.pot +3 -3
  53. data/test/po/untranslated.pot +23 -0
  54. data/test/run-test.rb +1 -1
  55. data/test/test_gettext.rb +2 -2
  56. data/test/test_mofile.rb +10 -0
  57. data/test/test_parser.rb +45 -19
  58. data/test/test_po_parser.rb +14 -1
  59. data/test/tools/test_msginit.rb +52 -36
  60. data/test/tools/test_msgmerge.rb +44 -6
  61. data/test/tools/test_xgettext.rb +203 -5
  62. metadata +143 -146
  63. data/po/de/gettext.po +0 -668
  64. data/po/de/gettext.po.bak +0 -589
  65. data/po/el/gettext.po +0 -571
  66. data/po/fr/gettext.po +0 -589
  67. data/po/gettext.pot +0 -638
  68. data/po/gettext.pot~ +0 -638
  69. data/po/it/gettext.po +0 -589
  70. data/po/uk/gettext.po +0 -571
  71. data/test/locale/ja/LC_MESSAGES/npgettext.mo +0 -0
  72. data/test/locale/ja/LC_MESSAGES/nsgettext.mo +0 -0
  73. data/test/locale/ja/LC_MESSAGES/pgettext.mo +0 -0
  74. data/test/locale/ja/LC_MESSAGES/sgettext.mo +0 -0
data/test/run-test.rb CHANGED
@@ -17,7 +17,7 @@
17
17
  # You should have received a copy of the GNU Lesser General Public License
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
- # $VERBOSE = true
20
+ $VERBOSE = true
21
21
 
22
22
  $KCODE = "utf8" unless "".respond_to?(:encoding)
23
23
 
data/test/test_gettext.rb CHANGED
@@ -52,7 +52,7 @@ class TestGetText < Test::Unit::TestCase
52
52
  set_locale("ja")
53
53
  assert_equal("JAPANESE", _("LANGUAGE")) # influence of previous line
54
54
  assert_equal("japanese", test.test)
55
- end
55
+ end
56
56
 
57
57
  def test_no_msgstr
58
58
  bindtextdomain("test1", :path => "locale")
@@ -77,7 +77,7 @@ EOH
77
77
  end
78
78
 
79
79
  def test_gettext
80
- test = TestRubyParser.new
80
+ test = MessageFixture.new
81
81
  assert_equal("AAA", test.test_1)
82
82
  assert_equal("AAA\n", test.test_2)
83
83
  assert_equal("BBB\nCCC", test.test_3)
data/test/test_mofile.rb CHANGED
@@ -3,6 +3,16 @@
3
3
  require 'gettext/runtime/mofile'
4
4
 
5
5
  class TestMoFile < Test::Unit::TestCase
6
+ def test_not_exist_msgid
7
+ mo = load_mo("_.mo")
8
+ assert_equal(nil, mo["notexistent"])
9
+ end
10
+
11
+ def test_untranslated
12
+ mo = load_mo("untranslated.mo")
13
+ assert_equal(nil, mo["untranslated"])
14
+ end
15
+
6
16
  def test_non_ascii
7
17
  mo = load_mo("non_ascii.mo")
8
18
  assert_equal("Hello in Japanese", mo["こんにちは"])
data/test/test_parser.rb CHANGED
@@ -21,6 +21,7 @@
21
21
  # You should have received a copy of the GNU Lesser General Public License
22
22
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
23
23
 
24
+ require "tempfile"
24
25
  require 'gettext/tools/parser/ruby'
25
26
  require 'gettext/tools/parser/glade'
26
27
  require 'gettext/tools/parser/erb'
@@ -51,8 +52,8 @@ class TestGetTextParser < Test::Unit::TestCase
51
52
  assert_target "\\taaa", ['fixtures/_.rb:96']
52
53
  assert_target "Here document1\\nHere document2\\n", ['fixtures/_.rb:100']
53
54
  assert_target "Francois Pinard", ['fixtures/_.rb:119'] do |t|
54
- assert_match /proper name/, t.comment
55
- assert_match /Pronunciation/, t.comment
55
+ assert_match(/proper name/, t.comment)
56
+ assert_match(/Pronunciation/, t.comment)
56
57
  end
57
58
 
58
59
  assert_target("No TRANSLATORS comment", ["fixtures/_.rb:122"]) do |t|
@@ -128,28 +129,53 @@ class TestGetTextParser < Test::Unit::TestCase
128
129
  assert_equal(['duplicated', 'fixtures/gladeparser.glade:137', 'fixtures/gladeparser.glade:158'], ary[6])
129
130
  end
130
131
 
131
- def fixtures_erb
132
- @ary = GetText::ErbParser.parse('fixtures/erb.rhtml')
132
+ class TestErbParser < self
133
+ include GetTextTestUtils
133
134
 
134
- assert_target 'aaa', ['fixtures/erb.rhtml:8']
135
- assert_target 'aaa\n', ['fixtures/erb.rhtml:11']
136
- assert_target 'bbb', ['fixtures/erb.rhtml:12']
137
- assert_plural_target "ccc1", "ccc2", ['fixtures/erb.rhtml:13']
135
+ def test_detect_encoding
136
+ need_encoding
137
+
138
+ euc_file = Tempfile.new("euc-jp.rhtml")
139
+ euc_file.open
140
+ euc_file.puts("<%#-*- coding: euc-jp -*-%>")
141
+ euc_file.close
142
+
143
+ erb_source = ERB.new(File.read(euc_file.path)).src
144
+ encoding = GetText::ErbParser.detect_encoding(erb_source)
145
+
146
+ assert_equal("EUC-JP", encoding)
147
+ end
148
+
149
+ def test_ascii
150
+ @ary = GetText::ErbParser.parse('fixtures/erb/ascii.rhtml')
151
+
152
+ assert_target 'aaa', ['fixtures/erb/ascii.rhtml:8']
153
+ assert_target 'aaa\n', ['fixtures/erb/ascii.rhtml:11']
154
+ assert_target 'bbb', ['fixtures/erb/ascii.rhtml:12']
155
+ assert_plural_target "ccc1", "ccc2", ['fixtures/erb/ascii.rhtml:13']
156
+ end
157
+
158
+ def test_non_ascii
159
+ fixture_path = "fixtures/erb/non_ascii.rhtml"
160
+ @ary = GetText::ErbParser.parse(fixture_path)
161
+
162
+ assert_target('わたし', ["#{fixture_path}:11"])
163
+ end
138
164
  end
139
165
 
140
166
  def test_xgettext_parse
141
167
  GetText::ErbParser.init(:extnames => ['.rhtml', '.rxml'])
142
- @ary = @xgettext.parse(['fixtures/erb.rhtml'])
143
- assert_target 'aaa', ['fixtures/erb.rhtml:8']
144
- assert_target 'aaa\n', ['fixtures/erb.rhtml:11']
145
- assert_target 'bbb', ['fixtures/erb.rhtml:12']
146
- assert_plural_target "ccc1", "ccc2", ['fixtures/erb.rhtml:13']
147
-
148
- @ary = @xgettext.parse(['fixtures/erb.rxml'])
149
- assert_target 'aaa', ['fixtures/erb.rxml:9']
150
- assert_target 'aaa\n', ['fixtures/erb.rxml:12']
151
- assert_target 'bbb', ['fixtures/erb.rxml:13']
152
- assert_plural_target "ccc1", "ccc2", ['fixtures/erb.rxml:14']
168
+ @ary = @xgettext.parse(['fixtures/erb/ascii.rhtml'])
169
+ assert_target 'aaa', ['fixtures/erb/ascii.rhtml:8']
170
+ assert_target 'aaa\n', ['fixtures/erb/ascii.rhtml:11']
171
+ assert_target 'bbb', ['fixtures/erb/ascii.rhtml:12']
172
+ assert_plural_target "ccc1", "ccc2", ['fixtures/erb/ascii.rhtml:13']
173
+
174
+ @ary = @xgettext.parse(['fixtures/erb/ascii.rxml'])
175
+ assert_target 'aaa', ['fixtures/erb/ascii.rxml:9']
176
+ assert_target 'aaa\n', ['fixtures/erb/ascii.rxml:12']
177
+ assert_target 'bbb', ['fixtures/erb/ascii.rxml:13']
178
+ assert_plural_target "ccc1", "ccc2", ['fixtures/erb/ascii.rxml:14']
153
179
 
154
180
  @ary = @xgettext.parse(['fixtures/n_.rb'])
155
181
  assert_plural_target "ooo", "ppp", ['fixtures/n_.rb:85', 'fixtures/n_.rb:86']
@@ -28,7 +28,20 @@ msgstr ""
28
28
  EOP
29
29
  messages = parse_po_file(po_file)
30
30
 
31
- assert_equal("", messages["Hello"])
31
+ assert_equal(nil, messages["Hello"])
32
+ end
33
+
34
+ def test_empty_msgstr_for_msgid_plural
35
+ po_file = create_po_file(<<-EOP)
36
+ msgid "He"
37
+ msgid_plural "They"
38
+ msgstr[0] ""
39
+ msgstr[1] ""
40
+ EOP
41
+ messages = parse_po_file(po_file)
42
+
43
+ assert_true(messages.has_key?("He\000They"))
44
+ assert_equal(nil, messages["He\000They"])
32
45
  end
33
46
 
34
47
  private
@@ -26,9 +26,14 @@ class TestToolsMsgInit < Test::Unit::TestCase
26
26
  stub(@msginit).read_translator_full_name {translator_full_name}
27
27
  stub(@msginit).read_translator_mail {translator_mail}
28
28
 
29
+ @year = "2012"
30
+ @po_revision_date = "2012-09-11 13:19+0900"
31
+ @pot_create_date = "2012-08-24 11:35+0900"
32
+
33
+ stub(@msginit).year {@year}
34
+ stub(@msginit).revision_date {@po_revision_date}
35
+
29
36
  Locale.current = "ja_JP.UTF-8"
30
- @pot_create_date = "2012-08-24 11:35+0900"
31
- @po_revision_date = Time.now.strftime("%Y-%m-%d %H:%M%z")
32
37
  end
33
38
 
34
39
  def test_all_options
@@ -43,7 +48,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
43
48
  "--output", po_file_path,
44
49
  "--locale", locale)
45
50
 
46
- actual_po_header = normalize_po_header(po_file_path)
51
+ actual_po_header = File.read(po_file_path)
47
52
  expected_po_header = po_header(locale, language)
48
53
  assert_equal(expected_po_header, actual_po_header)
49
54
  end
@@ -59,7 +64,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
59
64
 
60
65
  @msginit.run("--locale", locale)
61
66
 
62
- actual_po_header = normalize_po_header(po_file_path)
67
+ actual_po_header = File.read(po_file_path)
63
68
  expected_po_header = po_header(locale, language)
64
69
  assert_equal(expected_po_header, actual_po_header)
65
70
  end
@@ -76,7 +81,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
76
81
 
77
82
  @msginit.run("--locale", locale)
78
83
 
79
- actual_po_header = normalize_po_header(po_file_path)
84
+ actual_po_header = File.read(po_file_path)
80
85
  expected_po_header = po_header(locale, language)
81
86
  assert_equal(expected_po_header, actual_po_header)
82
87
  end
@@ -94,7 +99,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
94
99
 
95
100
  @msginit.run("--locale", "#{locale}.#{charset}")
96
101
 
97
- actual_po_header = normalize_po_header(po_file_path)
102
+ actual_po_header = File.read(po_file_path)
98
103
  expected_po_header = po_header(locale, language)
99
104
  assert_equal(expected_po_header, actual_po_header)
100
105
  end
@@ -111,7 +116,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
111
116
 
112
117
  @msginit.run("--input", pot_file_path, "--output", po_file_path)
113
118
 
114
- actual_po_header = normalize_po_header(po_file_path)
119
+ actual_po_header = File.read(po_file_path)
115
120
  expected_po_header = po_header(locale, language)
116
121
  assert_equal(expected_po_header, actual_po_header)
117
122
  end
@@ -128,7 +133,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
128
133
 
129
134
  @msginit.run("--input", pot_file_path)
130
135
 
131
- actual_po_header = normalize_po_header(po_file_path)
136
+ actual_po_header = File.read(po_file_path)
132
137
  expected_po_header = po_header(locale, language)
133
138
  assert_equal(expected_po_header, actual_po_header)
134
139
  end
@@ -145,7 +150,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
145
150
 
146
151
  @msginit.run
147
152
 
148
- actual_po_header = normalize_po_header(po_file_path)
153
+ actual_po_header = File.read(po_file_path)
149
154
  expected_po_header = po_header(locale, language)
150
155
  assert_equal(expected_po_header, actual_po_header)
151
156
  end
@@ -165,7 +170,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
165
170
 
166
171
  @msginit.run
167
172
 
168
- actual_po_header = normalize_po_header(po_file_path)
173
+ actual_po_header = File.read(po_file_path)
169
174
  expected_po_header = no_translator_po_header(locale, language)
170
175
  assert_equal(expected_po_header, actual_po_header)
171
176
  end
@@ -184,7 +189,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
184
189
 
185
190
  @msginit.run
186
191
 
187
- actual_po_header = normalize_po_header(po_file_path)
192
+ actual_po_header = File.read(po_file_path)
188
193
  expected_po_header = no_translator_po_header(locale, language)
189
194
  assert_equal(expected_po_header, actual_po_header)
190
195
  end
@@ -203,7 +208,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
203
208
 
204
209
  @msginit.run
205
210
 
206
- actual_po_header = normalize_po_header(po_file_path)
211
+ actual_po_header = File.read(po_file_path)
207
212
  expected_po_header = no_translator_po_header(locale, language)
208
213
  assert_equal(expected_po_header, actual_po_header)
209
214
  end
@@ -215,7 +220,7 @@ class TestToolsMsgInit < Test::Unit::TestCase
215
220
  Dir.chdir(dir) do
216
221
  pot_file_name = "test.pot"
217
222
  options = {:package_name => "test-package"}
218
- pot_file = create_pot_file(pot_file_name, options)
223
+ create_pot_file(pot_file_name, options)
219
224
  locale = current_locale
220
225
  language = current_language
221
226
  po_file_path = "#{locale}.po"
@@ -223,11 +228,29 @@ class TestToolsMsgInit < Test::Unit::TestCase
223
228
  @msginit.run("--input", pot_file_name)
224
229
 
225
230
  expected_po_header = po_header(locale, language, options)
226
- actual_po_header = normalize_po_header(po_file_path)
231
+ actual_po_header = File.read(po_file_path)
227
232
 
228
233
  assert_equal(expected_po_header, actual_po_header)
229
234
  end
230
235
  end
236
+
237
+ def test_no_plural_forms
238
+ Dir.mktmpdir do |dir|
239
+ Dir.chdir(dir) do
240
+ options = {:have_plural_forms => false}
241
+ create_pot_file("test.pot", options)
242
+ locale = current_locale
243
+ language = current_language
244
+ po_file_path = "#{locale}.po"
245
+
246
+ @msginit.run
247
+
248
+ actual_po_header = File.read(po_file_path)
249
+ expected_po_header = po_header(locale, language)
250
+ assert_equal(expected_po_header, actual_po_header)
251
+ end
252
+ end
253
+ end
231
254
  end
232
255
 
233
256
  private
@@ -256,7 +279,8 @@ class TestToolsMsgInit < Test::Unit::TestCase
256
279
 
257
280
  def pot_header(options)
258
281
  package_name = options[:package_name] || default_package_name
259
- <<EOF
282
+ have_plural_forms = options[:have_plural_forms] || true
283
+ header = <<EOF
260
284
  # SOME DESCRIPTIVE TITLE.
261
285
  # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
262
286
  # This file is distributed under the same license as the PACKAGE package.
@@ -274,21 +298,11 @@ msgstr ""
274
298
  "MIME-Version: 1.0\\n"
275
299
  "Content-Type: text/plain; charset=UTF-8\\n"
276
300
  "Content-Transfer-Encoding: 8bit\\n"
277
- "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"
278
301
  EOF
279
- end
280
-
281
- def normalize_po_header(po_file_path)
282
- po_file = ""
283
- File.open(po_file_path) do |file|
284
- po_file = file.read
302
+ if have_plural_forms
303
+ header << "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"
285
304
  end
286
-
287
- po_file = po_file.gsub(/#{Regexp.escape(@pot_create_date)}/,
288
- "XXXX-XX-XX XX:XX+XXXX")
289
- po_file = po_file.gsub(/#{Regexp.escape(@po_revision_date)}/,
290
- "YYYY-YY-YY YY:YY+YYYY")
291
- po_file.gsub(/#{Time.now.year}/, "YEAR")
305
+ header
292
306
  end
293
307
 
294
308
  def po_header(locale, language, options=nil)
@@ -301,15 +315,15 @@ EOF
301
315
 
302
316
  <<EOF
303
317
  # #{language_name} translations for #{package_name} package.
304
- # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
318
+ # Copyright (C) #{@year} THE PACKAGE'S COPYRIGHT HOLDER
305
319
  # This file is distributed under the same license as the PACKAGE package.
306
- # #{full_name} <#{mail}>, YEAR.
320
+ # #{full_name} <#{mail}>, #{@year}.
307
321
  #
308
322
  msgid ""
309
323
  msgstr ""
310
324
  "Project-Id-Version: #{package_name} VERSION\\n"
311
- "POT-Creation-Date: XXXX-XX-XX XX:XX+XXXX\\n"
312
- "PO-Revision-Date: YYYY-YY-YY YY:YY+YYYY\\n"
325
+ "POT-Creation-Date: #{@pot_create_date}\\n"
326
+ "PO-Revision-Date: #{@po_revision_date}\\n"
313
327
  "Last-Translator: #{full_name} <#{mail}>\\n"
314
328
  "Language: #{locale}\\n"
315
329
  "Language-Team: #{language_name}\\n"
@@ -317,6 +331,7 @@ msgstr ""
317
331
  "Content-Type: text/plain; charset=UTF-8\\n"
318
332
  "Content-Transfer-Encoding: 8bit\\n"
319
333
  "Plural-Forms: #{plural_forms}\\n"
334
+
320
335
  EOF
321
336
  end
322
337
 
@@ -330,15 +345,15 @@ EOF
330
345
 
331
346
  <<EOF
332
347
  # #{language_name} translations for PACKAGE package.
333
- # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
348
+ # Copyright (C) #{@year} THE PACKAGE'S COPYRIGHT HOLDER
334
349
  # This file is distributed under the same license as the PACKAGE package.
335
- # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
350
+ # FIRST AUTHOR <EMAIL@ADDRESS>, #{@year}.
336
351
  #
337
352
  msgid ""
338
353
  msgstr ""
339
354
  "Project-Id-Version: PACKAGE VERSION\\n"
340
- "POT-Creation-Date: XXXX-XX-XX XX:XX+XXXX\\n"
341
- "PO-Revision-Date: YYYY-YY-YY YY:YY+YYYY\\n"
355
+ "POT-Creation-Date: #{@pot_create_date}\\n"
356
+ "PO-Revision-Date: #{@po_revision_date}\\n"
342
357
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
343
358
  "Language: #{locale}\\n"
344
359
  "Language-Team: #{language_name}\\n"
@@ -346,6 +361,7 @@ msgstr ""
346
361
  "Content-Type: text/plain; charset=UTF-8\\n"
347
362
  "Content-Transfer-Encoding: 8bit\\n"
348
363
  "Plural-Forms: #{plural_forms}\\n"
364
+
349
365
  EOF
350
366
  end
351
367
  end
@@ -37,6 +37,7 @@ class TestToolsMsgMerge < Test::Unit::TestCase
37
37
  msgid \"\"
38
38
  msgstr \"\"
39
39
  \"#{header_entry}\\n\"
40
+
40
41
  #{comment}
41
42
  msgid \"#{msgid}\"
42
43
  msgstr \"#{msgstr}\"
@@ -66,6 +67,7 @@ EOC
66
67
  msgid \"\"
67
68
  msgstr \"\"
68
69
  \"#{header_entry}\\n\"
70
+
69
71
  #{obsolete_comment}
70
72
  EOP
71
73
 
@@ -77,18 +79,53 @@ EOP
77
79
  assert_equal(expected_po, po.generate_po)
78
80
  end
79
81
 
80
- def test_msgctxt
81
- msg_id = "Context\004Translation"
82
- @po_data[msg_id] = "Translated"
83
- @po_data.set_comment(msg_id, "#no comment")
82
+ def test_generate_po_msgid_plural_and_empty_msgstr
83
+ msgid = "Singular message\000Plural message"
84
+
85
+ @po_data[""] = "Plural-Forms: nplurals=2; plural=n != 1;\\n"
86
+ @po_data[msgid] = ""
87
+ @po_data.set_comment(msgid, "# plural message")
88
+ actual_po = @po_data.generate_po_entry(msgid)
89
+ expected_po = <<'EOE'
90
+ # plural message
91
+ msgid "Singular message"
92
+ msgid_plural "Plural message"
93
+ msgstr[0] ""
94
+ msgstr[1] ""
95
+ EOE
96
+ assert_equal(expected_po, actual_po)
97
+ end
98
+
99
+ class TestGeneratePoEntry < self
100
+ def test_msgid_plural
101
+ msgid = "Singular message\000Plural message"
102
+
103
+ @po_data[msgid] = "Singular translation\000Plural translation"
104
+ @po_data.set_comment(msgid, "#plural message")
105
+ actual_po = @po_data.generate_po_entry(msgid)
106
+ expected_po = <<'EOE'
107
+ #plural message
108
+ msgid "Singular message"
109
+ msgid_plural "Plural message"
110
+ msgstr[0] "Singular translation"
111
+ msgstr[1] "Plural translation"
112
+ EOE
113
+ assert_equal(expected_po, actual_po)
114
+ end
115
+
116
+ def test_msgctxt
117
+ msg_id = "Context\004Translation"
118
+ @po_data[msg_id] = "Translated"
119
+ @po_data.set_comment(msg_id, "#no comment")
84
120
 
85
- entry = @po_data.generate_po_entry(msg_id)
86
- assert_equal(<<-'EOE', entry)
121
+ entry = @po_data.generate_po_entry(msg_id)
122
+ assert_equal(<<-'EOE', entry)
87
123
  #no comment
88
124
  msgctxt "Context"
89
125
  msgid "Translation"
90
126
  msgstr "Translated"
91
127
  EOE
128
+ end
92
129
  end
93
130
  end
94
131
 
@@ -177,6 +214,7 @@ EOH
177
214
  def po_content
178
215
  <<-EOP
179
216
  #{po_header(@po_formatted_time, @po_formatted_time)}
217
+
180
218
  #: hello.rb:1
181
219
  msgid "World"
182
220
  msgstr "Translated World"