我想让网站多语言。
我有一个包含
的普通拦截器堆栈<interceptor-ref name="i18n" />
用于更改区域设置的常见jsp:
<s:a action="locale-manager" namespace="/common">
<s:param name="request_locale">fa_IR</s:param>
فارسی
</s:a>
<s:a action="locale-manager" namespace="/common">
<s:param name="request_locale">en_US</s:param>
English
</s:a>
一个简单的LocaleManager操作
public class LocaleManager extends ActionSupport{
private static final Logger log = LoggerFactory.getLogger(LocaleManager.class);
public String execute() {
log.debug("Change the local to {}", getLocale() );
return "homepage";
}
}
在上面的场景中,i18n拦截器总是针对所有动作运行,这是没有解决方案的。因为区域设置仅在用户单击区域设置管理器操作时更改。
我尝试删除拦截器堆栈并仅将i18n拦截器添加到LocaleManager,如下所示
@InterceptorRefs({ @InterceptorRef("i18n") })
public class LocaleManager extends ActionSupport{
.........
但它没用??我错过了什么,还是应该编写自己的拦截器?
答案 0 :(得分:4)
始终为每个操作运行I18nInterceptor
拦截器...它是defaultStack
的一部分(在struts-default.xml中配置),它有一个原因。
它的工作方式很简单:如果有一个名为request_locale
的请求参数,它会将新的语言环境设置为session。然后在调用getText()
或类似函数时从该本地化包中获取正确的消息时将读取该值。
处理设置会话中指定的语言环境的拦截器 作为当前操作请求的区域设置。另外,这个 拦截器将查找特定的HTTP请求参数并进行设置 提供任何值的语言环境。这意味着这一点 拦截器可用于动态地允许您的应用程序 更改用户会话的区域设置,或者仅用于 当前的请求(自XWork 2.1.3起)。这非常有用 需要多语言支持并希望用户使用的应用程序 能够在任何时候设置他或她的语言偏好。语言环境 参数在执行此拦截器时被删除, 确保不在动作上设置属性(例如 request_locale)你的中没有典型的相应setter 动作。
例如,使用默认参数名称,请求 foo.action?request_locale = en_US ,然后美国英语的区域设置是 保存在用户的会话中,将用于将来的所有请求。
如果没有设置区域设置(例如第一次访问),则 拦截器使用浏览器区域设置。
一些用法示例: