i18n - 本地化 Node.js 应用
发布于 11 年前 作者 phoenixlzx 23727 次浏览 最后一次编辑是 8 年前

虽然觉得是自己经验不足导致的这个模块使用起来有点折腾,不过,还是记录下…

以 express.js 应用为例,在 package.json 中添加 dependencies:

"i18n": "*"

app.js 中:

var express = require('express'),
    i18n = require('i18n');

i18n.configure({
    locales:['en-US', 'zh-CN', 'zh-TW'],  // setup some locales - other locales default to en_US silently
    defaultLocale: 'zh-CN',
    directory: './i18n',  // i18n 翻译文件目录,我的是 i18n, 可以写成其他的。
    updateFiles: false,
    indent: "\t",
    extension: '.js'  // 由于 JSON 不允许注释,所以用 js 会方便一点,也可以写成其他的,不过文件格式是 JSON
});

app.configure(function() {

    [...]

    // default: using 'accept-language' header to guess language settings
    app.use(i18n.init);

    [...]
});

路由控制:

app.get('/', function(req, res){
    var greeting = res.__('Hello');
});

EJS 模板:

<%= __('Hello') %>

i18n.configure 部分的 locales 里是可用语言列表,i18n 会在对应的 directory 下寻找以该语言命名的 json 文件(如果 extension 设置为其他的那么就会寻找对应后缀名的文件)。

例如 defaultLocale 设置为 zh-CN,i18n目录下的 zh-CN.js 文件内容为:

{
    "Hello": "Hello, world!"
}

那么上文中的 res.__('Hello')<%= __('Hello') %> 将返回 Hello, world!

简单吧?更详细的文档在 npmjs 上可以找到。

另外还有一个模块是 Mozilla 的,叫做 i18n-abide。一开始我也试了这个不过估计我能力还不够… gettext() 总是报错未定义 QAQ

8 回复

@phoenixlzx 你這樣寫的話, 應該會永遠是zh_CN吧?

因為 request.headers['accept-language']回傳的是:

[ 'en', 'en-US', 'zh-TW', 'zh', 'zh-CN' ]

如果要通过 accept-language 来判定使用的语言,那么就不用写 defaultLocale 了。

我这里是我写的 app 在配置文件里有默认语言的选项,我就给写上去了。

@phoenixlzx defaultLocale 是如果找不到其他語言, 才會默認為 defaultLocale

但是你設置 [‘en_US’, ‘zh_CN’, ‘zh_TW’], 所以沒一個找的到, 永遠會是zh_CN

@hankwang 啊咧… = = 抱歉我才发现。我去改一下。

@phoenixlzx 剛好今天也用到, 正在研究它的原碼 : )

而且 [‘zh-CN’, ‘zh-TW’] 會只被判定成 zh, 所以還是會跑去defaultLocale

所以我也正在想解決辦法

@hankwang 其实,我只是想让自己的 blog app 有一个本地化的功能,并没想做到自动切换语言… 于是原来的方法也并无大碍。

我这会正在找更好的 markdown 语法高亮插件 :-) 编辑器光秃秃的好难看

@phoenixlzx 在模板里面直接用 : (“hello”),不会出错吗?为什么我的会报错?说()没有定义,看网上都只有这几个步骤,难道还需要别的配置吗?

回到顶部