如何覆盖当前请求/响应的默认语言环境

How to override the default locale for current request / response

使用典型的 Web 应用程序时,我在执行区域设置时遇到问题,我希望 Play Framework 2.4 Messages API 在回答请求(和呈现视图)时使用。

我尝试过从我的控制器调用 Http.Context.Implicit.ctx().changeLang(mySpecificLangCode);(扩展 devkit.mvc.Controller)。如果我在那之后调用 play.i18n.Messages#get(java.lang.String, java.lang.Object...),我得到的答案是我想要的语言,一切都很好。
但是,如果我使用我的视图 (scala / Twirl) 中的消息 API 来处理相同的请求,那是不行的。它回退到默认语言。我必须等待客户端发送第二个请求才能使用正确的语言提供服务。
我认为这是因为第一次,服务器发送 PLAY_LANG cookie,客户端在以下请求中发送它,并以某种方式告诉 Play 使用我想要的语言呈现视图。不过,我不能依赖这种行为,因为我必须考虑客户端生命周期是一个单一的请求。我无法控制客户端,我也不会/不能将我的代码基于客户端请求的 Accept-Language header。 我试过调试一些东西,看看当从视图内部调用消息 API 时会发生什么,阅读一些文档,它对我没有太大帮助,考虑到我不精通 scala,更不用说了。

建议(在 SO 和官方文档中)似乎是使用依赖注入为视图提供消息 object,但我无法修改我的视图(我的响应使用scala 模板,它调用其他模板等。修改所有模板是不可能的。

我能做什么,我想做的不修改视图是不是很简单?

我最终发现这是(曾经)Play Framework 中的一个实际问题,请参阅 https://github.com/playframework/playframework/issues/5875(具有类似的解决方法)。