我的代码:
var i18n = require("i18n");
i18n.configure({
locales: ['en', 'ru'],
defaultLocale: 'en',
directory: __dirname + '/locales',
cookiename: 'locale'
});
app.configure(function () {
app.use(i18n.init);
})
app.get('/:locale', function (req, res) {
res.cookie('locale', req.params.locale);
i18n.setLocale(req.params.locale);
res.redirect('/');
});
问题是两个:
在模板中无法通过
输出__(“名称密钥”)
如果传输不直接通过值,请勿更改文本。有所有语言文件
res.render('index',{name:res .__('name')});
但请勿切换语言
/ * ----- * /
结果代码:
var i18n = require("i18n");
i18n.configure({
locales: ['en', 'ru'],
defaultLocale: 'ru',
directory: __dirname + '/locales'//,
cookiename: 'locale'
});
app.use(function (req, res, next) {
res.locals.__ = res.__ = function() {
return i18n.__.apply(req, arguments);
};
next();
});
app.get('/i18n/:locale', function (req, res) {
res.cookie('locale', req.params.locale);
i18n.setLocale(req.params.locale);
if (req.headers.referer) res.redirect(req.headers.referer);
else res.redirect("/");
});
这有效
答案 0 :(得分:3)
在模板中,假设您使用的是JADE,则必须使用#{}
,例如#{__("Your key")}
我不明白你的第二个问题,记住改编?
无论如何,如果你想从控制器使用i18n,你必须这样做:res.render('index', {name: res.i18n.__('name') });
切换语言时,您必须:
1-在任何地方保存用户偏好(例如,会话或cookie)
app.get("/i18n/:locale", setLocale);
function setLocale(req, res, next){
req.session.locale = req.params.locale;
if(req.headers.referer) res.redirect(req.headers.referer);
else res.redirect("/");
}
2-在每次请求时重新应用此更改(只需使用中间件):
var app = require("express")();
app.use(function(req, res, next){
if(req.session.locale) //check if user has changed i18n settings
req.i18n.setLocale(req.session.locale);
})
app.get("/", function(req, res, next){
res.render('index', {name: res.i18n.__('name') });
});
app.listen(8000);
答案 1 :(得分:1)
根据@renatoargh的回答,我不得不做一些修改,但这里有一个似乎让事情适合我的最后一块。
// configure i18n
i18n.configure({
locales : [
'en',
'zh'
],
directory : __dirname + '/locales'
});
// configure app
app.configure(function () {
// initialize session support
app.use(express.cookieParser());
app.use(express.cookieSession({secret: uuid.v4()}));
// initialize i18n
app.use(i18n.init);
// set locale (on every request), if session locale exists
// otherwise use default browser setting
app.use(function (req, res, next) {
// check if user has changed i18n settings
if (req.session.locale) {
i18n.setLocale(req, req.session.locale);
}
next();
});
});
// allow MANUAL locale selection
app.get("/i18n/:locale", function (req, res) {
req.session.locale = req.params.locale;
// go back to referrer OR root (/)
res.redirect('back');
});
在配置中 注意,我设置了directory
。出于某种原因,这是必要的,即使文档声明它是默认值。
另请注意,我正在使用secret: uuid.v4()
,但您可以对此值进行硬编码,以便在服务器重新启动时保持持久性。