translator
Version:
[ABANDONED] Translator for node and also for browser
337 lines (325 loc) • 15.8 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var Cache, FileStorage, Translator, cache, dir, expect, fs, path, translator;
expect = require('chai').expect;
path = require('path');
fs = require('fs');
Translator = require('../../../lib/Translator');
FileStorage = require('cache-storage/Storage/FileStorage');
Cache = require('cache-storage');
dir = path.normalize(__dirname + '/../../data');
cache = path.normalize(__dirname + '/../../cache');
translator = null;
describe('Translator', function() {
beforeEach(function() {
translator = new Translator(dir);
return translator.language = 'en';
});
afterEach(function() {
return translator = null;
});
describe('#constructor()', function() {
it('should contain some plural forms', function() {
return expect(translator.plurals).not.to.be.eql({});
});
it('should create translator with relative path', function() {
translator = new Translator('../../data');
return expect(translator.loader.directory).to.be.equal(dir);
});
return it('should create translator from path in config file', function() {
translator = new Translator('../../data/config.json');
return expect(translator.loader.directory).to.be.equal(dir);
});
});
describe('#normalizeTranslations()', function() {
it('should return normalized object with dictionary', function() {
return expect(translator.normalizeTranslations({
car: 'car',
bus: ['bus']
})).to.be.eql({
car: ['car'],
bus: ['bus']
});
});
it('should return normalized translations without comments', function() {
return expect(translator.normalizeTranslations({
one: ['# hello #', 'car', '# house #', 'something']
})).to.be.eql({
one: ['car', 'something']
});
});
it('should return normalized translations for list with comments', function() {
return expect(translator.normalizeTranslations({
one: [['first'], '# comment #', ['second', '# comment #'], ['third']]
})).to.be.eql({
one: [['first'], ['second'], ['third']]
});
});
return it('should return normalized translations for list with new syntax', function() {
return expect(translator.normalizeTranslations({
'-- list': ['first', 'second', 'third']
})).to.be.eql({
list: [['first'], ['second'], ['third']]
});
});
});
describe('#getMessageInfo()', function() {
return it('should return information about dictionary from message to translate', function() {
return expect(translator.getMessageInfo('web.pages.homepage.promo.title')).to.be.eql({
path: 'web/pages/homepage',
category: 'promo',
name: 'title'
});
});
});
describe('#loadCategory()', function() {
it('should load parsed dictionary', function() {
return expect(translator.loadCategory('web/pages/homepage', 'simple')).to.be.eql({
title: ['Title of promo box']
});
});
it('should load dictionary for different language', function() {
return expect(translator.loadCategory('web/pages/homepage', 'simple', 'cs')).to.be.eql({
title: ['Titulek promo boxu']
});
});
return it('should return empty object if dictionary does not exists', function() {
return expect(translator.loadCategory('some/unknown', 'translation')).to.be.eql({});
});
});
describe('#findTranslation()', function() {
it('should return english translations from dictionary', function() {
return expect(translator.findTranslation('web.pages.homepage.promo.title')).to.be.eql(['Title of promo box']);
});
it('should return translations from dictionary for different language', function() {
return expect(translator.findTranslation('web.pages.homepage.simple.title', 'cs')).to.be.eql(['Titulek promo boxu']);
});
it('should return null when translation does not exists', function() {
return expect(translator.findTranslation('some.unknown.translation')).to.be["null"];
});
return it('should return null when translation does not exists for given language', function() {
return expect(translator.findTranslation('some.unknown.translation', 'cs')).to.be["null"];
});
});
describe('#hasTranslation()', function() {
it('should return true when translation exists', function() {
return expect(translator.hasTranslation('web.pages.homepage.promo.title')).to.be["true"];
});
it('should return true when translation exists for different language', function() {
return expect(translator.hasTranslation('web.pages.homepage.simple.title', 'cs')).to.be["true"];
});
it('should return false when translation does not exists', function() {
return expect(translator.hasTranslation('some.unknown.translation')).to.be["false"];
});
return it('should return false when translation does not exists for different language', function() {
return expect(translator.hasTranslation('some.unknown.translation', 'cs')).to.be["false"];
});
});
describe('#pluralize()', function() {
it('should return right version of translation(s) by count', function() {
var cars, fruits;
cars = ['1 car', '%count% cars'];
expect(translator.pluralize('car', cars, 1)).to.be.equal('1 car');
expect(translator.pluralize('car', cars, 4)).to.be.equal('%count% cars');
fruits = [['1 apple', '%count% apples'], ['1 orange', '%count% oranges']];
expect(translator.pluralize('list', fruits, 1)).to.be.eql(['1 apple', '1 orange']);
return expect(translator.pluralize('list', fruits, 4)).to.be.eql(['%count% apples', '%count% oranges']);
});
return it('should return right version of translation(s) by count for different language', function() {
var cars, fruits;
cars = ['1 auto', '%count% auta', '%count% aut'];
expect(translator.pluralize('car', cars, 1, 'cs')).to.be.equal('1 auto');
expect(translator.pluralize('car', cars, 4, 'cs')).to.be.equal('%count% auta');
fruits = [['1 jablko', '%count% jablka', '%count% jablek'], ['1 pomeranč', '%count% pomeranče', '%count% pomerančů']];
expect(translator.pluralize('list', fruits, 1)).to.be.eql(['1 jablko', '1 pomeranč']);
return expect(translator.pluralize('list', fruits, 4)).to.be.eql(['%count% jablka', '%count% pomeranče']);
});
});
describe('#prepareTranslation()', function() {
return it('should return expanded translation with arguments', function() {
translator.addReplacement('item', 'car');
return expect(translator.prepareTranslation('%item% has got %count% %append%.', {
count: 5,
append: 'things'
})).to.be.equal('car has got 5 things.');
});
});
describe('#applyReplacements()', function() {
return it('should add replacements to text', function() {
return expect(translator.applyReplacements('%one% %two% %three%', {
one: 1,
two: 2,
three: 3
})).to.be.equal('1 2 3');
});
});
describe('#translate()', function() {
it('should return translated text from dictionary', function() {
return expect(translator.translate('web.pages.homepage.promo.title')).to.be.equal('Title of promo box');
});
it('should return original text if text is eclosed in \':\'', function() {
return expect(translator.translate(':do.not.translate.me:')).to.be.equal('do.not.translate.me');
});
it('should return array of list', function() {
return expect(translator.translate('web.pages.homepage.promo.list')).to.be.eql(['1st item', '2nd item', '3rd item', '4th item', '5th item']);
});
it('should return translation for plural form', function() {
return expect(translator.translate('web.pages.homepage.promo.cars', 3)).to.be.equal('3 cars');
});
it('should return translation of list for plural form', function() {
return expect(translator.translate('web.pages.homepage.promo.fruits', 3)).to.be.eql(['3 bananas', '3 citrons', '3 oranges']);
});
it('should return translation with replacement in message', function() {
translator.addReplacement('one', 1);
translator.addReplacement('dictionary', 'promo');
return expect(translator.translate('web.pages.homepage.%dictionary%.%name%', null, {
two: 2,
name: 'advanced'
})).to.be.equal('1 2');
});
it('should translate with parameters in place of count argument', function() {
return expect(translator.translate('web.pages.homepage.promo.advanced', {
one: '1',
two: 2
})).to.be.equal('1 2');
});
it('should translate one item from list in translate method', function() {
expect(translator.translate('web.pages.homepage.promo.newList[0]')).to.be.equal('first');
expect(translator.translate('web.pages.homepage.promo.newList[1]')).to.be.equal('second');
return expect(translator.translate('web.pages.homepage.promo.newList[2]')).to.be.equal('third');
});
it('should translate text from root directory', function() {
return expect(translator.translate('first.test')).to.be.equal('hello');
});
it('should throw an error when translating one item from non-list', function() {
return expect(function() {
return translator.translate('web.pages.homepage.promo.title[5]');
})["throw"](Error);
});
it('should throw an error when translating one item which does not exists', function() {
return expect(function() {
return translator.translate('web.pages.homepage.promo.newList[5]');
})["throw"](Error);
});
it('should return translated text from dictionary for different language', function() {
return expect(translator.translate('cs|web.pages.homepage.simple.title')).to.be.equal('Titulek promo boxu');
});
it('should return original text if text is eclosed in \':\'', function() {
return expect(translator.translate(':cs|do.not.translate.me:')).to.be.equal('do.not.translate.me');
});
it('should not apply filters to not translated messages', function() {
translator.addFilter(function(message) {
return message.split('').reverse().join('');
});
return expect(translator.translate('unknown.title')).to.be.equal('unknown.title');
});
it('should not apply filters to not translatable messages', function() {
translator.addFilter(function(message) {
return message.split('').reverse().join('');
});
return expect(translator.translate(':web.pages.homepage.simple.title:')).to.be.equal('web.pages.homepage.simple.title');
});
it('should apply filters to simple translations', function() {
translator.addFilter(function(message) {
return message.split('').reverse().join('');
});
return expect(translator.translate('web.pages.homepage.simple.title')).to.be.equal('xob omorp fo eltiT');
});
return it('should apply filters for lists of translations', function() {
translator.addFilter(function(message) {
return message.split('').reverse().join('');
});
return expect(translator.translate('web.pages.homepage.promo.fruits', 3)).to.be.eql(['sananab 3', 'snortic 3', 'segnaro 3']);
});
});
describe('#translatePairs()', function() {
it('should throw an error if message to translate are not arrays', function() {
return expect(function() {
return translator.translatePairs('web.pages.homepage.promo', 'title', 'list');
})["throw"](Error);
});
it('should throw an error if keys and values have not got the same length', function() {
return expect(function() {
return translator.translatePairs('web.pages.homepage.promo', 'list', 'keys');
})["throw"](Error);
});
return it('should return object with keys and values translations', function() {
return expect(translator.translatePairs('web.pages.homepage.promo', 'keys', 'values')).to.be.eql({
'1st title': '1st text',
'2nd title': '2nd text',
'3rd title': '3rd text',
'4th title': '4th text'
});
});
});
describe('#translateMap()', function() {
it('should throw an error if object is not array or object', function() {
return expect(function() {
return translator.translateMap(new Date);
}).to["throw"](Error);
});
it('should translate array', function() {
return expect(translator.translateMap(['web.pages.homepage.promo.title', 'web.pages.homepage.promo.info'])).to.be.eql(['Title of promo box', 'Some info text']);
});
it('should translate object', function() {
var t;
t = {
title: 'web.pages.homepage.promo.title',
info: 'web.pages.homepage.promo.info'
};
return expect(translator.translateMap(t)).to.be.eql({
title: 'Title of promo box',
info: 'Some info text'
});
});
it('should translate array with plural forms translations', function() {
return expect(translator.translateMap(['web.pages.homepage.promo.cars', 'web.pages.homepage.promo.mobile'], 6)).to.be.eql(['6 cars', '6 mobiles']);
});
it('should translate array with arguments', function() {
return expect(translator.translateMap(['web.pages.homepage.promo.advanced'], {
one: 1,
two: 2
})).to.be.eql(['1 2']);
});
it('should translate array with base path', function() {
return expect(translator.translateMap(['title', 'info'], 'web.pages.homepage.promo')).to.be.eql(['Title of promo box', 'Some info text']);
});
return it('should translate array with list', function() {
return expect(translator.translateMap(['web.pages.homepage.promo.fruits'], 4)).to.be.eql([['4 bananas', '4 citrons', '4 oranges']]);
});
});
describe('#setCacheStorage()', function() {
it('should throw an exception if storage is not the right type', function() {
return expect(function() {
return translator.setCacheStorage(new Array);
})["throw"](Error);
});
return it('should create cache instance', function() {
translator.setCacheStorage(new FileStorage(cache));
return expect(translator.cache).to.be.an["instanceof"](Cache);
});
});
return describe('#expand()', function() {
it('should expand base translate method', function() {
var main;
main = translator.expand({});
return expect(main._('web.pages.homepage.promo.title')).to.be.equal('Title of promo box');
});
it('should expand translatePairs method', function() {
var main;
main = translator.expand({});
return expect(main._p('web.pages.homepage.promo', 'keys', 'values')).to.be.eql({
'1st title': '1st text',
'2nd title': '2nd text',
'3rd title': '3rd text',
'4th title': '4th text'
});
});
return it('should expand translateMap method', function() {
var main;
main = translator.expand({});
return expect(main._m(['web.pages.homepage.promo.title', 'web.pages.homepage.promo.info'])).to.be.eql(['Title of promo box', 'Some info text']);
});
});
});
}).call(this);