Node表达多语言目录的api路由,如url

时间:2017-10-17 11:58:04

标签: node.js express i18n-node

有没有人知道一个例子或者可以在这里解释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',{
   ...
    });
});
  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的回答: How can I get the browser language in node.js (express.js)?说我应该使用app.all('*',...

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

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

    提前致谢

2 个答案:

答案 0 :(得分:3)

你需要考虑两件事:

1。如何获得本地:

接受语言

HTTP protocole定义Accept-Language header来管理本地。这是一种标准化方法。您可以使用req.acceptsLanguages快递方法访问它。

  • +归一化
  • + brower本地支持
  • 最终用户不容易通过

路径/ Cookies

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

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

两个

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

2。使用local:

  

获取本地的每种方法都可以以不同的方式使用。我会   在例子中使用它们随机但它们都是兼容的。

顶级配置。

如果您使用模板引擎,您的控制器可以是本地不可知的。您可以使用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