@ribajs/i18n
Advanced tools
Comparing version 1.9.0-alpha.0 to 1.9.0-alpha.1
@@ -1,9 +0,9 @@ | ||
import { BinderWrapper } from '@ribajs/core'; | ||
import { BinderWrapper } from "@ribajs/core"; | ||
export interface BinderAttributeChangedEvent { | ||
detail: { | ||
name: string; | ||
oldValue: string; | ||
newValue: string; | ||
namespace: null; | ||
}; | ||
detail: { | ||
name: string; | ||
oldValue: string; | ||
newValue: string; | ||
namespace: null; | ||
}; | ||
} | ||
@@ -10,0 +10,0 @@ /** |
@@ -8,169 +8,212 @@ "use strict"; | ||
exports.i18nStarBinderWrapper = (localesService) => { | ||
return { | ||
name: 'i18n-*', | ||
block: false, | ||
priority: 0, | ||
bind(el) { | ||
const getElementData = () => { | ||
const customData = {}; | ||
customData.type = el.type; | ||
customData.tagName = el.tagName; | ||
customData.contenteditable = el.getAttribute('contenteditable') ? true : false; | ||
customData.isRadio = customData.tagName === 'INPUT' && customData.type === 'radio'; | ||
return customData; | ||
}; | ||
this.customData = getElementData(); | ||
this.customData.i18n = localesService; | ||
this.customData.vars = {}; | ||
this.customData.translateMePathString = null; | ||
this.customData.properties = []; | ||
this.customData.attributeName = this.args[0].toString(); | ||
this.customData.applyTranslation = (locale) => { | ||
if (!locale) { | ||
if (this.customData.i18n.showMissingTranslation) { | ||
locale = `translation missing: "${this.customData.properties.join('.')}"`; | ||
} | ||
else { | ||
return; | ||
} | ||
} | ||
if (this.customData.attributeName === 'html') { | ||
el.innerHTML = locale; | ||
} | ||
else if (this.customData.attributeName === 'text') { | ||
el.innerText = locale; | ||
} | ||
else if (this.customData.attributeName === 'value') { | ||
// TODO support also: https://github.com/JumpLinkNetwork/tinybind/blob/master/src/binders/basic/value.binder.ts#L51 | ||
if (this.customData.contenteditable) { | ||
el.innerHTML = locale; | ||
} | ||
else { | ||
el.value = locale; | ||
} | ||
} | ||
else { | ||
el.setAttribute(this.customData.attributeName, locale); | ||
} | ||
}; | ||
this.customData.parseVars = (_el) => { | ||
// parse templates to vars | ||
const newVars = this.customData.i18n.parseTemplateVars(_el); | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, newVars); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed templates vars', this.customData.vars); | ||
// } | ||
// parse data attributes to vars | ||
// Vanilla works better than jquery data function? | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, _el.dataset); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed attribute vars', this.customData.vars); | ||
// } | ||
// Parse templates wich have his own translations | ||
this.customData.langVars = this.customData.i18n.parseLocalVars(_el); | ||
// if (this.customData.langVars && Object.keys(this.customData.langVars).length) { | ||
// console.warn('parsed own translations', this.customData.langVars); | ||
// } | ||
}; | ||
this.customData.translate = (langcode) => { | ||
// If language service is not ready do nothing | ||
if (!this.customData.i18n.ready) { | ||
return; | ||
} | ||
if (!langcode) { | ||
langcode = this.customData.i18n.getLangcode(); | ||
if (!langcode) { | ||
console.error('Langcode is requred', langcode); | ||
return; | ||
} | ||
} | ||
// translate by using the already translated language variable | ||
if (this.customData.langVars && this.customData.langVars[langcode]) { | ||
return this.customData.applyTranslation(this.customData.langVars[langcode]); | ||
} | ||
if (!this.customData.properties || this.customData.properties.length === 0) { | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
} | ||
} | ||
// translate by properies, e.g. de.cart.add | ||
return this.customData.i18n.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local) => { | ||
if (local && typeof (local) === 'string') { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
} | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
this.customData.onAttributeChanged = (data) => { | ||
if (data.detail.name.startsWith('data-')) { | ||
const varName = data.detail.name.slice(5); | ||
const newVar = {}; | ||
newVar[varName] = data.detail.newValue; | ||
// console.warn('binder-changed newVar', newVar); | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, newVar); | ||
this.customData.translate(); | ||
} | ||
}; | ||
this.customData.onLanguageChanged = (langcode, initial) => { | ||
// Do not translate on inital language change, we use the ready event for this | ||
if (!initial) { | ||
this.customData.translate(langcode); | ||
} | ||
}; | ||
/** | ||
* Initial stuff wee need to do after the language service is ready | ||
*/ | ||
this.customData.initOnReady = (langcode, translationNeeded) => { | ||
// Translate on translation service ready if needed | ||
if (translationNeeded) { | ||
this.customData.translate(langcode); | ||
} | ||
// Translate if language changes | ||
this.customData.i18n.event.on('changed', this.customData.onLanguageChanged); | ||
// Translate if binder attribute event is changed | ||
el.addEventListener('binder-changed', this.customData.onAttributeChanged); | ||
}; | ||
}, | ||
routine(el, translateMePathString) { | ||
if (this.customData.translateMePathString === null) { | ||
// if this is the first call of this function | ||
this.customData.translateMePathString = translateMePathString; | ||
if (translateMePathString) { | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
} | ||
this.customData.parseVars(el); | ||
// Translate if language is ready | ||
if (this.customData.i18n.ready) { | ||
this.customData.initOnReady(this.customData.i18n.getLangcode(), this.customData.i18n.currentLangcode !== this.customData.i18n.initalLangcode || !localesService.doNotTranslateDefaultLanguage); | ||
} | ||
else { | ||
this.customData.i18n.event.on('ready', this.customData.initOnReady); | ||
} | ||
return { | ||
name: "i18n-*", | ||
block: false, | ||
priority: 0, | ||
bind(el) { | ||
const getElementData = () => { | ||
const customData = {}; | ||
customData.type = el.type; | ||
customData.tagName = el.tagName; | ||
customData.contenteditable = el.getAttribute("contenteditable") | ||
? true | ||
: false; | ||
customData.isRadio = | ||
customData.tagName === "INPUT" && customData.type === "radio"; | ||
return customData; | ||
}; | ||
this.customData = getElementData(); | ||
this.customData.i18n = localesService; | ||
this.customData.vars = {}; | ||
this.customData.translateMePathString = null; | ||
this.customData.properties = []; | ||
this.customData.attributeName = this.args[0].toString(); | ||
this.customData.applyTranslation = (locale) => { | ||
if (!locale) { | ||
if (this.customData.i18n.showMissingTranslation) { | ||
locale = `translation missing: "${this.customData.properties.join( | ||
"." | ||
)}"`; | ||
} else { | ||
return; | ||
} | ||
} | ||
if (this.customData.attributeName === "html") { | ||
el.innerHTML = locale; | ||
} else if (this.customData.attributeName === "text") { | ||
el.innerText = locale; | ||
} else if (this.customData.attributeName === "value") { | ||
// TODO support also: https://github.com/JumpLinkNetwork/tinybind/blob/master/src/binders/basic/value.binder.ts#L51 | ||
if (this.customData.contenteditable) { | ||
el.innerHTML = locale; | ||
} else { | ||
el.value = locale; | ||
} | ||
} else { | ||
el.setAttribute(this.customData.attributeName, locale); | ||
} | ||
}; | ||
this.customData.parseVars = (_el) => { | ||
// parse templates to vars | ||
const newVars = this.customData.i18n.parseTemplateVars(_el); | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
newVars | ||
); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed templates vars', this.customData.vars); | ||
// } | ||
// parse data attributes to vars | ||
// Vanilla works better than jquery data function? | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
_el.dataset | ||
); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed attribute vars', this.customData.vars); | ||
// } | ||
// Parse templates wich have his own translations | ||
this.customData.langVars = this.customData.i18n.parseLocalVars(_el); | ||
// if (this.customData.langVars && Object.keys(this.customData.langVars).length) { | ||
// console.warn('parsed own translations', this.customData.langVars); | ||
// } | ||
}; | ||
this.customData.translate = (langcode) => { | ||
// If language service is not ready do nothing | ||
if (!this.customData.i18n.ready) { | ||
return; | ||
} | ||
if (!langcode) { | ||
langcode = this.customData.i18n.getLangcode(); | ||
if (!langcode) { | ||
console.error("Langcode is requred", langcode); | ||
return; | ||
} | ||
} | ||
// translate by using the already translated language variable | ||
if (this.customData.langVars && this.customData.langVars[langcode]) { | ||
return this.customData.applyTranslation( | ||
this.customData.langVars[langcode] | ||
); | ||
} | ||
if ( | ||
!this.customData.properties || | ||
this.customData.properties.length === 0 | ||
) { | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default', this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
} | ||
// translate by properies, e.g. de.cart.add | ||
return this.customData.i18n | ||
.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local) => { | ||
if (local && typeof local === "string") { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
else if (this.customData.translateMePathString !== translateMePathString) { | ||
// If translate string was changed | ||
this.customData.translateMePathString = translateMePathString; | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
this.customData.parseVars(el); | ||
this.customData.translate(); | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
}, | ||
unbind() { | ||
this.el.removeEventListener('binder-changed', this.customData.onAttributeChanged); | ||
this.customData.i18n.event.off('changed', this.customData.onLanguageChanged); | ||
}, | ||
}; | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
this.customData.onAttributeChanged = (data) => { | ||
if (data.detail.name.startsWith("data-")) { | ||
const varName = data.detail.name.slice(5); | ||
const newVar = {}; | ||
newVar[varName] = data.detail.newValue; | ||
// console.warn('binder-changed newVar', newVar); | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
newVar | ||
); | ||
this.customData.translate(); | ||
} | ||
}; | ||
this.customData.onLanguageChanged = (langcode, initial) => { | ||
// Do not translate on inital language change, we use the ready event for this | ||
if (!initial) { | ||
this.customData.translate(langcode); | ||
} | ||
}; | ||
/** | ||
* Initial stuff wee need to do after the language service is ready | ||
*/ | ||
this.customData.initOnReady = (langcode, translationNeeded) => { | ||
// Translate on translation service ready if needed | ||
if (translationNeeded) { | ||
this.customData.translate(langcode); | ||
} | ||
// Translate if language changes | ||
this.customData.i18n.event.on( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
// Translate if binder attribute event is changed | ||
el.addEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
}; | ||
}, | ||
routine(el, translateMePathString) { | ||
if (this.customData.translateMePathString === null) { | ||
// if this is the first call of this function | ||
this.customData.translateMePathString = translateMePathString; | ||
if (translateMePathString) { | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
} | ||
this.customData.parseVars(el); | ||
// Translate if language is ready | ||
if (this.customData.i18n.ready) { | ||
this.customData.initOnReady( | ||
this.customData.i18n.getLangcode(), | ||
this.customData.i18n.currentLangcode !== | ||
this.customData.i18n.initalLangcode || | ||
!localesService.doNotTranslateDefaultLanguage | ||
); | ||
} else { | ||
this.customData.i18n.event.on("ready", this.customData.initOnReady); | ||
} | ||
} else if ( | ||
this.customData.translateMePathString !== translateMePathString | ||
) { | ||
// If translate string was changed | ||
this.customData.translateMePathString = translateMePathString; | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
this.customData.parseVars(el); | ||
this.customData.translate(); | ||
} | ||
}, | ||
unbind() { | ||
this.el.removeEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
this.customData.i18n.event.off( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
}, | ||
}; | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi1zdGFyLmJpbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW5kZXJzL2kxOG4vaTE4bi1zdGFyLmJpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE0RDtBQWE1RDs7R0FFRztBQUNVLFFBQUEscUJBQXFCLEdBQTBCLENBQUMsY0FBK0IsRUFBRSxFQUFFO0lBQzlGLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxLQUFLO1FBQ1osUUFBUSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsRUFBc0I7WUFDekIsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO2dCQUMxQixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxJQUFJLEdBQUksRUFBdUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELFVBQVUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztnQkFDaEMsVUFBVSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMvRSxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO2dCQUNuRixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFV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 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi1zdGFyLmJpbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW5kZXJzL2kxOG4vaTE4bi1zdGFyLmJpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE0RDtBQWE1RDs7R0FFRztBQUNVLFFBQUEscUJBQXFCLEdBQTBCLENBQUMsY0FBK0IsRUFBRSxFQUFFO0lBQzlGLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxLQUFLO1FBQ1osUUFBUSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsRUFBc0I7WUFDekIsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO2dCQUMxQixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxJQUFJLEdBQUksRUFBdUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELFVBQVUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztnQkFDaEMsVUFBVSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMvRSxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO2dCQUNuRixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFV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 |
@@ -1,4 +0,4 @@ | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Binders } from '@ribajs/core'; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Binders } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Binders<any>; | ||
export default _default; |
@@ -5,6 +5,6 @@ "use strict"; | ||
exports.default = (localesService) => { | ||
return { | ||
i18nStarBinder: i18n_star_binder_1.i18nStarBinderWrapper(localesService), | ||
}; | ||
return { | ||
i18nStarBinder: i18n_star_binder_1.i18nStarBinderWrapper(localesService), | ||
}; | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhEQUFnRTtBQUloRSxrQkFBZSxDQUFDLGNBQStCLEVBQUUsRUFBRTtJQUNqRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLHdDQUFxQixDQUFDLGNBQWMsQ0FBQztLQUNyQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyJ9 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhEQUFnRTtBQUloRSxrQkFBZSxDQUFDLGNBQStCLEVBQUUsRUFBRTtJQUNqRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLHdDQUFxQixDQUFDLGNBQWMsQ0FBQztLQUNyQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyJ9 |
@@ -1,37 +0,46 @@ | ||
import { Component, Binder, View } from '@ribajs/core'; | ||
import { Langcode } from '../../interfaces'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
import { Component, Binder, View } from "@ribajs/core"; | ||
import { Langcode } from "../../interfaces"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
export interface Scope { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent["switch"]; | ||
toggle: AI18nSwitcherComponent["toggle"]; | ||
ready: boolean; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent['switch']; | ||
toggle: AI18nSwitcherComponent['toggle']; | ||
switch: ( | ||
langcode: Langcode, | ||
context?: Binder<any> | undefined, | ||
event?: Event | undefined | ||
) => void; | ||
toggle: ( | ||
context?: Binder<any> | undefined, | ||
event?: Event | undefined | ||
) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context?: Binder<any>, event?: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context?: Binder<any>, event?: Event): void; | ||
protected init( | ||
observedAttributes: string[] | ||
): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: (langcode: Langcode, context?: Binder<any> | undefined, event?: Event | undefined) => void; | ||
toggle: (context?: Binder<any> | undefined, event?: Event | undefined) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context?: Binder<any>, event?: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context?: Binder<any>, event?: Event): void; | ||
protected init(observedAttributes: string[]): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} |
@@ -5,105 +5,103 @@ "use strict"; | ||
class AI18nSwitcherComponent extends core_1.Component { | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode) | ||
.then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on('ready', (langcode, translationNeeded) => { | ||
this.initLocales(langcode) | ||
.then((langcodes) => { | ||
super.init(observedAttributes) | ||
.then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
}); | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode).then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === langcode); | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on('changed', (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === changedLangcode); | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on("ready", (langcode, translationNeeded) => { | ||
this.initLocales(langcode).then((langcodes) => { | ||
super.init(observedAttributes).then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}); | ||
}); | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService | ||
.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === langcode; | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on("changed", (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === changedLangcode; | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
} | ||
exports.AI18nSwitcherComponent = AI18nSwitcherComponent; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuYWJzdHJhY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYWJzdHJhY3Qtc3dpdGNoZXIvc3dpdGNoZXIuYWJzdHJhY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdUNBSXNCO0FBV3RCLE1BQXNCLHNCQUF1QixTQUFRLGdCQUFTO0lBVzVELFlBQVksT0FBcUI7UUFDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBUlAsVUFBSyxHQUFHO1lBQ2hCLFNBQVMsRUFBZSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFZLEtBQUs7U0FDdkIsQ0FBQztJQUlGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQWtCLEVBQUUsT0FBcUIsRUFBRSxLQUFhO1FBQ3BFLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsT0FBcUIsRUFBRSxLQUFhO1FBQ2hELElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUNELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxD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 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuYWJzdHJhY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYWJzdHJhY3Qtc3dpdGNoZXIvc3dpdGNoZXIuYWJzdHJhY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdUNBSXNCO0FBV3RCLE1BQXNCLHNCQUF1QixTQUFRLGdCQUFTO0lBVzVELFlBQVksT0FBcUI7UUFDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBUlAsVUFBSyxHQUFHO1lBQ2hCLFNBQVMsRUFBZSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFZLEtBQUs7U0FDdkIsQ0FBQztJQUlGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQWtCLEVBQUUsT0FBcUIsRUFBRSxLQUFhO1FBQ3BFLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsT0FBcUIsRUFBRSxLQUFhO1FBQ2hELElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUNELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxD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 |
@@ -1,5 +0,5 @@ | ||
export { AI18nSwitcherComponent } from './abstract-switcher/switcher.abstract.component'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Components } from '@ribajs/core'; | ||
export { AI18nSwitcherComponent } from "./abstract-switcher/switcher.abstract.component"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Components } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Components; | ||
export default _default; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var switcher_abstract_component_1 = require("./abstract-switcher/switcher.abstract.component"); | ||
exports.AI18nSwitcherComponent = switcher_abstract_component_1.AI18nSwitcherComponent; | ||
exports.AI18nSwitcherComponent = | ||
switcher_abstract_component_1.AI18nSwitcherComponent; | ||
const switcher_component_1 = require("./switcher/switcher.component"); | ||
exports.default = (localesService) => { | ||
return { | ||
i18nSwitcherComponent: switcher_component_1.i18nSwitcherComponentWrapper(localesService), | ||
}; | ||
return { | ||
i18nSwitcherComponent: switcher_component_1.i18nSwitcherComponentWrapper( | ||
localesService | ||
), | ||
}; | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtGQUF5RjtBQUFoRiwrREFBQSxzQkFBc0IsQ0FBQTtBQUMvQixzRUFBNkU7QUFJN0Usa0JBQWUsQ0FBQyxjQUErQixFQUFjLEVBQUU7SUFDN0QsT0FBTztRQUNMLHFCQUFxQixFQUFFLGlEQUE0QixDQUFDLGNBQWMsQ0FBQztLQUNwRSxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtGQUF5RjtBQUFoRiwrREFBQSxzQkFBc0IsQ0FBQTtBQUMvQixzRUFBNkU7QUFJN0Usa0JBQWUsQ0FBQyxjQUErQixFQUFjLEVBQUU7SUFDN0QsT0FBTztRQUNMLHFCQUFxQixFQUFFLGlEQUE0QixDQUFDLGNBQWMsQ0FBQztLQUNwRSxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0= |
@@ -1,4 +0,6 @@ | ||
import { TypeOfComponent } from '@ribajs/core'; | ||
import { AI18nSwitcherComponent } from '../abstract-switcher/switcher.abstract.component'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
export declare const i18nSwitcherComponentWrapper: (localesService: ALocalesService) => TypeOfComponent<AI18nSwitcherComponent>; | ||
import { TypeOfComponent } from "@ribajs/core"; | ||
import { AI18nSwitcherComponent } from "../abstract-switcher/switcher.abstract.component"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
export declare const i18nSwitcherComponentWrapper: ( | ||
localesService: ALocalesService | ||
) => TypeOfComponent<AI18nSwitcherComponent>; |
@@ -5,50 +5,52 @@ "use strict"; | ||
exports.i18nSwitcherComponentWrapper = (localesService) => { | ||
var _a; | ||
return _a = class I18nSwitcherComponent extends switcher_abstract_component_1.AI18nSwitcherComponent { | ||
constructor(element) { | ||
super(element); | ||
this.localesService = localesService; | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
this.init(I18nSwitcherComponent.observedAttributes); | ||
} | ||
static get observedAttributes() { | ||
return []; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
return super.switch(langcode, context, event); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
return super.toggle(context, event); | ||
} | ||
setLangcode(langcode) { | ||
return super.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}, | ||
_a.tagName = 'i18n-switcher', | ||
_a; | ||
var _a; | ||
return ( | ||
(_a = class I18nSwitcherComponent extends switcher_abstract_component_1.AI18nSwitcherComponent { | ||
constructor(element) { | ||
super(element); | ||
this.localesService = localesService; | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
this.init(I18nSwitcherComponent.observedAttributes); | ||
} | ||
static get observedAttributes() { | ||
return []; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
return super.switch(langcode, context, event); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
return super.toggle(context, event); | ||
} | ||
setLangcode(langcode) { | ||
return super.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}), | ||
(_a.tagName = "i18n-switcher"), | ||
_a | ||
); | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3dpdGNoZXIvc3dpdGNoZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0dBQTBGO0FBSTdFLFFBQUEsNEJBQTRCLEdBQUcsQ0FBQyxjQUErQixFQUEyQyxFQUFFOztJQUV2SCxZQUFPLE1BQU0scUJBQXNCLFNBQVEsb0RBQXNCO1lBaUIvRCxZQUFZLE9BQXFCO2dCQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBVlAsbUJBQWMsR0FBRyxjQUFjLENBQUM7Z0JBRWhDLFVBQUssR0FBRztvQkFDaEIsU0FBUyxFQUFlLEVBQUU7b0JBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixLQUFLLEVBQVksS0FBSztpQkFDdkIsQ0FBQztnQkFJQSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEQsQ0FBQztZQWhCRCxNQUFNLEtBQUssa0JBQWtCO2dCQUMzQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFnQkQ7Ozs7ZUFJRztZQUNJLE1BQU0sQ0FBQyxRQUFrQixFQUFFLE9BQXFCLEVBQUUsS0FBYTtnQkFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxNQUFNLENBQUMsT0FBcUIsRUFBRSxLQUFhO2dCQUNoRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFUyxXQUFXLENBQUMsUUFBZ0I7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRVMsa0JBQWtCO2dCQUMxQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFFUyxvQkFBb0I7Z0JBQzVCLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9CLENBQUM7WUFFUyxRQUFRO2dCQUNoQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRjtRQXJEZSxVQUFPLEdBQVcsZUFBZ0I7V0FxRGhEO0FBQ0osQ0FBQyxDQUFDIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3dpdGNoZXIvc3dpdGNoZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esa0dBQTBGO0FBSTdFLFFBQUEsNEJBQTRCLEdBQUcsQ0FBQyxjQUErQixFQUEyQyxFQUFFOztJQUV2SCxZQUFPLE1BQU0scUJBQXNCLFNBQVEsb0RBQXNCO1lBaUIvRCxZQUFZLE9BQXFCO2dCQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBVlAsbUJBQWMsR0FBRyxjQUFjLENBQUM7Z0JBRWhDLFVBQUssR0FBRztvQkFDaEIsU0FBUyxFQUFlLEVBQUU7b0JBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixLQUFLLEVBQVksS0FBSztpQkFDdkIsQ0FBQztnQkFJQSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEQsQ0FBQztZQWhCRCxNQUFNLEtBQUssa0JBQWtCO2dCQUMzQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFnQkQ7Ozs7ZUFJRztZQUNJLE1BQU0sQ0FBQyxRQUFrQixFQUFFLE9BQXFCLEVBQUUsS0FBYTtnQkFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSSxNQUFNLENBQUMsT0FBcUIsRUFBRSxLQUFhO2dCQUNoRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFUyxXQUFXLENBQUMsUUFBZ0I7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRVMsa0JBQWtCO2dCQUMxQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFFUyxvQkFBb0I7Z0JBQzVCLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9CLENBQUM7WUFFUyxRQUFRO2dCQUNoQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRjtRQXJEZSxVQUFPLEdBQVcsZUFBZ0I7V0FxRGhEO0FBQ0osQ0FBQyxDQUFDIn0= |
@@ -1,4 +0,4 @@ | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Formatters } from '@ribajs/core'; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Formatters } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Formatters; | ||
export default _default; |
@@ -5,6 +5,6 @@ "use strict"; | ||
exports.default = (localesService) => { | ||
return { | ||
t: t_formatter_1.tFormatterWrapper(localesService), | ||
}; | ||
return { | ||
t: t_formatter_1.tFormatterWrapper(localesService), | ||
}; | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZm9ybWF0dGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFrRDtBQUlsRCxrQkFBZSxDQUFDLGNBQStCLEVBQWMsRUFBRTtJQUM3RCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLCtCQUFpQixDQUFDLGNBQWMsQ0FBQztLQUNyQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZm9ybWF0dGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUFrRDtBQUlsRCxrQkFBZSxDQUFDLGNBQStCLEVBQWMsRUFBRTtJQUM3RCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLCtCQUFpQixDQUFDLGNBQWMsQ0FBQztLQUNyQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0= |
@@ -1,3 +0,5 @@ | ||
import { Formatter } from '@ribajs/core'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
export declare const tFormatterWrapper: (localesService: ALocalesService) => Formatter; | ||
import { Formatter } from "@ribajs/core"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
export declare const tFormatterWrapper: ( | ||
localesService: ALocalesService | ||
) => Formatter; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const translate = async (translateMePathString, localesService, langcode) => { | ||
const properties = translateMePathString.split('.'); | ||
const properties = translateMePathString.split("."); | ||
if (!langcode) { | ||
langcode = localesService.getLangcode(); | ||
if (!langcode) { | ||
langcode = localesService.getLangcode(); | ||
if (!langcode) { | ||
return null; | ||
} | ||
return null; | ||
} | ||
return localesService.get([langcode, ...properties] /*, vars */) | ||
.then((locale) => { | ||
return locale; | ||
} | ||
return localesService | ||
.get([langcode, ...properties] /*, vars */) | ||
.then((locale) => { | ||
return locale; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
exports.tFormatterWrapper = (localesService) => { | ||
return { | ||
name: 't', | ||
read(translateMePathString, langcode, ...vars) { | ||
return new Promise((resolve, reject) => { | ||
localesService.event.on('changed', () => { | ||
// console.debug('changed'); | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
localesService.event.on('ready', () => { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
if (localesService.ready) { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}); | ||
} | ||
return { | ||
name: "t", | ||
read(translateMePathString, langcode, ...vars) { | ||
return new Promise((resolve, reject) => { | ||
localesService.event.on("changed", () => { | ||
// console.debug('changed'); | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}, | ||
}; | ||
}); | ||
localesService.event.on("ready", () => { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
if (localesService.ready) { | ||
translate(translateMePathString, localesService, langcode).then( | ||
(locale) => { | ||
resolve(locale); | ||
} | ||
); | ||
} | ||
}); | ||
}, | ||
}; | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidC5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZm9ybWF0dGVycy90LmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxxQkFBNkIsRUFBRSxjQUErQixFQUFFLFFBQWlCLEVBQUUsRUFBRTtJQUM1RyxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLFFBQVEsR0FBRyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFBLFdBQVcsQ0FBQztTQUM5RCxJQUFJLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7U0FDRCxLQUFLLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRVcsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLGNBQStCLEVBQWEsRUFBRTtJQUM5RSxPQUFPO1FBQ0wsSUFBSSxFQUFFLEdBQUc7UUFDVCxJQUFJLENBQUMscUJBQTZCLEVBQUUsUUFBZ0IsRUFBRSxHQUFHLElBQWM7WUFDckUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFFckMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtvQkFDdEMsNEJBQTRCO29CQUM1QixTQUFTLENBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQzt5QkFDekQsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ2YsT0FBTyxDQUFDLE1BQWEsQ0FBQyxDQUFDO29CQUN6QixDQUFDLENBQUM7eUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7d0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDcEMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7eUJBQ3pELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxNQUFhLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO3dCQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksY0FBYyxDQUFDLEtBQUssRUFBRTtvQkFDeEIsU0FBUyxDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7eUJBQ3pELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDVyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyJ9 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidC5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZm9ybWF0dGVycy90LmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxxQkFBNkIsRUFBRSxjQUErQixFQUFFLFFBQWlCLEVBQUUsRUFBRTtJQUM1RyxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLFFBQVEsR0FBRyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFBLFdBQVcsQ0FBQztTQUM5RCxJQUFJLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7U0FDRCxLQUFLLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRVcsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLGNBQStCLEVBQWEsRUFBRTtJQUM5RSxPQUFPO1FBQ0wsSUFBSSxFQUFFLEdBQUc7UUFDVCxJQUFJLENBQUMscUJBQTZCLEVBQUUsUUFBZ0IsRUFBRSxHQUFHLElBQWM7WUFDckUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFFckMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtvQkFDdEMsNEJBQTRCO29CQUM1QixTQUFTLENBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQzt5QkFDekQsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ2YsT0FBTyxDQUFDLE1BQWEsQ0FBQyxDQUFDO29CQUN6QixDQUFDLENBQUM7eUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7d0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDcEMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7eUJBQ3pELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxNQUFhLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO3dCQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksY0FBYyxDQUFDLEtBQUssRUFBRTtvQkFDeEIsU0FBUyxDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7eUJBQ3pELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDVyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyJ9 |
@@ -1,9 +0,11 @@ | ||
import { RibaModule } from '@ribajs/core'; | ||
export * from './binders'; | ||
export * from './components'; | ||
export * from './formatters'; | ||
export * from './interfaces'; | ||
export * from './services'; | ||
import * as services from './services'; | ||
export declare const i18nModule: (localesService: services.ALocalesService) => RibaModule; | ||
import { RibaModule } from "@ribajs/core"; | ||
export * from "./binders"; | ||
export * from "./components"; | ||
export * from "./formatters"; | ||
export * from "./interfaces"; | ||
export * from "./services"; | ||
import * as services from "./services"; | ||
export declare const i18nModule: ( | ||
localesService: services.ALocalesService | ||
) => RibaModule; | ||
export default i18nModule; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
var __importDefault = | ||
(this && this.__importDefault) || | ||
function (mod) { | ||
return mod && mod.__esModule ? mod : { default: mod }; | ||
}; | ||
var __importStar = | ||
(this && this.__importStar) || | ||
function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
if (mod != null) | ||
for (var k in mod) | ||
if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
result["default"] = mod; | ||
return result; | ||
}; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -25,10 +31,10 @@ __export(require("./binders")); | ||
exports.i18nModule = (localesService) => { | ||
return { | ||
binders: binders_1.default(localesService), | ||
components: components_1.default(localesService), | ||
formatters: formatters_1.default(localesService), | ||
services, | ||
}; | ||
return { | ||
binders: binders_1.default(localesService), | ||
components: components_1.default(localesService), | ||
formatters: formatters_1.default(localesService), | ||
services, | ||
}; | ||
}; | ||
exports.default = exports.i18nModule; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsK0JBQTBCO0FBQzFCLGtDQUE2QjtBQUM3QixrQ0FBNkI7QUFFN0IsZ0NBQTJCO0FBRTNCLHdEQUF1QztBQUN2Qyw4REFBNkM7QUFDN0MsOERBQTZDO0FBQzdDLHFEQUF1QztBQUUxQixRQUFBLFVBQVUsR0FBRyxDQUFDLGNBQXdDLEVBQWMsRUFBRTtJQUNqRixPQUFPO1FBQ0wsT0FBTyxFQUFFLGlCQUFjLENBQUMsY0FBYyxDQUFDO1FBQ3ZDLFVBQVUsRUFBRSxvQkFBaUIsQ0FBQyxjQUFjLENBQUM7UUFDN0MsVUFBVSxFQUFFLG9CQUFpQixDQUFDLGNBQWMsQ0FBQztRQUM3QyxRQUFRO0tBQ1QsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLGtCQUFlLGtCQUFVLENBQUMifQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsK0JBQTBCO0FBQzFCLGtDQUE2QjtBQUM3QixrQ0FBNkI7QUFFN0IsZ0NBQTJCO0FBRTNCLHdEQUF1QztBQUN2Qyw4REFBNkM7QUFDN0MsOERBQTZDO0FBQzdDLHFEQUF1QztBQUUxQixRQUFBLFVBQVUsR0FBRyxDQUFDLGNBQXdDLEVBQWMsRUFBRTtJQUNqRixPQUFPO1FBQ0wsT0FBTyxFQUFFLGlCQUFjLENBQUMsY0FBYyxDQUFDO1FBQ3ZDLFVBQVUsRUFBRSxvQkFBaUIsQ0FBQyxjQUFjLENBQUM7UUFDN0MsVUFBVSxFQUFFLG9CQUFpQixDQUFDLGNBQWMsQ0FBQztRQUM3QyxRQUFRO0tBQ1QsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLGtCQUFlLGtCQUFVLENBQUMifQ== |
@@ -1,2 +0,2 @@ | ||
export * from './langcode'; | ||
export * from './local-var'; | ||
export * from "./langcode"; | ||
export * from "./local-var"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= |
export interface Langcode { | ||
code: string; | ||
active: boolean; | ||
code: string; | ||
active: boolean; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ2NvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9sYW5nY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ2NvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9sYW5nY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= |
export interface LocalPluralization { | ||
zero?: string; | ||
one?: string; | ||
two?: string; | ||
other?: string; | ||
zero?: string; | ||
one?: string; | ||
two?: string; | ||
other?: string; | ||
} | ||
export interface LocalVar { | ||
[name: string]: string | LocalPluralization; | ||
[name: string]: string | LocalPluralization; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtdmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvbG9jYWwtdmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtdmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvbG9jYWwtdmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ== |
@@ -1,3 +0,3 @@ | ||
export * from './locales-base.service'; | ||
export * from './locales-rest.service'; | ||
export * from './locales-static.service'; | ||
export * from "./locales-base.service"; | ||
export * from "./locales-rest.service"; | ||
export * from "./locales-static.service"; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
@@ -9,2 +9,2 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||
__export(require("./locales-static.service")); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsNENBQXVDO0FBQ3ZDLDhDQUF5QyJ9 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsNENBQXVDO0FBQ3ZDLDhDQUF5QyJ9 |
@@ -1,67 +0,73 @@ | ||
import { EventDispatcher } from '@ribajs/core'; | ||
import { Langcode, LocalPluralization, LocalVar } from '../interfaces'; | ||
import { EventDispatcher } from "@ribajs/core"; | ||
import { Langcode, LocalPluralization, LocalVar } from "../interfaces"; | ||
export declare abstract class ALocalesService { | ||
doNotTranslateDefaultLanguage: boolean; | ||
get ready(): boolean; | ||
event: EventDispatcher; | ||
showMissingTranslation: boolean; | ||
protected _ready: boolean; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode?: string; | ||
constructor(doNotTranslateDefaultLanguage: boolean, showMissingTranslation: boolean); | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: LocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: LocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string | undefined; | ||
getInitialLangcode(): string | undefined; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<Langcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: LocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected init(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization(translateObj: LocalPluralization | string, vars: LocalVar): string; | ||
doNotTranslateDefaultLanguage: boolean; | ||
get ready(): boolean; | ||
event: EventDispatcher; | ||
showMissingTranslation: boolean; | ||
protected _ready: boolean; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode?: string; | ||
constructor( | ||
doNotTranslateDefaultLanguage: boolean, | ||
showMissingTranslation: boolean | ||
); | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: LocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: LocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string | undefined; | ||
getInitialLangcode(): string | undefined; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<Langcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: LocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected init(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization( | ||
translateObj: LocalPluralization | string, | ||
vars: LocalVar | ||
): string; | ||
} |
@@ -5,234 +5,260 @@ "use strict"; | ||
class ALocalesService { | ||
constructor(doNotTranslateDefaultLanguage, showMissingTranslation) { | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.event = new core_1.EventDispatcher('i18n'); | ||
this.showMissingTranslation = false; | ||
this._ready = false; | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.showMissingTranslation = showMissingTranslation; | ||
constructor(doNotTranslateDefaultLanguage, showMissingTranslation) { | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.event = new core_1.EventDispatcher("i18n"); | ||
this.showMissingTranslation = false; | ||
this._ready = false; | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.showMissingTranslation = showMissingTranslation; | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error("not ready"); | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error('not ready'); | ||
} | ||
return this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} | ||
else { | ||
return null; | ||
} | ||
} | ||
return local; | ||
return ( | ||
this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} else { | ||
return null; | ||
} | ||
} | ||
return locals; | ||
}) | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn(`WARNING translation missing: "${properties.join('.')}"`, local, properties); | ||
} | ||
return local; | ||
} | ||
return locals; | ||
}) | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn( | ||
`WARNING translation missing: "${properties.join(".")}"`, | ||
local, | ||
properties | ||
); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}) | ||
); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error("Langcode not found in html tag"); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error('Langcode not found in html tag'); | ||
} | ||
return this.get([langcode, ...properties], vars); | ||
return this.get([langcode, ...properties], vars); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split("-")[0].toLowerCase(); | ||
return simplified; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement | ||
? document.documentElement.lang | ||
: "en"; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger("changed", langcode, initial); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split('-')[0].toLowerCase(); | ||
return simplified; | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true).then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el) { | ||
const templates = el.querySelectorAll("template"); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const name = template.getAttribute("name"); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el) { | ||
const templates = el.querySelectorAll("template"); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const lang = template.getAttribute("lang"); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if ( | ||
!translateString || | ||
Object.keys(vars).length === 0 || | ||
typeof translateString.match !== "function" | ||
) { | ||
return translateString; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement ? document.documentElement.lang : 'en'; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger('changed', langcode, initial); | ||
const matches = translateString.match(/{{\s*?[A-Za-z0-9_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ""); | ||
if ( | ||
typeof vars[varName] === "string" || | ||
typeof vars[varName] === "number" | ||
) { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true) | ||
.then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
return translateString; | ||
} | ||
async init() { | ||
this.initalLangcode = this.getHTMLLangcode(); | ||
this.currentLangcode = this.initalLangcode; | ||
if (!this.initalLangcode) { | ||
throw new Error( | ||
`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}` | ||
); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el) { | ||
const templates = el.querySelectorAll('template'); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const name = template.getAttribute('name'); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el) { | ||
const templates = el.querySelectorAll('template'); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const lang = template.getAttribute('lang'); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if (!translateString || Object.keys(vars).length === 0 || typeof (translateString.match) !== 'function') { | ||
return translateString; | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
const matches = translateString.match(/{{\s*?[A-Za-z0-9_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ''); | ||
if (typeof (vars[varName]) === 'string' || typeof (vars[varName]) === 'number') { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if ( | ||
!this.doNotTranslateDefaultLanguage || | ||
(browserLangFound && browserLangcode !== this.currentLangcode) | ||
) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return translateString; | ||
} | ||
async init() { | ||
this.initalLangcode = this.getHTMLLangcode(); | ||
this.currentLangcode = this.initalLangcode; | ||
if (!this.initalLangcode) { | ||
throw new Error(`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}`); | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = | ||
this.currentLangcode !== this.initalLangcode || | ||
!this.doNotTranslateDefaultLanguage; | ||
this.event.trigger("ready", this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if ( | ||
vars.count && | ||
typeof translateObj === "object" && | ||
translateObj !== null | ||
) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if (!this.doNotTranslateDefaultLanguage || (browserLangFound && browserLangcode !== this.currentLangcode)) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = this.currentLangcode !== this.initalLangcode || !this.doNotTranslateDefaultLanguage; | ||
this.event.trigger('ready', this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if (vars.count && typeof (translateObj) === 'object' && translateObj !== null) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
} | ||
else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
} | ||
else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
} | ||
} else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
if (typeof (translateObj) === 'object' && translateObj !== null && translateObj.other) { | ||
return translateObj.other; | ||
} else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
return translateObj; | ||
} | ||
} | ||
if ( | ||
typeof translateObj === "object" && | ||
translateObj !== null && | ||
translateObj.other | ||
) { | ||
return translateObj.other; | ||
} | ||
return translateObj; | ||
} | ||
} | ||
exports.ALocalesService = ALocalesService; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1iYXNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbG9jYWxlcy1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBc0Q7QUFHdEQsTUFBc0IsZUFBZTtJQXNCbkMsWUFBbUIsNkJBQXNDLEVBQUUsc0JBQStCO1FBQXZFLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBUztRQWhCbEQsVUFBSyxHQUFHLElBQUksc0JBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFFckMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQWFoQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsNkJBQTZCLENBQUM7UUFDbkUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO0lBQ3ZELENBQUM7SUF2QkQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUF1QkQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQXFCLEVBQUUsSUFBZSxFQUFFLFFBQWlCLEtBQUs7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQixxQkFBcUI7YUFDcEIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUNuQyxJQUFJLEtBQUssR0FBUSxZQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxRQUFR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 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1iYXNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbG9jYWxlcy1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBc0Q7QUFHdEQsTUFBc0IsZUFBZTtJQXNCbkMsWUFBbUIsNkJBQXNDLEVBQUUsc0JBQStCO1FBQXZFLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBUztRQWhCbEQsVUFBSyxHQUFHLElBQUksc0JBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFFckMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQWFoQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsNkJBQTZCLENBQUM7UUFDbkUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO0lBQ3ZELENBQUM7SUF2QkQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUF1QkQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQXFCLEVBQUUsSUFBZSxFQUFFLFFBQWlCLEtBQUs7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQixxQkFBcUI7YUFDcEIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUNuQyxJQUFJLEtBQUssR0FBUSxZQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxRQUFR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 |
@@ -1,2 +0,2 @@ | ||
import { ALocalesService } from './locales-base.service'; | ||
import { ALocalesService } from "./locales-base.service"; | ||
/** | ||
@@ -6,22 +6,26 @@ * LocalesRestService get locales object from url | ||
export declare class LocalesRestService extends ALocalesService { | ||
protected url: string; | ||
static instances: { | ||
[url: string]: LocalesRestService; | ||
}; | ||
static getInstance(url: string): LocalesRestService; | ||
locales: any; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor(url: string, doNotTranslateDefaultLanguage?: boolean, showMissingTranslation?: boolean); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(url?: string): Promise<any>; | ||
protected url: string; | ||
static instances: { | ||
[url: string]: LocalesRestService; | ||
}; | ||
static getInstance(url: string): LocalesRestService; | ||
locales: any; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor( | ||
url: string, | ||
doNotTranslateDefaultLanguage?: boolean, | ||
showMissingTranslation?: boolean | ||
); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(url?: string): Promise<any>; | ||
} |
@@ -9,45 +9,48 @@ "use strict"; | ||
class LocalesRestService extends locales_base_service_1.ALocalesService { | ||
constructor(url, doNotTranslateDefaultLanguage = false, showMissingTranslation = false) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.url = url; | ||
this.locales = {}; | ||
this.url = url; | ||
if (!this.url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (LocalesRestService.instances[this.url]) { | ||
return LocalesRestService.instances[this.url]; | ||
} | ||
this.init(); | ||
LocalesRestService.instances[this.url] = this; | ||
constructor( | ||
url, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.url = url; | ||
this.locales = {}; | ||
this.url = url; | ||
if (!this.url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
static getInstance(url) { | ||
return LocalesRestService.instances[url]; | ||
if (LocalesRestService.instances[this.url]) { | ||
return LocalesRestService.instances[this.url]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(url) { | ||
if (!url) { | ||
url = this.url; | ||
} | ||
if (!url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (window.Shopify.shop) { | ||
url = url + `?shop=${window.Shopify.shop}`; | ||
} | ||
if (this.locales[url]) { | ||
return this.locales[url]; | ||
} | ||
return core_1.HttpService.getJSON(url) | ||
.then((locales) => { | ||
this.locales[url] = locales; | ||
return this.locales[url]; | ||
}); | ||
this.init(); | ||
LocalesRestService.instances[this.url] = this; | ||
} | ||
static getInstance(url) { | ||
return LocalesRestService.instances[url]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(url) { | ||
if (!url) { | ||
url = this.url; | ||
} | ||
if (!url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (window.Shopify.shop) { | ||
url = url + `?shop=${window.Shopify.shop}`; | ||
} | ||
if (this.locales[url]) { | ||
return this.locales[url]; | ||
} | ||
return core_1.HttpService.getJSON(url).then((locales) => { | ||
this.locales[url] = locales; | ||
return this.locales[url]; | ||
}); | ||
} | ||
} | ||
exports.LocalesRestService = LocalesRestService; | ||
LocalesRestService.instances = {}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1yZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbG9jYWxlcy1yZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBMkM7QUFDM0MsaUVBQXlEO0FBRXpEOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQ0FBZTtJQXNCckQsWUFBc0IsR0FBVyxFQUFFLGdDQUF5QyxLQUFLLEVBQUUseUJBQWtDLEtBQUs7UUFDeEgsS0FBSyxDQUFDLDZCQUE2QixFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFEekMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQVoxQixZQUFPLEdBQVEsRUFBRSxDQUFDO1FBZXZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDcEM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDaEQsQ0FBQztJQS9CTSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVc7UUFDbkMsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQStCRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVk7UUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUssTUFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDaEMsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFVLE1BQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxrQkFBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7YUFDOUIsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFhLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEvREgsZ0RBaUVDO0FBL0RlLDRCQUFTLEdBRW5CLEVBQUUsQ0FBQyJ9 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1yZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbG9jYWxlcy1yZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBMkM7QUFDM0MsaUVBQXlEO0FBRXpEOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQ0FBZTtJQXNCckQsWUFBc0IsR0FBVyxFQUFFLGdDQUF5QyxLQUFLLEVBQUUseUJBQWtDLEtBQUs7UUFDeEgsS0FBSyxDQUFDLDZCQUE2QixFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFEekMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQVoxQixZQUFPLEdBQVEsRUFBRSxDQUFDO1FBZXZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDcEM7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDaEQsQ0FBQztJQS9CTSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVc7UUFDbkMsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQStCRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVk7UUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUssTUFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDaEMsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFVLE1BQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxrQkFBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7YUFDOUIsSUFBSSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFhLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEvREgsZ0RBaUVDO0FBL0RlLDRCQUFTLEdBRW5CLEVBQUUsQ0FBQyJ9 |
@@ -1,23 +0,28 @@ | ||
import { ALocalesService } from './locales-base.service'; | ||
import { ALocalesService } from "./locales-base.service"; | ||
export declare class LocalesStaticService extends ALocalesService { | ||
protected locales: any; | ||
protected id?: string | undefined; | ||
static instances: { | ||
[id: string]: LocalesStaticService; | ||
}; | ||
static getInstance(id?: string): LocalesStaticService; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor(locales: any, id?: string | undefined, doNotTranslateDefaultLanguage?: boolean, showMissingTranslation?: boolean); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(themeID?: number): Promise<any>; | ||
protected locales: any; | ||
protected id?: string | undefined; | ||
static instances: { | ||
[id: string]: LocalesStaticService; | ||
}; | ||
static getInstance(id?: string): LocalesStaticService; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor( | ||
locales: any, | ||
id?: string | undefined, | ||
doNotTranslateDefaultLanguage?: boolean, | ||
showMissingTranslation?: boolean | ||
); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(themeID?: number): Promise<any>; | ||
} |
@@ -5,29 +5,34 @@ "use strict"; | ||
class LocalesStaticService extends locales_base_service_1.ALocalesService { | ||
constructor(locales, id, doNotTranslateDefaultLanguage = false, showMissingTranslation = false) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.locales = locales; | ||
this.id = id; | ||
if (!id) { | ||
id = 'main'; | ||
} | ||
this.locales = locales; | ||
if (LocalesStaticService.instances[id]) { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
this.init(); | ||
LocalesStaticService.instances[id] = this; | ||
constructor( | ||
locales, | ||
id, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.locales = locales; | ||
this.id = id; | ||
if (!id) { | ||
id = "main"; | ||
} | ||
static getInstance(id = 'main') { | ||
return LocalesStaticService.instances[id]; | ||
this.locales = locales; | ||
if (LocalesStaticService.instances[id]) { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(themeID) { | ||
return this.locales; | ||
} | ||
this.init(); | ||
LocalesStaticService.instances[id] = this; | ||
} | ||
static getInstance(id = "main") { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(themeID) { | ||
return this.locales; | ||
} | ||
} | ||
exports.LocalesStaticService = LocalesStaticService; | ||
LocalesStaticService.instances = {}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1zdGF0aWMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9sb2NhbGVzLXN0YXRpYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUVBQXlEO0FBRXpELE1BQWEsb0JBQXFCLFNBQVEsc0NBQWU7SUFvQnZELFlBQXNCLE9BQVksRUFBWSxFQUFXLEVBQUUsZ0NBQXlDLEtBQUssRUFBRSx5QkFBa0MsS0FBSztRQUNoSixLQUFLLENBQUMsNkJBQTZCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUR6QyxZQUFPLEdBQVAsT0FBTyxDQUFLO1FBQVksT0FBRSxHQUFGLEVBQUUsQ0FBUztRQUV2RCxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsRUFBRSxHQUFHLE1BQU0sQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzVDLENBQUM7SUE1Qk0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFhLE1BQU07UUFDM0MsT0FBTyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQTRCRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDOztBQTFDSCxvREE0Q0M7QUExQ2UsOEJBQVMsR0FFbkIsRUFBRSxDQUFDIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy1zdGF0aWMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9sb2NhbGVzLXN0YXRpYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUVBQXlEO0FBRXpELE1BQWEsb0JBQXFCLFNBQVEsc0NBQWU7SUFvQnZELFlBQXNCLE9BQVksRUFBWSxFQUFXLEVBQUUsZ0NBQXlDLEtBQUssRUFBRSx5QkFBa0MsS0FBSztRQUNoSixLQUFLLENBQUMsNkJBQTZCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUR6QyxZQUFPLEdBQVAsT0FBTyxDQUFLO1FBQVksT0FBRSxHQUFGLEVBQUUsQ0FBUztRQUV2RCxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsRUFBRSxHQUFHLE1BQU0sQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzVDLENBQUM7SUE1Qk0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFhLE1BQU07UUFDM0MsT0FBTyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQTRCRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDOztBQTFDSCxvREE0Q0M7QUExQ2UsOEJBQVMsR0FFbkIsRUFBRSxDQUFDIn0= |
@@ -1,1 +0,1 @@ | ||
export * from './i18n/i18n-star.binder'; | ||
export * from "./i18n/i18n-star.binder"; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__export(require("./i18n/i18n-star.binder")); |
@@ -1,9 +0,9 @@ | ||
import { BinderWrapper } from '@ribajs/core'; | ||
import { BinderWrapper } from "@ribajs/core"; | ||
export interface BinderAttributeChangedEvent { | ||
detail: { | ||
name: string; | ||
oldValue: string; | ||
newValue: string; | ||
namespace: null; | ||
}; | ||
detail: { | ||
name: string; | ||
oldValue: string; | ||
newValue: string; | ||
namespace: null; | ||
}; | ||
} | ||
@@ -10,0 +10,0 @@ /** |
@@ -8,168 +8,211 @@ "use strict"; | ||
exports.i18nStarBinderWrapper = (localesService) => { | ||
return { | ||
name: 'i18n-*', | ||
block: false, | ||
priority: 0, | ||
bind(el) { | ||
const getElementData = () => { | ||
const customData = {}; | ||
customData.type = el.type; | ||
customData.tagName = el.tagName; | ||
customData.contenteditable = el.getAttribute('contenteditable') ? true : false; | ||
customData.isRadio = customData.tagName === 'INPUT' && customData.type === 'radio'; | ||
return customData; | ||
}; | ||
this.customData = getElementData(); | ||
this.customData.i18n = localesService; | ||
this.customData.vars = {}; | ||
this.customData.translateMePathString = null; | ||
this.customData.properties = []; | ||
this.customData.attributeName = this.args[0].toString(); | ||
this.customData.applyTranslation = (locale) => { | ||
if (!locale) { | ||
if (this.customData.i18n.showMissingTranslation) { | ||
locale = `translation missing: "${this.customData.properties.join('.')}"`; | ||
} | ||
else { | ||
return; | ||
} | ||
} | ||
if (this.customData.attributeName === 'html') { | ||
el.innerHTML = locale; | ||
} | ||
else if (this.customData.attributeName === 'text') { | ||
el.innerText = locale; | ||
} | ||
else if (this.customData.attributeName === 'value') { | ||
// TODO support also: https://github.com/JumpLinkNetwork/tinybind/blob/master/src/binders/basic/value.binder.ts#L51 | ||
if (this.customData.contenteditable) { | ||
el.innerHTML = locale; | ||
} | ||
else { | ||
el.value = locale; | ||
} | ||
} | ||
else { | ||
el.setAttribute(this.customData.attributeName, locale); | ||
} | ||
}; | ||
this.customData.parseVars = (_el) => { | ||
// parse templates to vars | ||
const newVars = this.customData.i18n.parseTemplateVars(_el); | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, newVars); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed templates vars', this.customData.vars); | ||
// } | ||
// parse data attributes to vars | ||
// Vanilla works better than jquery data function? | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, _el.dataset); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed attribute vars', this.customData.vars); | ||
// } | ||
// Parse templates wich have his own translations | ||
this.customData.langVars = this.customData.i18n.parseLocalVars(_el); | ||
// if (this.customData.langVars && Object.keys(this.customData.langVars).length) { | ||
// console.warn('parsed own translations', this.customData.langVars); | ||
// } | ||
}; | ||
this.customData.translate = (langcode) => { | ||
// If language service is not ready do nothing | ||
if (!this.customData.i18n.ready) { | ||
return; | ||
} | ||
if (!langcode) { | ||
langcode = this.customData.i18n.getLangcode(); | ||
if (!langcode) { | ||
console.error('Langcode is requred', langcode); | ||
return; | ||
} | ||
} | ||
// translate by using the already translated language variable | ||
if (this.customData.langVars && this.customData.langVars[langcode]) { | ||
return this.customData.applyTranslation(this.customData.langVars[langcode]); | ||
} | ||
if (!this.customData.properties || this.customData.properties.length === 0) { | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
} | ||
} | ||
// translate by properies, e.g. de.cart.add | ||
return this.customData.i18n.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local) => { | ||
if (local && typeof (local) === 'string') { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
} | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
this.customData.onAttributeChanged = (data) => { | ||
if (data.detail.name.startsWith('data-')) { | ||
const varName = data.detail.name.slice(5); | ||
const newVar = {}; | ||
newVar[varName] = data.detail.newValue; | ||
// console.warn('binder-changed newVar', newVar); | ||
this.customData.vars = core_1.Utils.concat(true, this.customData.vars, newVar); | ||
this.customData.translate(); | ||
} | ||
}; | ||
this.customData.onLanguageChanged = (langcode, initial) => { | ||
// Do not translate on inital language change, we use the ready event for this | ||
if (!initial) { | ||
this.customData.translate(langcode); | ||
} | ||
}; | ||
/** | ||
* Initial stuff wee need to do after the language service is ready | ||
*/ | ||
this.customData.initOnReady = (langcode, translationNeeded) => { | ||
// Translate on translation service ready if needed | ||
if (translationNeeded) { | ||
this.customData.translate(langcode); | ||
} | ||
// Translate if language changes | ||
this.customData.i18n.event.on('changed', this.customData.onLanguageChanged); | ||
// Translate if binder attribute event is changed | ||
el.addEventListener('binder-changed', this.customData.onAttributeChanged); | ||
}; | ||
}, | ||
routine(el, translateMePathString) { | ||
if (this.customData.translateMePathString === null) { | ||
// if this is the first call of this function | ||
this.customData.translateMePathString = translateMePathString; | ||
if (translateMePathString) { | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
} | ||
this.customData.parseVars(el); | ||
// Translate if language is ready | ||
if (this.customData.i18n.ready) { | ||
this.customData.initOnReady(this.customData.i18n.getLangcode(), this.customData.i18n.currentLangcode !== this.customData.i18n.initalLangcode || !localesService.doNotTranslateDefaultLanguage); | ||
} | ||
else { | ||
this.customData.i18n.event.on('ready', this.customData.initOnReady); | ||
} | ||
return { | ||
name: "i18n-*", | ||
block: false, | ||
priority: 0, | ||
bind(el) { | ||
const getElementData = () => { | ||
const customData = {}; | ||
customData.type = el.type; | ||
customData.tagName = el.tagName; | ||
customData.contenteditable = el.getAttribute("contenteditable") | ||
? true | ||
: false; | ||
customData.isRadio = | ||
customData.tagName === "INPUT" && customData.type === "radio"; | ||
return customData; | ||
}; | ||
this.customData = getElementData(); | ||
this.customData.i18n = localesService; | ||
this.customData.vars = {}; | ||
this.customData.translateMePathString = null; | ||
this.customData.properties = []; | ||
this.customData.attributeName = this.args[0].toString(); | ||
this.customData.applyTranslation = (locale) => { | ||
if (!locale) { | ||
if (this.customData.i18n.showMissingTranslation) { | ||
locale = `translation missing: "${this.customData.properties.join( | ||
"." | ||
)}"`; | ||
} else { | ||
return; | ||
} | ||
} | ||
if (this.customData.attributeName === "html") { | ||
el.innerHTML = locale; | ||
} else if (this.customData.attributeName === "text") { | ||
el.innerText = locale; | ||
} else if (this.customData.attributeName === "value") { | ||
// TODO support also: https://github.com/JumpLinkNetwork/tinybind/blob/master/src/binders/basic/value.binder.ts#L51 | ||
if (this.customData.contenteditable) { | ||
el.innerHTML = locale; | ||
} else { | ||
el.value = locale; | ||
} | ||
} else { | ||
el.setAttribute(this.customData.attributeName, locale); | ||
} | ||
}; | ||
this.customData.parseVars = (_el) => { | ||
// parse templates to vars | ||
const newVars = this.customData.i18n.parseTemplateVars(_el); | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
newVars | ||
); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed templates vars', this.customData.vars); | ||
// } | ||
// parse data attributes to vars | ||
// Vanilla works better than jquery data function? | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
_el.dataset | ||
); | ||
// if (Object.keys(this.customData.vars).length) { | ||
// console.warn('parsed attribute vars', this.customData.vars); | ||
// } | ||
// Parse templates wich have his own translations | ||
this.customData.langVars = this.customData.i18n.parseLocalVars(_el); | ||
// if (this.customData.langVars && Object.keys(this.customData.langVars).length) { | ||
// console.warn('parsed own translations', this.customData.langVars); | ||
// } | ||
}; | ||
this.customData.translate = (langcode) => { | ||
// If language service is not ready do nothing | ||
if (!this.customData.i18n.ready) { | ||
return; | ||
} | ||
if (!langcode) { | ||
langcode = this.customData.i18n.getLangcode(); | ||
if (!langcode) { | ||
console.error("Langcode is requred", langcode); | ||
return; | ||
} | ||
} | ||
// translate by using the already translated language variable | ||
if (this.customData.langVars && this.customData.langVars[langcode]) { | ||
return this.customData.applyTranslation( | ||
this.customData.langVars[langcode] | ||
); | ||
} | ||
if ( | ||
!this.customData.properties || | ||
this.customData.properties.length === 0 | ||
) { | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default', this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
} | ||
// translate by properies, e.g. de.cart.add | ||
return this.customData.i18n | ||
.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local) => { | ||
if (local && typeof local === "string") { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
else if (this.customData.translateMePathString !== translateMePathString) { | ||
// If translate string was changed | ||
this.customData.translateMePathString = translateMePathString; | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
this.customData.parseVars(el); | ||
this.customData.translate(); | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
}, | ||
unbind() { | ||
this.el.removeEventListener('binder-changed', this.customData.onAttributeChanged); | ||
this.customData.i18n.event.off('changed', this.customData.onLanguageChanged); | ||
}, | ||
}; | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
this.customData.onAttributeChanged = (data) => { | ||
if (data.detail.name.startsWith("data-")) { | ||
const varName = data.detail.name.slice(5); | ||
const newVar = {}; | ||
newVar[varName] = data.detail.newValue; | ||
// console.warn('binder-changed newVar', newVar); | ||
this.customData.vars = core_1.Utils.concat( | ||
true, | ||
this.customData.vars, | ||
newVar | ||
); | ||
this.customData.translate(); | ||
} | ||
}; | ||
this.customData.onLanguageChanged = (langcode, initial) => { | ||
// Do not translate on inital language change, we use the ready event for this | ||
if (!initial) { | ||
this.customData.translate(langcode); | ||
} | ||
}; | ||
/** | ||
* Initial stuff wee need to do after the language service is ready | ||
*/ | ||
this.customData.initOnReady = (langcode, translationNeeded) => { | ||
// Translate on translation service ready if needed | ||
if (translationNeeded) { | ||
this.customData.translate(langcode); | ||
} | ||
// Translate if language changes | ||
this.customData.i18n.event.on( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
// Translate if binder attribute event is changed | ||
el.addEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
}; | ||
}, | ||
routine(el, translateMePathString) { | ||
if (this.customData.translateMePathString === null) { | ||
// if this is the first call of this function | ||
this.customData.translateMePathString = translateMePathString; | ||
if (translateMePathString) { | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
} | ||
this.customData.parseVars(el); | ||
// Translate if language is ready | ||
if (this.customData.i18n.ready) { | ||
this.customData.initOnReady( | ||
this.customData.i18n.getLangcode(), | ||
this.customData.i18n.currentLangcode !== | ||
this.customData.i18n.initalLangcode || | ||
!localesService.doNotTranslateDefaultLanguage | ||
); | ||
} else { | ||
this.customData.i18n.event.on("ready", this.customData.initOnReady); | ||
} | ||
} else if ( | ||
this.customData.translateMePathString !== translateMePathString | ||
) { | ||
// If translate string was changed | ||
this.customData.translateMePathString = translateMePathString; | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
this.customData.parseVars(el); | ||
this.customData.translate(); | ||
} | ||
}, | ||
unbind() { | ||
this.el.removeEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
this.customData.i18n.event.off( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
}, | ||
}; | ||
}; |
@@ -1,4 +0,4 @@ | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Binders } from '@ribajs/core'; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Binders } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Binders<any>; | ||
export default _default; |
@@ -5,5 +5,5 @@ "use strict"; | ||
exports.default = (localesService) => { | ||
return { | ||
i18nStarBinder: i18n_star_binder_1.i18nStarBinderWrapper(localesService), | ||
}; | ||
return { | ||
i18nStarBinder: i18n_star_binder_1.i18nStarBinderWrapper(localesService), | ||
}; | ||
}; |
@@ -1,37 +0,46 @@ | ||
import { Component, Binder, View } from '@ribajs/core'; | ||
import { Langcode } from '../../interfaces'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
import { Component, Binder, View } from "@ribajs/core"; | ||
import { Langcode } from "../../interfaces"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
export interface Scope { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent["switch"]; | ||
toggle: AI18nSwitcherComponent["toggle"]; | ||
ready: boolean; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent['switch']; | ||
toggle: AI18nSwitcherComponent['toggle']; | ||
switch: ( | ||
langcode: Langcode, | ||
context?: Binder<any> | undefined, | ||
event?: Event | undefined | ||
) => void; | ||
toggle: ( | ||
context?: Binder<any> | undefined, | ||
event?: Event | undefined | ||
) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context?: Binder<any>, event?: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context?: Binder<any>, event?: Event): void; | ||
protected init( | ||
observedAttributes: string[] | ||
): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: (langcode: Langcode, context?: Binder<any> | undefined, event?: Event | undefined) => void; | ||
toggle: (context?: Binder<any> | undefined, event?: Event | undefined) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context?: Binder<any>, event?: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context?: Binder<any>, event?: Event): void; | ||
protected init(observedAttributes: string[]): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} |
@@ -5,104 +5,102 @@ "use strict"; | ||
class AI18nSwitcherComponent extends core_1.Component { | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
if (event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
} | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode) | ||
.then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on('ready', (langcode, translationNeeded) => { | ||
this.initLocales(langcode) | ||
.then((langcodes) => { | ||
super.init(observedAttributes) | ||
.then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
}); | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode).then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === langcode); | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on('changed', (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === changedLangcode); | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on("ready", (langcode, translationNeeded) => { | ||
this.initLocales(langcode).then((langcodes) => { | ||
super.init(observedAttributes).then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}); | ||
}); | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService | ||
.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === langcode; | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on("changed", (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === changedLangcode; | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
} | ||
exports.AI18nSwitcherComponent = AI18nSwitcherComponent; |
@@ -1,5 +0,5 @@ | ||
export { AI18nSwitcherComponent } from './abstract-switcher/switcher.abstract.component'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Components } from '@ribajs/core'; | ||
export { AI18nSwitcherComponent } from "./abstract-switcher/switcher.abstract.component"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Components } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Components; | ||
export default _default; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var switcher_abstract_component_1 = require("./abstract-switcher/switcher.abstract.component"); | ||
exports.AI18nSwitcherComponent = switcher_abstract_component_1.AI18nSwitcherComponent; | ||
exports.AI18nSwitcherComponent = | ||
switcher_abstract_component_1.AI18nSwitcherComponent; | ||
const switcher_component_1 = require("./switcher/switcher.component"); | ||
exports.default = (localesService) => { | ||
return { | ||
i18nSwitcherComponent: switcher_component_1.i18nSwitcherComponentWrapper(localesService), | ||
}; | ||
return { | ||
i18nSwitcherComponent: switcher_component_1.i18nSwitcherComponentWrapper( | ||
localesService | ||
), | ||
}; | ||
}; |
@@ -1,37 +0,39 @@ | ||
import { Component, Binder, View } from '@ribajs/core'; | ||
import { Langcode } from '../../interfaces'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
import { Component, Binder, View } from "@ribajs/core"; | ||
import { Langcode } from "../../interfaces"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
export interface Scope { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent["switch"]; | ||
toggle: AI18nSwitcherComponent["toggle"]; | ||
ready: boolean; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: AI18nSwitcherComponent['switch']; | ||
toggle: AI18nSwitcherComponent['toggle']; | ||
switch: (langcode: Langcode, context: Binder<any>, event: Event) => void; | ||
toggle: (context: Binder<any>, event: Event) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context: Binder<any>, event: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context: Binder<any>, event: Event): void; | ||
protected init( | ||
observedAttributes: string[] | ||
): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} | ||
export declare abstract class AI18nSwitcherComponent extends Component { | ||
protected abstract localesService: ALocalesService; | ||
protected scope: { | ||
langcodes: Langcode[]; | ||
switch: (langcode: Langcode, context: Binder<any>, event: Event) => void; | ||
toggle: (context: Binder<any>, event: Event) => void; | ||
ready: boolean; | ||
}; | ||
constructor(element?: HTMLElement); | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode: Langcode, context: Binder<any>, event: Event): void; | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context: Binder<any>, event: Event): void; | ||
protected init(observedAttributes: string[]): Promise<View | null | undefined>; | ||
protected initLocales(langcode: string): Promise<Langcode[]>; | ||
protected setLangcode(langcode: string): void; | ||
protected requiredAttributes(): never[]; | ||
protected disconnectedCallback(): void; | ||
protected template(): null; | ||
} |
@@ -5,100 +5,98 @@ "use strict"; | ||
class AI18nSwitcherComponent extends core_1.Component { | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
constructor(element) { | ||
super(element); | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
if (!langcode.active) { | ||
this.setLangcode(langcode.code); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
} | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
event.preventDefault(); | ||
event.stopPropagation(); | ||
for (const i in this.scope.langcodes) { | ||
if (this.scope.langcodes.hasOwnProperty(i)) { | ||
if (this.scope.langcodes[i].active !== true) { | ||
this.setLangcode(this.scope.langcodes[i].code); | ||
return; | ||
} | ||
} | ||
} | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode) | ||
.then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on('ready', (langcode, translationNeeded) => { | ||
this.initLocales(langcode) | ||
.then((langcodes) => { | ||
super.init(observedAttributes) | ||
.then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
}); | ||
} | ||
async init(observedAttributes) { | ||
if (this.localesService.ready) { | ||
const langcode = this.localesService.getLangcode(); | ||
if (langcode) { | ||
return this.initLocales(langcode).then((langcodes) => { | ||
return super.init(observedAttributes); | ||
}); | ||
} | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === langcode); | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on('changed', (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = (langCode.code === changedLangcode); | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
return new Promise((resolve, reject) => { | ||
this.localesService.event.on("ready", (langcode, translationNeeded) => { | ||
this.initLocales(langcode).then((langcodes) => { | ||
super.init(observedAttributes).then((view) => { | ||
resolve(view); | ||
}); | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}); | ||
}); | ||
} | ||
async initLocales(langcode) { | ||
// set avaible langcodes | ||
return this.localesService | ||
.getAvailableLangcodes() | ||
.then((langcodes) => { | ||
this.scope.langcodes = langcodes; | ||
// set active langcodes | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === langcode; | ||
}); | ||
return this.scope.langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.localesService.event.on("changed", (changedLangcode, initial) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === changedLangcode; | ||
}); | ||
}); | ||
return langcodes; | ||
}) | ||
.then((langcodes) => { | ||
this.scope.ready = true; | ||
return langcodes; | ||
}); | ||
} | ||
setLangcode(langcode) { | ||
this.localesService.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
} | ||
exports.AI18nSwitcherComponent = AI18nSwitcherComponent; |
@@ -1,4 +0,6 @@ | ||
import { Type } from '@ribajs/core'; | ||
import { AI18nSwitcherComponent } from '../abstract-switcher/switcher.abstract.component'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
export declare const i18nSwitcherComponentWrapper: (localesService: ALocalesService) => Type<AI18nSwitcherComponent>; | ||
import { Type } from "@ribajs/core"; | ||
import { AI18nSwitcherComponent } from "../abstract-switcher/switcher.abstract.component"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
export declare const i18nSwitcherComponentWrapper: ( | ||
localesService: ALocalesService | ||
) => Type<AI18nSwitcherComponent>; |
@@ -5,49 +5,51 @@ "use strict"; | ||
exports.i18nSwitcherComponentWrapper = (localesService) => { | ||
var _a; | ||
return _a = class I18nSwitcherComponent extends switcher_abstract_component_1.AI18nSwitcherComponent { | ||
constructor(element) { | ||
super(element); | ||
this.localesService = localesService; | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
this.init(I18nSwitcherComponent.observedAttributes); | ||
} | ||
static get observedAttributes() { | ||
return []; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
return super.switch(langcode, context, event); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
return super.toggle(context, event); | ||
} | ||
setLangcode(langcode) { | ||
return super.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}, | ||
_a.tagName = 'i18n-switcher', | ||
_a; | ||
var _a; | ||
return ( | ||
(_a = class I18nSwitcherComponent extends switcher_abstract_component_1.AI18nSwitcherComponent { | ||
constructor(element) { | ||
super(element); | ||
this.localesService = localesService; | ||
this.scope = { | ||
langcodes: [], | ||
switch: this.switch, | ||
toggle: this.toggle, | ||
ready: false, | ||
}; | ||
this.init(I18nSwitcherComponent.observedAttributes); | ||
} | ||
static get observedAttributes() { | ||
return []; | ||
} | ||
/** | ||
* Switch to language by langcode | ||
* @param langcode | ||
* @param event | ||
*/ | ||
switch(langcode, context, event) { | ||
return super.switch(langcode, context, event); | ||
} | ||
/** | ||
* Toggle language, makes only sense if you have only two languages | ||
* @param langcode | ||
* @param event | ||
*/ | ||
toggle(context, event) { | ||
return super.toggle(context, event); | ||
} | ||
setLangcode(langcode) { | ||
return super.setLangcode(langcode); | ||
} | ||
requiredAttributes() { | ||
return []; | ||
} | ||
disconnectedCallback() { | ||
super.disconnectedCallback(); | ||
} | ||
template() { | ||
return null; | ||
} | ||
}), | ||
(_a.tagName = "i18n-switcher"), | ||
_a | ||
); | ||
}; |
@@ -1,1 +0,1 @@ | ||
export { i18nFormatterWrapper } from './t.formatter'; | ||
export { i18nFormatterWrapper } from "./t.formatter"; |
@@ -1,4 +0,4 @@ | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Formatters } from '@ribajs/core'; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Formatters } from "@ribajs/core"; | ||
declare const _default: (localesService: ALocalesService) => Formatters; | ||
export default _default; |
@@ -5,5 +5,5 @@ "use strict"; | ||
exports.default = (localesService) => { | ||
return { | ||
t: t_formatter_1.tFormatterWrapper(localesService), | ||
}; | ||
return { | ||
t: t_formatter_1.tFormatterWrapper(localesService), | ||
}; | ||
}; |
@@ -1,3 +0,5 @@ | ||
import { Formatter } from '@ribajs/core'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
export declare const tFormatterWrapper: (localesService: ALocalesService) => Formatter; | ||
import { Formatter } from "@ribajs/core"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
export declare const tFormatterWrapper: ( | ||
localesService: ALocalesService | ||
) => Formatter; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const translate = async (translateMePathString, localesService, langcode) => { | ||
const properties = translateMePathString.split('.'); | ||
const properties = translateMePathString.split("."); | ||
if (!langcode) { | ||
langcode = localesService.getLangcode(); | ||
if (!langcode) { | ||
langcode = localesService.getLangcode(); | ||
if (!langcode) { | ||
return null; | ||
} | ||
return null; | ||
} | ||
return localesService.get([langcode, ...properties] /*, vars */) | ||
.then((locale) => { | ||
return locale; | ||
} | ||
return localesService | ||
.get([langcode, ...properties] /*, vars */) | ||
.then((locale) => { | ||
return locale; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
.catch((error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
exports.tFormatterWrapper = (localesService) => { | ||
return { | ||
name: 't', | ||
read(translateMePathString, langcode, ...vars) { | ||
return new Promise((resolve, reject) => { | ||
localesService.event.on('changed', () => { | ||
// console.debug('changed'); | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
localesService.event.on('ready', () => { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
if (localesService.ready) { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}); | ||
} | ||
return { | ||
name: "t", | ||
read(translateMePathString, langcode, ...vars) { | ||
return new Promise((resolve, reject) => { | ||
localesService.event.on("changed", () => { | ||
// console.debug('changed'); | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}, | ||
}; | ||
}); | ||
localesService.event.on("ready", () => { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}) | ||
.catch((error) => { | ||
reject(error); | ||
}); | ||
}); | ||
if (localesService.ready) { | ||
translate(translateMePathString, localesService, langcode).then( | ||
(locale) => { | ||
resolve(locale); | ||
} | ||
); | ||
} | ||
}); | ||
}, | ||
}; | ||
}; |
@@ -1,9 +0,11 @@ | ||
import { RibaModule } from '@ribajs/core'; | ||
export * from './binders'; | ||
export * from './components'; | ||
export * from './formatters'; | ||
export * from './interfaces'; | ||
export * from './services'; | ||
import * as services from './services'; | ||
export declare const i18nModule: (localesService: services.ALocalesService) => RibaModule; | ||
import { RibaModule } from "@ribajs/core"; | ||
export * from "./binders"; | ||
export * from "./components"; | ||
export * from "./formatters"; | ||
export * from "./interfaces"; | ||
export * from "./services"; | ||
import * as services from "./services"; | ||
export declare const i18nModule: ( | ||
localesService: services.ALocalesService | ||
) => RibaModule; | ||
export default i18nModule; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
var __importDefault = | ||
(this && this.__importDefault) || | ||
function (mod) { | ||
return mod && mod.__esModule ? mod : { default: mod }; | ||
}; | ||
var __importStar = | ||
(this && this.__importStar) || | ||
function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
if (mod != null) | ||
for (var k in mod) | ||
if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
result["default"] = mod; | ||
return result; | ||
}; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -25,9 +31,9 @@ __export(require("./binders")); | ||
exports.i18nModule = (localesService) => { | ||
return { | ||
binders: binders_1.default(localesService), | ||
components: components_1.default(localesService), | ||
formatters: formatters_1.default(localesService), | ||
services, | ||
}; | ||
return { | ||
binders: binders_1.default(localesService), | ||
components: components_1.default(localesService), | ||
formatters: formatters_1.default(localesService), | ||
services, | ||
}; | ||
}; | ||
exports.default = exports.i18nModule; |
@@ -1,2 +0,2 @@ | ||
export * from './langcode'; | ||
export * from './local-var'; | ||
export * from "./langcode"; | ||
export * from "./local-var"; |
@@ -1,2 +0,2 @@ | ||
export * from './langcode'; | ||
export * from './local-var'; | ||
export * from "./langcode"; | ||
export * from "./local-var"; |
export interface Langcode { | ||
code: string; | ||
active: boolean; | ||
code: string; | ||
active: boolean; | ||
} |
export interface LocalPluralization { | ||
zero?: string; | ||
one?: string; | ||
two?: string; | ||
other?: string; | ||
zero?: string; | ||
one?: string; | ||
two?: string; | ||
other?: string; | ||
} | ||
export interface LocalVar { | ||
[name: string]: string | LocalPluralization; | ||
[name: string]: string | LocalPluralization; | ||
} |
@@ -1,1 +0,1 @@ | ||
export * from './locales.service'; | ||
export * from "./locales.service"; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__export(require("./locales.service")); |
@@ -1,3 +0,3 @@ | ||
export * from './locales-base.service'; | ||
export * from './locales-rest.service'; | ||
export * from './locales-static.service'; | ||
export * from "./locales-base.service"; | ||
export * from "./locales-rest.service"; | ||
export * from "./locales-static.service"; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
@@ -5,0 +5,0 @@ Object.defineProperty(exports, "__esModule", { value: true }); |
@@ -1,67 +0,73 @@ | ||
import { EventDispatcher } from '@ribajs/core'; | ||
import { Langcode, LocalPluralization, LocalVar } from '../interfaces'; | ||
import { EventDispatcher } from "@ribajs/core"; | ||
import { Langcode, LocalPluralization, LocalVar } from "../interfaces"; | ||
export declare abstract class ALocalesService { | ||
doNotTranslateDefaultLanguage: boolean; | ||
get ready(): boolean; | ||
event: EventDispatcher; | ||
showMissingTranslation: boolean; | ||
protected _ready: boolean; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode?: string; | ||
constructor(doNotTranslateDefaultLanguage: boolean, showMissingTranslation: boolean); | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: LocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: LocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string | undefined; | ||
getInitialLangcode(): string | undefined; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<Langcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: LocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected init(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization(translateObj: LocalPluralization | string, vars: LocalVar): string; | ||
doNotTranslateDefaultLanguage: boolean; | ||
get ready(): boolean; | ||
event: EventDispatcher; | ||
showMissingTranslation: boolean; | ||
protected _ready: boolean; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode?: string; | ||
constructor( | ||
doNotTranslateDefaultLanguage: boolean, | ||
showMissingTranslation: boolean | ||
); | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: LocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: LocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string | undefined; | ||
getInitialLangcode(): string | undefined; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<Langcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el: HTMLElement): LocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: LocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected init(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization( | ||
translateObj: LocalPluralization | string, | ||
vars: LocalVar | ||
): string; | ||
} |
@@ -5,233 +5,259 @@ "use strict"; | ||
class ALocalesService { | ||
constructor(doNotTranslateDefaultLanguage, showMissingTranslation) { | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.event = new core_1.EventDispatcher('i18n'); | ||
this.showMissingTranslation = false; | ||
this._ready = false; | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.showMissingTranslation = showMissingTranslation; | ||
constructor(doNotTranslateDefaultLanguage, showMissingTranslation) { | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.event = new core_1.EventDispatcher("i18n"); | ||
this.showMissingTranslation = false; | ||
this._ready = false; | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
this.showMissingTranslation = showMissingTranslation; | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error("not ready"); | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error('not ready'); | ||
} | ||
return this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} | ||
else { | ||
return null; | ||
} | ||
} | ||
return local; | ||
return ( | ||
this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} else { | ||
return null; | ||
} | ||
} | ||
return locals; | ||
}) | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn(`WARNING translation missing: "${properties.join('.')}"`, local, properties); | ||
} | ||
return local; | ||
} | ||
return locals; | ||
}) | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn( | ||
`WARNING translation missing: "${properties.join(".")}"`, | ||
local, | ||
properties | ||
); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}) | ||
); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error("Langcode not found in html tag"); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error('Langcode not found in html tag'); | ||
} | ||
return this.get([langcode, ...properties], vars); | ||
return this.get([langcode, ...properties], vars); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split("-")[0].toLowerCase(); | ||
return simplified; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement | ||
? document.documentElement.lang | ||
: "en"; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger("changed", langcode, initial); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split('-')[0].toLowerCase(); | ||
return simplified; | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true).then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el) { | ||
const templates = el.querySelectorAll("template"); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const name = template.getAttribute("name"); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el) { | ||
const templates = el.querySelectorAll("template"); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const lang = template.getAttribute("lang"); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if ( | ||
!translateString || | ||
Object.keys(vars).length === 0 || | ||
typeof translateString.match !== "function" | ||
) { | ||
return translateString; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement ? document.documentElement.lang : 'en'; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger('changed', langcode, initial); | ||
const matches = translateString.match(/{{\s*?[A-Za-z0-9_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ""); | ||
if ( | ||
typeof vars[varName] === "string" || | ||
typeof vars[varName] === "number" | ||
) { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true) | ||
.then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
return translateString; | ||
} | ||
async init() { | ||
this.initalLangcode = this.getHTMLLangcode(); | ||
this.currentLangcode = this.initalLangcode; | ||
if (!this.initalLangcode) { | ||
throw new Error( | ||
`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}` | ||
); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars(el) { | ||
const templates = el.querySelectorAll('template'); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const name = template.getAttribute('name'); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars(el) { | ||
const templates = el.querySelectorAll('template'); | ||
const vars = {}; | ||
templates.forEach((template) => { | ||
const lang = template.getAttribute('lang'); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if (!translateString || Object.keys(vars).length === 0 || typeof (translateString.match) !== 'function') { | ||
return translateString; | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
const matches = translateString.match(/{{\s*?[A-Za-z0-9_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ''); | ||
if (typeof (vars[varName]) === 'string' || typeof (vars[varName]) === 'number') { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if ( | ||
!this.doNotTranslateDefaultLanguage || | ||
(browserLangFound && browserLangcode !== this.currentLangcode) | ||
) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return translateString; | ||
} | ||
async init() { | ||
this.initalLangcode = this.getHTMLLangcode(); | ||
this.currentLangcode = this.initalLangcode; | ||
if (!this.initalLangcode) { | ||
throw new Error(`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}`); | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = | ||
this.currentLangcode !== this.initalLangcode || | ||
!this.doNotTranslateDefaultLanguage; | ||
this.event.trigger("ready", this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if ( | ||
vars.count && | ||
typeof translateObj === "object" && | ||
translateObj !== null | ||
) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if (!this.doNotTranslateDefaultLanguage || (browserLangFound && browserLangcode !== this.currentLangcode)) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = this.currentLangcode !== this.initalLangcode || !this.doNotTranslateDefaultLanguage; | ||
this.event.trigger('ready', this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if (vars.count && typeof (translateObj) === 'object' && translateObj !== null) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
} | ||
else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
} | ||
else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
} | ||
} else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
if (typeof (translateObj) === 'object' && translateObj !== null && translateObj.other) { | ||
return translateObj.other; | ||
} else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
return translateObj; | ||
} | ||
} | ||
if ( | ||
typeof translateObj === "object" && | ||
translateObj !== null && | ||
translateObj.other | ||
) { | ||
return translateObj.other; | ||
} | ||
return translateObj; | ||
} | ||
} | ||
exports.ALocalesService = ALocalesService; |
@@ -1,2 +0,2 @@ | ||
import { ALocalesService } from './locales-base.service'; | ||
import { ALocalesService } from "./locales-base.service"; | ||
/** | ||
@@ -6,22 +6,26 @@ * LocalesRestService get locales object from url | ||
export declare class LocalesRestService extends ALocalesService { | ||
protected url: string; | ||
static instances: { | ||
[url: string]: LocalesRestService; | ||
}; | ||
static getInstance(url: string): LocalesRestService; | ||
locales: any; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor(url: string, doNotTranslateDefaultLanguage?: boolean, showMissingTranslation?: boolean); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(url?: string): Promise<any>; | ||
protected url: string; | ||
static instances: { | ||
[url: string]: LocalesRestService; | ||
}; | ||
static getInstance(url: string): LocalesRestService; | ||
locales: any; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor( | ||
url: string, | ||
doNotTranslateDefaultLanguage?: boolean, | ||
showMissingTranslation?: boolean | ||
); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(url?: string): Promise<any>; | ||
} |
@@ -9,44 +9,47 @@ "use strict"; | ||
class LocalesRestService extends locales_base_service_1.ALocalesService { | ||
constructor(url, doNotTranslateDefaultLanguage = false, showMissingTranslation = false) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.url = url; | ||
this.locales = {}; | ||
this.url = url; | ||
if (!this.url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (LocalesRestService.instances[this.url]) { | ||
return LocalesRestService.instances[this.url]; | ||
} | ||
this.init(); | ||
LocalesRestService.instances[this.url] = this; | ||
constructor( | ||
url, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.url = url; | ||
this.locales = {}; | ||
this.url = url; | ||
if (!this.url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
static getInstance(url) { | ||
return LocalesRestService.instances[url]; | ||
if (LocalesRestService.instances[this.url]) { | ||
return LocalesRestService.instances[this.url]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(url) { | ||
if (!url) { | ||
url = this.url; | ||
} | ||
if (!url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (window.Shopify.shop) { | ||
url = url + `?shop=${window.Shopify.shop}`; | ||
} | ||
if (this.locales[url]) { | ||
return this.locales[url]; | ||
} | ||
return core_1.HttpService.getJSON(url) | ||
.then((locales) => { | ||
this.locales[url] = locales; | ||
return this.locales[url]; | ||
}); | ||
this.init(); | ||
LocalesRestService.instances[this.url] = this; | ||
} | ||
static getInstance(url) { | ||
return LocalesRestService.instances[url]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(url) { | ||
if (!url) { | ||
url = this.url; | ||
} | ||
if (!url) { | ||
throw new Error(`Url is requred!`); | ||
} | ||
if (window.Shopify.shop) { | ||
url = url + `?shop=${window.Shopify.shop}`; | ||
} | ||
if (this.locales[url]) { | ||
return this.locales[url]; | ||
} | ||
return core_1.HttpService.getJSON(url).then((locales) => { | ||
this.locales[url] = locales; | ||
return this.locales[url]; | ||
}); | ||
} | ||
} | ||
exports.LocalesRestService = LocalesRestService; | ||
LocalesRestService.instances = {}; |
@@ -1,23 +0,28 @@ | ||
import { ALocalesService } from './locales-base.service'; | ||
import { ALocalesService } from "./locales-base.service"; | ||
export declare class LocalesStaticService extends ALocalesService { | ||
protected locales: any; | ||
protected id?: string | undefined; | ||
static instances: { | ||
[id: string]: LocalesStaticService; | ||
}; | ||
static getInstance(id?: string): LocalesStaticService; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor(locales: any, id?: string | undefined, doNotTranslateDefaultLanguage?: boolean, showMissingTranslation?: boolean); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(themeID?: number): Promise<any>; | ||
protected locales: any; | ||
protected id?: string | undefined; | ||
static instances: { | ||
[id: string]: LocalesStaticService; | ||
}; | ||
static getInstance(id?: string): LocalesStaticService; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected currentLangcode?: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected initalLangcode?: string; | ||
constructor( | ||
locales: any, | ||
id?: string | undefined, | ||
doNotTranslateDefaultLanguage?: boolean, | ||
showMissingTranslation?: boolean | ||
); | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
protected getAll(themeID?: number): Promise<any>; | ||
} |
@@ -5,28 +5,33 @@ "use strict"; | ||
class LocalesStaticService extends locales_base_service_1.ALocalesService { | ||
constructor(locales, id, doNotTranslateDefaultLanguage = false, showMissingTranslation = false) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.locales = locales; | ||
this.id = id; | ||
if (!id) { | ||
id = 'main'; | ||
} | ||
this.locales = locales; | ||
if (LocalesStaticService.instances[id]) { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
this.init(); | ||
LocalesStaticService.instances[id] = this; | ||
constructor( | ||
locales, | ||
id, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
this.locales = locales; | ||
this.id = id; | ||
if (!id) { | ||
id = "main"; | ||
} | ||
static getInstance(id = 'main') { | ||
return LocalesStaticService.instances[id]; | ||
this.locales = locales; | ||
if (LocalesStaticService.instances[id]) { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(themeID) { | ||
return this.locales; | ||
} | ||
this.init(); | ||
LocalesStaticService.instances[id] = this; | ||
} | ||
static getInstance(id = "main") { | ||
return LocalesStaticService.instances[id]; | ||
} | ||
/** | ||
* Get file with all languages | ||
* @param themeID | ||
*/ | ||
async getAll(themeID) { | ||
return this.locales; | ||
} | ||
} | ||
exports.LocalesStaticService = LocalesStaticService; | ||
LocalesStaticService.instances = {}; |
@@ -1,65 +0,72 @@ | ||
import { EventDispatcher, Debug } from '@ribajs/core'; | ||
import { ILangcode, ILocalPluralization, ILocalVar } from '../interfaces/interfaces'; | ||
import { EventDispatcher, Debug } from "@ribajs/core"; | ||
import { | ||
ILangcode, | ||
ILocalPluralization, | ||
ILocalVar, | ||
} from "../interfaces/interfaces"; | ||
export declare abstract class ALocalesService { | ||
readonly ready: boolean; | ||
event: EventDispatcher; | ||
protected _ready: boolean; | ||
protected debug: Debug.IDebugger; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode: string; | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: ILocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: ILocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string; | ||
getInitialLangcode(): string; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<ILangcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars($el: JQuery<HTMLElement>): ILocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars($el: JQuery<HTMLElement>): ILocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: ILocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected switchToBrowserLanguage(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization(translateObj: ILocalPluralization | string, vars: ILocalVar): string; | ||
readonly ready: boolean; | ||
event: EventDispatcher; | ||
protected _ready: boolean; | ||
protected debug: Debug.IDebugger; | ||
/** | ||
* The current setted langcode | ||
*/ | ||
protected abstract currentLangcode: string; | ||
/** | ||
* The default theme langcode before any language was choosed | ||
*/ | ||
protected abstract initalLangcode: string; | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
get(properties?: string[], vars?: ILocalVar, force?: boolean): Promise<any>; | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
getByCurrentLang(properties?: string[], vars?: ILocalVar): Promise<any>; | ||
getBrowserLangcode(): any; | ||
getHTMLLangcode(): string; | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode(): string; | ||
getInitialLangcode(): string; | ||
setLangcode(langcode: string, initial?: boolean): void; | ||
getAvailableLangcodes(): Promise<ILangcode[]>; | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars($el: JQuery<HTMLElement>): ILocalVar; | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars($el: JQuery<HTMLElement>): ILocalVar; | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString: string, vars: ILocalVar): string; | ||
/** | ||
* Get file with all languages | ||
*/ | ||
protected abstract getAll(): Promise<any>; | ||
protected switchToBrowserLanguage(): Promise<any>; | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
protected setTranslateStringPluralization( | ||
translateObj: ILocalPluralization | string, | ||
vars: ILocalVar | ||
): string; | ||
} |
@@ -5,224 +5,239 @@ "use strict"; | ||
class ALocalesService { | ||
constructor() { | ||
this.event = new core_1.EventDispatcher('i18n'); | ||
this._ready = false; | ||
this.debug = core_1.Debug('services:ALocalesService'); | ||
constructor() { | ||
this.event = new core_1.EventDispatcher("i18n"); | ||
this._ready = false; | ||
this.debug = core_1.Debug("services:ALocalesService"); | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error("not ready"); | ||
} | ||
get ready() { | ||
return this._ready; | ||
} | ||
/** | ||
* Get translation by properties, e.g. `de.form.newsletter_label` | ||
* Properties object must include the language code, e.g. `de`. | ||
* @param properties properties, e.g. `['de', 'form', 'newsletter', 'label']` | ||
* @param force Set this to true if you want to force the request also if the service is not ready, you should use this only one the time | ||
*/ | ||
async get(properties, vars, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error('not ready'); | ||
} | ||
return this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} | ||
else { | ||
return null; | ||
} | ||
} | ||
return local; | ||
return ( | ||
this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local = core_1.Utils.clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} else { | ||
return null; | ||
} | ||
} | ||
return locals; | ||
}) | ||
.then((local) => { | ||
if (local === null && properties) { | ||
this.debug(`WARNING translation missing: "${properties.join('.')}"`, local, properties); | ||
} | ||
return local; | ||
} | ||
return locals; | ||
}) | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
.then((local) => { | ||
if (local === null && properties) { | ||
this.debug( | ||
`WARNING translation missing: "${properties.join(".")}"`, | ||
local, | ||
properties | ||
); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}) | ||
); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error("Langcode not found in html tag"); | ||
} | ||
/** | ||
* Get translation by properties, e.g. `form.newsletter_label` | ||
* Properties object must not include the language code. | ||
* @param properties properties, e.g. `[form', 'newsletter', 'label']` | ||
*/ | ||
async getByCurrentLang(properties = [], vars) { | ||
const langcode = this.getLangcode(); | ||
if (!langcode) { | ||
throw new Error('Langcode not found in html tag'); | ||
} | ||
return this.get([langcode, ...properties], vars); | ||
return this.get([langcode, ...properties], vars); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split("-")[0].toLowerCase(); | ||
return simplified; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement | ||
? document.documentElement.lang | ||
: "en"; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger("changed", langcode, initial); | ||
} | ||
getBrowserLangcode() { | ||
const lang = navigator.language || navigator.userLanguage; | ||
const simplified = lang.split('-')[0].toLowerCase(); | ||
return simplified; | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true).then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars($el) { | ||
const templates = $el.find("template"); | ||
const vars = {}; | ||
templates.each((i, template) => { | ||
const name = template.getAttribute("name"); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars($el) { | ||
const templates = $el.find("template"); | ||
const vars = {}; | ||
templates.each((i, template) => { | ||
const lang = template.getAttribute("lang"); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if (!translateString || typeof translateString.match !== "function") { | ||
return translateString; | ||
} | ||
getHTMLLangcode() { | ||
const langcode = document.documentElement ? document.documentElement.lang : 'en'; | ||
return langcode; | ||
} | ||
/** | ||
* Get the current langcode, | ||
* if lang was not choosed this is the langcode of the lang attribute of the html element. | ||
* If the language was changed this returns the changed language | ||
*/ | ||
getLangcode() { | ||
return this.currentLangcode; | ||
} | ||
getInitialLangcode() { | ||
return this.initalLangcode; | ||
} | ||
setLangcode(langcode, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
this.currentLangcode = langcode; | ||
// $('html').attr('lang', langcode); | ||
if (document.documentElement) { | ||
document.documentElement.lang = langcode; | ||
} | ||
this.event.trigger('changed', langcode, initial); | ||
const matches = translateString.match(/{{\s*?[A-Za-z_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ""); | ||
if ( | ||
typeof vars[varName] === "string" || | ||
typeof vars[varName] === "number" | ||
) { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
} | ||
async getAvailableLangcodes() { | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true) | ||
.then((locals) => { | ||
const langcodes = []; | ||
Object.keys(locals).forEach((langcode) => { | ||
langcodes.push({ | ||
code: langcode, | ||
active: langcode === activeCode, | ||
}); | ||
}); | ||
return langcodes; | ||
}); | ||
} | ||
/** | ||
* Parse templates wich can be used to set variables on language strings | ||
*/ | ||
parseTemplateVars($el) { | ||
const templates = $el.find('template'); | ||
const vars = {}; | ||
templates.each((i, template) => { | ||
const name = template.getAttribute('name'); | ||
if (name !== null) { | ||
vars[name] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Parse templates wich have his own translations | ||
*/ | ||
parseLocalVars($el) { | ||
const templates = $el.find('template'); | ||
const vars = {}; | ||
templates.each((i, template) => { | ||
const lang = template.getAttribute('lang'); | ||
if (lang !== null) { | ||
vars[lang] = template.innerHTML.trim(); | ||
} | ||
}); | ||
return vars; | ||
} | ||
/** | ||
* Replace variables on translated string | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringVars(translateString, vars) { | ||
if (!translateString || typeof (translateString.match) !== 'function') { | ||
return translateString; | ||
return translateString; | ||
} | ||
async switchToBrowserLanguage() { | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
const matches = translateString.match(/{{\s*?[A-Za-z_-]+\s*?}}/gm); | ||
if (matches) { | ||
for (const match of matches) { | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ''); | ||
if (typeof (vars[varName]) === 'string' || typeof (vars[varName]) === 'number') { | ||
translateString = translateString.replace(match, vars[varName]); | ||
} | ||
} | ||
} | ||
// ony switch language if autodetectLanguage is true and the browser language is not the default language | ||
if (browserLangFound && browserLangcode !== this.currentLangcode) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return translateString; | ||
} | ||
async switchToBrowserLanguage() { | ||
// Detect browser language and switch to this language when available | ||
const browserLangcode = this.getBrowserLangcode(); | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
// ony switch language if autodetectLanguage is true and the browser language is not the default language | ||
if (browserLangFound && browserLangcode !== this.currentLangcode) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = this.currentLangcode !== this.initalLangcode; | ||
this.event.trigger('ready', this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if (vars.count && typeof (translateObj) === 'object' && translateObj !== null) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
} | ||
else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
} | ||
else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = this.currentLangcode !== this.initalLangcode; | ||
this.event.trigger("ready", this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
/** | ||
* see https://help.shopify.com/en/themes/development/theme-store-requirements/internationalizing/translation-filter#pluralization-in-translation-keys | ||
* @param translateString | ||
* @param vars | ||
*/ | ||
setTranslateStringPluralization(translateObj, vars) { | ||
if ( | ||
vars.count && | ||
typeof translateObj === "object" && | ||
translateObj !== null | ||
) { | ||
const count = Number(vars.count); | ||
if (count === 0) { | ||
if (translateObj.zero) { | ||
return translateObj.zero; | ||
} | ||
if (typeof (translateObj) === 'object' && translateObj !== null && translateObj.other) { | ||
return translateObj.other; | ||
} else if (count === 1) { | ||
if (translateObj.one) { | ||
return translateObj.one; | ||
} | ||
return translateObj; | ||
} else if (count === 2) { | ||
if (translateObj.two) { | ||
return translateObj.two; | ||
} | ||
} | ||
} | ||
if ( | ||
typeof translateObj === "object" && | ||
translateObj !== null && | ||
translateObj.other | ||
) { | ||
return translateObj.other; | ||
} | ||
return translateObj; | ||
} | ||
} | ||
exports.ALocalesService = ALocalesService; |
{ | ||
"name": "@ribajs/i18n", | ||
"description": "Internationalization module for Riba.js", | ||
"version": "1.9.0-alpha.0", | ||
"version": "1.9.0-alpha.1", | ||
"author": "Pascal Garber <pascal@artandcode.studio>", | ||
@@ -29,23 +29,29 @@ "url": "https://github.com/ribajs/riba/tree/master/packages/i18n", | ||
"devDependencies": { | ||
"@babel/cli": "^7.8.4", | ||
"@babel/core": "^7.9.0", | ||
"@babel/plugin-proposal-class-properties": "^7.8.3", | ||
"@babel/plugin-proposal-object-rest-spread": "^7.9.5", | ||
"@babel/preset-env": "^7.9.5", | ||
"@babel/preset-typescript": "^7.9.0", | ||
"@babel/runtime-corejs3": "^7.9.2", | ||
"@ribajs/eslint-config": "1.9.0-alpha.0", | ||
"@ribajs/tsconfig": "1.9.0-alpha.0", | ||
"@ribajs/webpack-config": "0.0.1", | ||
"@babel/cli": "^7.10.4", | ||
"@babel/core": "^7.10.4", | ||
"@babel/plugin-proposal-class-properties": "^7.10.4", | ||
"@babel/plugin-proposal-object-rest-spread": "^7.10.4", | ||
"@babel/preset-env": "^7.10.4", | ||
"@babel/preset-typescript": "^7.10.4", | ||
"@babel/runtime-corejs3": "^7.10.4", | ||
"@ribajs/eslint-config": "1.9.0-alpha.1", | ||
"@ribajs/tsconfig": "1.9.0-alpha.1", | ||
"@ribajs/webpack-config": "1.9.0-alpha.1", | ||
"@typescript-eslint/eslint-plugin": "^3.6.0", | ||
"@typescript-eslint/parser": "^3.6.0", | ||
"babel-loader": "^8.1.0", | ||
"babel-plugin-array-includes": "^2.0.3", | ||
"core-js": "^3.6.5", | ||
"eslint": "^6.8.0", | ||
"typescript": "^3.8.3", | ||
"webpack": "^5.0.0-beta.15", | ||
"webpack-cli": "^3.3.11" | ||
"eslint": "^7.4.0", | ||
"eslint-config-prettier": "^6.11.0", | ||
"eslint-plugin-prettier": "^3.1.4", | ||
"prettier": "^2.0.5", | ||
"typescript": "^3.9.6", | ||
"webpack": "^5.0.0-beta.22", | ||
"webpack-cli": "^3.3.12" | ||
}, | ||
"dependencies": { | ||
"@ribajs/bs4": "1.9.0-alpha.0", | ||
"@ribajs/core": "1.9.0-alpha.0" | ||
"@ribajs/bs4": "1.9.0-alpha.1", | ||
"@ribajs/core": "1.9.0-alpha.1", | ||
"@ribajs/utils": "1.9.0-alpha.1" | ||
}, | ||
@@ -52,0 +58,0 @@ "bugs": { |
@@ -1,4 +0,4 @@ | ||
import { Binder, BinderWrapper } from '@ribajs/core'; | ||
import { concat } from '@ribajs/utils/src/type'; | ||
import { ALocalesService } from '../../services/locales-base.service'; | ||
import { Binder, BinderWrapper } from "@ribajs/core"; | ||
import { concat } from "@ribajs/utils/src/type"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
@@ -11,3 +11,3 @@ // see star.binder.ts | ||
newValue: string; | ||
namespace: null, | ||
namespace: null; | ||
}; | ||
@@ -19,5 +19,7 @@ } | ||
*/ | ||
export const i18nStarBinderWrapper: BinderWrapper<string> = (localesService: ALocalesService) => { | ||
export const i18nStarBinderWrapper: BinderWrapper<string> = ( | ||
localesService: ALocalesService | ||
) => { | ||
return { | ||
name: 'i18n-*', | ||
name: "i18n-*", | ||
block: false, | ||
@@ -30,4 +32,7 @@ priority: 0, | ||
customData.tagName = el.tagName; | ||
customData.contenteditable = el.getAttribute('contenteditable') ? true : false; | ||
customData.isRadio = customData.tagName === 'INPUT' && customData.type === 'radio'; | ||
customData.contenteditable = el.getAttribute("contenteditable") | ||
? true | ||
: false; | ||
customData.isRadio = | ||
customData.tagName === "INPUT" && customData.type === "radio"; | ||
return customData; | ||
@@ -45,3 +50,5 @@ }; | ||
if (this.customData.i18n.showMissingTranslation) { | ||
locale = `translation missing: "${this.customData.properties.join('.')}"`; | ||
locale = `translation missing: "${this.customData.properties.join( | ||
"." | ||
)}"`; | ||
} else { | ||
@@ -51,7 +58,7 @@ return; | ||
} | ||
if (this.customData.attributeName === 'html') { | ||
if (this.customData.attributeName === "html") { | ||
el.innerHTML = locale; | ||
} else if (this.customData.attributeName === 'text') { | ||
} else if (this.customData.attributeName === "text") { | ||
el.innerText = locale; | ||
} else if (this.customData.attributeName === 'value') { | ||
} else if (this.customData.attributeName === "value") { | ||
// TODO support also: https://github.com/JumpLinkNetwork/tinybind/blob/master/src/binders/basic/value.binder.ts#L51 | ||
@@ -77,3 +84,2 @@ if (this.customData.contenteditable) { | ||
// parse data attributes to vars | ||
// Vanilla works better than jquery data function? | ||
this.customData.vars = concat(true, this.customData.vars, _el.dataset); | ||
@@ -99,3 +105,3 @@ // if (Object.keys(this.customData.vars).length) { | ||
if (!langcode) { | ||
console.error('Langcode is requred', langcode); | ||
console.error("Langcode is requred", langcode); | ||
return; | ||
@@ -107,10 +113,17 @@ } | ||
if (this.customData.langVars && this.customData.langVars[langcode]) { | ||
return this.customData.applyTranslation(this.customData.langVars[langcode]); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars[langcode] | ||
); | ||
} | ||
if (!this.customData.properties || this.customData.properties.length === 0) { | ||
if ( | ||
!this.customData.properties || | ||
this.customData.properties.length === 0 | ||
) { | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
@@ -120,23 +133,28 @@ } | ||
// translate by properies, e.g. de.cart.add | ||
return this.customData.i18n.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local: string) => { | ||
if (local && typeof(local) === 'string') { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation(this.customData.langVars.default); | ||
} | ||
return this.customData.i18n | ||
.get([langcode, ...this.customData.properties], this.customData.vars) | ||
.then((local: string) => { | ||
if (local && typeof local === "string") { | ||
// console.warn('Translate by properties', [langcode, ...this.customData.properties], local); | ||
return this.customData.applyTranslation(local); | ||
} | ||
// get the default translation if available | ||
if (this.customData.langVars && this.customData.langVars.default) { | ||
// console.warn('Translate by default as fallback', this.customData.langVars.default); | ||
return this.customData.applyTranslation( | ||
this.customData.langVars.default | ||
); | ||
} | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error: Error) => { | ||
console.error(error); | ||
}); | ||
return this.customData.applyTranslation(null); | ||
}) | ||
.catch((error: Error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
this.customData.onAttributeChanged = (data: BinderAttributeChangedEvent) => { | ||
if (data.detail.name.startsWith('data-')) { | ||
this.customData.onAttributeChanged = ( | ||
data: BinderAttributeChangedEvent | ||
) => { | ||
if (data.detail.name.startsWith("data-")) { | ||
const varName = data.detail.name.slice(5); | ||
@@ -151,3 +169,6 @@ const newVar: any = {}; | ||
this.customData.onLanguageChanged = (langcode: string, initial: boolean) => { | ||
this.customData.onLanguageChanged = ( | ||
langcode: string, | ||
initial: boolean | ||
) => { | ||
// Do not translate on inital language change, we use the ready event for this | ||
@@ -162,3 +183,6 @@ if (!initial) { | ||
*/ | ||
this.customData.initOnReady = (langcode: string, translationNeeded: boolean) => { | ||
this.customData.initOnReady = ( | ||
langcode: string, | ||
translationNeeded: boolean | ||
) => { | ||
// Translate on translation service ready if needed | ||
@@ -170,6 +194,12 @@ if (translationNeeded) { | ||
// Translate if language changes | ||
this.customData.i18n.event.on('changed', this.customData.onLanguageChanged); | ||
this.customData.i18n.event.on( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
// Translate if binder attribute event is changed | ||
el.addEventListener('binder-changed', this.customData.onAttributeChanged); | ||
el.addEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
}; | ||
@@ -180,7 +210,8 @@ }, | ||
if (this.customData.translateMePathString === null) { | ||
// if this is the first call of this function | ||
this.customData.translateMePathString = translateMePathString; | ||
if (translateMePathString) { | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
} | ||
@@ -192,10 +223,19 @@ | ||
if (this.customData.i18n.ready) { | ||
this.customData.initOnReady(this.customData.i18n.getLangcode(), this.customData.i18n.currentLangcode !== this.customData.i18n.initalLangcode || !localesService.doNotTranslateDefaultLanguage); | ||
this.customData.initOnReady( | ||
this.customData.i18n.getLangcode(), | ||
this.customData.i18n.currentLangcode !== | ||
this.customData.i18n.initalLangcode || | ||
!localesService.doNotTranslateDefaultLanguage | ||
); | ||
} else { | ||
this.customData.i18n.event.on('ready', this.customData.initOnReady); | ||
this.customData.i18n.event.on("ready", this.customData.initOnReady); | ||
} | ||
} else if (this.customData.translateMePathString !== translateMePathString) { | ||
} else if ( | ||
this.customData.translateMePathString !== translateMePathString | ||
) { | ||
// If translate string was changed | ||
this.customData.translateMePathString = translateMePathString; | ||
this.customData.properties = this.customData.translateMePathString.split('.'); | ||
this.customData.properties = this.customData.translateMePathString.split( | ||
"." | ||
); | ||
this.customData.parseVars(el); | ||
@@ -207,7 +247,12 @@ this.customData.translate(); | ||
unbind() { | ||
this.el.removeEventListener('binder-changed', this.customData.onAttributeChanged); | ||
this.customData.i18n.event.off('changed', this.customData.onLanguageChanged); | ||
this.el.removeEventListener( | ||
"binder-changed", | ||
this.customData.onAttributeChanged | ||
); | ||
this.customData.i18n.event.off( | ||
"changed", | ||
this.customData.onLanguageChanged | ||
); | ||
}, | ||
} as Binder<string>; | ||
}; |
@@ -1,4 +0,4 @@ | ||
import { i18nStarBinderWrapper } from './i18n/i18n-star.binder'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Binders } from '@ribajs/core'; | ||
import { i18nStarBinderWrapper } from "./i18n/i18n-star.binder"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Binders } from "@ribajs/core"; | ||
@@ -8,3 +8,3 @@ export default (localesService: ALocalesService) => { | ||
i18nStarBinder: i18nStarBinderWrapper(localesService), | ||
} as Binders<any>; | ||
} as Binders<any>; | ||
}; |
@@ -1,2 +0,2 @@ | ||
import { Component, View } from "@ribajs/core"; | ||
import { Component } from "@ribajs/core"; | ||
import { Langcode } from "../../interfaces"; | ||
@@ -70,13 +70,12 @@ import { ALocalesService } from "../../services/locales-base.service"; | ||
} | ||
return new Promise<View | null | undefined>((resolve) => { | ||
this.localesService.event.on( | ||
"ready", | ||
(langcode: string, translationNeeded: boolean) => { | ||
this.initLocales(langcode).then((langcodes) => { | ||
super.init(observedAttributes).then((view) => { | ||
resolve(view); | ||
}); | ||
return new Promise<undefined | null>((resolve) => { | ||
this.localesService.event.on("ready", ( | ||
langcode: string /*, translationNeeded: boolean*/ | ||
) => { | ||
return this.initLocales(langcode).then((/*langcodes*/) => { | ||
return super.init(observedAttributes).then((view) => { | ||
resolve(view); | ||
}); | ||
} | ||
); | ||
}); | ||
}); | ||
}); | ||
@@ -98,11 +97,10 @@ } | ||
.then((langcodes) => { | ||
this.localesService.event.on( | ||
"changed", | ||
(changedLangcode: string, initial: boolean) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === changedLangcode; | ||
}); | ||
} | ||
); | ||
this.localesService.event.on("changed", ( | ||
changedLangcode: string /*, initial: boolean*/ | ||
) => { | ||
// Activate localcode and disable the other | ||
this.scope.langcodes.forEach((langCode) => { | ||
langCode.active = langCode.code === changedLangcode; | ||
}); | ||
}); | ||
return langcodes; | ||
@@ -109,0 +107,0 @@ }) |
@@ -6,5 +6,5 @@ import { TypeOfComponent } from "@ribajs/core"; | ||
} from "@ribajs/bs4/src/components/bs4-share/bs4-share.component"; | ||
import template from "@ribajs/bs4/src/components/bs4-share/bs4-share.component.html"; | ||
import labelTemplate from "./share.label.html"; | ||
import { ALocalesService } from "../../services/locales-base.service"; | ||
// import { LocalesService } from "@ribajs/shopify-tda"; | ||
@@ -39,2 +39,4 @@ interface Scope extends Bs4ShareScope { | ||
public _debug = false; | ||
static get observedAttributes() { | ||
@@ -61,2 +63,7 @@ return [ | ||
protected connectedCallback() { | ||
this.init(Bs4ShareComponent.observedAttributes); | ||
this.addEventListeners(); | ||
} | ||
protected async initTranslate() { | ||
@@ -86,3 +93,3 @@ return new Promise<string>((resolve) => { | ||
.then((locale: string) => { | ||
// console.debug('changed local', local); | ||
// this.debug('changed local', local); | ||
return locale; | ||
@@ -96,3 +103,3 @@ }) | ||
protected async beforeBind() { | ||
// console.debug('beforeBind'); | ||
// this.debug('beforeBind'); | ||
await super.beforeBind(); | ||
@@ -121,3 +128,13 @@ const langcode = await this.initTranslate(); | ||
} | ||
protected template() { | ||
this.debug("template", this.el, this.el.hasChildNodes()); | ||
if (this.el && this.el.hasChildNodes()) { | ||
// If a child is set, this is a custom label template | ||
this.scope.labelTemplate = this.el.innerHTML; | ||
this.debug("Custom label template: ", this.scope.labelTemplate); | ||
} | ||
return template; | ||
} | ||
}; | ||
}; |
@@ -1,4 +0,4 @@ | ||
import { tFormatterWrapper } from './t.formatter'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Formatters } from '@ribajs/core'; | ||
import { tFormatterWrapper } from "./t.formatter"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
import { Formatters } from "@ribajs/core"; | ||
@@ -5,0 +5,0 @@ export default (localesService: ALocalesService): Formatters => { |
@@ -1,6 +0,10 @@ | ||
import { Formatter } from '@ribajs/core'; | ||
import { ALocalesService } from '../services/locales-base.service'; | ||
import { Formatter } from "@ribajs/core"; | ||
import { ALocalesService } from "../services/locales-base.service"; | ||
const translate = async (translateMePathString: string, localesService: ALocalesService, langcode?: string) => { | ||
const properties = translateMePathString.split('.'); | ||
const translate = async ( | ||
translateMePathString: string, | ||
localesService: ALocalesService, | ||
langcode?: string | ||
) => { | ||
const properties = translateMePathString.split("."); | ||
if (!langcode) { | ||
@@ -12,43 +16,49 @@ langcode = localesService.getLangcode(); | ||
} | ||
return localesService.get([langcode, ...properties]/*, vars */) | ||
.then((locale: string) => { | ||
return locale; | ||
}) | ||
.catch((error: Error) => { | ||
console.error(error); | ||
}); | ||
return localesService | ||
.get([langcode, ...properties] /*, vars */) | ||
.then((locale: string) => { | ||
return locale; | ||
}) | ||
.catch((error: Error) => { | ||
console.error(error); | ||
}); | ||
}; | ||
export const tFormatterWrapper = (localesService: ALocalesService): Formatter => { | ||
export const tFormatterWrapper = ( | ||
localesService: ALocalesService | ||
): Formatter => { | ||
return { | ||
name: 't', | ||
read(translateMePathString: string, langcode: string, ...vars: string[]) { | ||
name: "t", | ||
read( | ||
translateMePathString: string, | ||
langcode: string /*, ...vars: string[]*/ | ||
) { | ||
return new Promise((resolve, reject) => { | ||
localesService.event.on('changed', () => { | ||
localesService.event.on("changed", () => { | ||
// console.debug('changed'); | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale as any); | ||
}) | ||
.catch((error: Error) => { | ||
reject(error); | ||
}); | ||
.then((locale) => { | ||
resolve(locale as any); | ||
}) | ||
.catch((error: Error) => { | ||
reject(error); | ||
}); | ||
}); | ||
localesService.event.on('ready', () => { | ||
localesService.event.on("ready", () => { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale as any); | ||
}) | ||
.catch((error: Error) => { | ||
reject(error); | ||
}); | ||
.then((locale) => { | ||
resolve(locale as any); | ||
}) | ||
.catch((error: Error) => { | ||
reject(error); | ||
}); | ||
}); | ||
if (localesService.ready) { | ||
translate(translateMePathString, localesService, langcode) | ||
.then((locale) => { | ||
resolve(locale); | ||
}); | ||
translate(translateMePathString, localesService, langcode).then( | ||
(locale) => { | ||
resolve(locale); | ||
} | ||
); | ||
} | ||
@@ -55,0 +65,0 @@ }); |
@@ -1,6 +0,6 @@ | ||
export * from './binders'; | ||
export * from './components'; | ||
export * from './formatters'; | ||
export * from './interfaces'; | ||
export * from './services'; | ||
export * from './i18n.module'; | ||
export * from "./binders"; | ||
export * from "./components"; | ||
export * from "./formatters"; | ||
export * from "./interfaces"; | ||
export * from "./services"; | ||
export * from "./i18n.module"; |
@@ -1,2 +0,2 @@ | ||
export * from './langcode'; | ||
export * from './local-var'; | ||
export * from "./langcode"; | ||
export * from "./local-var"; |
@@ -1,3 +0,3 @@ | ||
export * from './locales-base.service'; | ||
export * from './locales-rest.service'; | ||
export * from './locales-static.service'; | ||
export * from "./locales-base.service"; | ||
export * from "./locales-rest.service"; | ||
export * from "./locales-static.service"; |
@@ -1,7 +0,6 @@ | ||
import { EventDispatcher } from '@ribajs/core'; | ||
import { clone } from '@ribajs/utils/src/type'; | ||
import { Langcode, LocalPluralization, LocalVar } from '../interfaces'; | ||
import { EventDispatcher } from "@ribajs/core"; | ||
import { clone } from "@ribajs/utils/src/type"; | ||
import { Langcode, LocalPluralization, LocalVar } from "../interfaces"; | ||
export abstract class ALocalesService { | ||
public get ready() { | ||
@@ -11,7 +10,7 @@ return this._ready; | ||
public event = new EventDispatcher('i18n'); | ||
public event = new EventDispatcher("i18n"); | ||
public showMissingTranslation: boolean = false; | ||
public showMissingTranslation = false; | ||
protected _ready: boolean = false; | ||
protected _ready = false; | ||
@@ -28,3 +27,6 @@ /** | ||
constructor(public doNotTranslateDefaultLanguage: boolean, showMissingTranslation: boolean) { | ||
constructor( | ||
public doNotTranslateDefaultLanguage: boolean, | ||
showMissingTranslation: boolean | ||
) { | ||
this.doNotTranslateDefaultLanguage = doNotTranslateDefaultLanguage; | ||
@@ -40,44 +42,50 @@ this.showMissingTranslation = showMissingTranslation; | ||
*/ | ||
public async get(properties?: string[], vars?: LocalVar, force: boolean = false) { | ||
public async get(properties?: string[], vars?: LocalVar, force = false) { | ||
if (!this.ready && !force) { | ||
throw new Error('not ready'); | ||
throw new Error("not ready"); | ||
} | ||
return this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local: any = clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
return ( | ||
this.getAll() | ||
// extract properties | ||
.then((locals) => { | ||
if (properties && properties.length) { | ||
let local: any = clone(true, locals); | ||
for (const property of properties) { | ||
if (!property) { | ||
return; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} else { | ||
return null; | ||
} | ||
} | ||
return local; | ||
} | ||
if (local[property]) { | ||
local = local[property]; | ||
} else { | ||
return null; | ||
return locals; | ||
}) | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn( | ||
`WARNING translation missing: "${properties.join(".")}"`, | ||
local, | ||
properties | ||
); | ||
} | ||
} | ||
return local; | ||
} | ||
return locals; | ||
}) | ||
.then((local) => { | ||
if (local === null && properties) { | ||
console.warn(`WARNING translation missing: "${properties.join('.')}"`, local, properties); | ||
} | ||
return local; | ||
}) | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
return local; | ||
}) | ||
// Replace variables in local string if vars are set | ||
.then((local) => { | ||
if (vars) { | ||
local = this.setTranslateStringPluralization(local, vars); | ||
local = this.setTranslateStringVars(local, vars); | ||
} | ||
return local; | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}) | ||
); | ||
} | ||
@@ -93,3 +101,3 @@ | ||
if (!langcode) { | ||
throw new Error('Langcode not found in html tag'); | ||
throw new Error("Langcode not found in html tag"); | ||
} | ||
@@ -101,3 +109,3 @@ return this.get([langcode, ...properties], vars); | ||
const lang = navigator.language || (navigator as any).userLanguage; | ||
const simplified = lang.split('-')[0].toLowerCase(); | ||
const simplified = lang.split("-")[0].toLowerCase(); | ||
return simplified; | ||
@@ -107,3 +115,5 @@ } | ||
public getHTMLLangcode(): string { | ||
const langcode = document.documentElement ? document.documentElement.lang : 'en'; | ||
const langcode = document.documentElement | ||
? document.documentElement.lang | ||
: "en"; | ||
return langcode; | ||
@@ -125,3 +135,3 @@ } | ||
public setLangcode(langcode: string, initial: boolean = false) { | ||
public setLangcode(langcode: string, initial = false) { | ||
if (this.currentLangcode !== langcode) { | ||
@@ -134,3 +144,3 @@ this.currentLangcode = langcode; | ||
} | ||
this.event.trigger('changed', langcode, initial); | ||
this.event.trigger("changed", langcode, initial); | ||
} | ||
@@ -141,4 +151,3 @@ } | ||
const activeCode = this.getLangcode(); | ||
return this.get(undefined, undefined, true) | ||
.then((locals) => { | ||
return this.get(undefined, undefined, true).then((locals) => { | ||
const langcodes: Langcode[] = []; | ||
@@ -159,6 +168,6 @@ Object.keys(locals).forEach((langcode) => { | ||
public parseTemplateVars(el: HTMLElement): LocalVar { | ||
const templates = el.querySelectorAll<HTMLTemplateElement>('template'); | ||
const templates = el.querySelectorAll<HTMLTemplateElement>("template"); | ||
const vars: LocalVar = {}; | ||
templates.forEach((template) => { | ||
const name: string | null = template.getAttribute('name'); | ||
const name: string | null = template.getAttribute("name"); | ||
if (name !== null) { | ||
@@ -175,6 +184,6 @@ vars[name] = template.innerHTML.trim(); | ||
public parseLocalVars(el: HTMLElement): LocalVar { | ||
const templates = el.querySelectorAll<HTMLTemplateElement>('template'); | ||
const templates = el.querySelectorAll<HTMLTemplateElement>("template"); | ||
const vars: LocalVar = {}; | ||
templates.forEach((template) => { | ||
const lang: string | null = template.getAttribute('lang'); | ||
const lang: string | null = template.getAttribute("lang"); | ||
if (lang !== null) { | ||
@@ -193,3 +202,7 @@ vars[lang] = template.innerHTML.trim(); | ||
public setTranslateStringVars(translateString: string, vars: LocalVar) { | ||
if (!translateString || Object.keys(vars).length === 0 || typeof(translateString.match) !== 'function') { | ||
if ( | ||
!translateString || | ||
Object.keys(vars).length === 0 || | ||
typeof translateString.match !== "function" | ||
) { | ||
return translateString; | ||
@@ -201,5 +214,11 @@ } | ||
if (match) { | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ''); | ||
if (typeof(vars[varName]) === 'string' || typeof(vars[varName]) === 'number') { | ||
translateString = translateString.replace(match, vars[varName] as string); | ||
const varName = match.replace(/{{\s*|\s*}}/gm, ""); | ||
if ( | ||
typeof vars[varName] === "string" || | ||
typeof vars[varName] === "number" | ||
) { | ||
translateString = translateString.replace( | ||
match, | ||
vars[varName] as string | ||
); | ||
} | ||
@@ -220,4 +239,6 @@ } | ||
this.currentLangcode = this.initalLangcode; | ||
if (!this.initalLangcode ) { | ||
throw new Error(`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}`); | ||
if (!this.initalLangcode) { | ||
throw new Error( | ||
`The lang attribute on the html element is requred to detect the default theme language: ${this.initalLangcode}` | ||
); | ||
} | ||
@@ -227,26 +248,31 @@ // Detect browser language and switch to this language when available | ||
return this.getAvailableLangcodes() | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
.then((availableLangcodes) => { | ||
let browserLangFound = false; | ||
for (const availableLangcodeObj of availableLangcodes) { | ||
if (availableLangcodeObj.code === browserLangcode) { | ||
browserLangFound = true; | ||
} | ||
} | ||
} | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if (!this.doNotTranslateDefaultLanguage || (browserLangFound && browserLangcode !== this.currentLangcode)) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((availableLangcodes) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = this.currentLangcode !== this.initalLangcode || !this.doNotTranslateDefaultLanguage; | ||
this.event.trigger('ready', this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
// only switch language if the browser language is not the default language (if doNotTranslateDefaultLanguage is true) | ||
if ( | ||
!this.doNotTranslateDefaultLanguage || | ||
(browserLangFound && browserLangcode !== this.currentLangcode) | ||
) { | ||
this.setLangcode(browserLangcode, true); | ||
} | ||
return availableLangcodes; | ||
}) | ||
.then((/*availableLangcodes*/) => { | ||
this._ready = true; | ||
// If the current langcode is not the inital langcode then translation is needed | ||
const translationNeeded = | ||
this.currentLangcode !== this.initalLangcode || | ||
!this.doNotTranslateDefaultLanguage; | ||
this.event.trigger("ready", this.currentLangcode, translationNeeded); | ||
}) | ||
.catch((error) => { | ||
console.error(error); | ||
this._ready = false; | ||
return error; | ||
}); | ||
} | ||
@@ -259,4 +285,11 @@ | ||
*/ | ||
protected setTranslateStringPluralization(translateObj: LocalPluralization | string, vars: LocalVar) { | ||
if (vars.count && typeof(translateObj) === 'object' && translateObj !== null) { | ||
protected setTranslateStringPluralization( | ||
translateObj: LocalPluralization | string, | ||
vars: LocalVar | ||
) { | ||
if ( | ||
vars.count && | ||
typeof translateObj === "object" && | ||
translateObj !== null | ||
) { | ||
const count = Number(vars.count); | ||
@@ -278,3 +311,7 @@ if (count === 0) { | ||
if (typeof(translateObj) === 'object' && translateObj !== null && translateObj.other) { | ||
if ( | ||
typeof translateObj === "object" && | ||
translateObj !== null && | ||
translateObj.other | ||
) { | ||
return translateObj.other; | ||
@@ -281,0 +318,0 @@ } |
@@ -1,3 +0,3 @@ | ||
import { HttpService } from '@ribajs/core'; | ||
import { ALocalesService } from './locales-base.service'; | ||
import { HttpService } from "@ribajs/core"; | ||
import { ALocalesService } from "./locales-base.service"; | ||
@@ -8,3 +8,2 @@ /** | ||
export class LocalesRestService extends ALocalesService { | ||
public static instances: { | ||
@@ -30,3 +29,7 @@ [url: string]: LocalesRestService; | ||
constructor(protected url: string, doNotTranslateDefaultLanguage: boolean = false, showMissingTranslation: boolean = false) { | ||
constructor( | ||
protected url: string, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
@@ -67,4 +70,3 @@ | ||
} | ||
return HttpService.getJSON(url) | ||
.then((locales: any) => { | ||
return HttpService.getJSON(url).then((locales: any) => { | ||
this.locales[url as string] = locales; | ||
@@ -74,3 +76,2 @@ return this.locales[url as string]; | ||
} | ||
} |
@@ -1,5 +0,4 @@ | ||
import { ALocalesService } from './locales-base.service'; | ||
import { ALocalesService } from "./locales-base.service"; | ||
export class LocalesStaticService extends ALocalesService { | ||
public static instances: { | ||
@@ -9,3 +8,3 @@ [id: string]: LocalesStaticService; | ||
public static getInstance(id: string = 'main') { | ||
public static getInstance(id = "main") { | ||
return LocalesStaticService.instances[id]; | ||
@@ -24,6 +23,11 @@ } | ||
constructor(protected locales: any, protected id?: string, doNotTranslateDefaultLanguage: boolean = false, showMissingTranslation: boolean = false) { | ||
constructor( | ||
protected locales: any, | ||
protected id?: string, | ||
doNotTranslateDefaultLanguage = false, | ||
showMissingTranslation = false | ||
) { | ||
super(doNotTranslateDefaultLanguage, showMissingTranslation); | ||
if (!id) { | ||
id = 'main'; | ||
id = "main"; | ||
} | ||
@@ -45,6 +49,5 @@ | ||
*/ | ||
protected async getAll(themeID?: number) { | ||
protected async getAll(/*themeID?: number*/) { | ||
return this.locales; | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
152889
3
22
98
3860
+ Added@ribajs/utils@1.9.0-alpha.1
+ Added@ribajs/bs4@1.9.0-alpha.1(transitive)
+ Added@ribajs/cache@1.9.0-alpha.1(transitive)
+ Added@ribajs/core@1.9.0-alpha.1(transitive)
+ Added@ribajs/extras@1.9.0-alpha.1(transitive)
+ Added@ribajs/utils@1.9.0-alpha.1(transitive)
- Removed@ribajs/bs4@1.9.0-alpha.0(transitive)
- Removed@ribajs/cache@1.9.0-alpha.0(transitive)
- Removed@ribajs/core@1.9.0-alpha.0(transitive)
- Removed@ribajs/extras@1.9.0-alpha.0(transitive)
- Removed@ribajs/utils@1.9.0-alpha.0(transitive)
Updated@ribajs/bs4@1.9.0-alpha.1
Updated@ribajs/core@1.9.0-alpha.1