虽然觉得是自己经验不足导致的这个模块使用起来有点折腾,不过,还是记录下…
以 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
@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 啊咧… = = 抱歉我才发现。我去改一下。
@hankwang 其实,我只是想让自己的 blog app 有一个本地化的功能,并没想做到自动切换语言… 于是原来的方法也并无大碍。
我这会正在找更好的 markdown 语法高亮插件 :-) 编辑器光秃秃的好难看
@phoenixlzx 在模板里面直接用 : (“hello”),不会出错吗?为什么我的会报错?说()没有定义,看网上都只有这几个步骤,难道还需要别的配置吗?
@denghuiyan 同问。。。