1

I would like to create a p:selectOneMenu item where the values and selected value display translated strings. So if the user has switched their language to french, the dropdown contents and selection will all be displayed in french, etc.

Currently I have a list of values to display, each of which knows what their string value is in each language (I realize this is probably an antipattern, will refactor once this is working.)

I've solved the issue of displaying the drop down elements in translated fashion using the following code. I've also created a subclass of the Omnifaces SelectItemsConverter class to get a translated string of each object.

<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); 
        }
    }
}

When the form is displayed, I can debug this converter, it's returning values translated, but the selected element ID is always being displayed in the default language, english. Thoughts?

Rob Young
  • 23
  • 6

1 Answers1

2

The converter is for converting item values, not item labels.

You need to explicitly specify 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>

This is only a somewhat strange approach of localization. You usually put translations in a resource bundle instead of in the model itself. It could even be done without a converter if it's an enum.

See also:

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555