UNPKG

localized-strings

Version:

Simple module to localize the strings of any JS based program using the same syntax used in the ReactLocalization and ReactNativeLocalization module, use 'npm run build' before publishing

2 lines (1 loc) 4.18 kB
(function(u,i){typeof exports=="object"&&typeof module<"u"?module.exports=i():typeof define=="function"&&define.amd?define(i):(u=typeof globalThis<"u"?globalThis:u||self,u.LocalizedStrings=i())})(this,function(){"use strict";var p=Object.defineProperty;var L=(u,i,r)=>i in u?p(u,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):u[i]=r;var o=(u,i,r)=>L(u,typeof i!="symbol"?i+"":i,r);function u(){const g="en-US";if(typeof navigator>"u")return g;const e=navigator;if(e){if(e.language)return e.language;if(e.languages&&e.languages[0])return e.languages[0];if("userLanguage"in e)return e.userLanguage;if("browserLanguage"in e)return e.browserLanguage}return g}function i(g,e){if(e[g])return g;const t=g.indexOf("-"),a=t>=0?g.substring(0,t):g;return e[a]?a:Object.keys(e)[0]}function r(g){const e=["_interfaceLanguage","_language","_defaultLanguage","_defaultLanguageFirstLevelKeys","_props"];g.forEach(t=>{if(e.indexOf(t)!==-1)throw new Error(`${t} cannot be used as a key. It is a reserved word.`)})}function d(g){let e="";const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let a=0;a<g;a+=1)e+=t.charAt(Math.floor(Math.random()*t.length));return e}const c=/(\{[\d|\w]+\})/,h=/(\$ref\{[\w|.]+\})/;class _{constructor(e,t){o(this,"_opts");o(this,"_interfaceLanguage");o(this,"_language");o(this,"_defaultLanguage");o(this,"_defaultLanguageFirstLevelKeys");o(this,"_props");o(this,"_availableLanguages");typeof t=="function"&&(t={customLanguageInterface:t}),this._opts={customLanguageInterface:u,pseudo:!1,pseudoMultipleLanguages:!1,logsEnabled:!0,...t},this._interfaceLanguage=this._opts.customLanguageInterface(),this._language=this._interfaceLanguage,this.setContent(e)}setContent(e){const[t]=Object.keys(e);this._defaultLanguage=t,this._defaultLanguageFirstLevelKeys=[],this._props=e,r(Object.keys(e[this._defaultLanguage])),Object.keys(this._props[this._defaultLanguage]).forEach(a=>{typeof this._props[this._defaultLanguage][a]=="string"&&this._defaultLanguageFirstLevelKeys.push(a)}),this.setLanguage(this._interfaceLanguage),this._opts.pseudo&&this._pseudoAllValues(this._props)}_pseudoAllValues(e){Object.keys(e).forEach(t=>{if(typeof e[t]=="object")this._pseudoAllValues(e[t]);else if(typeof e[t]=="string"){if(e[t].indexOf("[")===0&&e[t].lastIndexOf("]")===e[t].length-1)return;const a=e[t].split(" ");for(let n=0;n<a.length;n+=1){if(a[n].match(c)||a[n].match(h))continue;let s=a[n].length;this._opts.pseudoMultipleLanguages&&(s=Math.floor(s*1.4)),a[n]=d(s)}e[t]=`[${a.join(" ")}]`}})}setLanguage(e){const t=i(e,this._props),a=Object.keys(this._props)[0];if(this._language=t,this._props[t]){for(const s of this._defaultLanguageFirstLevelKeys)delete this[s];let n={...this._props[this._language]};Object.keys(n).forEach(s=>{this[s]=n[s]}),a!==this._language&&(n=this._props[a],this._fallbackValues(n,this))}}_fallbackValues(e,t){Object.keys(e).forEach(a=>{Object.prototype.hasOwnProperty.call(e,a)&&!t[a]&&t[a]!==""?(t[a]=e[a],this._opts.logsEnabled&&console.log(`🚧 👷 key '${a}' not found in localizedStrings for language ${this._language} 🚧`)):typeof t[a]!="string"&&this._fallbackValues(e[a],t[a])})}getLanguage(){return this._language}getInterfaceLanguage(){return this._interfaceLanguage}getAvailableLanguages(){return this._availableLanguages||(this._availableLanguages=Object.keys(this._props)),this._availableLanguages}formatString(e,...t){let a=e||"";return typeof a=="string"&&(a=this.getString(e,null,!0)||a),a.split(h).filter(Boolean).map(s=>{if(s.match(h)){const l=s.slice(5,-1),f=this.getString(l);return f||(this._opts.logsEnabled&&console.log(`No Localization ref found for '${s}' in string '${e}'`),`$ref(id:${l})`)}return s}).join("").split(c).filter(Boolean).map(s=>{if(s.match(c)){const l=s.slice(1,-1);let f=t[l];return f===void 0&&t[0]&&(f=t[0][l]),f}return s}).join("")}getString(e,t,a=!1){try{let n=this._props[t||this._language];const s=e.split(".");for(const l of s){if(n[l]===void 0)throw new Error(l);n=n[l]}return n}catch(n){!a&&this._opts.logsEnabled&&console.log(`No localization found for key '${e}' and language '${t}', failed on ${n.message}`)}return null}getContent(){return this._props}}return _});