JSF 选择菜单 il8n
JSF selectonemenu il8n
我想创建一个 p:selectOneMenu 项,其中的值和选定值显示翻译后的字符串。因此,如果用户将语言切换为法语,则下拉内容和选择将全部以法语等显示
目前我有一个要显示的值列表,每个值都知道它们在每种语言中的字符串值是什么(我意识到这可能是一种反模式,一旦它起作用就会重构。)
我已经使用以下代码解决了以翻译方式显示下拉元素的问题。我还创建了 Omnifaces SelectItemsConverter class 的子 class 来获取每个对象的翻译字符串。
<p:selectOneMenu
value="#{linkagecontroller.selectedLink}"
converter="linkageTypeSelectItemsConverter"
var="lnk">
<f:selectItems value="#{linkagecontroller.linkageTypes}"
var="item"/>
<p:column>
<div class="link-item-#{lnk.linkageTypeId}">
<h:outputText value="#{lnk.getKeyValue(language.localeCode)}" />
</div>
</p:column>
</p:selectOneMenu>
LinkageTypeSelectItemsConverter
@FacesConverter("linkageTypeSelectItemsConverter")
public class LinkageTypeSelectItemsConverter extends SelectItemsConverter implements Serializable {
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
final String locale = context.getApplication().evaluateExpressionGet(context,
"#{language.localeCode}",
String.class);
if (value instanceof LinkageTypeKey) {
return ((LinkageTypeKey) value).getKeyValue(locale);
} else {
return super.getAsString(context, component, value);
}
}
}
显示表单时,我可以调试此转换器,它返回已翻译的值,但所选元素 ID 始终以默认语言英语显示。想法?
转换器用于转换项目值,而不是项目标签。
您需要明确指定 itemLabel
。
<p:selectOneMenu
value="#{linkagecontroller.selectedLink}"
converter="omnifaces.SelectItemsConverter">
<f:selectItems value="#{linkagecontroller.linkageTypes}" var="item"
itemValue="#{item}" itemLabel="#{item.getKeyValue(language.localeCode)}" />
</p:selectOneMenu>
这只是一种有点奇怪的本地化方法。您通常将翻译放在资源包中而不是模型本身。如果它是 enum
.
,甚至可以在没有转换器的情况下完成
另请参阅:
- How to use enum values in f:selectItem(s)
- Localizing enum values in resource bundle.
我想创建一个 p:selectOneMenu 项,其中的值和选定值显示翻译后的字符串。因此,如果用户将语言切换为法语,则下拉内容和选择将全部以法语等显示
目前我有一个要显示的值列表,每个值都知道它们在每种语言中的字符串值是什么(我意识到这可能是一种反模式,一旦它起作用就会重构。)
我已经使用以下代码解决了以翻译方式显示下拉元素的问题。我还创建了 Omnifaces SelectItemsConverter class 的子 class 来获取每个对象的翻译字符串。
<p:selectOneMenu
value="#{linkagecontroller.selectedLink}"
converter="linkageTypeSelectItemsConverter"
var="lnk">
<f:selectItems value="#{linkagecontroller.linkageTypes}"
var="item"/>
<p:column>
<div class="link-item-#{lnk.linkageTypeId}">
<h:outputText value="#{lnk.getKeyValue(language.localeCode)}" />
</div>
</p:column>
</p:selectOneMenu>
LinkageTypeSelectItemsConverter
@FacesConverter("linkageTypeSelectItemsConverter")
public class LinkageTypeSelectItemsConverter extends SelectItemsConverter implements Serializable {
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
final String locale = context.getApplication().evaluateExpressionGet(context,
"#{language.localeCode}",
String.class);
if (value instanceof LinkageTypeKey) {
return ((LinkageTypeKey) value).getKeyValue(locale);
} else {
return super.getAsString(context, component, value);
}
}
}
显示表单时,我可以调试此转换器,它返回已翻译的值,但所选元素 ID 始终以默认语言英语显示。想法?
转换器用于转换项目值,而不是项目标签。
您需要明确指定 itemLabel
。
<p:selectOneMenu
value="#{linkagecontroller.selectedLink}"
converter="omnifaces.SelectItemsConverter">
<f:selectItems value="#{linkagecontroller.linkageTypes}" var="item"
itemValue="#{item}" itemLabel="#{item.getKeyValue(language.localeCode)}" />
</p:selectOneMenu>
这只是一种有点奇怪的本地化方法。您通常将翻译放在资源包中而不是模型本身。如果它是 enum
.
另请参阅:
- How to use enum values in f:selectItem(s)
- Localizing enum values in resource bundle.