我在header.xhtml中更改了语言selectOneMenu。通过选择更改任何xhtml文件的语言。但是很少有页面在Java类本身中设置语言字符串,后者由Post-Construct调用。
Header.xhtml
<h:selectOneMenu value="#{client.language}" onchange="submit()" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>
在managed bean
中,我有ViewScoped
,然后是PostConstruct
。我的问题是 - 从菜单中更改语言后,Java没有翻译某些字符串。那是因为PostConstruct调用了它,当语言改变时不会调用它。但是当我通过单击链接转到该页面时,字符串将被翻译。只是一旦我改变语言,字符串就不会被翻译。
我认为这里的问题是因为语言改变时不会调用PostConstruct
。我该如何调用它?
答案 0 :(得分:3)
您的问题基本上是关于@PostConstruct
的行为。在创建bean之后以及在注入字段之后,将调用此方法,例如,用@EJB
和@Resource
注释装饰的字段。
由于您使用@ViewScoped
bean,因此每个视图将创建一次。刷新页面将创建一个新视图,这就是为什么将重新创建@ViewScoped
bean的实例,并且您将以所需语言处理数据。
可能的解决方案:
@RequestScoped
。就我而言,我会使用后者而不是前者。此外,在更改语言之后,最好的选择是向服务器发出新的非Ajax请求 - 响应周期。
更多信息:
答案 1 :(得分:1)
我试图像过去那样做,但没有运气。以下是我如何解决问题(使用JQuery):
<h:selectOneMenu value="#{client.language}" onchange="$(document).find('.submitBtn').click();" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>
<h:commandButton style="visibility: hidden;" styleClass="jsfHidden submitBtn" action="#{yourpostconstructmethod}"/>