Struts 1.3: Как установить локаль по умолчанию в веб-приложении? - PullRequest
0 голосов
/ 05 декабря 2008

У меня есть два или три файла i18n в моем приложении Struts. Я могу переключаться между ними, устанавливая переменную Global.LOCALE_KEY в сеансе.

Есть ли способ установить локаль по умолчанию для приложения (наверное, в файле struts-config.xml)? Является ли сеанс единственным местом для установки локали?

Конечно, я мог бы перехватить вызов на первой странице и установить переменную в сеансе, но это более громоздко.

Ответы [ 4 ]

3 голосов
/ 05 декабря 2008

В вашем web.xml вы можете определить контекстный параметр:

<context-param>
    <param-name>LOCALE</param-name>
    <param-value>en-GB</param-value>
</context-param>

Тогда в вашем веб-приложении:

java.util.Enumeration<String> setout = servletContext.getInitParameterNames();
while (setout.hasMoreElements()) {
    String paramName = setout.nextElement();
    configProperties.put(paramName, servletContext.getInitParameter(paramName));
}

хотя вам придется изменить эту строку свойств, чтобы вместо этого прикрепить ее к сеансу. Возможно, вам понадобится взломать версию ActionComponentServlet, которая выполняет предварительную инициализацию, как это.

Вероятно, есть лучший способ сделать это, это просто код, который я унаследовал.

1 голос
/ 27 апреля 2016

Если вы хотите настроить сеанс по мере его создания, вы можете использовать HttpSessionListener. Настройка локали по умолчанию для каждого нового сеанса будет выглядеть примерно так:

package com.mycompany.web.session;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.struts.Globals;

public class LocaleController implements HttpSessionListener {

    private static Locale defaultLocale = locale.ENGLISH;

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        event.getSession().setAttribute(Globals.LOCALE_KEY, defaultLocale);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
    }
}

Затем вы добавляете этот элемент в ваш файл web.xml:

<listener>
    <listener-class>com.mycompany.web.session.LocaleController</listener-class>
</listener>

Или вы можете добавить его «программно» методом ServletContext.addListener

0 голосов
/ 15 декабря 2008

Если вам просто нужно, чтобы файл ресурса был выбран по умолчанию, просто опустите код языка в имени файла:

Texts_en_GB.properties
Texts_pt_BR.properties
Texts.propertiers ( <-- this one will be selected when no resources for requested language could be found)

EDIT: В Struts 1.x есть ошибка, связанная с обработкой сообщений по умолчанию, если вы определяете свои сообщения в режиме по умолчанию (который будет выбран, если вы пропустите свойство mode):

<message-resources key="Texts" parameter="com.mycompany.Texts" null="false"/>

и язык по умолчанию не совпадает с языком в свойствах без постфикса: Texts.properties.

Допустим, наш Texts.properties файл будет содержать текст на английском языке. Дополнительно есть немецкий перевод: Texts_de.properties. Наш системный языковой стандарт по умолчанию - французский, потому что мы работаем на французском сервере (и мы не указали его явно).

Если ваш первый запрос после запуска сервера запрашивает перевод страницы на немецкий язык, все последующие запросы на той же странице будут обрабатываться на немецком языке, если для запрошенного кода языка нет файла явных свойств.

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

Решением этой проблемы является установка свойства mode для каждого объявления ресурса сообщения:

<message-resources key="Texts" parameter="com.mycompany.Texts" null="false">
    <set-property key="mode" value="JSTL" />
</message-resources>
0 голосов
/ 08 декабря 2008

Хм, я наконец решил эту проблему, написав Java-код вместо использования struts-config.xml.

Я создал прослушиватель контекста для установки значения статического поля в классе Struts.

См. Этот вопрос: Есть ли способ запустить метод / класс только при запуске tomcat?

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class AppContextListener implements ServletContextListener {
    @Override
    public void contextDestroyed(ServletContextEvent event) { /* empty. */ }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        /*
         * Default locale
         */
        ServletContext sc = event.getServletContext();
        sc.setAttribute(org.apache.struts.Globals.LOCALE_KEY, "pt_BR");
    }
} 
...