From 6fbfe63c101fe32adf431ac9734693348394e8a8 Mon Sep 17 00:00:00 2001 From: Jairo Panduro Date: Fri, 26 Mar 2021 18:09:50 +0200 Subject: [PATCH] STRF-9091 Modify renderPage operation to take already transformed translations --- index.js | 5 ++-- lib/translator/index.js | 11 ++++---- spec/index.js | 61 ++++++++++++++++++++++++++++++++++++++++ spec/lib/translator.js | 62 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index e17a1613..205a0030 100644 --- a/index.js +++ b/index.js @@ -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; }); diff --git a/lib/translator/index.js b/lib/translator/index.js index b3d1f1f6..eede631a 100644 --- a/lib/translator/index.js +++ b/lib/translator/index.js @@ -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} @@ -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); }; /** diff --git a/spec/index.js b/spec/index.js index 7fc0f37a..f89d4f1a 100644 --- a/spec/index.js +++ b/spec/index.js @@ -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); + }); + }) +}); diff --git a/spec/lib/translator.js b/spec/lib/translator.js index b89f8fce..9f33b529 100644 --- a/spec/lib/translator.js +++ b/spec/lib/translator.js @@ -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; @@ -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(); + }) + + }) + });