Spring Boot - 本地化到达自定义 (DWR) AbstractController 的请求,本地化子线程,LocaleResolver 与 LocaleChangeInterceptor

问题描述

因此,我已经介入这个主题有一段时间了,试图了解本地化 Spring Boot 项目的最佳可用解决方案。 我的用例如下: 区域设置应根据已保存(和稍后缓存)的 DB 用户首选项进行解析,当不存在时认为浏览器区域设置,不存在时认为全局系统区域设置。另外,我应该支持子线程本地化。

最重要的是,我的所有项目都使用传统的 DWR 技术,因此对服务器的大部分请求都通过 DWR 控制器。

我当前的解决方案是实现 SessionLocaleResolver 类,据我所知,它的 resolveLocale 方法应该为每个请求调用,因为它的返回值是之后将在任何地方返回的值调用 LocaleContextHolder.getLocale() 时的代码。我在 resolveLocale 上的工作相当复杂(转到数据库、缓存并在必要时使用一系列回退),但最终它只是返回一个语言环境。

  • 几个问题:
  1. 当客户端请求静态服务器呈现的页面时,区域设置解析器似乎工作正常,解析正确的区域设置,从而将正确的翻译输入 Thymeleaf HTML 页面。然而,通过 DWR 控制器(基本上是 AbstractControler 的扩展)的请求不会调用 resolveLocale 方法,因此没有正确本地化。我没有在文档中的任何地方找到为什么会发生这种情况。 我当前的解决方案是为通过此控制器的每个请求手动调用 LocaleContextHolder.setLocale(),但我想知道是否有更好的解决方案。

  2. 与语言环境解析器相比,LocaleChangeInterceptor 需要什么?在所有教程中,我都看到人们结合使用它们(由于某种原因,语言环境解析器总是返回一些硬编码的语言环境,如 Locale.US,而拦截器正在执行繁重的工作)。我避免使用它,因为这里的做法似乎是从请求标头中获取语言环境,而我的用例有点不同。

  3. 本地化当前请求线程的子线程的最佳实践是什么?我知道使用 LocaleContextHolder.setLocale(locale,true) 来本地化生成的线程,但是 [a] 如果我不小心并且忘记在任务完成时将子线程语言环境恢复为原始语言,我可能会让相同的线程处理由不同语言环境的线程(由其他用户)发起的某些任务,混合语言。 [b] 我们如何通过内置的语言环境解析器执行 LocaleContextHolder.setLocale(locale,true) 的等效操作?我在任何地方都没有找到。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)