From e2330bd433211eeb6970cab8943b861fa22eb938 Mon Sep 17 00:00:00 2001 From: rosston Date: Thu, 9 Feb 2017 22:43:31 -0500 Subject: [PATCH 1/3] Upgrade dev dependencies. --- Gruntfile.coffee | 4 +--- package.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 5a8a5f3..36e607c 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -5,7 +5,7 @@ module.exports = (grunt) -> @loadNpmTasks('grunt-contrib-jshint') @loadNpmTasks('grunt-contrib-uglify') @loadNpmTasks('grunt-contrib-watch') - @loadNpmTasks('grunt-jscs-checker') + @loadNpmTasks('grunt-jscs') @loadNpmTasks('grunt-mocha-cli') @initConfig @@ -42,8 +42,6 @@ module.exports = (grunt) -> dist: files: 'dist/pofile.js': ['lib/po.js'] - options: - alias: 'lib/po.js:pofile' uglify: dist: diff --git a/package.json b/package.json index 9ad7b72..8e1651d 100644 --- a/package.json +++ b/package.json @@ -35,16 +35,16 @@ "test": "test" }, "devDependencies": { - "browserify": "~3.11.1", - "grunt": "~0.4.2", - "grunt-browserify": "~1.3.0", - "grunt-bump": "0.0.13", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-jshint": "~0.7.2", - "grunt-contrib-uglify": "~0.2.7", - "grunt-contrib-watch": "~0.5.3", - "grunt-jscs-checker": "^0.5.1", - "grunt-mocha-cli": "~1.4.0" + "browserify": "~14.0.0", + "grunt": "~1.0.1", + "grunt-browserify": "~5.0.0", + "grunt-bump": "0.8.0", + "grunt-contrib-clean": "~1.0.0", + "grunt-contrib-jshint": "~1.1.0", + "grunt-contrib-uglify": "~2.1.0", + "grunt-contrib-watch": "~1.0.0", + "grunt-jscs": "~3.0.1", + "grunt-mocha-cli": "~3.0.0" }, "dependencies": { "lodash.isarray": "~2.4.1" From 79407fcf5e382150372c62a20aa53636a7a7e1b9 Mon Sep 17 00:00:00 2001 From: rosston Date: Thu, 9 Feb 2017 22:09:42 -0500 Subject: [PATCH 2/3] Remove lodash.isarray (use native Array.isArray). Other code was already depending on Object.keys() and Array.prototype.filter(), which are also ES5 along with Array.isArray(). --- lib/po.js | 5 ++--- package.json | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/po.js b/lib/po.js index 6407079..d0aed37 100644 --- a/lib/po.js +++ b/lib/po.js @@ -1,5 +1,4 @@ var fs = require('fs'); -var isArray = require('lodash.isarray'); function trim(string) { return string.replace(/^\s+|\s+$/g, ''); @@ -317,12 +316,12 @@ PO.Item.prototype.toString = function () { ['msgctxt', 'msgid', 'msgid_plural', 'msgstr'].forEach(function (keyword) { var text = self[keyword]; if (text != null) { - if (isArray(text) && text.length > 1) { + if (Array.isArray(text) && text.length > 1) { text.forEach(function (t, i) { lines = lines.concat(mkObsolete + _process(keyword, t, i)); }); } else { - text = isArray(text) ? text.join() : text; + text = Array.isArray(text) ? text.join() : text; var processed = _process(keyword, text); //handle \n in single-line texts (can not be handled in _escape) for (var i = 1; i < processed.length - 1; i++) { diff --git a/package.json b/package.json index 8e1651d..04cf97d 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,5 @@ "grunt-jscs": "~3.0.1", "grunt-mocha-cli": "~3.0.0" }, - "dependencies": { - "lodash.isarray": "~2.4.1" - } + "dependencies": {} } From 115459160e015e5c1d33bee691fbb59cec37356e Mon Sep 17 00:00:00 2001 From: rosston Date: Thu, 9 Feb 2017 22:40:58 -0500 Subject: [PATCH 3/3] Use msgstr[0] when stringifying an untranslated plural item. --- lib/po.js | 5 ++++- test/fixtures/plural.po | 32 ++++++++++++++++++++++++++++ test/write.js | 47 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/plural.po 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();