2009-08-18 2 views
0

Я внедрил пользовательский ActionMapper, который получает локаль из URI (сам URI, а не параметры запроса). Из ActionMapper.getMapping(), как мне установить локаль для текущего действия?Как установить язык в пользовательском Struts 2 ActionMapper

Вот некоторые идеи, которые я уже рассмотрели:.

  • ActionContext.getCurrent() Setlocale(). К сожалению, кажется, что новый новый ActionContext создается, когда действие вызывается, и языковой стандарт сбрасывается по умолчанию.
  • Установите параметр request_locale, который будет обработан перехватчиком i18n. К сожалению, перехватчик i18n настаивает на настройке локали не только для текущего действия, но и для текущего сеанса, что вызывает исключение, поскольку сеансы не включены для моего приложения.
  • Задайте параметр и обработайте его в самом действии, выполнив setLocale(). Прямо, но это означает, что ни один из перехватчиков не будет иметь доступ к языку.
  • Задайте параметр и запишите перехватчик (в основном выполните то же самое, что и перехватчик i18n, не допуская поддержки сеанса). Похоже на излишнюю проблему для такой простой проблемы, не говоря уже о повторной разработке колеса.

Есть ли простой способ достичь этого?

+0

Если вам нужно локалите по всем вашим перехватчикам, я думаю, что вы застряли заново изобретать колесо с пользовательских i18n перехватчиком. Я удивлен, что ActionContext воссоздается - я решил, что ваша первая идея тоже сработает. – Pat

ответ

0

Я действительно в конечном итоге установил параметр «locale» и переписал перехватчик i18n, используя его.

Поскольку Struts 2.1.1 параметры в ActionMapping сохраняются отдельно от параметров запроса. Перехватчик actionMappingParams принимает эти параметры и применяет их к объекту действия. Тем не менее, я хотел, чтобы мой i18n перехватчик потреблять «локаль» параметры и не передать его через к действию, вот как я это сделал:

private static final String LOCALE_PARAMETER = "locale"; 

public String intercept(ActionInvocation invocation) throws Exception { 
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext() 
     .get(ServletActionContext.ACTION_MAPPING); 
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER); 

    if(locale != null) { 
     ActionContext.getContext().setLocale(locale); 
    } 

    return invocation.invoke(); 
} 

Этот обычай i18n перехватчик должен прийти прежде, чем actionMappingParams в стеке перехватчика ,

1

вы можете использовать предоставленный I18nInterceptor при установке параметров: request_only_locale

вместо request_locale

request_only_locale сохраняет локаль только для запросов и не прикасается к сессии.

Приветствие, Christian

+0

Хорошее решение. Я предполагаю, что это было недоступно в любой версии Struts2, которую я использовал в то время, когда я задал оригинальный вопрос (так как я уверен, что я прошел через источник I18nInterceptor). –

Смежные вопросы