Apache MyFaces 2.3-next-M6 |更改语言不起作用 |它显示的不是所选语言

Apache MyFaces 2.3-next-M6 | change of language don't work | it shows not the selected language

如何修复以下错误?起始语言是德语。如果我 select 英语,它会保留德语文本。但是,如果我然后 select 德语,我得到英语,如果我然后 select 英语,我得到德语。但是,当出现英文文本而不是德文文本时,“de”会在 index.xhtml 中的语言 (Language de:) 旁边正确显示。为了显示 selected 是哪种语言,我在 index.xhtml 中使用了#{language.localeCode}。我将 Apache MyFaces 2.3-next-M6 与 Quarkus 一起使用。我做错了什么?

index.xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui">

<f:view contentType="text/html" encoding="UTF-8" locale="#{language.localeCode}">
    <f:loadBundle basename="messages" var="msg" />

    <h:head>
        <h:outputStylesheet name="primeflex/primeflex.css" />
    </h:head>

    <h:body>
        <p:growl>
            <p:autoUpdate />
        </p:growl>

        <h:form id="formlanguagechanger">
            <h:panelGrid columns="2">


                Language #{language.localeCode}:
                <h:selectOneMenu value="#{language.localeCode}" onchange="submit()"
                    valueChangeListener="#{language.countryLocaleCodeChanged}">
                    <f:selectItems value="#{language.countriesInMap}" />
                </h:selectOneMenu>
            </h:panelGrid>
        </h:form>

        <h:outputText value="#{msg.title}" />
    </h:body>
</f:view>

</html>

LanguageBean.java

@Named("language")
@SessionScoped
public class LanguageBean implements Serializable {
    private static final long serialVersionUID = 1L;

        private String localeCode;
        
        @PostConstruct
        public void init() {
            localeCode = "de";
        }

        private static Map<String, Locale> countries;
        static {
            countries = new LinkedHashMap<String, Locale>();
            countries.put("Deutsch", new Locale("de"));
            countries.put("English", new Locale("en"));
        }

        public Map<String, Locale> getCountriesInMap() {
            return countries;
        }

        public String getLocaleCode() {
            return localeCode;
        }

        public void setLocaleCode(String localeCode) {
            this.localeCode = localeCode;
        }

        // value change event listener
        public void countryLocaleCodeChanged(ValueChangeEvent e) {

            String newLocaleValue = e.getNewValue().toString();

            // loop country map to compare the locale code
            for (Map.Entry<String, Locale> entry : countries.entrySet()) {

                if (entry.getValue().toString().equals(newLocaleValue)) {

                    FacesContext.getCurrentInstance().getViewRoot().setLocale((Locale) entry.getValue());

                }
            }
        }
}

此代码在 Mojarra 2.3.17 中对我来说工作正常。

但是,在 Myfaces 2.3.9 中,我可以重现所描述的问题。

根本原因是 <f:loadBundle> 未在视图渲染期间(重新)初始化,而仅在视图构建期间初始化。这可能是 MyFaces 中的错误。

我可以通过用 faces-config.xml 中的条目替换 <f:loadBundle> 标签来解决这个问题。

<application>
    ...
    <resource-bundle>
        <base-name>messages</base-name>
        <var>msg</var>
    </resource-bundle>
</application>

至少不是 Quarkus 相关的问题。所以我已经解决了你的问题。

另请参阅:

  • Localization in JSF, how to remember selected locale per session instead of per request/view