Skip to content

Commit

Permalink
Merge pull request #290 from IShotTheSheriff/fix-plurals
Browse files Browse the repository at this point in the history
Fix handling plurals for languages with locale e.g. pl_PL, en_US
  • Loading branch information
rubenv committed Jun 20, 2016
2 parents 9fb8875 + e980954 commit 8c6cabf
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 3 deletions.
18 changes: 17 additions & 1 deletion dist/angular-gettext.js
Expand Up @@ -586,8 +586,11 @@ angular.module('gettext').filter('translate', ["gettextCatalog", function (gette

// Do not edit this file, it is autogenerated using genplurals.py!
angular.module("gettext").factory("gettextPlurals", function () {
var languageCodes = {
"pt_BR": "pt_BR"
};
return function (langCode, n) {
switch (langCode) {
switch (getLanguageCode(langCode)) {
case "ay": // Aymará
case "bo": // Tibetan
case "cgg": // Chiga
Expand Down Expand Up @@ -696,6 +699,19 @@ angular.module("gettext").factory("gettextPlurals", function () {
default: // Everything else
return n != 1 ? 1 : 0;
}
};

/**
* Method extracts iso639-2 language code from code with locale e.g. pl_PL, en_US, etc.
* If it's provided with standalone iso639-2 language code it simply returns it.
* @param {String} langCode
* @returns {String} iso639-2 language Code
*/
function getLanguageCode(langCode) {
if (!languageCodes[langCode]) {
languageCodes[langCode] = langCode.split('_').shift();
}
return languageCodes[langCode];
}
});

Expand Down
2 changes: 1 addition & 1 deletion dist/angular-gettext.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 17 additions & 1 deletion src/plural.js
@@ -1,7 +1,10 @@
// Do not edit this file, it is autogenerated using genplurals.py!
angular.module("gettext").factory("gettextPlurals", function () {
var languageCodes = {
"pt_BR": "pt_BR"
};
return function (langCode, n) {
switch (langCode) {
switch (getLanguageCode(langCode)) {
case "ay": // Aymará
case "bo": // Tibetan
case "cgg": // Chiga
Expand Down Expand Up @@ -110,5 +113,18 @@ angular.module("gettext").factory("gettextPlurals", function () {
default: // Everything else
return n != 1 ? 1 : 0;
}
};

/**
* Method extracts iso639-2 language code from code with locale e.g. pl_PL, en_US, etc.
* If it's provided with standalone iso639-2 language code it simply returns it.
* @param {String} langCode
* @returns {String} iso639-2 language Code
*/
function getLanguageCode(langCode) {
if (!languageCodes[langCode]) {
languageCodes[langCode] = langCode.split('_').shift();
}
return languageCodes[langCode];
}
});
128 changes: 128 additions & 0 deletions test/unit/directive.js
Expand Up @@ -277,4 +277,132 @@ describe("Directive", function () {
$rootScope.$digest();
assert.equal(el.text(), "Produkt tygodnia: SMART TV.");
});

describe("Translation's with plurals", function () {
var sourceString;

beforeEach(inject(function () {
sourceString = "Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.";

catalog.setStrings("pl", {
"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.": [
"Dziś {{someone}} spotyka się z {{someoneElse}} przez jedną minutę.",
"Dziś {{someone}} spotyka się z {{someoneElse}} przez {{duration}} minuty.",
"Dziś {{someone}} spotyka się z {{someoneElse}} przez {{duration}} minut."
]
});
}));

it("Should properly handle plural translation for 1", function () {
catalog.setCurrentLanguage("pl");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 1;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez jedną minutę.");
});

it("Should properly handle plural translation for 0, 5, 6, 7, ...", function () {
catalog.setCurrentLanguage("pl");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 0;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 0 minut.");

$rootScope.duration = 5;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 5 minut.");

$rootScope.duration = 26;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 26 minut.");
});

it("Should properly handle plural translation for 2, 3, 4, 22, ...", function () {
catalog.setCurrentLanguage("pl");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 2;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 2 minuty.");

$rootScope.duration = 3;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 3 minuty.");

$rootScope.duration = 4;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 4 minuty.");

$rootScope.duration = 22;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 22 minuty.");
});

it("Should properly handle plural translation for 1 with language code that includes locale (e.g. pl_PL, en_US)", function () {
catalog.setCurrentLanguage("pl_PL");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 1;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez jedną minutę.");
});

it("Should properly handle plural translation for 0, 5, 6, 7, ... with language code that includes locale (e.g. pl_PL, en_US)", function () {
catalog.setCurrentLanguage("pl_PL");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 0;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 0 minut.");

$rootScope.duration = 5;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 5 minut.");

$rootScope.duration = 26;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 26 minut.");
});

it("Should properly handle plural translation for 2, 3, 4, 22, ... with language code that includes locale (e.g. pl_PL, en_US)", function () {
catalog.setCurrentLanguage("pl_PL");
$rootScope.someone = "Ruben";
$rootScope.someoneElse = "Ernest";

var el = $compile("<h1 translate translate-n=\"duration\" translate-plural=\"Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.\">Today {{someone}} meets with {{someoneElse}} for {{duration}} minute.</h1>")($rootScope);

$rootScope.duration = 2;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 2 minuty.");

$rootScope.duration = 3;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 3 minuty.");

$rootScope.duration = 4;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 4 minuty.");

$rootScope.duration = 22;
$rootScope.$digest();
assert.equal(el.text(), "Dziś Ruben spotyka się z Ernest przez 22 minuty.");
});
});
});

0 comments on commit 8c6cabf

Please sign in to comment.