Использование i18n Interceptor в Struts2

Я хочу сделать сайт многоязычным.

У меня есть нормальный стек перехватчиков, который содержит

<interceptor-ref name="i18n" /> 

Обычный jsp для смены локали:

<s:a action="locale-manager" namespace="/common">
    <s:param name="request_locale">fa_IR</s:param>
    فارسی  
</s:a>

<s:a action="locale-manager" namespace="/common">
    <s:param name="request_locale">en_US</s:param>
    English
</s:a>

И простое действие LocaleManager

public class LocaleManager extends ActionSupport{
    private static final Logger log = LoggerFactory.getLogger(LocaleManager.class);

    public String execute() {
        log.debug("Change the local to {}", getLocale() );
        return "homepage";
    }

}

В приведенном выше сценарии перехватчик i18n всегда запускается для всех действий, для которых нет решения. Потому что языковой стандарт изменяется только тогда, когда пользователь нажимает на действие locale-manager.

Я попытался удалить стек перехватчика и добавить перехватчик i18n только в LocaleManager, как показано ниже.

@InterceptorRefs({ @InterceptorRef("i18n") })
public class LocaleManager extends ActionSupport{
  .........

Но не вышло ?! Я что-то упускаю, или мне стоит написать свой собственный перехватчик?


person Alireza Fattahi    schedule 23.10.2013    source источник
comment
Что ты пытаешься сделать? Если вы хотите изменить языковой стандарт, вам не нужно никаких действий для его изменения.   -  person Aleksandr M    schedule 23.10.2013


Ответы (1)


Всегда запускайте _1 _ перехватчик для каждого действия ... Он является частью defaultStack (настроенного в struts-default.xml), это не просто так.

Это работает просто: если есть параметр запроса с именем request_locale, он устанавливает новый языковой стандарт для сеанса. Затем это значение будет прочитано при вызове getText() или аналогичных функций для получения правильного сообщения из локализованного пакета.

Из официальной документации:

Перехватчик, который обрабатывает установку языкового стандарта, указанного в сеансе, в качестве языкового стандарта для текущего запроса действия. Кроме того, этот перехватчик будет искать конкретный параметр HTTP-запроса и устанавливать для языкового стандарта любое предоставленное значение. Это означает, что этот перехватчик может использоваться, чтобы позволить вашему приложению динамически изменять языковой стандарт для сеанса пользователя или, альтернативно, только для текущего запроса (начиная с XWork 2.1.3). Это очень полезно для приложений, которым требуется многоязычная поддержка и которые хотят, чтобы пользователь мог установить свои языковые предпочтения в любой момент. Параметр locale удаляется во время выполнения этого перехватчика, гарантируя, что свойства не установлены для действия (такого как request_locale), для которого в вашем действии нет типичного соответствующего установщика.

Например, используя имя параметра по умолчанию, запрос к foo.action? Request_locale = en_US, тогда языковой стандарт для английского языка (США) сохраняется в сеансе пользователя и будет использоваться для всех будущих запросов.

Если языковой стандарт не задан (например, при первом посещении), перехватчик использует языковой стандарт браузера.


Некоторые примеры использования:

person Andrea Ligios    schedule 23.10.2013