【发布时间】:2014-06-13 21:51:31
【问题描述】:
我是 Node 新手,但我想我会立即开始将 PHP 应用程序转换为 Node/Express。这是一个双语应用程序,使用gettext 和 PO/MO 文件。我找到了一个名为 node-gettext 的 Node 模块。我现在不想将 PO 文件转换成另一种格式,所以看来这个库是我唯一的选择。
所以我现在担心的是,在每个页面呈现之前,我正在做这样的事情:
exports.home_index = function(req, res)
{
var gettext = require('node-gettext'),
gt = new gettext();
var fs = require('fs');
gt.textdomain('de');
var fileContents = fs.readFileSync('./locale/de.mo');
gt.addTextdomain('de', fileContents);
res.render(
'home/index.ejs',
{ gt: gt }
);
};
我也将在类中使用翻译,所以现在的设置方式我每次想在另一个地方翻译某些东西时都必须重新加载整个翻译文件。
翻译文件大约 50k,我真的不喜欢在每次页面加载时都进行这样的文件操作。在 Node/Express 中,处理这个问题的最有效方法是什么(除了数据库)?通常用户在第一次之后甚至不会更改他们的语言(如果他们从英语更改它)。
编辑:
好的,我不知道这是否是一个好方法,但它至少可以让我在应用程序的其他部分重复使用翻译文件,而无需在需要获取翻译文本的任何地方重新加载它。
在 app.js 中:
var express = require('express'),
app = express(),
...
gettext = require('node-gettext'),
gt = new gettext();
然后,同样在 app.js 中,我创建变量 app.locals.gt 以包含 gettext/translation 对象,并包含我的中间件函数:
app.locals.gt = gt;
app.use(locale());
在我的中间件文件中,我有这个:
模组
module.exports = function locale()
{
return function(req, res, next)
{
// do stuff here to populate lang variable
var fs = require('fs');
req.app.locals.gt.textdomain(lang);
var fileContents = fs.readFileSync('./locales/' + lang + '.mo');
req.app.locals.gt.addTextdomain(lang, fileContents);
next();
};
};
将加载的翻译文件分配给app 似乎不是一个好主意,因为根据当前请求,该文件将是两种语言之一。如果我将加载的翻译文件分配给 app 而不是请求变量,那会混淆用户的语言吗?
无论如何,我知道必须有更好的方法来做到这一点。
【问题讨论】:
-
如果你不想每次都加载它,你必须有某种缓存或全局变量。您可能会查看一些数据缓存库。