2013-10-23 3 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. 전송이 값을 통해 직접 전달되지 않으면 텍스트를 변경하지 마십시오. 모든 언어 파일이 있습니다.

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

  2. 그러나 전환되지 않는 언어

/* ----- */

결과 코드 :

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를 사용하는 가정

두 번째 질문을 이해하지 못했습니다.

어쨌든, 당신은 컨트롤러에서 싶어 사용 국제화, 당신이해야 할 경우 :


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

당신이해야 언어 전환 할 때 (예를 들어, 세션이나 쿠키) 어디에서나 사용자 환경 설정 저장
1-

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); 
:

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- (간단히 미들웨어를 사용하는) 모든 요청에 ​​변경을 다시 적용

+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을 설정했습니다. 어떤 이유로 docs가 기본값을 명시한다고해도 이것이 필요했습니다.

또한 secret: uuid.v4()을 사용하고 있지만 서버 재시작시 지속성을 위해이 값을 하드 코딩 할 수 있습니다.