0

有谁知道一个例子或可以在这里解释 node.js 和 express 如何为多语言站点路由?我正在使用 i18n-node 进行翻译和文件夹,如路由( /es/、/de/ 等)用于不同语言。这都是静态路由,但我也有像apiRoutes.route('/user/profile')这样的路由在开头使用 'app' (app.get('/app/user/profile')所以请在你的回答中考虑这一点所以不是必要的路线: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',{
   ...
    });
});
  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. Miro 的回答: 如何在 node.js (express.js) 中获取浏览器语言?说我应该使用 app.all('*', ...

这就是我所需要的吗?,..仍然,它可能有语法错误,或者我对这两部分不太了解

    var rxLocal = /^\/(de|en)/i;
    ...
    app.get(/\/(de|en)\/login/i, routes.login);

提前致谢

4

2 回答 2

3

你需要考虑两件事:

1.如何获取本地:

接受语言

HTTP 协议定义了Accept-Language 标头来管理本地。这是一种标准化的方法。您可以使用 express 的req.acceptsLanguages方法访问它。

  • +标准化
  • +浏览器原生支持
  • - 不容易被最终用户绕过

路径/饼干

您可以从路径中获取本地信息。在 express 中,它可以使用参数模式来完成,并使用req.param方法/:local/rest/of/path在请求对象中检索。

您还可以使用req.cookies属性从 cookie 中获取信息(不要忘记设置它)。

两个都

为了增加用户体验,您可以混合使用这两种方法。例如,从浏览器发送的 HTTP 标头中获取默认语言,但允许用户在您的应用程序中覆盖它并将此参数存储在 cookie 中。

2.使用本地:

每种获取本地的方法都可以从不同的方式使用。我将随机使用它们作为示例,但它们都是兼容的。

顶级配置。

如果您使用模板引擎并且您的控制器可以与本地无关。您可以使用中间件获取本地信息并配置渲染引擎。

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和您的引擎文档。

在控制器中使用它。

如果本地是控制器进程的一部分。您可以直接获取控制器中的值。

如果您使用复杂的方法来确定本地的最终值,您还可以使用中间件来确定该值并用它来丰富请求。

app.use((req, res, next) => {
  let local = req.cookies.local;
  if(!local) local = req.acceptsLanguages();
  if(!local) local = 'en-US';
  req.local = local;
}

两个都

您也可以同时使用这两种方法。这取决于你需要什么。找到获得可维护代码并避免复制您的用例的最佳方法。

当您使用女巫影响控制器的中间位置时,请确保在您的路线之前声明它们。

于 2017-10-17T14:45:34.560 回答
1

您可以使用路由参数从 URL 获取语言环境,如下所示:

app.get('/:lang/terms', function (req, res) {
    if (req.params === 'es') {
        res.send('¡Hola!');
    else {
        res.send('Hi!');
    }
});

冒号字符告诉 Express 将路径的第一个到斜杠之间的任何内容放入req.params.lang. 有关详细信息,请参阅快速路由文档

于 2017-10-17T12:06:10.887 回答