diff --git a/lib/po.js b/lib/po.js index d0aed37..4f4df98 100644 --- a/lib/po.js +++ b/lib/po.js @@ -321,8 +321,11 @@ PO.Item.prototype.toString = function () { lines = lines.concat(mkObsolete + _process(keyword, t, i)); }); } else { + var index = (self.msgid_plural && Array.isArray(text)) ? + 0 : + undefined; text = Array.isArray(text) ? text.join() : text; - var processed = _process(keyword, text); + var processed = _process(keyword, text, index); //handle \n in single-line texts (can not be handled in _escape) for (var i = 1; i < processed.length - 1; i++) { processed[i] = processed[i].slice(0, -1) + '\\n"'; diff --git a/test/fixtures/plural.po b/test/fixtures/plural.po new file mode 100644 index 0000000..64b9c68 --- /dev/null +++ b/test/fixtures/plural.po @@ -0,0 +1,32 @@ +# French translation of Link (6.x-2.9) +# Copyright (c) 2011 by the French translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Link (6.x-2.9)\n" +"POT-Creation-Date: 2011-12-31 23:39+0000\n" +"PO-Revision-Date: 2013-12-17 14:59+0100\n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Last-Translator: Ruben Vermeersch \n" +"Language: fr\n" +"X-Generator: Poedit 1.6.2\n" + +# correct plurals, with translation +msgid "1 source" +msgid_plural "{{$count}} sources" +msgstr[0] "1 source" +msgstr[1] "{{$count}} sources" + +# correct plurals, with no translation +msgid "1 destination" +msgid_plural "{{$count}} destinations" +msgstr[0] "" + +# incorrect plurals, with no translation +msgid "1 mistake" +msgid_plural "{{$count}} mistakes" +msgstr "" diff --git a/test/write.js b/test/write.js index 6a114c5..44dad19 100644 --- a/test/write.js +++ b/test/write.js @@ -16,6 +16,21 @@ function assertHasLine(str, line) { assert(found, 'Could not find line: ' + line); } +function assertHasContiguousLines(str, assertedLines) { + var assertedLinesJoined = assertedLines.join('\n'); + + var trimmedStr = str + .split('\n') + .map(function (line) { + return line.trim(); + }) + .join('\n'); + + var found = trimmedStr.indexOf(assertedLinesJoined) !== -1; + + assert(found, 'Could not find lines: \n' + assertedLinesJoined); +} + function assertDoesntHaveLine(str, line) { var lines = str.split('\n'); var found = false; @@ -103,6 +118,38 @@ describe('Write', function () { assertHasLine(str, '#~ msgstr "also not sure"'); }); + describe('plurals', function () { + it('should write multiple msgstrs', function () { + var input = fs.readFileSync(__dirname + '/fixtures/plural.po', 'utf8'); + var po = PO.parse(input); + var str = po.toString(); + assertHasContiguousLines(str, [ + 'msgstr[0] "1 source"', + 'msgstr[1] "{{$count}} sources"' + ]); + }); + + it('should write msgstr[0] when there is no translation', function () { + var input = fs.readFileSync(__dirname + '/fixtures/plural.po', 'utf8'); + var po = PO.parse(input); + var str = po.toString(); + assertHasContiguousLines(str, [ + 'msgid_plural "{{$count}} destinations"', + 'msgstr[0] ""' + ]); + }); + + it('should write msgstr[0] when there is no translation and empty plural translation is stored in msgstr ""', function () { + var input = fs.readFileSync(__dirname + '/fixtures/plural.po', 'utf8'); + var po = PO.parse(input); + var str = po.toString(); + assertHasContiguousLines(str, [ + 'msgid_plural "{{$count}} mistakes"', + 'msgstr[0] ""' + ]); + }); + }); + describe('C-Strings', function () { it('should escape "', function () { var item = new PO.Item();