2013-10-23 63 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(),但您可以對此值進行硬編碼以便在服務器重新啓動時保持持久性。