2013-10-23 47 views
1

我的代码:本地化的NodeJS(国际化)

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. 但不切换语言

/* ----- */

生成的代码:

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

这工作

回答

3

在你的模板,假设你使用JADE,你必须拥有#{},比如#{__("Your key")}

我不明白你的第二个问题,头脑改写了吗?

不管怎么说,如果你从一个控制器想用国际化,你必须做到:res.render('index', {name: res.i18n.__('name') });


当切换您必须将语言:
1-保存用户偏好的任何地方(会话或饼干,例如)在每个请求

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); 
+0

解决了第一个错误,代码中出现错误 – hase

+0

但是不要切换语言,切换如下:app.get('/:locale',function(req,res){ res.cookie 'locale',req.params.locale); i18n.setLocale(req.params.locale); res.redirect('/'); }); – hase

+0

检查我的编辑!添加一些示例代码,让我知道如果你明白,清除 – renatoargh

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