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

时间:2018-01-10 20:13:52

标签: nestjs

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

使用plain express,我可以从请求标头中获取用户语言,并且可以将其转换为Nestjs Middleware,以便将语言代码放入存在于请求执行上下文中的某些软件中,然后使用我的i18n服务(我不想添加我需要用户语言的语言参数)你怎么看?它是一个解决我的要求的propper架构吗?哪个是为当前请求提供语言的最佳位置?

3 个答案:

答案 0 :(得分:4)

我一直在使用Nestjs-i18n软件包。

它包含内置功能,例如I18nServiceI18nLang decorator

答案 1 :(得分:2)

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

答案 2 :(得分:0)

要做出架构决定,请先考虑以下内容。

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

    无论翻译什么,都应该在前端应用程序上完成。最后,只要使用任何模板引擎(即使是Node或PHP或您使用其创建前端的其他任何东西)和Poedit都可以。

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

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

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

    FYI注意REQUEST scoped injection,因此服务依赖于特定的请求上下文并正确处理语言设置。

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