translator
Version:
[ABANDONED] Translator for node and also for browser
350 lines (274 loc) • 12.4 kB
text/coffeescript
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', ->
beforeEach( ->
translator = new Translator(dir)
translator.language = 'en'
)
afterEach( ->
translator = null
)
describe '#constructor()', ->
it 'should contain some plural forms', ->
expect(translator.plurals).not.to.be.eql({})
it 'should create translator with relative path', ->
translator = new Translator('../../data')
expect(translator.loader.directory).to.be.equal(dir)
it 'should create translator from path in config file', ->
translator = new Translator('../../data/config.json')
expect(translator.loader.directory).to.be.equal(dir)
describe '#normalizeTranslations()', ->
it 'should return normalized object with dictionary', ->
expect(translator.normalizeTranslations(
car: 'car'
bus: ['bus']
)).to.be.eql(
car: ['car']
bus: ['bus']
)
it 'should return normalized translations without comments', ->
expect(translator.normalizeTranslations(
one: [
'# hello #'
'car'
'# house #'
'something'
]
)).to.be.eql(
one: [
'car'
'something'
]
)
it 'should return normalized translations for list with comments', ->
expect(translator.normalizeTranslations(
one: [
['first']
'# comment #'
[
'second'
'# comment #'
]
['third']
]
)).to.be.eql(
one: [
['first']
['second']
['third']
]
)
it 'should return normalized translations for list with new syntax', ->
expect(translator.normalizeTranslations(
'-- list': [
'first'
'second'
'third'
]
)).to.be.eql(
list: [
['first']
['second']
['third']
]
)
describe '#getMessageInfo()', ->
it 'should return information about dictionary from message to translate', ->
expect(translator.getMessageInfo('web.pages.homepage.promo.title')).to.be.eql(
path: 'web/pages/homepage'
category: 'promo'
name: 'title'
)
describe '#loadCategory()', ->
it 'should load parsed dictionary', ->
expect(translator.loadCategory('web/pages/homepage', 'simple')).to.be.eql(
title: ['Title of promo box']
)
it 'should load dictionary for different language', ->
expect(translator.loadCategory('web/pages/homepage', 'simple', 'cs')).to.be.eql(
title: ['Titulek promo boxu']
)
it 'should return empty object if dictionary does not exists', ->
expect(translator.loadCategory('some/unknown', 'translation')).to.be.eql({})
describe '#findTranslation()', ->
it 'should return english translations from dictionary', ->
expect(translator.findTranslation('web.pages.homepage.promo.title')).to.be.eql(['Title of promo box'])
it 'should return translations from dictionary for different language', ->
expect(translator.findTranslation('web.pages.homepage.simple.title', 'cs')).to.be.eql(['Titulek promo boxu'])
it 'should return null when translation does not exists', ->
expect(translator.findTranslation('some.unknown.translation')).to.be.null
it 'should return null when translation does not exists for given language', ->
expect(translator.findTranslation('some.unknown.translation', 'cs')).to.be.null
describe '#hasTranslation()', ->
it 'should return true when translation exists', ->
expect(translator.hasTranslation('web.pages.homepage.promo.title')).to.be.true
it 'should return true when translation exists for different language', ->
expect(translator.hasTranslation('web.pages.homepage.simple.title', 'cs')).to.be.true
it 'should return false when translation does not exists', ->
expect(translator.hasTranslation('some.unknown.translation')).to.be.false
it 'should return false when translation does not exists for different language', ->
expect(translator.hasTranslation('some.unknown.translation', 'cs')).to.be.false
describe '#pluralize()', ->
it 'should return right version of translation(s) by count', ->
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'])
expect(translator.pluralize('list', fruits, 4)).to.be.eql(['%count% apples', '%count% oranges'])
it 'should return right version of translation(s) by count for different language', ->
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č'])
expect(translator.pluralize('list', fruits, 4)).to.be.eql(['%count% jablka', '%count% pomeranče'])
describe '#prepareTranslation()', ->
it 'should return expanded translation with arguments', ->
translator.addReplacement('item', 'car')
expect(translator.prepareTranslation('%item% has got %count% %append%.',
count: 5
append: 'things'
)).to.be.equal('car has got 5 things.')
describe '#applyReplacements()', ->
it 'should add replacements to text', ->
expect(translator.applyReplacements('%one% %two% %three%',
one: 1
two: 2
three: 3
)).to.be.equal('1 2 3')
describe '#translate()', ->
it 'should return translated text from dictionary', ->
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 \':\'', ->
expect(translator.translate(':do.not.translate.me:')).to.be.equal('do.not.translate.me')
it 'should return array of list', ->
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', ->
expect(translator.translate('web.pages.homepage.promo.cars', 3)).to.be.equal('3 cars')
it 'should return translation of list for plural form', ->
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', ->
translator.addReplacement('one', 1)
translator.addReplacement('dictionary', 'promo')
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', ->
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', ->
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')
expect(translator.translate('web.pages.homepage.promo.newList[2]')).to.be.equal('third')
it 'should translate text from root directory', ->
expect(translator.translate('first.test')).to.be.equal('hello')
it 'should throw an error when translating one item from non-list', ->
expect( -> translator.translate('web.pages.homepage.promo.title[5]') ).throw(Error)
it 'should throw an error when translating one item which does not exists', ->
expect( -> translator.translate('web.pages.homepage.promo.newList[5]') ).throw(Error)
it 'should return translated text from dictionary for different language', ->
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 \':\'', ->
expect(translator.translate(':cs|do.not.translate.me:')).to.be.equal('do.not.translate.me')
it 'should not apply filters to not translated messages', ->
translator.addFilter( (message) ->
return message.split('').reverse().join('')
)
expect(translator.translate('unknown.title')).to.be.equal('unknown.title')
it 'should not apply filters to not translatable messages', ->
translator.addFilter( (message) ->
return message.split('').reverse().join('')
)
expect(translator.translate(':web.pages.homepage.simple.title:')).to.be.equal('web.pages.homepage.simple.title')
it 'should apply filters to simple translations', ->
translator.addFilter( (message) ->
return message.split('').reverse().join('')
)
expect(translator.translate('web.pages.homepage.simple.title')).to.be.equal('xob omorp fo eltiT')
it 'should apply filters for lists of translations', ->
translator.addFilter( (message) ->
return message.split('').reverse().join('')
)
expect(translator.translate('web.pages.homepage.promo.fruits', 3)).to.be.eql([
'sananab 3'
'snortic 3'
'segnaro 3'
])
describe '#translatePairs()', ->
it 'should throw an error if message to translate are not arrays', ->
expect( -> 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', ->
expect( -> translator.translatePairs('web.pages.homepage.promo', 'list', 'keys') ).throw(Error)
it 'should return object with keys and values translations', ->
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()', ->
it 'should throw an error if object is not array or object', ->
expect( -> translator.translateMap(new Date)).to.throw(Error)
it 'should translate array', ->
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', ->
t =
title: 'web.pages.homepage.promo.title'
info: 'web.pages.homepage.promo.info'
expect(translator.translateMap(t)).to.be.eql(
title: 'Title of promo box'
info: 'Some info text'
)
it 'should translate array with plural forms translations', ->
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', ->
expect(translator.translateMap(['web.pages.homepage.promo.advanced'], {one: 1, two: 2})).to.be.eql(['1 2'])
it 'should translate array with base path', ->
expect(translator.translateMap(['title', 'info'], 'web.pages.homepage.promo')).to.be.eql([
'Title of promo box'
'Some info text'
])
it 'should translate array with list', ->
expect(translator.translateMap(['web.pages.homepage.promo.fruits'], 4)).to.be.eql([[
'4 bananas'
'4 citrons'
'4 oranges'
]])
describe '#setCacheStorage()', ->
it 'should throw an exception if storage is not the right type', ->
expect( -> translator.setCacheStorage(new Array) ).throw(Error)
it 'should create cache instance', ->
translator.setCacheStorage(new FileStorage(cache))
expect(translator.cache).to.be.an.instanceof(Cache)
describe '#expand()', ->
it 'should expand base translate method', ->
main = translator.expand({})
expect(main._('web.pages.homepage.promo.title')).to.be.equal('Title of promo box')
it 'should expand translatePairs method', ->
main = translator.expand({})
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'
)
it 'should expand translateMap method', ->
main = translator.expand({})
expect(main._m(['web.pages.homepage.promo.title', 'web.pages.homepage.promo.info'])).to.be.eql([
'Title of promo box'
'Some info text'
])