0

我的 struts 应用程序中有两个或三个 i18n 文件。我可以通过Global.LOCALE_KEY在会话中设置变量来在这些之间切换。

有没有办法为应用程序设置默认语言环境(我猜可能在 struts-config.xml 文件中)?会话是设置语言环境的唯一地方吗?

当然,我可以拦截对第一页的调用并在会话中设置变量,但这更麻烦。

4

4 回答 4

3

在您的 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 版本。

可能有更好的方法来做到这一点,这只是我继承的代码。

于 2008-12-05T12:13:46.497 回答
1

如果要在创建会话时设置会话,可以使用 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 方法“以编程方式”添加它

于 2016-04-27T01:34:27.170 回答
0

嗯,我终于通过编写 Java 代码而不是使用 struts-config.xml 解决了这个问题。

我创建了一个上下文侦听器来设置 Struts 类中静态字段的值。

看到这个问题:Is there a way to run a method/class only on tomcat startup?

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");
    }
} 
于 2008-12-08T12:27:40.537 回答
0

如果您只需要选择一个资源文件作为默认值,只需省略文件名中的语言代码:

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

编辑:mode如果您在默认模式下定义消息(如果您省略该属性 ,则会选择该模式),则 Struts 1.x 中存在一个关于默认消息处理的错误:

<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>
于 2008-12-14T23:11:19.460 回答