Node express api 多语言目录的路由,如 url
Node express api routes for multilingual directory like url
有没有人知道一个例子或者可以在这里解释 node.js 和 express 如何路由多语言站点?我正在使用 i18n-node 进行翻译,并使用不同语言的路由(/es/、/de/ 等)文件夹。这都是静态路由,但我也有像 apiRoutes.route('/user/profile') 这样的路由,开头使用 'app'( app.get('/app/user/profile') 所以请在你的回答中考虑这一点,所以不是通往 : app.get('/es/应用/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
或者我应该采用另一种方法来遵循良好做法或更好地遵守标准?
米罗的回答:
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);
提前致谢
您可以使用路由参数从 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。
您需要考虑两件事:
1。如何获取本地:
Accept-Language
HTTP 协议定义了 express 的 Accept-Language header to manage the local. This is a normalized method. You can access it with the req.acceptsLanguages 方法。
- +归一化
- +浏览器原生支持
- -不容易被最终用户绕过
路径/Cookies
您可以从路径中获取本地。在 express 中,它可以使用 /:local/rest/of/path
之类的参数模式,并使用 req.param 方法在请求 object 中检索。
您还可以从具有 req.cookies 属性的 cookie 中获取信息(不要忘记设置它)。
两者都
要增加用户体验,您可以混合使用这两种方法。例如,从浏览器发送的 HTTP header 中获取默认语言,但允许用户在您的应用程序中覆盖它并将该参数存储在 cookie 中。
2。使用本地:
Each methods to get the local can be used from different way. I will
use random of them in exemple but they are all compatible.
顶级配置。
如果您使用模板引擎并且您的控制器可以是本地不可知的。您可以使用 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 和您的引擎文档。
在控制器中使用它。
如果本地是控制器进程的一部分。可以直接获取控制器中的is值。
如果你使用复杂的方法来确定本地的最终值,你也可以使用中间件来确定这个值并用它来丰富请求。
app.use((req, res, next) => {
let local = req.cookies.local;
if(!local) local = req.acceptsLanguages();
if(!local) local = 'en-US';
req.local = local;
}
两者都
你也可以同时使用这两种方法。这取决于你需要什么。找到获得可维护代码的最佳方法并避免重复使用您的用例。
When you use middle where witch impact the controllers, be sure you declare them before your routes.
有没有人知道一个例子或者可以在这里解释 node.js 和 express 如何路由多语言站点?我正在使用 i18n-node 进行翻译,并使用不同语言的路由(/es/、/de/ 等)文件夹。这都是静态路由,但我也有像 apiRoutes.route('/user/profile') 这样的路由,开头使用 'app'( app.get('/app/user/profile') 所以请在你的回答中考虑这一点,所以不是通往 : app.get('/es/应用/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
或者我应该采用另一种方法来遵循良好做法或更好地遵守标准?
米罗的回答: 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);
提前致谢
您可以使用路由参数从 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。
您需要考虑两件事:
1。如何获取本地:
Accept-Language
HTTP 协议定义了 express 的 Accept-Language header to manage the local. This is a normalized method. You can access it with the req.acceptsLanguages 方法。
- +归一化
- +浏览器原生支持
- -不容易被最终用户绕过
路径/Cookies
您可以从路径中获取本地。在 express 中,它可以使用 /:local/rest/of/path
之类的参数模式,并使用 req.param 方法在请求 object 中检索。
您还可以从具有 req.cookies 属性的 cookie 中获取信息(不要忘记设置它)。
两者都
要增加用户体验,您可以混合使用这两种方法。例如,从浏览器发送的 HTTP header 中获取默认语言,但允许用户在您的应用程序中覆盖它并将该参数存储在 cookie 中。
2。使用本地:
Each methods to get the local can be used from different way. I will use random of them in exemple but they are all compatible.
顶级配置。
如果您使用模板引擎并且您的控制器可以是本地不可知的。您可以使用 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 和您的引擎文档。
在控制器中使用它。
如果本地是控制器进程的一部分。可以直接获取控制器中的is值。
如果你使用复杂的方法来确定本地的最终值,你也可以使用中间件来确定这个值并用它来丰富请求。
app.use((req, res, next) => {
let local = req.cookies.local;
if(!local) local = req.acceptsLanguages();
if(!local) local = 'en-US';
req.local = local;
}
两者都
你也可以同时使用这两种方法。这取决于你需要什么。找到获得可维护代码的最佳方法并避免重复使用您的用例。
When you use middle where witch impact the controllers, be sure you declare them before your routes.