Struts 1.3:如何在Web应用程序中设置默认语言环境?

时间:2008-12-05 11:54:10

标签: java locale struts-1

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

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

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

4 个答案:

答案 0 :(得分:3)

在您的web.xml中,您可以定义一个context-param:

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

然后在你的webapp中预先显示:

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

虽然您必须更改该属性行以将其粘贴在会话上。您可能需要修改一个像这样进行预初始化的ActionComponentServlet版本。

可能有更好的方法,这只是我继承的代码。

答案 1 :(得分:1)

如果要在创建会话时设置会话,可以使用HttpSessionListener。为每个新会话设置默认语言环境如下所示:

"password"

然后将此元素添加到web.xml文件中:

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) {
    }
}

或者你可以通过方法ServletContext.addListener“以编程方式”添加它

答案 2 :(得分: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");
    }
} 

答案 3 :(得分: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)

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

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

并且默认语言环境与没有后缀的属性中的语言不同:Texts.properties

假设我们的Texts.properties文件包含英文文本。另外还有德语翻译:{{1​​}}。我们的默认系统区域设置是法语,因为我们在法语服务器上运行(我们没有明确地设置它)。

如果您在服务器启动后的第一个请求请求页面的德语翻译,则如果没有所请求语言代码的显式属性文件,则将以德语提供同一页面的所有后续请求。

如果第一个请求要求提供英文页面,如果所请求的语言代码没有明确的属性文件(这是我们想要的),则每个后续同一页面的请求将以英语提供。

此问题的解决方案是为每个消息资源声明设置mode属性:

Texts_de.properties