我的 struts 应用程序中有两个或三个 i18n 文件。我可以通过Global.LOCALE_KEY
在会话中设置变量来在这些之间切换。
有没有办法为应用程序设置默认语言环境(我猜可能在 struts-config.xml 文件中)?会话是设置语言环境的唯一地方吗?
当然,我可以拦截对第一页的调用并在会话中设置变量,但这更麻烦。
在您的 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 版本。
可能有更好的方法来做到这一点,这只是我继承的代码。
如果要在创建会话时设置会话,可以使用 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 方法“以编程方式”添加它
嗯,我终于通过编写 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");
}
}
如果您只需要选择一个资源文件作为默认值,只需省略文件名中的语言代码:
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>