UNPKG

@voerkai18n/react

Version:

React支持,提供语言切换等功能

6 lines 2.32 kB
import {useState,useRef,useCallback,createElement,useEffect}from'react';import {loadAsyncModule}from'@voerkai18n/runtime';import {jsx,Fragment}from'react/jsx-runtime';/*** * ---=== VoerkaI18n for React ===--- * https://zhangfisher.github.io/voerka-i18n */ function Q(t){let{tagName:n,attrs:e={},class:l="vt-msg",style:i,loading:c}=Object.assign({},t),r=!!c;return function(a){return u=>{let{id:g,message:o,vars:d,options:m,default:P=""}=u,f=typeof g=="string"&&g.length>0,[y,k]=useState(()=>f?u.children:typeof o=="function"?P:a.translate(o,d,m)),I=useRef(false),[b,V]=useState(false),h=u.tag||n,C=a.getMessageId(u.message),S=f||typeof o=="function",x=useCallback(async s=>{let p=typeof o=="function"?()=>o(s,d,m):()=>o;return Promise.resolve(p()).then(O=>{k(a.translate(O,d,m));})},[o,d,m]),M=async()=>{if(g){let s=a.activeParagraphs[g];if(!s)return;r&&V(true);try{let p=await loadAsyncModule(s);k(p);}catch(p){console.error(p);}finally{r&&V(false);}}},R=useCallback(s=>{f?M():x(s);},[]);return !I.current&&(typeof o=="function"||f)&&(R(a.activeLanguage),I.current=true),useEffect(()=>{let s=a.on("change",R);return ()=>s.off()},[]),C&&(e["data-id"]=C),g&&(e["data-id"]=g),a.library&&(e["data-scope"]=String(a.$id)),h||f?createElement(h||"div",{...e,className:l,suppressHydrationWarning:true,style:Object.assign({position:"relative"},i,u.style)},y,S&&r&&b?c:null):jsx(Fragment,{children:y})}}}function L(t){let n=globalThis.VoerkaI18n,e=t||n.scope;if(!n||!e)throw new Error("VoerkaI18n is not defined");let[l,i]=useState(e.activeLanguage),c=useRef(true);return useEffect(()=>{c.current&&(e.ready(()=>{i(e.activeLanguage);}),c.current=false);let r=n.on("change",a=>{i(a);});return ()=>r&&r.off()},[]),{scope:e,manager:n,activeLanguage:l,defaultLanguage:e.defaultLanguage,languages:e.languages,changeLanguage:e.change.bind(e),t:e.t}}function q(t){return t.activeLanguage===t.defaultLanguage||typeof t.scope.messages[t.activeLanguage]!="function"}function te(t){let{fallback:n,children:e}=t,{manager:l}=L(),[i,c]=useState(q(l));return useEffect(()=>{let r=l.on("ready",()=>{c(true);});return ()=>{typeof r=="object"&&r.off();}},[]),jsx(Fragment,{children:i||!i&&!n?e:n})}export{te as VoerkaI18nProvider,Q as createTranslateComponent,L as useVoerkaI18n};//# sourceMappingURL=index.mjs.map //# sourceMappingURL=index.mjs.map