UNPKG

@gulibs/react-vintl

Version:

Type-safe i18n library for React with Vite plugin and automatic type inference

1 lines 6.67 kB
const e=require(`./chunk-CUT6urMc.cjs`);let t=require(`react`);t=e.__toESM(t);let n=require(`react/jsx-runtime`);n=e.__toESM(n);function r(){return typeof process<`u`&&process.env.NODE_ENV?process.env.NODE_ENV===`production`:typeof window<`u`?!window.location.hostname.includes(`localhost`)&&!window.location.hostname.includes(`127.0.0.1`)&&!window.location.hostname.includes(`0.0.0.0`):!1}var i=class{constructor(e={}){let t=r();this.config={debug:e.debug??!t,warn:e.warn??!t,error:e.error??!0}}debug(...e){this.config.debug&&console.log(`[react-vintl]`,...e)}warn(...e){this.config.warn&&console.warn(`[react-vintl]`,...e)}error(...e){this.config.error&&console.error(`[react-vintl]`,...e)}setConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}};const a=new i;function o(e,t){return t.split(`.`).reduce((e,t)=>{if(typeof e==`object`&&e&&t in e)return e[t]},e)}function s(e,t={}){return e.replace(/\{\{([^}]+)\}\}/g,(e,n)=>{try{return c(n.trim(),t)}catch(t){return a.warn(`Failed to process interpolation "${e}":`,t),e}})}function c(e,t){let n=e.split(`,`).map(e=>e.trim()),r=n[0];if(!r)throw Error(`Missing parameter key`);let i=l(t,r);if(i===void 0)throw Error(`Parameter "${r}" not found`);if(n.length===1)return String(i);let a=n[1],o=n.slice(2);switch(a){case`plural`:return u(i,o);case`select`:return d(i,o);case`number`:return f(i,o);case`date`:return p(i,o);case`currency`:return m(i,o);default:return h(i,a,o)}}function l(e,t){return t.split(`.`).reduce((e,t)=>{if(typeof e==`object`&&e&&t in e)return e[t]},e)}function u(e,t){let n=Number(e);if(isNaN(n))return String(e);let r={};for(let e of t){let[t,n]=e.split(`=`,2).map(e=>e.trim());t&&n&&(r[t]=n)}let i=`other`;return n===1&&`one`in r?i=`one`:n===0&&`zero`in r?i=`zero`:n>1&&`few`in r?i=`few`:n>1&&`many`in r&&(i=`many`),(r[i]||r.other||String(e)).replace(/#/g,String(n))}function d(e,t){let n=String(e),r={};for(let e of t){let[t,n]=e.split(`=`,2).map(e=>e.trim());t&&n&&(r[t]=n)}return r[n]||r.other||n}function f(e,t){let n=Number(e);if(isNaN(n))return String(e);let r={};for(let e of t){let[t,n]=e.split(`=`,2).map(e=>e.trim());if(t&&n){let e=Number(n);isNaN(e)||(r[t]=e)}}try{return new Intl.NumberFormat(void 0,r).format(n)}catch{return String(n)}}function p(e,t){let n;if(e instanceof Date)n=e;else if(typeof e==`string`||typeof e==`number`)n=new Date(e);else return String(e);if(isNaN(n.getTime()))return String(e);let r={};for(let e of t){let[t,n]=e.split(`=`,2).map(e=>e.trim());t&&n&&(r[t]=n)}try{return new Intl.DateTimeFormat(void 0,r).format(n)}catch{return n.toLocaleDateString()}}function m(e,t){let n=Number(e);if(isNaN(n))return String(e);let r={style:`currency`};for(let e of t){let[t,n]=e.split(`=`,2).map(e=>e.trim());if(t&&n)if(t===`currency`)r.currency=n;else{let e=Number(n);isNaN(e)||(r[t]=e)}}try{return new Intl.NumberFormat(void 0,r).format(n)}catch{return String(n)}}function h(e,t,n){switch(t){case`uppercase`:return String(e).toUpperCase();case`lowercase`:return String(e).toLowerCase();case`capitalize`:return String(e).charAt(0).toUpperCase()+String(e).slice(1).toLowerCase();default:return String(e)}}function g(e){if(!e||typeof e!=`object`)return!1;try{return JSON.stringify(e),!0}catch{return a.warn(`Invalid params object: contains circular reference`),!1}}function _(e,t){return(n,r)=>{let i=e[t];if(!i)return a.warn(`Locale "${t}" not found in resources`),n;let c=o(i,n);if(typeof c!=`string`)return a.warn(`Translation key "${n}" not found or not a string in locale "${t}"`),n;if(r&&!g(r))return a.warn(`Invalid params for key "${n}":`,r),c;try{return r?s(c,r):c}catch(e){return a.error(`Failed to process translation for key "${n}":`,e),c}}}function v(e){if(!e||typeof e!=`object`)return a.error(`Resources must be an object`),!1;let t=Object.keys(e);if(t.length===0)return a.error(`Resources must contain at least one locale`),!1;let n=t[0],r=y(e[n]);for(let n of t.slice(1)){let t=y(e[n]),i=r.filter(e=>!t.includes(e)),o=t.filter(e=>!r.includes(e));i.length>0&&a.warn(`Locale "${n}" is missing keys: ${i.join(`, `)}`),o.length>0&&a.warn(`Locale "${n}" has extra keys: ${o.join(`, `)}`)}return!0}function y(e,t=``){let n=[];if(typeof e!=`object`||!e||Array.isArray(e))return n;for(let r in e)if(Object.prototype.hasOwnProperty.call(e,r)){let i=t?`${t}.${r}`:r,a=e[r];typeof a==`object`&&a&&!Array.isArray(a)?n.push(...y(a,i)):n.push(i)}return n}var b=(0,t.createContext)(null),x=`@gulibs/react-vintl:locale`;function S({resources:e,defaultLocale:r,supportedLocales:i,children:o}){if(!v(e)){let t=e&&typeof e==`object`&&Object.keys(e).length===0?`Invalid i18n resources: resources object is empty. Please configure the @gulibs/react-vintl plugin in your vite.config.ts to generate locale resources from your translation files.`:`Invalid i18n resources`;throw Error(t)}let s=i||Object.keys(e),c=r||s[0];if(!s.includes(c))throw Error(`Default locale "${c}" is not in supported locales: ${s.join(`, `)}`);let[l,u]=(0,t.useState)(()=>{if(typeof window>`u`)return c;try{let e=localStorage.getItem(x);if(e&&s.includes(e))return e}catch(e){a.warn(`Failed to read locale from localStorage:`,e)}return c}),d=e=>{if(!s.includes(e)){a.warn(`Locale "${e}" is not in supported locales: ${s.join(`, `)}`);return}if(u(e),typeof window<`u`)try{localStorage.setItem(x,e)}catch(e){a.warn(`Failed to save locale to localStorage:`,e)}};(0,t.useEffect)(()=>{if(typeof window>`u`)return;let e=e=>{if(e.key===x&&e.newValue){let t=e.newValue;s.includes(t)&&t!==l&&u(t)}};return window.addEventListener(`storage`,e),()=>{window.removeEventListener(`storage`,e)}},[s,l]);let f=(0,t.useMemo)(()=>_(e,l),[e,l]),p=(0,t.useMemo)(()=>({locale:l,supportedLocales:s,t:f,setLocale:d,resources:e}),[l,s,f,e]);return(0,n.jsx)(b.Provider,{value:p,children:o})}function C(){let e=(0,t.useContext)(b);if(!e)throw Error(`useI18nContext must be used within an I18nProvider`);return e}function w(e){let t=C();return e?(n,r)=>{let i=`${e}.${n}`;return t.t(i,r)}:t.t}function T(){let e=C();return{locale:e.locale,supportedLocales:e.supportedLocales,setLocale:e.setLocale,resources:e.resources}}function E(e,n){let r=w(),i=(0,t.useCallback)(t=>r(e,t||n),[r,e,n]);return{translation:(0,t.useCallback)(()=>r(e,n),[r,e,n])(),t:i}}function D(){let{locale:e,supportedLocales:n,setLocale:r}=T(),i=(0,t.useCallback)(e=>n.includes(e),[n]);return{locale:e,supportedLocales:n,setLocale:r,isSupportedLocale:i}}exports.I18nProvider=S,exports.Logger=i,exports.createTranslationFunction=_,exports.getNestedValue=o,exports.logger=a,exports.replaceParams=s,exports.useI18n=T,exports.useI18nContext=C,exports.useLocale=D,exports.useTranslation=w,exports.useTranslationKey=E,exports.validateResources=v;