Интернационализация выпадающих с использованием Spring 3 - PullRequest
1 голос
/ 14 января 2012

История

У меня есть элемент управления select, который представляет уровень доступа пользователя. Я ищу способ интернационализировать это. Метка должна быть загружена из ресурса сообщения, а значение должно использоваться как есть. Я готовлю все свои выпадающие списки в контроллерах, используя простой класс SelectOption, который имеет метку и свойства значения. Таким образом, мой выбор будет выглядеть одинаково во всех jsp.

Задача

Я нашел несколько примеров, но они основаны на логике в jsp. Разработчик просматривает свои метки и вручную создает тег опции, используя ресурс сообщения. Хотя это работает, просто должен быть лучший способ. Я также нашел некоторые комментарии о том, что Spring 3 будет поддерживать интернационализацию опционных ярлыков, но я не могу найти ничего конкретного по этому поводу.

Логика контроллера

Collection<SelectOption> optionList = new ArrayList<SelectOption>();
optionList.add(new SelectOption("-SELECT-", "-"));  
optionList.add(new SelectOption("Administrator", "ADMIN"));
optionList.add(new SelectOption("Editor", "EDIT"));
bean.setFilterUserAccessLevelOptionList(optionList);

логика JSP

<form:select path="filterUserAccessLevel"  items="${bean.filterUserAccessLevelOptionList}" itemLabel="label" itemValue="value"/>

Вопросы

  1. Я бы хотел добавить опции в свой контроллер следующим образом: optionList.add (new SelectOption ("userAccessLevelAdministratorLabel", "ADMIN")); и Spring преобразует userAccessLevelAdministratorLabel в значение из ресурса сообщения. Это возможно?
  2. Если Spring 3 не может сделать это для меня, как еще это можно сделать без ручного создания тега option в jsp?

=== 2012-01-15 ==================================== ==========================

Все еще пытаюсь найти решение, используя идею Авейгольда.

Контроллер

@Controller
public class UserController {
@Autowired
private UserService userService;

@Autowired
SelectOptionListBuilder listBuilder;

    @RequestMapping("/userIndex/{pageNumber}")
public ModelAndView getUserList(@PathVariable Integer pageNumber, @ModelAttribute("userIndexBean") UserIndexBean phantomBean, Locale locale, Model model) {

    UserIndexBean bean = new UserIndexBean();

    // prepare filter form
    Collection<SelectOption> optionList = listBuilder.getUserAccessLevelOptionList(true, SortOrder.NONE, locale);
    bean.setFilterUserAccessLevelOptionList(optionList);

SelectOptionListBuilderImpl

@Component
public class SelectOptionListBuilderImpl implements SelectOptionListBuilder, MessageSourceAware {

private MessageSource messageSource;

@Override     
public void setMessageSource(MessageSource messageSource) {
    this.messageSource = messageSource;
} 


@Override
public List<SelectOption> getUserAccessLevelOptionList(boolean addSelectPrompt, SortOrder sortOrder, Locale locale) {
    List<SelectOption> optionList = new ArrayList<SelectOption>();

    if(addSelectPrompt) {
        optionList.add(new SelectOption(messageSource.getMessage("common.selectPromptLabel", null, locale), "-"));
    }

messageSource mapping

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">    
<property name="basename" value="/WEB-INF/i18n/messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="UseCodeAsDefaultMessage" value="true"/>
</bean>

Исключение

org.springframework.context.NoSuchMessageException: No message found under code 'common.selectPromptLabel' for locale 'en_CA'

Ответы [ 2 ]

1 голос
/ 14 января 2012

Посмотрите на проект Spring Roo. Они решили эту проблему, создав теги tagx. Эти теги делают то, что вы уже дешифровали (он содержит небольшую логику для загрузки сообщений из ресурсов и построения тегов опций). Но поскольку логика проясняется один раз, и вы можете использовать эти теги как обычные теги в ваших jspx файлах, вы чувствуете, что тег делает то, что вы хотите.

1 голос
/ 14 января 2012

Когда мне нужно выполнить такие операции в контроллере вне jsp, я делаю мои контроллеры MessageSourceAware.Затем Spring вставит новый источник сообщений, когда они меняются местами, и вы можете опросить его так же, как Spring.В вашем примере вы бы сделали что-то вроде этого:

@Controller
public class someController implements MessageSourceAware {
    private MessageSource messageSource;

    @Override
    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @RequestMapping
    // Pass in the locale from the LocaleResolver
    public void someMapping(Locale locale){
        optionList.add(new SelectOption(
           messageSource.getMessage("userAccessLevelAdministratorLabel", null, locale),
           "ADMIN"))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...