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',{
   ...
    });
});
  1. 我是否应该复制这条路线并添加例如语言环境 每个喜欢:

    app.get('/es/terms', function(req, res) {
        res.render('terms',{
        ...
         });
     });
    
  2. 或者应该这样做:

     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
    
  3. 或者我应该采用另一种方法来遵循良好做法或更好地遵守标准?

  4. 米罗的回答: 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.