Использование перехватчика i18n в 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{
  .........

Но это не сработало?! Я что-то упустил, или я должен написать свой собственный перехватчик?

1 ответ

Решение

Всегда бегать I18nInterceptor перехватчик для каждого действия... Это часть defaultStack (настраивается в Struts-default.xml), это не просто так.

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

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

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

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

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


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

Другие вопросы по тегам