【问题标题】:<default-locale> does not seem to work, instead the <supported-locale> is being used<default-locale> 似乎不起作用,而是使用 <supported-locale>
【发布时间】:2013-11-24 15:02:25
【问题描述】:

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

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

【问题讨论】:

  • 您的浏览器是否将默认语言环境设置为 DE?
  • 即使我将浏览器默认本地更改为英语,我的网络应用也会加载所有德语消息
  • 您确定 en_EN 语言环境存在吗?我 90% 确定使用 en_US 或 en_GB 时一切都会正常工作。当然还有重命名属性文件。

标签: jsf-2 localization


【解决方案1】:
<default-locale>en_EN</default-locale>

首先,您在语言环境标识符en_EN 中有一个错误。前两个小写字符代表ISO 693-1 语言代码。它是可选的,仅在存在国家代码时才需要。最后两个大写字符代表ISO 3166-1 Alpha-2 国家代码。它是可选的,通常仅用于区分特定国家/地区的语言方言,例如 American English (en_US) 和 British English (en_GB)。没有像“英格兰”这样的国家,所以en_EN 肯定是无效的。您很可能想在此处使用enen_US

所以,所以

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

使用适当的messages_en.properties 文件。


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

&lt;default-locale&gt; 仅在客户端没有按照Accept-Language HTTP 请求标头的风格自行提供区域设置时使用,或者提供了&lt;supported-locale&gt; 中定义的应用程序不支持的区域设置。许多(理智的)客户实际上设置了Accept-Language 标头。使用 HTTP 流量监视器,您可以看到它们。

(屏幕显示:en-US 是第一个首选项(默认“权重”为 1),en 是第二个首选项,“权重”为 0.8,nl 是“权重”为 0.6 的第三个首选项;在 Chrome 中,您可以在 chrome://settings/languages 中通过添加/删除/重新排序语言来更改它)

如果您想阻止这种情况并出于某种不清楚的原因想要强制使用“默认”语言环境,那么您需要将 &lt;f:view locale&gt; 显式设置为所需的“默认”语言环境(注意:您实际上是覆盖客户端在其程序中配置的首选语言环境 - 网络浏览器)。

例如:

<f:view locale="#{languageService.language}">

(只需放入主模板,包装&lt;h:head&gt;&lt;h:body&gt;

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

@Named
@SessionScoped
public class LanguageService implements Serializable {

    private Locale locale;

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

    // ...
}

我还需要知道如何更改本地化。

您在这个特定示例中的错误是您在调用操作后没有更新视图。您需要将update="@all" 添加到命令按钮。但是还有另一个错误:您不记得后续请求的语言环境。它将再次退回到“默认”语言环境。您需要使用此属性设置&lt;f:view locale&gt;。这个之前已经详细回答过:Localization in JSF, how to remember selected locale per session instead of per request/view

【讨论】:

  • 如果用户在表单中输入了一些信息,然后用“英语”或“德语”按钮更改语言,有没有办法保留用户已经输入的信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2015-10-29
相关资源
最近更新 更多