2

My code:

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

The problems are two:

  1. In template does not work output through

    __("Name Key")

  2. When the transfer is not directly through value, do not change text. There are all languages files

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

  3. But do not switch languages​​</p>

/* ----- */

The resulting code:

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

This works

4

2 回答 2

4

在您的模板中,假设您使用的是 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);
于 2013-10-23T10:42:25.133 回答
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(),但您可以硬编码此值以在服务器重新启动时保持持久性。

于 2013-12-01T18:06:08.063 回答