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
如何修复以下错误?起始语言是德语。如果我 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