一.前言
以前原生dom时代,没有三大框架的时候。做多语言设计,你能想到怎么做?
1、通过变量直接刷新页面
2、 无非是对页面的dom结构进行标记,然后在遍历替换。
现代单页应用,也可以用前者。
但是我们对体验有更高的要求
1、首先我们需要切换无刷感
2、可以实时注册增减多语言
3、不想应用顶层包裹一个多语言的容器
4、 可以在任意地方注册多语言并全局生效
借助响应式的理念,可以满足产品需求
二.响应式库介绍
@focbiz/loong是focbiz团队打造的一个响应式库,可用于构建现代web架构的全局数据流。
首先安装
npm i @focbiz/loong
然后定制代理对象
import {loong} from '@focbiz/loong';
const state=loong({count:0})
react组件内使用
import {useLoong} from '@focbiz/loong';
function Counter() {
const [data,setData] = useLoong(state);
return ( <div> {data.count}
<button onClick={() => {
setData({count:++data.count})}>+1}
</button>
</div> )}
三.基于响应式框架实现多语方案
有了loong一切都简单了。
1.首先定义多语言,语种标识要尽量参照于国际相关标准
export const companent = { 'zh-CN': {a: '你好'}, 'en-US': {a: 'hello'}, 'ja': {a:'亚麻'};
2.提供全局多语言对象locales,生成一个可以被监听loong对象。这里loong可以用其他库替换
import {loong} from '@focbiz/loong';
const locales= {};
export const localesHander = loong(locales);
3.提供消费的hooks,根据对象路径进行查找
期间要对传入的 token做必须得校验和查找。校验是必要的tokenstring格式,存在等。再根据 token作为对象路径查找
const useMessage=(key:tokenstring)=>{
const [data] = useLoong<typeof locales>(localesHander)
return data[nowLangKey][tokenstring]}
4.组件不做演示,组件就是使用hooks,封装一个基础的react组件即可
5.提供全局注册多语言的方法 mergeLocales方法就是对象的合并
export const registerLocales=(...packages: Locales[])=> {
packages.forEach((locales) => mergeLocales(locales, locales)})
}
6. 最后可以把这些方法挂着window上,可以实时查看以及注册调试等
四.结语
@focbiz/loong可以替换成其他的数据流方案,但是多语言的设计理念是相通的。在设计时要考虑是国际化还是本地化。
国际化往往是翻译即可,使用者能看懂。但是本地化还需要考虑当地的文化习俗,以及用户习惯,同时文字的翻译表达也应该更贴近当地人的日常。