我想将我的jsf web项目的默认位置设置为英语,所以 我做了以下事情:
faces-config.xml中
<application>
<locale-config>
<default-locale>en_EN</default-locale>
<supported-locale>de_DE</supported-locale>
</locale-config>
<resource-bundle>
<base-name>de.hof.tschuwwa.resources.messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
我的src文件夹de.hof.tschuwwa.resources
里面有一个包
我有两个属性文件:
messages_de_DE.properties
messages_en_EN.properties
我在一个小的xhtml文件中测试过它:
<h:body>
<ui:composition template="/templates/master.xhtml">
<ui:define name="header">
<h:form>
<h:commandButton action="#{navigationService.toLogin}" value="#{msg['login']}" />
<h:commandButton action="#{navigationService.toRegister}" value="#{msg['register']}" />
</h:form>
</ui:define>
</ui:composition>
</h:body>
当我启动我的应用程序时,它显示的是德语值而不是 英国的价值观。我希望默认语言是英语。
如何设置默认语言? faces-config.xml默认语言环境 似乎不起作用。
此外,我需要知道如何改变我的本地化。我写的这么小 服务:
@Named
@SessionScoped
public class LanguageService implements Serializable {
private static final long serialVersionUID = 1L;
public void changeLanguage(String language) {
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(language));
}
}
并尝试使用表单中的以下按钮:
<p:commandButton id="english" value="English" action="#{languageService.changeLanguage('en')}" immediate="true" />
<p:commandButton id="german" value="Deutsch" action="#{languageService.changeLanguage('de')}" immediate="true" />
但是当我使用它们时什么也没发生。
答案 0 :(得分:28)
<default-locale>en_EN</default-locale>
首先,您在区域设置标识en_EN
中出现了错误。前两个小写字符代表ISO 693-1语言代码。它是可选的,仅在国家/地区代码存在时才需要。最后两个大写字符代表ISO 3166-1 Alpha-2国家/地区代码。它是可选的,通常仅用于区分特定国家/地区的语言,例如American English(en_US
)和British English(en_GB
)。没有像#34;英格兰&#34;这样的国家,所以en_EN
肯定是无效的。您最有可能想在这里使用en
或en_US
。
因此,所以
<default-locale>en</default-locale>
使用适当的messages_en.properties
文件。
如何设置我的默认语言? faces-config.xml默认语言环境似乎不起作用。
<default-locale>
仅在客户端没有在Accept-Language
HTTP请求标头的风格中提供区域设置时使用,或者仅在客户端不支持的情况下使用<supported-locale>
。在Accept-Language
中定义的应用程序。很多(理智的)客户端实际设置了en-US
标头。使用HTTP流量监视器,您可以看到它们。
(屏幕显示:en
是第一个偏好设置(默认值为&#34;重量&#34;为1),nl
是&##的第二个偏好设置34;权重&#34;为0.8,chrome://settings/languages
是&#34;权重&#34;为0.6的第三个首选项;在Chrome中,您可以通过添加/删除/重新排序在<f:view locale>
中更改此权限语言)
如果你想阻止这种情况并想要强制执行&#34;默认&#34;出于某些不明原因的区域设置,您需要明确将<f:view locale="#{languageService.language}">
设置为所需的&#34;默认值&#34; locale(注意:您实际上覆盖了客户端在其程序中配置的首选语言环境 - webbrowser)。
E.g:
<h:head>
(只需放入主模板,包裹<h:body>
和@Named
@SessionScoped
public class LanguageService implements Serializable {
private Locale locale;
@PostConstruct
public void init() {
locale = FacesContext.getCurrentInstance().getApplication().getDefaultLocale();
}
// ...
}
)
在你的支持bean中使用这个新属性:
update="@all"
我还需要知道如何改变我的本地化。
您在此特定示例中的错误是您在调用操作后未更新视图。您需要在命令按钮中添加<f:view locale>
。但是还有另一个错误:你不记得后续请求的语言环境。它将回归到&#34;默认&#34;现场再次。您需要使用此属性设置{{1}}。在此之前已经详细解答过:Localization in JSF, how to remember selected locale per session instead of per request/view。