diff --git a/i18n.js b/i18n.js index edf9af2d..68d9735c 100644 --- a/i18n.js +++ b/i18n.js @@ -54,6 +54,7 @@ module.exports = (function() { logDebugFn, logErrorFn, logWarnFn, + preserveLegacyCase, objectNotation, prefix, queryParameter, @@ -147,6 +148,9 @@ module.exports = (function() { logWarnFn = (typeof opt.logWarnFn === 'function') ? opt.logWarnFn : warn; logErrorFn = (typeof opt.logErrorFn === 'function') ? opt.logErrorFn : error; + preserveLegacyCase = (typeof opt.preserveLegacyCase === 'undefined') ? + true : opt.preserveLegacyCase; + // when missing locales we try to guess that from directory opt.locales = opt.locales || guessLocales(directory); @@ -659,7 +663,12 @@ module.exports = (function() { var urlObj = url.parse(request.url, true); if (urlObj.query[queryParameter]) { logDebug('Overriding locale from query: ' + urlObj.query[queryParameter]); - request.language = urlObj.query[queryParameter].toLowerCase(); + request.language = urlObj.query[queryParameter]; + + if (preserveLegacyCase) { + request.language = request.language.toLowerCase(); + } + return i18n.setLocale(request, request.language); } } @@ -1175,4 +1184,4 @@ module.exports = (function() { return i18n; -}()); \ No newline at end of file +}()); diff --git a/test/i18n.configureCookiename.js b/test/i18n.configureCookiename.js index f91dd9ee..7044b0b3 100644 --- a/test/i18n.configureCookiename.js +++ b/test/i18n.configureCookiename.js @@ -2,7 +2,7 @@ var i18n = require('../i18n'), should = require("should"), path = require("path"); -describe('Locale switching should work queryParameter', function() { +describe('Locale switching should work when set via cookie', function() { var req; var res; diff --git a/test/i18n.configureLocales.js b/test/i18n.configureLocales.js index dc5aba7e..67c63f0d 100644 --- a/test/i18n.configureLocales.js +++ b/test/i18n.configureLocales.js @@ -3,7 +3,7 @@ var i18n = require('../i18n'), fs = require('fs'), path = require('path'); -describe('locals configuration', function() { +describe('locales configuration', function() { it('omitting it should read all directory contents', function(done) { var directory = path.resolve(__dirname + '/../locales'); @@ -89,4 +89,5 @@ describe('locals configuration', function() { done(); }); -}); \ No newline at end of file + +}); diff --git a/test/i18n.verifyLocaleSelectionMethods.js b/test/i18n.verifyLocaleSelectionMethods.js new file mode 100644 index 00000000..2d4f9b49 --- /dev/null +++ b/test/i18n.verifyLocaleSelectionMethods.js @@ -0,0 +1,69 @@ +var i18n = require('../i18n'), + should = require("should"); + +describe('when configuring selected locale', function () { + var res; + + function setByQueryParam(i18n, locale) { + var req = { + request: 'GET /test?lang=' + locale, + url: '/test?lang=' + locale + }; + i18n.init(req, res); + return i18n.getLocale(req); + }; + + function setByCookie(i18n, locale) { + var req = { + request: 'GET /test', + url: '/test', + cookies:{ + 'languageCookie': locale + } + }; + + i18n.init(req, res); + return i18n.getLocale(req); + }; + + function setByHeader(i18n, locale) { + var req = { + request: 'GET /test', + url: '/test', + headers: { + 'accept-language': locale + } + }; + i18n.init(req, res); + return i18n.getLocale(req); + }; + + beforeEach(function () { + res = { locals: {} }; + i18n.configure({ + locales: ['de-AT', 'de-DE', 'en-GB', 'tr-TR', 'en-US', 'en'], + defaultLocale: 'default-locale', + queryParameter: 'lang', + cookie: 'languageCookie', + directory: './locales', + preserveLegacyCase: false + }); + }); + + + describe('should result in the same locale whether set by cookie, queryParam, or header', function () { + it('should work for simple language codes', function (done) { + (setByQueryParam(i18n, 'en')).should.be.equal('en', 'when set via queryParameter'); + (setByCookie(i18n, 'en')).should.be.equal('en', 'when set via cookie'); + (setByHeader(i18n, 'en')).should.be.equal('en', 'when set via header'); + done(); + }); + + it('should work for compound language codes', function (done) { + (setByQueryParam(i18n, 'de-AT')).should.be.equal('de-AT', 'when set via queryParameter'); + (setByCookie(i18n, 'de-AT')).should.be.equal('de-AT', 'when set via cookie'); + (setByHeader(i18n, 'de-AT')).should.be.equal('de-AT', 'when set via header'); + done(); + }); + }); +});