「 功能点 」国际化的一些思考和注意事项

从后端国际化转向了使用vue-i18n前端国际化,不再会出现因为资源缺失导致的service error了,近期又全面整理了下国际化中踩过的坑,分享给大家。

和翻译同学的合作

翻译同学一般使用 https://crowdin.com 来提交翻译,在crowdin提交之后会有脚本定时提交到gitlab的语言资源项目中,开发同学可以通过脚本将语言资源copy到自己的实际项目中,但是要注意需要等翻译100%完成时才进行copy,不然会混杂着未翻译的文案给用户造成困扰。

和翻译同学合作需要注意以下几点:

1.注意尽量不要使用拼接的字符串

比如:

tips=请同意隐私政策和用户协议

千万不要因为用户协议和隐私政策需要在多处用到,就将字符串切分为多个:

agreement=用户协议

privacy=隐私政策

notice=请同意

and=和

这样翻译同学会和莫名其妙,而且不同语言因为语序不一样,我们生硬的组合起来,展示在网页上的整句话会完全不可读。

2.注意单复数的处理

left_times=您还能发送{n}条短信

在其他语言中会有单复数的区分,1 message left,2 messages left。 在阿语中单复数的表达甚至有多达6种。 Android的resource是使用xml,处理单复数如下

1
2
3
4
<plurals name="watch_face_count">
<item quantity="one">%1$d个手盘</item>
<item quantity="other">%1$d个手盘</item>
</plurals>

Web中暂时没有比较好的处理方法

3.需要注意日期,金额等格式差异的处理

比如在中文中通常是年月日格式:2019-05-13,英语中日期格式是日月年 13-05-2019

4.需要注意rtl语言的特殊ui处理

有很多语言,比如iw_IL,ar等语言习惯都是从左到右的书写习惯,此时除了需要加上 body{direction:rtl}

其他的布局也需要注意将left和right互换。

5.需要注意语言中单双引号的处理

英语en_US,法语fr_FR,意大利语it_IT有单引号,iw_IL希伯来语中有双引号作为字符。

如果出现在js的字符串中,导致语法错误,程序直接无法运行,此时我们需要用上转义字符来避免问题。

写个脚本统一将单双引号进行html转译

Character 转义后
' &#39;(因为 &apos; 不兼容IE所以使用这个)
" &quot;

6.需要注意某些语言过长的处理

有些语言,比如 mr_IR 一个单词就非常长,所以一点要做好超长的样式处理,能够做到自适应布局。

对外提供页面原则

国际化的实现通常有两种方案:

1.将每个语言打包成一个页面(index-en_US.html,index-fr_FR.html)

  • 通常使用在对于性能和白屏时间有要求的网站首页,采用后端渲染根据对应的语言去加载
  • 或者每个语言的差异比较大,不能通过模版语法简单的key-value对应上

2.同一个页面,根据_locale参数或cookie加载不同的语言包(en_US.json,fr_FR.json)

无论使用哪种方式,因为我们对外提供的页面需要被别的页面引用,不应该让每个引用的页面来处理语言和页面对应逻辑,即不应该直接提供zh_CN.html,en_US.html这样的路径,而应该提供一个中间页面index.html,有的locale并不能自动对应locale.html,需要作为页面提供者的我们根据参数_locale=${locale}或者cookie来自动跳转对应的语言版本统一处理。

vue-i18n使用

Vue-i18n 文档 已经很清楚而且现在也有翻译了,不再赘述,需要注意使用webpack延迟加载而不是直接加载全部。

一般情况下都是前端来维护国际化的资源文件,确实是一件费时费力枯燥无味的工作,但是在工作中切忌眼高手低,分配到你的工作一定要做好。随着业务发展,需要支持的语言的种类越来越多,为了方便维护,最开始就要考虑好上面的问题的解决方案。

Eva wechat
关注Eva的意如小馆,更方便的与我交流