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

use*_*812 9 localization jsf-2

我想将我的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>
Run Code Online (Sandbox Code Playgroud)

我在我的src文件夹中有一个包,在de.hof.tschuwwa.resources该包内有两个属性文件:

messages_de_DE.properties
messages_en_EN.properties
Run Code Online (Sandbox Code Playgroud)

我在一个小的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>
Run Code Online (Sandbox Code Playgroud)

当我开始我的应用程序时,它显示德国值而不是英语值.我希望默认语言是英语.

如何设置我的默认语言?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));
    }
}
Run Code Online (Sandbox Code Playgroud)

并尝试使用表单中的以下按钮:

<p:commandButton id="english" value="English" action="#{languageService.changeLanguage('en')}" immediate="true" />
<p:commandButton id="german" value="Deutsch" action="#{languageService.changeLanguage('de')}" immediate="true" />
Run Code Online (Sandbox Code Playgroud)

但是当我使用它们时没有任何反应.

Bal*_*usC 29

<default-locale>en_EN</default-locale>
Run Code Online (Sandbox Code Playgroud)

首先,您在区域设置标识符中存在错误en_EN.前两个小写字符代表ISO 693-1语言代码.它是可选的,仅在国家/地区代码存在时才需要.最后两个大写字符代表ISO 3166-1 Alpha-2国家/地区代码.它是可选的,通常仅用于区分国家特定的语言方言,如美式英语(en_US)和英式英语(en_GB).没有像"英格兰"这样的国家,所以en_EN绝对无效.你很可能想要使用en或者也许en_US在这里.

因此,如此

<default-locale>en</default-locale>
Run Code Online (Sandbox Code Playgroud)

用适当的messages_en.properties文件.


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

<default-locale>仅用于当客户端没有在风味本身提供的区域设置Accept-Language的HTTP请求报头,或提供的一个如在definied未由应用程序所支持<supported-locale>.很多(理智的)客户端实际上设置了Accept-Language标题.使用HTTP流量监视器,您可以看到它们.

在此输入图像描述

(屏幕显示:en-US是第一个偏好(默认"权重"为1),en第二个偏好的"权重"为0.8,nl第三个偏好的"权重"为0.6;在Chrome中你可以chrome://settings/languages通过添加/删除/重新排序语言来改变这一点).

如果您想要阻止这种情况并希望强制使用"默认"语言环境以获得某些不明原因,那么您需要显式设置<f:view locale>为所需的"默认"语言环境(注意:您实际上是按照配置覆盖了客户端的首选语言环境)在它的程序 - webbrowser).

例如:

<f:view locale="#{languageService.language}">
Run Code Online (Sandbox Code Playgroud)

(只需放入主模板,包装<h:head><h:body>)

在您的支持bean中使用此新属性:

@Named
@SessionScoped
public class LanguageService implements Serializable {

    private Locale locale;

    @PostConstruct
    public void init() {
        locale = FacesContext.getCurrentInstance().getApplication().getDefaultLocale();
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

此外,我需要知道如何改变我的本地化.

您在此特定示例中的错误是您在调用操作后未更新视图.您需要添加update="@all"到命令按钮.但是还有另一个错误:你不记得后续请求的语言环境.它会再次回到"默认"区域设置.您需要<f:view locale>使用此属性进行设置.这在以前已经详细解答过:JSF中的本地化,如何记住每个会话的选定区域设置而不是每个请求/视图.