Skip to content

Commit

Permalink
Merge pull request #231 from jairo-bc/STRF-9091
Browse files Browse the repository at this point in the history
STRF-9091 Modify renderPage operation to take already transformed translations
  • Loading branch information
junedkazi authored Mar 30, 2021
2 parents 721595b + 6fbfe63 commit af6e235
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 7 deletions.
5 changes: 3 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,12 @@ class Paper {
* Load translation files and give a translator to renderer.
*
* @param {String} acceptLanguage The accept-language header, used to select a locale
* @param {Boolean} omitTransforming If set to true, translations won't be transformted(flattened) and used as provided
* @return {Promise} Promise to load the translations into the renderer.
*/
loadTranslations(acceptLanguage) {
loadTranslations(acceptLanguage, omitTransforming = false) {
return this._assembler.getTranslations().then(translations => {
const translator = Translator.create(acceptLanguage, translations, this.logger);
const translator = Translator.create(acceptLanguage, translations, this.logger, omitTransforming);
this.renderer.setTranslator(translator);
return translations;
});
Expand Down
11 changes: 6 additions & 5 deletions lib/translator/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ const DEFAULT_LOCALE = 'en';
* @param {string} acceptLanguage
* @param {Object} allTranslations
* @param {Object} logger
* @param {Boolean} omitTransforming
*/
function Translator(acceptLanguage, allTranslations, logger = console) {
function Translator(acceptLanguage, allTranslations, logger = console, omitTransforming = false) {
this.logger = logger;

const languages = Transformer.transform(allTranslations, DEFAULT_LOCALE, this.logger);

const languages = omitTransforming ? allTranslations : Transformer.transform(allTranslations, DEFAULT_LOCALE, this.logger);
/**
* @private
* @type {string}
Expand Down Expand Up @@ -59,10 +59,11 @@ function Translator(acceptLanguage, allTranslations, logger = console) {
* @param {string} acceptLanguage
* @param {Object} allTranslations
* @param {Object} logger
* @param {Boolean} omitTransforming
* @returns {Translator}
*/
Translator.create = function (acceptLanguage, allTranslations, logger = console) {
return new Translator(acceptLanguage, allTranslations, logger);
Translator.create = function (acceptLanguage, allTranslations, logger = console, omitTransforming = false) {
return new Translator(acceptLanguage, allTranslations, logger, omitTransforming);
};

/**
Expand Down
61 changes: 61 additions & 0 deletions spec/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,64 @@ describe('renderTheme()', function() {
});
});
});


describe('loadTranslations', () => {
it('should load translations in normal flow (transforming and flattening translations)', done => {
const assembler = {
getTemplates: () => Promise.resolve({}),
getTranslations: () => {
return Promise.resolve({
'en': {
hello: 'Hello {name}',
level1: {
level2: 'we are in the second level'
}
},
'fr': {
hello: 'Bonjour {name}',
level1: {
level2: 'nous sommes dans le deuxième niveau'
}
},
'fr-CA': {
hello: 'Salut {name}'
}
});
}
};
const paper = new Paper(null, null, assembler);
paper.loadTranslations('en').then(() => {
expect(paper.renderer.getTranslator().getLanguage().locales).to.equal({ hello: 'en', 'level1.level2': 'en' });
done();
});
});

it('should load translations and omit trasnformation', done => {
const assembler = {
getTemplates: () => Promise.resolve({}),
getTranslations: () => {
return Promise.resolve({
en: {
locale: 'en',
locales: {
'hello': 'en',
'level1.level2': 'en'
},
translations: {
hello: 'Hello {name}',
'level1.level2': 'we are in the second level'
}
}
});
}
};
const paper = new Paper(null, null, assembler);
paper.loadTranslations('en', true).then(() => {
expect(paper.renderer.getTranslator().getLanguage().locales).to.equal({ hello: 'en', 'level1.level2': 'en' });
done();
}).catch(e => {
console.log(e);
});
})
});
62 changes: 62 additions & 0 deletions spec/lib/translator.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const Code = require('code');
const Lab = require('lab');
const Sinon = require('sinon');
const Translator = require('../../lib/translator');
const Transformer = require('../../lib/translator/transformer');

const lab = exports.lab = Lab.script();
const beforeEach = lab.beforeEach;
Expand Down Expand Up @@ -260,4 +261,65 @@ describe('Translator', () => {

done();
});

describe('translations flattening', () => {
const flattenedLanguages = {
"en": {
"locale": "en",
"locales": {
"welcome": "en",
"hello": "en",
"bye": "en",
"items": "en",
"level1.level2": "en"
},
"translations": {
"welcome": "Welcome",
"hello": "Hello {name}",
"bye": "Bye bye",
"items": "{count, plural, one{1 Item} other{# Items}}",
"level1.level2": "we are on the second level"
}
}
};

it('should provide flattened translations object', done => {
const flattenedTranslator = Translator.create('en', flattenedLanguages, console, true);
const translator = Translator.create('en', translations);
expect(flattenedTranslator.getLanguage('en')).to.equal(translator.getLanguage('en'));

done();
});

it('should omit transforming languages, when flattened languages are provided', done => {
const stub = Sinon.stub(Transformer, 'transform');
Translator.create('en', flattenedLanguages, console, true);
expect(stub.called).to.equal(false);
stub.restore();

done();
});

it('should successfully translate en language without transforming translations', done => {
const locale = 'en';
const translator = Translator.create(locale, flattenedLanguages, console, true);
expect(translator.translate('hello', {name: 'User'})).to.equal('Hello User');

const key = 'level1.level2';
expect(translator.translate(key)).to.equal(flattenedLanguages[locale].translations[key]);
done();
});

it('should successfully translate fr language with transforming translations', done => {
const locale = 'fr-CA';
const translator = Translator.create(locale, translations);
expect(translator.translate('hello', {name: 'User'})).to.equal('Salut User');

const key = 'level1.level2';
expect(translator.translate(key)).to.equal(translations.fr.level1.level2);
done();
})

})

});

0 comments on commit af6e235

Please sign in to comment.