diff --git a/lib/i18n.js b/lib/i18n.js index 8ca4d337d5956d7eb648158e82e0ef249a1bf119..18504bcfb89b83a4dbb1124d3801efe8582fa8b9 100644 --- a/lib/i18n.js +++ b/lib/i18n.js @@ -177,12 +177,15 @@ exports.parseAcceptLanguage = parseAcceptLanguage = function (header) { // supported languages, returns the best match or a default language. // // languages must be a sorted list, the first match is returned. -function bestLanguage(languages, supported_languages, defaultLanguage) { +exports.bestLanguage = bestLanguage = function(languages, supported_languages, defaultLanguage) { var lower = supported_languages.map(function (l) { return l.toLowerCase(); }); for(var i=0; i < languages.length; i++) { var lq = languages[i]; if (lower.indexOf(lq.lang.toLowerCase()) !== -1) { return lq.lang; + // Issue#1128 match locale, even if region isn't supported + } else if (lower.indexOf(lq.lang.slice(0, 2).toLowerCase()) !== -1) { + return lq.lang.slice(0, 2); } } return defaultLanguage; diff --git a/tests/i18n-tests.js b/tests/i18n-tests.js index 66c5e4bf5ced647a757836bd66da8e162b21eb3b..4add4f4333c3a6f6d90b309318243882808aa64c 100755 --- a/tests/i18n-tests.js +++ b/tests/i18n-tests.js @@ -54,6 +54,48 @@ suite.addBatch({ } }); +suite.addBatch({ + "We find exact language match": { + topic: function () { + var accept = 'pa,sv;q=0.8,fi;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'; + var supported = ['af', 'en-US', 'pa']; + var def = 'en-US'; + return i18n.bestLanguage( + parseAcceptLanguage(accept), + supported, def); + }, + "For Punjabi": function (err, locale) { + assert.equal(locale, "pa"); + } + }, + "Issue#1128 We find best locale even if region doesn't match": { + topic: function () { + var accept = 'pa-it,sv;q=0.8,fi;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'; + var supported = ['af', 'en-US', 'pa']; + var def = 'en-US'; + return i18n.bestLanguage( + parseAcceptLanguage(accept), + supported, def); + }, + "For Punjabi (India) serve Punjabi": function (err, locale) { + assert.equal(locale, "pa"); + } + }, + "We don't extend into a region, unless we have an exact match": { + topic: function () { + var accept = 'pa,sv;q=0.8,fi;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'; + var supported = ['af', 'en-US', 'pa-IT']; + var def = 'en-US'; + return i18n.bestLanguage( + parseAcceptLanguage(accept), + supported, def); + }, + "Don't choose Punjabi (India)": function (err, locale) { + assert.equal(locale, "en-us"); + } + } +}); + // run or export the suite. if (process.argv[1] === __filename) suite.run(); else suite.export(module);