Skip to content

Commit

Permalink
added __l() and __h() + tests, see #150
Browse files Browse the repository at this point in the history
  • Loading branch information
mashpie committed Feb 15, 2016
1 parent 20f7f64 commit 680885d
Show file tree
Hide file tree
Showing 3 changed files with 140 additions and 10 deletions.
40 changes: 30 additions & 10 deletions i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ var vsprintf = require('sprintf-js').vsprintf,
api = [
'__',
'__n',
'__l',
'__h',
'getLocale',
'setLocale',
'getCatalog',
Expand Down Expand Up @@ -60,7 +62,7 @@ i18n.configure = function i18nConfigure(opt) {
register.forEach(function(r) {
applyAPItoObject(r);
});
}else{
} else {
applyAPItoObject(opt.register);
}
}
Expand Down Expand Up @@ -204,6 +206,24 @@ i18n.__ = function i18nTranslate(phrase) {
return msg;
};

i18n.__l = function i18nTranslationList(phrase) {
var translations = [];
Object.keys(locales).sort().forEach(function(l) {
translations.push(i18n.__({ phrase: phrase, locale: l }));
});
return translations;
};

i18n.__h = function i18nTranslationHash(phrase) {
var translations = [];
Object.keys(locales).sort().forEach(function(l) {
var hash = {};
hash[l] = i18n.__({ phrase: phrase, locale: l });
translations.push(hash);
});
return translations;
};

i18n.__n = function i18nTranslatePlural(singular, plural, count) {
var msg, namedValues, args = [];

Expand Down Expand Up @@ -275,7 +295,7 @@ i18n.__n = function i18nTranslatePlural(singular, plural, count) {
i18n.setLocale = function i18nSetLocale(object, locale, skipImplicitObjects) {

// when given an array of objects => setLocale on each
if(Array.isArray(object) && typeof locale === 'string'){
if (Array.isArray(object) && typeof locale === 'string') {
for (var i = object.length - 1; i >= 0; i--) {
i18n.setLocale(object[i], locale, true);
}
Expand Down Expand Up @@ -306,18 +326,18 @@ i18n.setLocale = function i18nSetLocale(object, locale, skipImplicitObjects) {
register.forEach(function(r) {
r.locale = target_object.locale;
});
}else{
} else {
register.locale = target_object.locale;
}
}

// consider res
if(target_object.res && !skipImplicitObjects){
if (target_object.res && !skipImplicitObjects) {
i18n.setLocale(target_object.res, target_object.locale);
}

// consider locals
if(target_object.locals && !skipImplicitObjects){
if (target_object.locals && !skipImplicitObjects) {
i18n.setLocale(target_object.locals, target_object.locale);
}

Expand Down Expand Up @@ -355,9 +375,9 @@ i18n.getCatalog = function i18nGetCatalog(object, locale) {

// called like req.getCatalog()
if (!target_locale && object === undefined && locale === undefined && typeof this.locale === 'string') {
if(register && register.GLOBAL){
if (register && register.GLOBAL) {
target_locale = '';
}else{
} else {
target_locale = this.locale;
}
}
Expand Down Expand Up @@ -412,17 +432,17 @@ function applyAPItoObject(object) {
});

// set initial locale if not set
if(!object.locale){
if (!object.locale) {
object.locale = defaultLocale;
}

// attach to response if present (ie. in express)
if(object.res){
if (object.res) {
applyAPItoObject(object.res);
}

// attach to locals if present (ie. in express)
if(object.locals){
if (object.locals) {
applyAPItoObject(object.locals);
}
}
Expand Down
4 changes: 4 additions & 0 deletions test/i18n.configureRegister.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ describe('configure register', function() {
});

it('should work on global', function() {

// global is evil and will always be
delete global.locale;

reconfigure({
locales: ['en', 'de'],
register: global
Expand Down
106 changes: 106 additions & 0 deletions test/i18n.listsHashes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*jslint nomen: true, undef: true, sloppy: true, white: true, stupid: true, passfail: false, node: true, plusplus: true, indent: 2 */

var i18n = require('../i18n'),
should = require("should"),
fs = require('fs'),
path = require('path');

var i18nPath = 'i18n';
var i18nFilename = path.resolve(i18nPath + '.js');

function reconfigure(config) {
delete require.cache[i18nFilename];
i18n = require(i18nFilename);
i18n.configure(config);
}

describe('i18n.__l() - return a list of translations', function() {

it('should work on a custom object', function() {
var customObject = {};
reconfigure({
locales: ['en', 'de'],
register: customObject
});

//
should.deepEqual(i18n.__l('Hello'), [ 'Hallo', 'Hello' ]);
should.deepEqual(customObject.__l('Hello'), [ 'Hallo', 'Hello' ]);
});

it('should work on list of objects', function() {
var obj1 = {}, obj2 = {};
reconfigure({
locales: ['en', 'de', 'fr'],
register: [obj1, obj2]
});
should.deepEqual(obj1.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
should.deepEqual(obj2.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);

// sets both
i18n.setLocale('fr');
should.deepEqual(obj1.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
should.deepEqual(obj2.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);

// sets both too
obj1.setLocale('en');
should.deepEqual(obj1.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
should.deepEqual(obj2.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);

// sets obj2 only
i18n.setLocale([obj2], 'de');
should.deepEqual(obj1.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
should.deepEqual(obj2.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);

// sets obj2 only
i18n.setLocale(obj2, 'fr', true);
should.deepEqual(obj1.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
should.deepEqual(obj2.__l('Hello'), [ 'Hallo', 'Hello', 'Bonjour' ]);
});
});

describe('i18n.__h() - return a hash of translations', function() {

it('should work on a custom object', function() {
var customObject = {};
reconfigure({
locales: ['en', 'de'],
register: customObject
});


should.deepEqual(i18n.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' } ]);
should.deepEqual(customObject.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' } ]);
});

it('should work on list of objects', function() {
var obj1 = {}, obj2 = {};
reconfigure({
locales: ['en', 'de', 'fr'],
register: [obj1, obj2]
});

should.deepEqual(obj1.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
should.deepEqual(obj2.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);

// sets both
i18n.setLocale('fr');
should.deepEqual(obj1.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
should.deepEqual(obj2.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);

// sets both too
obj1.setLocale('en');
should.deepEqual(obj1.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
should.deepEqual(obj2.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);

// sets obj2 only
i18n.setLocale([obj2], 'de');
should.deepEqual(obj1.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
should.deepEqual(obj2.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);

// sets obj2 only
i18n.setLocale(obj2, 'fr', true);
should.deepEqual(obj1.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
should.deepEqual(obj2.__h('Hello'), [ { de: 'Hallo' }, { en: 'Hello' }, { fr: 'Bonjour' } ]);
});
});

0 comments on commit 680885d

Please sign in to comment.