Skip to content

Commit

Permalink
[#128] Make case comparisons consistent between various locale settin…
Browse files Browse the repository at this point in the history
…g methods (e.g. cookies, headers, query).
  • Loading branch information
Nik Krimm committed Jul 20, 2016
1 parent a74afa5 commit 7e1c9e1
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 5 deletions.
13 changes: 11 additions & 2 deletions i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ module.exports = (function() {
logDebugFn,
logErrorFn,
logWarnFn,
preserveLegacyCase,
objectNotation,
prefix,
queryParameter,
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -1175,4 +1184,4 @@ module.exports = (function() {

return i18n;

}());
}());
2 changes: 1 addition & 1 deletion test/i18n.configureCookiename.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions test/i18n.configureLocales.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -89,4 +89,5 @@ describe('locals configuration', function() {

done();
});
});

});
69 changes: 69 additions & 0 deletions test/i18n.verifyLocaleSelectionMethods.js
Original file line number Diff line number Diff line change
@@ -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();
});
});
});

0 comments on commit 7e1c9e1

Please sign in to comment.