UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 3.54 kB
import{EventHandler as s}from"../../core/event-handler.js";import{Asset as t}from"../asset/asset.js";import{I18nParser as e}from"./i18n-parser.js";import{DEFAULT_LOCALE as a,DEFAULT_LOCALE_FALLBACKS as i}from"./constants.js";import{getLang as n,replaceLang as o,getPluralFn as l,findAvailableLocale as r}from"./utils.js";class h extends s{constructor(s){super(),this.locale=a,this._translations={},this._availableLangs={},this._app=s,this._assets=[],this._parser=new e}set assets(s){const e={};for(let a=0,i=s.length;a<i;a++){e[s[a]instanceof t?s[a].id:s[a]]=!0}let a=this._assets.length;for(;a--;){const s=this._assets[a];if(!e[s]){this._app.assets.off(`add:${s}`,this._onAssetAdd,this);const t=this._app.assets.get(s);t&&this._onAssetRemove(t),this._assets.splice(a,1)}}for(const s in e){const t=parseInt(s,10);if(-1!==this._assets.indexOf(t))continue;this._assets.push(t);const e=this._app.assets.get(t);e?this._onAssetAdd(e):this._app.assets.once(`add:${t}`,this._onAssetAdd,this)}}get assets(){return this._assets}set locale(s){if(this._locale===s)return;let t=n(s);if("in"===t&&(t="id",s=o(s,t),this._locale===s))return;const e=this._locale;this._locale=s,this._lang=t,this._pluralFn=l(this._lang),this.fire("set:locale",s,e)}get locale(){return this._locale}static findAvailableLocale(s,t){return r(s,t)}findAvailableLocale(s){if(this._translations[s])return s;const t=n(s);return this._findFallbackLocale(s,t)}getText(s,t){let e,a=s;t||(t=this._locale,e=this._lang);let i=this._translations[t];return i||(e||(e=n(t)),t=this._findFallbackLocale(t,e),i=this._translations[t]),i&&i.hasOwnProperty(s)&&(a=i[s],Array.isArray(a)&&(a=a[0]),null==a&&(a=s)),a}getPluralText(s,t,e){let a,i,o=s;e?(a=n(e),i=l(a)):(e=this._locale,a=this._lang,i=this._pluralFn);let r=this._translations[e];if(r||(e=this._findFallbackLocale(e,a),a=n(e),i=l(a),r=this._translations[e]),r&&r[s]&&i){const e=i(t);o=r[s][e],null==o&&(o=s)}return o}addData(s){let t;try{t=this._parser.parse(s)}catch(s){return void console.error(s)}for(let s=0,e=t.length;s<e;s++){const e=t[s],a=e.info.locale,i=e.messages;if(!this._translations[a]){this._translations[a]={};const s=n(a);this._availableLangs[s]||(this._availableLangs[s]=a)}Object.assign(this._translations[a],i),this.fire("data:add",a,i)}}removeData(s){let t;try{t=this._parser.parse(s)}catch(s){return void console.error(s)}for(let s=0,e=t.length;s<e;s++){const e=t[s],a=e.info.locale,i=this._translations[a];if(!i)continue;const o=e.messages;for(const s in o)delete i[s];0===Object.keys(i).length&&(delete this._translations[a],delete this._availableLangs[n(a)]),this.fire("data:remove",a,o)}}destroy(){this._translations=null,this._availableLangs=null,this._assets=null,this._parser=null,this.off()}_findFallbackLocale(s,t){let e=i[s];return e&&this._translations[e]?e:(e=i[t],e&&this._translations[e]?e:(e=this._availableLangs[t],e&&this._translations[e]?e:a))}_onAssetAdd(s){s.on("load",this._onAssetLoad,this),s.on("change",this._onAssetChange,this),s.on("remove",this._onAssetRemove,this),s.on("unload",this._onAssetUnload,this),s.resource&&this._onAssetLoad(s)}_onAssetLoad(s){this.addData(s.resource)}_onAssetChange(s){s.resource&&this.addData(s.resource)}_onAssetRemove(s){s.off("load",this._onAssetLoad,this),s.off("change",this._onAssetChange,this),s.off("remove",this._onAssetRemove,this),s.off("unload",this._onAssetUnload,this),s.resource&&this.removeData(s.resource),this._app.assets.once(`add:${s.id}`,this._onAssetAdd,this)}_onAssetUnload(s){s.resource&&this.removeData(s.resource)}}export{h as I18n};