在语言子路径中组织Node Express App

时间:2017-09-09 12:42:16

标签: node.js express

我正在进行国际化节点expressjs-app的进程。我们的想法是在语言子文件夹(www.domain.com/en/)中为整个网站提供服务。我有点挣扎着围绕如何组织应用程序,似乎很难在stacko或web上找到一些有用的资源。

我觉得这里有什么挑战,事实上你必须在三个方面取得最佳成绩:可用性,搜索引擎优化和绩效。

有几个问题:

  • 要存储的响应/所选语言在哪里?在会议中?
  • 理想情况下,当前语言设置的唯一来源是什么?
  • 语言路径如何影响语言? (将语言更改为当前路径?重定向到活动/存储语言?)
  • 如何组织路线?哪些中间件策略对于检测和更改语言有意义?是否有必要将语言子路径添加到所有内部链接,或者这可以通过巧妙的路由来完成?

我希望获得一些提示,资源,博客文章,回购信息,以便我了解有关此主题的最佳做法。

干杯

3 个答案:

答案 0 :(得分:1)

我强烈推荐node.js i18n。到目前为止,我已经在2节点项目中使用它,它总是像魅力一样工作。然后我总是为我想要服务的每种语言都有一个json-File。您需要在模板中实现一次,然后才能正常工作。

关于配置一个简单的例子:

// Configuration
app.configure(function() {

    [...]

    // default: using 'accept-language' header to guess language settings
    app.use(i18n.init);

    [...]
});

因此i18n会根据用户浏览器代理猜测语言。 我一直在做的不是使用额外的路由,而是使用参数lang,而且每个href可以一直改变语言。例如。 https://example.com/?lang=de将改为德语。当然,你需要在每个get表达一个辅助函数来检测是否设置了另一种语言然后你就可以处理它。对我而言,这是最简单的方法,但对于SEO而言,这并不是我认为最好的。

当然你也可以处理它,例如具有不同的域/子域名,因为airbnb正在这样做。 https://nl.airbnb.comhttps://www.airbnb.comhttps://www.airbnb.de的比较,或者正如您在路线中提到的那样,效果也非常好。但我认为这与更多的工作有关。

关于搜索引擎优化和其他方面的利弊,你可以稍微谷歌一下,看看这个quora question,这也强烈推荐Google Best Practices这个主题。

答案 1 :(得分:1)

您甚至不需要使用库进行简单的本地化。我将向您展示一个简单的例子:

假设您在全局范围内的json中有您的语言字符串(也可以在文件或数据库中):

var languageData = {
    'en': {
        'LOGIN_BTN': 'Login now',
        'REGISTER_BTN': 'Register'
    },
    'tr': {
        'LOGIN_BTN': 'Giris',
        'REGISTER_BTN': 'Kayit'
    }
}

让我们创建简单的中间件:

function getLanguageStrings(req, res, next) {
    var lang = req.acceptsLanguages('en', 'tr', 'fr')
    var selectedLang = lang ? lang : 'en' // default to english
    req.languageStrings = languageData[selectedLang]
    next()
}

上面,我使用acceptsLanguages()方法获取浏览器的首选语言,但是如果您愿意,可以从客户端设置cookie并在我们的中间件中读取它。

使用req.languageStrings = languageData[selectedLang]行,我已将字符串附加到当前请求,以便下一个中间件可以使用它。

让我们使用我们的中间件:

app.use(getLanguageStrings)

在路线中,渲染它们以查看:

app.get("/info", function (req, res) {
    res.render("info.html", { 
        languageStrings: req.languageStrings
    })
})

在视图中,您现在将它与首选模板引擎一起使用:

<button class="btn">{{languageStrings.LOGIN_BTN}}</button>
<button class="btn">{{languageStrings.REGISTER_BTN}}</button>

答案 2 :(得分:0)

为此我使用了i18n模块(与其他本地化模块几乎相同)。您将翻译保存在简单的json文件中,默认情况下,i18n会根据客户端发送的cookie检查语言。

这就是它,我认为还有其他一些方法来获取语言而不是使用cookie,例如请求参数(如您所提到的)或请求体内发送的值。

这实际上取决于您的需求。这仅在您使用i18n-node-2模块时可用,对于第一个您必须使用cookie(如果我错了,请纠正我)。

示例I已创建,以显示如何在服务器端进行设置。

Localization with Express and i18n

更新:

对于i18n-node-2

与README.md文件一样,您可以选择一些函数来检测/设置所需的语言:

  • 的setLocale(区域)
  • setLocaleFromQuery([请求])
  • setLocaleFromCookie([请求])
  • setLocaleFromSessionVar([请求])
  • setLocaleFromEnvironmentVariable()

文档:i18n-node-2