我的struts应用程序中有两个或三个i18n文件。我可以通过在会话中设置Global.LOCALE_KEY
变量来切换它们。
有没有办法为应用程序设置默认语言环境(我猜可能在struts-config.xml文件中)?会话是唯一设置区域设置的地方吗?
当然,我可以拦截第一页的调用并在会话中设置变量,但这更麻烦。
答案 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