const languageList = [ { lang : "en", name : "English", }, { lang : "zh-CN", name : "简体中文", }, { lang : "zh-TC", name : "繁體中文", }, ]; export const Test_Reaxel_i18n = reaxper( class extends Reaxlass { render() { const {changeLang,I18n,language,languageList} = reaxel_i18n(); return <>

By stakeholders, for stakeholders.

We bring DAOs and Stakeholders together.

; } } ); export const reaxel_i18n = function(){ const {store,setState} = orzMobx( { lang : "en" , } ); /*已经加载好的i18n文件*/ const loadedLangMap = {}; /*维护一个加载lang-json的列表,惰性加载*/ const asyncLangMap = { "zh-CN" : () => import('./lang_zh-CN.json'), /*模拟测试: 当异步加载一个语言包很慢时,实现了先渲染上一次语言的缓存(防止空白),待加载lang-json成功后再渲染*/ "zh-TC": () => { return orzPromise((resolve) => { setTimeout( () => { import('./lang_zh-TC.json').then( ( module ) => { resolve( module ); } ); } , 2500 ); }) }, }; const asyncLangLoader = () => { if(store.lang === 'en') return ; if(!loadedLangMap[store.lang]){ return asyncLangMap[ store.lang ](). then( ( module ) => { const json = module.default; loadedLangMap[ store.lang ] = json; } ); } } const I18n = reaxper((props:React.PropsWithChildren<{}>):React.ReactElement => { [store.lang]; const children = props.children as React.ReactText; const forceUpdate = utils.useforceUpdate(); const prevRef = useRef(); useEffect( () => { asyncLangLoader()?.then?.(() => { forceUpdate(); }); } ,[store.lang]); /*暂时不要移除,监测组件是否被不正常地卸载*/ useEffect(() => { console.log( 'mounted' ); return () => console.log( 'unmounted' ); },[]) if(store.lang === 'en') { prevRef.current = children; return <>{children} ; }; if(!loadedLangMap[store.lang]){ return <>{ prevRef.current }; }else { prevRef.current = loadedLangMap[store.lang][children]; return <>{loadedLangMap[store.lang][children]}; } }); return () => { return { /*返回语言列表*/ get languageList (){ return languageList; }, /*返回当前使用的语言缩写*/ get language(){ return store.lang; }, /*修改语言方法,会重新渲染所有使用了此闭包内I18n的组件*/ changeLang : ( lang : string ) => { setState( {lang} ); }, /*I18n组件,children直接放英语自然文本.*/ I18n , } } }();