react-localization
Version:
Simple module to localize the React interface using the same syntax used in the ReactNativeLocalization module
2 lines (1 loc) • 4.57 kB
JavaScript
(function(o,g){typeof exports=="object"&&typeof module<"u"?module.exports=g(require("react")):typeof define=="function"&&define.amd?define(["react"],g):(o=typeof globalThis<"u"?globalThis:o||self,o.ReactLocalization=g(o.React))})(this,function(o){"use strict";var g=Object.defineProperty,_=(s,e,t)=>e in s?g(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,u=(s,e,t)=>_(s,typeof e!="symbol"?e+"":e,t);function L(){const s="en-US";if(typeof navigator>"u")return s;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 s}function y(s,e){if(e[s])return s;const t=s.indexOf("-"),a=t>=0?s.substring(0,t):s;return e[a]?a:Object.keys(e)[0]}function b(s){const e=["_interfaceLanguage","_language","_defaultLanguage","_defaultLanguageFirstLevelKeys","_props"];s.forEach(t=>{if(e.indexOf(t)!==-1)throw new Error(`${t} cannot be used as a key. It is a reserved word.`)})}function m(s){let e="";const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let a=0;a<s;a+=1)e+=t.charAt(Math.floor(Math.random()*t.length));return e}const c=/(\{[\d|\w]+\})/,h=/(\$ref\{[\w|.]+\})/;class p{constructor(e,t){u(this,"_opts"),u(this,"_interfaceLanguage"),u(this,"_language"),u(this,"_defaultLanguage"),u(this,"_defaultLanguageFirstLevelKeys"),u(this,"_props"),u(this,"_availableLanguages"),typeof t=="function"&&(t={customLanguageInterface:t}),this._opts={customLanguageInterface:L,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,b(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 i=a[n].length;this._opts.pseudoMultipleLanguages&&(i=Math.floor(i*1.4)),a[n]=m(i)}e[t]=`[${a.join(" ")}]`}})}setLanguage(e){const t=y(e,this._props),a=Object.keys(this._props)[0];if(this._language=t,this._props[t]){for(const i of this._defaultLanguageFirstLevelKeys)delete this[i];let n={...this._props[this._language]};Object.keys(n).forEach(i=>{this[i]=n[i]}),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(n=>{if(n.match(h)){const i=n.slice(5,-1);return this.getString(i)||(this._opts.logsEnabled&&console.log(`No Localization ref found for '${n}' in string '${e}'`),`$ref(id:${i})`)}return n}).join("").split(c).filter(Boolean).map(n=>{if(n.match(c)){const i=n.slice(1,-1);let r=t[i];return r===void 0&&t[0]&&(r=t[0][i]),r}return n}).join("")}getString(e,t,a=!1){try{let n=this._props[t||this._language];const i=e.split(".");for(const r of i){if(n[r]===void 0)throw new Error(r);n=n[r]}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}}const d=/(\{[\d|\w]+\})/;return p.prototype.formatString=(s,...e)=>{let t=!1;const a=(s||"").split(d).filter(n=>!!n).map((n,i)=>{if(n.match(d)){const r=n.slice(1,-1);let l=e[r];if(l==null){const f=e[0]?e[0][r]:void 0;if(f!==void 0)l=f;else return l}return o.isValidElement(l)?(t=!0,o.Children.toArray(l).map(f=>({...f,key:i.toString()}))):l}return n});return t?a:a.join("")},p});