vue-i18n-lite
Version:
A super lightweight and minimal plugin that introduces internationalization into your Vue.js app with a simple API
7 lines (6 loc) • 1.88 kB
JavaScript
/*!
* vue-i18n-lite v1.0.2
* (c) 2021 Erik Pham
* @license MIT
*/
var VueI18nLite=function(e,t){"use strict";const n=["__proto__","prototype","constructor"];function r(e){const t=e.split("."),r=[];for(let e=0;e<t.length;e++){let n=t[e];for(;"\\"===n[n.length-1]&&void 0!==t[e+1];)n=n.slice(0,-1)+".",n+=t[++e];r.push(n)}return r.some((e=>-1!==n.indexOf(e)))?[]:r}function o(e,t){if(!function(e){const t=typeof e;return null!==e&&("object"===t||"function"===t)}(e))return"";const n=r(t);if(0===n.length)return"";let o=Object.assign({},e);for(let e=0;e<n.length;e++){if("string"==typeof o[n[e]])return o[n[e]];if(o=o[n[e]],null==o){if(e!==n.length-1)return"";break}}return""}function c(e,t){return Object.keys(t).forEach((n=>{t[n]instanceof Object&&n in e&&(t[n]={...t[n],...c(e[n],t[n])})})),{...e||{},...t}}const i="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,l=(e=>i?Symbol(e):"_vt_"+e)("i18n");return e.createI18n=function(e){const n=Object.assign({locale:"en",fallbackLocale:"en",messages:{}},e),r=t.ref(n.locale),i=t.reactive({});return Object.entries(n.messages).forEach((([e,t])=>{i[e]=t})),{t(e,t){if(!e)return"";let c=o(i["string"==typeof t&&t?t:r.value],e)||o(i[n.fallbackLocale],e);if(t&&"string"!=typeof t){const e=function(e,t){if(Array.isArray(t)){const n={},r=[...e.matchAll(/{(.+?)}/g)];return r&&r.forEach(((e,r)=>{t[r]&&(n[e[1]]=t[r])})),n}return t}(c,t);l=e,(Array.isArray(l)?l.length:Object.keys(l).length)&&(c=function(e,t){for(const n in t)e=e.replace(`{${n}}`,String(t[n]));return e}(c,e))}var l;return c||e},current:t.readonly(r),options:t.readonly(e||{}),install(e){e.config.globalProperties.$t=this.t,e.provide(l,this)},changeLocale(e){r.value=e},setLocaleMessage(e,n){i[e]=c(t.toRaw(i[e]||{}),n)},getLocaleMessage:e=>i[e]||{}}},e.useI18n=function(){return t.inject(l)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},Vue);