有没有人知道一个例子或者可以在这里解释node.js和express如何为多语言站点路由?我正在使用i18n-node进行翻译,并使用路由器(/ es /,/ de /等)作为不同语言的文件夹。这一切都是静态路由,但我也有开头使用'app'的 apiRoutes.route('/ user / profile')等路线( app.get('/ app / user /个人资料')所以请在你的答案中考虑这个,所以不是必要的路线: app.get('/ es / app / user / profile')。
现在有15条这样的路线:app.get('/terms', function(req, res) {
res.render('terms',{
...
});
});
如何为以下路线设置:
app.get('/es/terms', function(req, res) {
res.render('terms',{
...
});
});
我应该复制此路由并添加例如的语言环境 每个人都喜欢:
app.get('/es/terms', function(req, res) {
res.render('terms',{
...
});
});
或者应该做类似的事情:
if cookie['lang'] && cookie['lang'] is in locales
// then redirect to /:lang/terms
else
// show default language in /terms
if req.headers["accept-language"] && req.headers["accept-language"]
// then redirect to /:lang/terms
else
//show default language in /terms
或者我还有另一种方法可以遵循良好做法或更好地遵守标准吗?
Miro的回答: How can I get the browser language in node.js (express.js)?说我应该使用app.all('*',...
这就是我需要的吗?,但是,它可能有语法错误或者我不太了解这两部分
var rxLocal = /^\/(de|en)/i;
...
app.get(/\/(de|en)\/login/i, routes.login);
提前致谢
答案 0 :(得分:3)
你需要考虑两件事:
HTTP protocole定义Accept-Language header来管理本地。这是一种标准化方法。您可以使用req.acceptsLanguages快递方法访问它。
您可以从路径中获取本地。在express中,它可以使用/:local/rest/of/path
之类的参数模式,并使用req.param方法在请求对象中进行检索。
您还可以使用req.cookies属性从Cookie中获取信息(不要忘记设置)。
为了增加用户体验,您可以混合使用这两种方法。例如,从浏览器发送的HTTP标头中获取默认语言,但允许用户在您的应用程序中覆盖它,并将此参数存储在cookie中。
获取本地的每种方法都可以以不同的方式使用。我会 在例子中使用它们随机但它们都是兼容的。
如果您使用模板引擎,您的控制器可以是本地不可知的。您可以使用middleware获取本地信息并配置渲染引擎。
app.use('/:local' (req, res, next) => {
let localKey = req.param('local');
res.locals = // Some ingenious method to get the locales from localKey
next();
}
检查res.locals和您的引擎文档。
如果本地是控制器进程的一部分。你可以直接得到控制器的价值。
如果您使用complexe方法确定本地的最终值,您还可以使用中间件来确定此值并使用它来丰富请求。
app.use((req, res, next) => {
let local = req.cookies.local;
if(!local) local = req.acceptsLanguages();
if(!local) local = 'en-US';
req.local = local;
}
您也可以使用这两种方法。这取决于你需要什么。找到获得可维护代码的最佳方法,并避免为您的用例复制。
当你使用中间女巫影响控制器时,请务必在路线前声明它们。
答案 1 :(得分:1)
您可以使用路由参数从URL获取区域设置,如下所示:
app.get('/:lang/terms', function (req, res) {
if (req.params === 'es') {
res.send('¡Hola!');
else {
res.send('Hi!');
}
});
冒号字符告诉Express在req.params.lang
中放置路径的第一个斜杠之间的任何内容。
有关详细信息,请参阅express routing documentation。