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

Posted

技术标签:

【中文标题】架构服务器端 i18n 的最佳方式【英文标题】:Best way to architecture server side i18n 【发布时间】:2018-06-20 02:11:48 【问题描述】:

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

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

【问题讨论】:

这篇博文可能对服务器端 i18n 有所启发:dev.to/adrai/… 【参考方案1】:

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

【讨论】:

谢谢卡米尔。我想知道的是如何在我的服务中使用 i18n。考虑从服务中引发业务逻辑异常,包括必须使用用户首选语言的友好错误消息。 @JoseSelesan a friendly error message that have to be in the user prefered language - API 代表面向程序员的编程接口,而不是(最终)用户。所以它可能不应该是程序员的口语,而是所有编程语言中使用的标准口语,即英语:)我的意思是,例如JS 使用英语作为其语言结构,为什么 API 内部应该使用不同的语言。只是一个值得思考的讨论点。【参考方案2】:

我认为没有办法在不将语言代码作为参数传递的情况下获取服务中的语言代码。 如果您想从您的服务访问语言代码,您必须将其作为参数传递,或者从另一个地方检索与用户对象关联的语言代码。

我在我的应用程序中处理翻译如下:

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

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);

【讨论】:

我使用 @Req() req 装饰器,然后在控制器方法中设置 i18n 语言环境,如下所示:setLocale(getLocale(req)); 如果需要,这允许在服务中简单地使用 getLocale()。本地化将遵循设置的语言环境。 有什么理由不能使用全局拦截器来设置语言环境?【参考方案3】:

我一直在使用Nestjs-i18n 包。

它包含诸如I18nService和I18nLang decorator等内置功能。

【讨论】:

【参考方案4】:

要做出您要求的架构决策,我会先考虑以下问题。

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

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

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

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

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

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

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

【讨论】:

以上是关于架构服务器端 i18n 的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

保护 javascript 前端/REST 后端架构网站的最佳方式?

Web后端架构2022年10个最佳Web开发后端框架

最佳实践服务端高并发分布式架构演进之路

向 JSP 提供服务器端属性的最佳方式是啥?

导出 ajax/服务器端数据表的最佳方式

微服务之间调用的最佳设计