常见的国际化方式
官方方案
官方链接,其实官方的解决方案最大的问题就是麻烦,主要体现在以下几个方面
强依赖目录结构
由于gulp.js里是按照此目录结构进行处理的,如果要维持自定义目录需要修改glup文件,如下图
特别好笑的一点官方示例里居然不是这个目录结构,不过依然是强依赖目录结构,因为gulp中路径是写死的
文档简陋
通过官方文档快速入门居然无法搭建起项目,暂时只用这种方式搭建起来了 官方github demo,通过对比发现好多必要代码都没有在文档中说明。
比如需要在app.js中开始便需要执行getI18nInstance()
,否则全局都无法正常国际化。这么重要的信息居然在快速入门中没有说明
调试麻烦
每次修改代码都要重新执行npm run build
,注意是每次。
由于国际化必须通过npm run build
来实现,而每次npm run build
过后dist文件就会被覆盖,所以每次只能修改src,而小程序预览的却是dist文件,这也就导致必须频繁的执行build命令。下面演示一下增加一个表头的操作步骤
说下优点
代码简洁。解释一下,从上图可以看到,他的书写方式和其他主流框架的国际化书写方式很类似(vue,react)。view层都是类似t(key,参数)
,对js侵入也很小,下面是上图页面对应的js部分。
可以说除了I18nPage
以外没有别的侵入,剩下那些代码都是用于切换语言所需,如果只是最简单国际化,只需要I18nPage({})
即可
聊一下为什每次都需build
其实咱们看下dist/i18n/locales.wxs文件即可
其实搞这么麻烦构建方式主要是为了生成这个wxs文件,我们之所以能在vue中看到{{t('key')}}
的方式进行国际化,是因为wxml层本身支持函数调用且函数可以调用外部资源(国际化文件),而小程序只允许通过wxs(官方文档)的方式在页面使用函数,出于性能考虑又不允许wxs引用任何外部资源(除了其他的wxs),所以这个build最核心的诉求是把 国际化文件copy一份到wxs文件中。下面是wxs无法引用外部资源的官方说明
优化
我们国际化的核心诉求就是解决官方国际化问题同时保留他的优点,这里我们列下此次的目标
- 路径灵活,不强依赖路径减少后期添加国际化的路径改动成本
- 调试方便,和原始开发调试方式相同
- 书写简洁,保持和vue一样的书写方式
先来看下效果
wxml代码
js代码
基本维持和官方相同的写法,尽可能少的代码写入
代码段链接
解决思路
利用behaviors(官方文档)将国际化文案进行引入每个页面。然后将所有国际化数据和key值以参数的形式传递给wxs函数,这样就可以避开wxs外部资源限制实现和vue i18n相同的效果。
- behaviors负责将国际化方法和文案导入全局,以下是behaviors/i18n.js源码:
- wxs负责为wxml层提供国际化方法,此处逻辑比较简单,先找到国际化文件中key值对应的语句,然后根据第二参数(arr)将变量进行替换,此处替换逻辑比较粗暴,使用
{key}
方式代表变量。如:"我的年龄是{age}
",age代表变量,参数传递格式为[{key:'xxx',value:'xxxx'}]
wxs源码如下:
同时提供一个在js里获取国际化的util方法
这样就基本实现了同时在wxml,js中进行国际化的基本需求,同时也解决了官方调试体验不足的缺点。
不足
-
其实调试体验还不是那么完美,由于只有在show中初始化国际化文件内容,所以当开启“热重载”时对国际化文件进行修改,国际化内容不会自动进行更新
-
每个page的js文件都需要引入behaviors/i18n.js,wxml文件引入
<wxs src="../wxs/i18n.wxs" module="i18n" />
有些略显繁琐 -
require('../i18n/xxx')
整个项目引入了3遍略显繁琐,可以封装一下 -
i18n.t(locales['key'])
其中locals每次都要写一遍比较繁琐,不过由于wxs的限制也想不到太好的方法
使用建议
由于只是写一个demo很多逻辑并没有写完整,所以如果使用的话需要根据项目进行修改
-
如果i18n路径和命名方式不同需要同时修改behaviors/i18n.js,以及utils/index.js中的路径
-
现在每次刷新页面国际化都会被重置成中文,建议在behaviors/i18n.js的show方法中从全局获取当前的国际化语言。这样就不会每次都被重置成中文了。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!