本地化nodejs(i18n)

时间:2013-10-23 10:36:16

标签: node.js localization

我的代码:

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('/'); 
});

问题是两个:

  1. 在模板中无法通过

    输出

    __(“名称密钥”)

  2. 如果传输不直接通过值,请勿更改文本。有所有语言文件

    res.render('index',{name:res .__('name')});

  3. 但请勿切换语言

  4. / * ----- * /

    结果代码:

    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("/");
    });
    

    这有效

2 个答案:

答案 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(),但您可以对此值进行硬编码,以便在服务器重新启动时保持持久性。