构建服务器端 i18n 的最佳方式



我正在使用nestjs来创建我的REST API,并且我要求API返回的所有消息(异常消息,提示等)支持i18n,我想知道使用nestjs框架更好的方法是什么。

使用普通表达,我可以从请求标头中获取用户语言,并且可以将其转换为 Nestjs 中间件,以便将语言代码放入位于请求执行上下文中的某个软件中,然后从我的 i18n 服务中使用(我不想为每个软件添加语言参数,我需要用户语言)你怎么看?它是解决我需求的道具架构吗?放置当前请求的语言的最佳位置是什么?

>我会使用i18 节点包 https://github.com/mashpie/i18n-node,与 express 兼容,因此与 Nest 一起使用也没有矛盾。此外,我建议注册一个自定义装饰器作为调用res.__包装器。

我一直在使用Nestjs-i18n包。

它包含内置功能,如I18nService和I18nLang装饰器。

我认为没有办法在不将其作为参数传递的情况下获取服务中的语言代码。 如果要从服务访问语言代码,则必须将其作为参数传递,或从其他位置检索与用户对象关联的语言代码。

我在应用程序中处理翻译,如下所示:

我有一个语言装饰器来处理客户端覆盖的"接受语言"标头:

export const Language = createRouteParamDecorator((data, req) => {
if (!req.body.lang) return req.getLocale();
return req.body.lang;
});

并在控制器中像这样使用它:

@Post()
public async testLocale(@Req() req, @Language() locale) {
return this.myService.someMethod(someParam, locale);
}

要做出您要求的架构决策,我会首先考虑以下内容。

  1. 如果您的 API 包装了一个只执行某些操作(发送电子邮件、处理一些数据、进行计算等)的服务,我只会返回标准化的错误或提示代码及其标准化的英语消息。

    翻译的事情应该在前端应用程序上完成,不管它是什么。在它的最后,您只需使用任何模板引擎(无论是 Node 还是 PHP 还是您创建前端的任何其他内容)和 Poedit,都可以

    。应用程序负责知道哪个错误或提示代码转换为哪个匹配的前端 UI 消息。Poedit将使用node-gettext和gettext-parser进行翻译。

  2. 相反,如果您的 API 包装了多语言内容(这不是您所描述的情况),那么您别无选择,您必须为每个请求实现语言选择机制。正如您所说,该语言由浏览器通过HTTP请求标头定义。

    您必须创建应用程序服务对象,负责根据语言参数(例如,您传递给它的基本语言内容项 ID)获取内容翻译(从内容存储库)。

    仅供参考,请注意REQUEST范围注入,因此服务依赖于特定的请求上下文并正确处理语言设置。

i18n 实现可以是适用于您的情况的任何内容。

最新更新