Navigation Menu

Skip to content

Commit

Permalink
introduce normalization and merge helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
karimJWP authored and karimJWP committed Sep 27, 2018
1 parent b5aeff1 commit f84a21d
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 27 deletions.
3 changes: 1 addition & 2 deletions karma.conf.js
Expand Up @@ -142,8 +142,7 @@ module.exports = function(config) {
files: [ files: [
{ pattern: './node_modules/intersection-observer/intersection-observer.js' }, { pattern: './node_modules/intersection-observer/intersection-observer.js' },
{ pattern: './test/index.js' }, { pattern: './test/index.js' },
{ pattern: './test/files/*', included: false }, { pattern: './test/files/**', included: false },
{ pattern: './test/files/translations/*', included: false },
{ pattern: './src/js/*', included: false } { pattern: './src/js/*', included: false }
], ],


Expand Down
2 changes: 1 addition & 1 deletion src/js/api/config.js
Expand Up @@ -69,7 +69,7 @@ const Config = function(options, persisted) {
const language = getLanguage(); const language = getLanguage();
const { localization, intl } = allOptions; const { localization, intl } = allOptions;
const customLocalization = getCustomLocalization(localization, intl, language); const customLocalization = getCustomLocalization(localization, intl, language);
allOptions.localization = applyTranslation({}, customLocalization); allOptions.localization = applyTranslation(en, customLocalization);


let config = Object.assign({}, Defaults, allOptions); let config = Object.assign({}, Defaults, allOptions);
if (config.base === '.') { if (config.base === '.') {
Expand Down
2 changes: 1 addition & 1 deletion src/js/api/setup-steps.js
Expand Up @@ -105,7 +105,7 @@ export function loadTranslations(_model) {
return new Promise(resolve => { return new Promise(resolve => {
return loadJsonTranslation(base, language) return loadJsonTranslation(base, language)
.then(({ response }) => { .then(({ response }) => {
if (destroyed(_model)) { if (destroyed(_model) || !response) {
return; return;
} }
attributes.localization = applyTranslation(response, customLocalization); attributes.localization = applyTranslation(response, customLocalization);
Expand Down
52 changes: 29 additions & 23 deletions src/js/utils/language.js
Expand Up @@ -23,10 +23,23 @@ const codeToLang = {


const langToCode = invert(codeToLang); const langToCode = invert(codeToLang);


function formatLanguageCode(language) { function normalizeLanguageCode(language) {
return language.substring(0, 2).toLowerCase(); return language.substring(0, 2).toLowerCase();
} }


function normalizeLanguageAndCountryCode(language) {
return language.toLowerCase().replace('-', '_');
}

function normalizeIntl(intl) {
// TODO: Country codes are generally seen in upper case, but we have yet to find documentation confirming that this is the standard.
// When the documentation is found, remove lower case support and update our docs with reference to standards.
return Object.keys(intl).reduce((obj, key) => {
obj[normalizeLanguageAndCountryCode(key)] = intl[key];
return obj;
}, {});
}

export function getLabel(language) { export function getLabel(language) {
if (!language) { if (!language) {
return; return;
Expand All @@ -37,7 +50,7 @@ export function getLabel(language) {
return language; return language;
} }


return codeToLang[formatLanguageCode(language)] || language; return codeToLang[normalizeLanguageCode(language)] || language;
} }


export function getCode(language) { export function getCode(language) {
Expand All @@ -63,41 +76,34 @@ export function getLanguage() {
export const translatedLanguageCodes = ['ar', 'da', 'de', 'es', 'fr', 'it', 'ja', 'nb', 'nl', 'pt', 'ro', 'sv', 'tr', 'zh']; export const translatedLanguageCodes = ['ar', 'da', 'de', 'es', 'fr', 'it', 'ja', 'nb', 'nl', 'pt', 'ro', 'sv', 'tr', 'zh'];


export function isTranslationAvailable(language) { export function isTranslationAvailable(language) {
return translatedLanguageCodes.indexOf(formatLanguageCode(language)) >= 0; return translatedLanguageCodes.indexOf(normalizeLanguageCode(language)) >= 0;
} }


export function getCustomLocalization(localization, intl, languageAndCountryCode) { export function getCustomLocalization(localization, intl, languageAndCountryCode) {
localization = localization || {}; intl = normalizeIntl(intl || {});
intl = intl || {}; return Object.assign({}, localization || {}, intl[normalizeLanguageCode(languageAndCountryCode)], intl[normalizeLanguageAndCountryCode(languageAndCountryCode)]);
const languageCode = formatLanguageCode(languageAndCountryCode);
const languageAndCountryCustomization = languageCode === languageAndCountryCode ? {} :
intl[languageAndCountryCode] || intl[languageAndCountryCode.toLowerCase()] ||
intl[languageAndCountryCode.replace('-', '_')] || intl[languageAndCountryCode.toLowerCase().replace('-', '_')];
// TODO: Country codes are generally seen in upper case, but we have yet to find documentation enforcing this format.
// When the documentation is found, remove lower case support and update our docs with reference to standards.
return Object.assign({}, localization, intl[languageCode], languageAndCountryCustomization);
} }


export function isLocalizationComplete(customLocalization) { export function isLocalizationComplete(customLocalization) {
return isDeepKeyMatch(en, customLocalization); return isDeepKeyMatch(en, customLocalization);
} }


export function loadJsonTranslation(base, languageCode) { export function loadJsonTranslation(base, languageCode) {
const url = `${base}translations/${formatLanguageCode(languageCode)}.json`; const url = `${base}translations/${normalizeLanguageCode(languageCode)}.json`;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const oncomplete = (result) => resolve(result); ajax({ url, resolve, reject, responseType: 'json' });
const onerror = () => reject();
ajax({ url, oncomplete, onerror, responseType: 'json' });
}); });
} }


export function applyTranslation(translationJson, customization) { export function applyTranslation(baseLocalization, customization) {
translationJson = translationJson || {}; const localization = Object.assign({}, baseLocalization, customization);
const localization = Object.assign({}, en, translationJson, customization); merge(localization, 'errors', baseLocalization, customization);
localization.errors = Object.assign({}, en.errors, translationJson.errors, customization.errors); merge(localization, 'related', baseLocalization, customization);
localization.related = Object.assign({}, en.related, translationJson.related, customization.related); merge(localization, 'sharing', baseLocalization, customization);
localization.sharing = Object.assign({}, en.sharing, translationJson.sharing, customization.sharing); merge(localization, 'advertising', baseLocalization, customization);
localization.advertising = Object.assign({}, en.advertising, translationJson.advertising, customization.advertising);
return localization; return localization;
}


function merge(z, prop, a, b) {
z[prop] = Object.assign({}, a[prop], b[prop]);
} }

0 comments on commit f84a21d

Please sign in to comment.