1

我正在玩 Node.js,我想知道我正在做的事情是否可以被认为是最佳实践,我还有很多东西要学。

我正在尝试通过创建更多 JSON 文件来实现多语言布局,然后根据 http 标头(语言)加载这些文件。我正在做的是这样的:

exports.index = function(req, res){
try {
    var words = require('../languages/' + req.headers["accept-language"].substr(0, 2).toLowerCase());
} catch(err) {
    console.log("no language found - falling back to english");
    var words = require('../languages/en');
}

res.render('index', { language: words });
};

现在,我很确定那里有问题。因为我认为要求应该只做一次,而且我在每个请求中都要求它。但是,我想不出任何其他方式,因为我需要访问请求标头中的语言。

有任何想法吗?

提前致谢。

4

2 回答 2

1

对于国际化,我强烈推荐 i18n。

i18n节点

于 2012-09-14T14:08:17.650 回答
1

您需要两个不同的文件。所以我不确定你为什么认为你在重复自己。

最终,您应该将语言文件转换为位于本地 node_modules 文件夹或您的应用程序使用的同一 node_modules 中的实际模块。

这样你就可以像这样要求你的语言模块。

var language = require('language');

在你的语言模块里面应该有一个索引文件和 lib 目录。

index.js

exports.en= require('./lib/en'),
exports.fr= require('./lib/fr'),
exports.de= require('./lib/de'),

然后你就可以像这样使用你的模块了。

exports.index = function(req, res){

  language = require('language');

try {

    var words = language[req.headers["accept-language"].substr(0, 2).toLowerCase()]();
} catch(err) {
    console.log("no language found - falling back to english");
    var words = language.en();
}

res.render('index', { language: words });
};

用这个替换上面的。

exports.index = function(req, res){

    var language = require('language');
        supported_languages = ['en', 'fr' , 'de'],
        accept_language = req.headers["accept-language"].substr(0, 2).toLowerCase();

    if(supported_languages.indexOf(accept_language) !== -1){

        var words = language[accept_language]();

    }else {
        console.log("no language found - falling back to english");
        var words = language.en();
    }

    res.render('index', { language: words });    
};
于 2012-09-14T15:30:32.847 回答