从0到1教你写一个JS的多语言库

简介: 造这个轮子源于之前做的那个彩虹屁老婆插件,里面需要用到多语言切换。借这个由头,自己来实现一下。做之前其实对JS的多语言库没什么了解,做完之后倒是去比较了下vue-i18n。

选择多语言文本配置


vue-i18n的配置(图片来自百度)


1650848270(1).png


vue-i18n的配置(图片来自百度)


1650848299(1).png


大部分js的多语言库似乎都采用了json格式,可以很方便的转为对象解析,还可以分多级结构来组织配置内容。但是我个人感觉json格式对非技术人员(比如正经请个翻译的话)并不太友好。加上联想起过去做iOS开发多语言时的体验,我还是倾向于选择普通的文本格式,基本上完全照搬iOS里的.strings文件来做多语言配置。


1650848337(1).png


  • 这样的好处是,我们在代码里使用的时候就用常用语言写字符串即可。无论是代码的可读性,多语言配置文件编辑者的易用性都很高


//vue-i18n示例
$t("login.title")
//NSLocalizedString示例
NSLocalizedString("知道了")


代码时间


按行拆分数据

本例里是一个node环境,所以用fs来读取文件内容,然后赋值给data。如果要支持浏览器环境,可以用其他http框架api来读取文件内容。


const list = data.split("\n");


拆分变量名和值


在这里我使用了两个数组,一个用来存放读取所用的键名,一个用来存放对应的值。是不是可以扔到{}对象里呢?考虑到可能有一些特殊情况需要使用特殊字符来取值,为了保证这种特殊情况下的兼容性,所以尽量不要让key成为key


keys=[];
values=[];
for (var i = list.length - 1; i >= 0; i--) {
    var row=list[i];
    var key=row.split("=")[0].trim().match(/(?<=').*?(?=')/)[0];
    var value=row.split("=")[1].trim().match(/(?<=').*?(?=')/)[0];
    keys.push(key);
    values.push(value);
}


首先通过String的split方法,以=为分隔符拆分字符串为数组。然后trim裁剪掉两边的空格,给这样的配置结构增加一定的容错性。


以上步骤完成后,我们就可以通过values[keys.indexOf("键")]的方式来获取对应的多语言文本了。


拆解变量


在使用多语言时,我们可能会遇到这样的情况。“我有1个苹果”,其中数字部分是动态的,前后为固定不变的内容。当然我们可以使用A+变量+B的形式来组合,但这样未免有点麻烦,而且影响代码的可读性。


这个时候我们就需要另一种实现方式


localized("请选择{$1}文件","model.json")


也需要支持携带多个变量


localized("请选择{$1},{$2}文件","png","jpg")


这样用起来就非常简单,代码也十分好读。实现的核心就是先用正则将{$}结构全部提取出来,然后按照args的传递顺序依次替换


let dynamics=value.match(/{\$.*?}/g);
if(!dynamics)return value;
var dynamic_str = value;
for (var i = 0; i < dynamics.length; i++) {
    var d_item=dynamics[i];
    dynamic_str=dynamic_str.replace(d_item,`${args[i]}`);
}
return dynamic_str;


结语


自己手写一个多语言库不难,核心逻辑并不复杂。重点是在造轮子的过程中,去思考使用场景,多语言配置的提供者,有可能遇到哪些问题,什么样的配置能提升他们的工作效率。在代码层,api怎么设计更好用,代码可读性更好等等。


相关文章
|
3月前
|
JavaScript 前端开发 Python
用python执行js代码:PyExecJS库
文章讲述了如何使用PyExecJS库在Python环境中执行JavaScript代码,并提供了安装指南和示例代码。
128 1
用python执行js代码:PyExecJS库
|
25天前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
1月前
|
存储 JavaScript 前端开发
decimal.js库的安装和使用方法
【10月更文挑战第24天】decimal.js 是一个非常实用的高精度计算库,通过合理的安装和使用,可以在 JavaScript 中实现精确的数值计算和处理。你可以根据具体的需求和项目情况,灵活运用该库来解决数字精度丢失的问题。
|
2月前
|
JavaScript 前端开发 开发者
jQuery:JavaScript库的瑰宝
jQuery:JavaScript库的瑰宝
47 3
|
3月前
|
JavaScript 前端开发
常用的 JavaScript 框架和库
常用的 JavaScript 框架和库
132 6
|
2月前
|
JavaScript 前端开发 API
深入了解jQuery:快速、高效的JavaScript库
【10月更文挑战第11天深入了解jQuery:快速、高效的JavaScript库
19 0
|
3月前
|
移动开发 JavaScript 数据可视化
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 库
JavaScript 库
24 0
|
4月前
|
JavaScript 前端开发 数据可视化
图像裁剪库Cropper.js的学习使用
图像裁剪库Cropper.js的学习使用
62 4
|
4月前
|
JavaScript 前端开发 开发者
jQuery:JavaScript库的瑰宝
jQuery:JavaScript库的瑰宝
92 4