DelayNoMore/frontend/packages/i18n-master/runtime-scripts/LanguageData.js

98 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2022-09-20 15:50:01 +00:00
const Polyglot = require('polyglot.min');
let polyInst = null;
if (!window.i18n) {
window.i18n = {
languages: {},
curLang:''
};
}
if (CC_EDITOR) {
Editor.Profile.load('profile://project/i18n.json', (err, profile) => {
window.i18n.curLang = profile.data['default_language'];
if (polyInst) {
let data = loadLanguageData(window.i18n.curLang) || {};
initPolyglot(data);
}
});
}
function loadLanguageData (language) {
return window.i18n.languages[language];
}
function initPolyglot (data) {
if (data) {
if (polyInst) {
polyInst.replace(data);
} else {
polyInst = new Polyglot({ phrases: data, allowMissing: true });
}
}
}
module.exports = {
/**
* This method allow you to switch language during runtime, language argument should be the same as your data file name
* such as when language is 'zh', it will load your 'zh.js' data source.
* @method init
* @param language - the language specific data file name, such as 'zh' to load 'zh.js'
*/
init (language) {
if (language === window.i18n.curLang) {
return;
}
let data = loadLanguageData(language) || {};
window.i18n.curLang = language;
initPolyglot(data);
this.inst = polyInst;
},
/**
* this method takes a text key as input, and return the localized string
* Please read https://github.com/airbnb/polyglot.js for details
* @method t
* @return {String} localized string
* @example
*
* var myText = i18n.t('MY_TEXT_KEY');
*
* // if your data source is defined as
* // {"hello_name": "Hello, %{name}"}
* // you can use the following to interpolate the text
* var greetingText = i18n.t('hello_name', {name: 'nantas'}); // Hello, nantas
*/
t (key, opt) {
if (polyInst) {
return polyInst.t(key, opt);
}
},
inst: polyInst,
updateSceneRenderers () { // very costly iterations
let rootNodes = cc.director.getScene().children;
// walk all nodes with localize label and update
let allLocalizedLabels = [];
for (let i = 0; i < rootNodes.length; ++i) {
let labels = rootNodes[i].getComponentsInChildren('LocalizedLabel');
Array.prototype.push.apply(allLocalizedLabels, labels);
}
for (let i = 0; i < allLocalizedLabels.length; ++i) {
let label = allLocalizedLabels[i];
if(!label.node.active)continue;
label.updateLabel();
}
// walk all nodes with localize sprite and update
let allLocalizedSprites = [];
for (let i = 0; i < rootNodes.length; ++i) {
let sprites = rootNodes[i].getComponentsInChildren('LocalizedSprite');
Array.prototype.push.apply(allLocalizedSprites, sprites);
}
for (let i = 0; i < allLocalizedSprites.length; ++i) {
let sprite = allLocalizedSprites[i];
if(!sprite.node.active)continue;
sprite.updateSprite(window.i18n.curLang);
}
}
};