i18n - 本地化 Node.js 应用 - CNode技术社区

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

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

以 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"),不会出错吗?为什么我的会报错?说()没有定义,看网上都只有这几个步骤,难道还需要别的配置吗?

回到顶部

AltStyle によって変換されたページ (->オリジナル) /