0. 零

internationalization, 抛去首尾是 18 个字母。

1. 实现的基础

在后端做 i18n 时一般是通过检查 HTTP 头 Accept-Language 来判断语言的。(也有加 IP 判断什么的那种)

前端没法读到这个请求头,而是通过 navigator.language 返回一个首选语言,此外还有 navigator.languages(实验性)提供如 Accept-Language 那样的语言优先顺序列表。

当然,如果已经习惯了各家浏览器对 W3C 标准的差异实现的话,对下面的内容应该不奇怪:

  1. IE<=10 是 navigator.browserLanguagenavigator.userLanguageuserLanguage 是系统语言,Internet 选项 仅对 Accept-Language 有效。

  2. 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