从零开始的前端 i18n
0. 零
internationalization, 抛去首尾是 18 个字母。
1. 实现的基础
在后端做 i18n 时一般是通过检查 HTTP 头 Accept-Language
来判断语言的。(也有加 IP 判断什么的那种)
前端没法读到这个请求头,而是通过 navigator.language
返回一个首选语言,此外还有 navigator.languages
(实验性)提供如 Accept-Language
那样的语言优先顺序列表。
当然,如果已经习惯了各家浏览器对 W3C 标准的差异实现的话,对下面的内容应该不奇怪:
IE<=10 是
navigator.browserLanguage
和navigator.userLanguage
。userLanguage
是系统语言,Internet 选项
仅对Accept-Language
有效。IE<10 和 Safari<10.2 的语言代码没有按 IETF 语言标签规范,是全小写的。
2. 打包工具 / 前端框架可以做哪些事
已经有一份比较详细的说明了,直接甩链接:
https://github.com/CommanderXL/D-i18n
3. 前端 i18n 与 SEO
目前搜索引擎对 JS 动态生成的内容基本不怎么支持(Google 说它们的 bot 支持一部分 JS 也只是处理跳转)。
要是真看重这些的话,还是分站的比较好(在 url param 里放语言标识符效果也不好)。
4. 还有很多要做,比如 l10n
文本替换只是第一步,能正确显示出来是第二步。CJK 文本和拉丁文本在显示位置、字体 hinting 等等都还要处理。
这还没提到 RTL(right-to-left) 的阿拉伯语、希伯来语等,这种即使文字能正确从右至左显示,在展现方式等方面调整几乎无异于重新设计了。
internationalization 离 localization 还是有点距离的啊。
本文参考了:
[1] https://developer.mozilla.org/zh-CN/docs/Web/API/NavigatorLanguage/language