JSF选择菜单il8n

JSF选择菜单il8n,jsf,primefaces,omnifaces,Jsf,Primefaces,Omnifaces,我想创建一个p:selectOne菜单项,其中值和所选值显示翻译后的字符串。因此,如果用户已将其语言切换为法语,则下拉内容和选择都将以法语显示,等等 目前我有一个要显示的值列表,每个值都知道它们在每种语言中的字符串值是什么(我意识到这可能是一个反模式,一旦工作起来就会重构) 我已经用下面的代码解决了以翻译方式显示下拉元素的问题。我还创建了Omnifaces SelectItemsConverter类的子类,以获取每个对象的转换字符串 <p:selectOneMenu value="

我想创建一个p:selectOne菜单项,其中值和所选值显示翻译后的字符串。因此,如果用户已将其语言切换为法语,则下拉内容和选择都将以法语显示,等等

目前我有一个要显示的值列表,每个值都知道它们在每种语言中的字符串值是什么(我意识到这可能是一个反模式,一旦工作起来就会重构)

我已经用下面的代码解决了以翻译方式显示下拉元素的问题。我还创建了Omnifaces SelectItemsConverter类的子类,以获取每个对象的转换字符串

<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>

当表单显示时,我可以调试这个转换器,它返回翻译的值,但所选元素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
,甚至可以在没有转换器的情况下完成

另见:
<p:selectOneMenu
    value="#{linkagecontroller.selectedLink}" 
    converter="omnifaces.SelectItemsConverter">
    <f:selectItems value="#{linkagecontroller.linkageTypes}" var="item"
        itemValue="#{item}" itemLabel="#{item.getKeyValue(language.localeCode)}" />
</p:selectOneMenu>