Переписать сессию локали Struts2 - PullRequest
0 голосов
/ 01 июля 2011

Можно ли переписать атрибут сеанса WW_TRANS_I18N_LOCALE в Struts2 ? Я хочу установить языковой стандарт в файлах cookie для будущего использования, поскольку по умолчанию время сеанса составляет 30 минут, а для языкового стандарта это небольшой промежуток времени, если пользователь не использует сайт. Я пытаюсь установить WW_TRANS_I18N_LOCALE в зависимости от значения куки, но без какой-либо удачи, значение остается таким же, как и сейчас.

Я нашел здесь вопрос, похожий на мой, но все мои jsp проходят через Действия https://stackoverflow.com/questions/5291271/struts-2-internationalisation-problem, и это не решение ..

1 Ответ

1 голос
/ 01 июля 2011

То есть вы хотите изменить значение сеанса в действии? Я не совсем уверен в последней строке, но просто внедрите SessionAware, тогда все должно быть просто. Лучшее место для установки значения, вероятно, - когда пользователь входит в систему (если есть).

Что-то вроде ...

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class MyAction extends ActionSupport implements SessionAware{
    Map<String, Object> session;

    @Override
    public String execute(){
        session.put("WW_TRANS_I18N_LOCALE", "fr");
        return SUCCESS;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}

должен сделать. Для большинства других областей есть знающие интерфейсы, см. Верхнюю часть этой страницы: http://struts.apache.org/2.0.11/struts2-core/apidocs/org/apache/struts2/interceptor/package-summary.html

Редактировать : Думая об этом, я не могу рекомендовать использовать куки для хранения языковых предпочтений. Но если вы сделаете это ... перехватчик i18n по умолчанию проверит, существует ли параметр с именем «request_locale», и установит значение в сеансе на это значение. Вы не хотите, чтобы значение сохранялось в сеансе. Но так как по умолчанию это делает struts2, вы можете сделать что-то вроде следующего:

  • создать свой собственный перехватчик i18n, который является копией существующих, но удаляет языковые данные, сохраненные в сеансе (таким образом, значение, помещаемое в сеанс, действительно существует только на время запроса).
  • создать функцию javascript, которая добавляется на каждую страницу (возможно, через некоторую систему шаблонов), которая после загрузки страницы ищет все теги привязки и теги формы. В случае тегов привязки добавляется параметр «request_local» в конец из значения, которое он находит в вашем файле cookie, и он добавляет скрытое поле к каждой форме, которое также устанавливает параметр «request_local» из файла cookie.
  • Я бы, вероятно, также поместил раскрывающийся список выбора языка на каждой странице, который устанавливает значение cookie и затем перезагрузил бы текущую страницу. Для идеи создания такого списка (хотя выпадающий список будет лучше, чем ссылки): Tiles2 Struts Switch Locale

Для получения информации о перехватчике i18n: http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/I18nInterceptor.html

Для функции JS, поскольку я неравнодушен к jQuery, я бы начал с этого: http://plugins.jquery.com/project/jsper

или это ...

http://plugins.jquery.com/project/Cookie

...