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

时间:2019-04-18 07:21:22

标签: playframework locale

使用典型的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)使用Messages API来满足相同的请求,那是不可行的。它回退到默认语言。我必须等待客户端发送第二个请求,以使其以正确的语言提供服务。
我认为这是因为服务器第一次发送PLAY_LANG cookie,客户端在以下请求中发送了该cookie,并以某种方式告诉Play用我想要的语言呈现视图。但是,我不能依靠这种行为,因为我必须考虑到客户端的寿命是一个请求。我对客户端没有控制权,我也不能/也不能基于客户端请求的Accept-Language标头来编写代码。 我尝试了一些调试工作,并查看了从视图内部调用Messages API,阅读一些文档时会发生什么情况,但对我没有多大帮助,甚至对我来说也没有多大帮助。

建议(在此处以及官方文档中也有建议)似乎是使用依赖注入为视图提供Messages对象,但是我无法修改视图(我的响应使用了scala模板,该模板调用了其他模板等。修改它们都是毫无疑问的。

我该怎么办,就是我想做的简单明了的事,并且不修改视图就根本不可行?

1 个答案:

答案 0 :(得分:0)

我最终发现这是Play框架中的实际问题,请参见https://github.com/playframework/playframework/issues/5875(并提供解决该问题的方法)。