<default-locale>似乎不起作用,而是使用<supported-locale> </supported-locale> </default-locale>

时间:2013-11-24 15:02:25

标签: jsf-2 localization

我想将我的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" />

但是当我使用它们时什么也没发生。

1 个答案:

答案 0 :(得分:28)

<default-locale>en_EN</default-locale>

首先,您在区域设置标识en_EN中出现了错误。前两个小写字符代表ISO 693-1语言代码。它是可选的,仅在国家/地区代码存在时才需要。最后两个大写字符代表ISO 3166-1 Alpha-2国家/地区代码。它是可选的,通常仅用于区分特定国家/地区的语言,例如American Englishen_US)和British Englishen_GB)。没有像#34;英格兰&#34;这样的国家,所以en_EN肯定是无效的。您最有可能想在这里使用enen_US

因此,所以

<default-locale>en</default-locale>

使用适当的messages_en.properties文件。


  

如何设置我的默认语言? faces-config.xml默认语言环境似乎不起作用。

<default-locale>仅在客户端没有在Accept-Language HTTP请求标头的风格中提供区域设置时使用,或者仅在客户端不支持的情况下使用<supported-locale>。在Accept-Language中定义的应用程序。很多(理智的)客户端实际设置了en-US标头。使用HTTP流量监视器,您可以看到它们。

enter image description here

(屏幕显示: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