在Struts2中使用I18n Interceptor

我想让网站多语言。

我有一个普通的拦截器堆栈,其中包含

 

用于更改区域设置的常见jsp:

  fa_IR فارسی   en_US English  

还有一个简单的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拦截器总是针对所有动作运行,这是没有得到解决方案的。 因为区域设置仅在用户单击locale-manager操作时更改。

我试图删除拦截器堆栈并仅将i18n拦截器添加到LocaleManager,如下所示

 @InterceptorRefs({ @InterceptorRef("i18n") }) public class LocaleManager extends ActionSupport{ ......... 

但它不起作用?! 我错过了什么,还是应该编写自己的拦截器?

总是为每个Action运行I18nInterceptor拦截器……它是defaultStack一部分(在struts-default.xml中配置),它是有原因的。

它的工作方式很简单:如果有一个名为request_locale的请求参数,它会将新的语言环境设置为session。 当调用getText()或类似函数从本地化bundle获取正确的消息时,将读取该值。

从官方文档 :

一个拦截器,它处理将会话中指定的语言环境设置为当前操作请求的语言环境。 此外,此拦截器将查找特定的HTTP请求参数,并将语言环境设置为提供的任何值。 这意味着此拦截器可用于允许您的应用程序动态更改用户会话的区域设置,或者仅用于当前请求(自XWork 2.1.3起)。 这对于需要多语言支持并希望用户能够在任何时候设置他或她的语言偏好的应用程序非常有用。 在执行此拦截器期间将删除locale参数,从而确保未在操作中没有典型相应setter的操作(例如request_locale)上设置属性。

例如,使用默认参数名称,对foo.action?request_locale = en_US的请求,然后美国英语的语言环境保存在用户的会话中,并将用于所有将来的请求。

如果没有设置区域设置(例如第一次访问),拦截器将使用浏览器区域设置。

一些用法示例:

  • Struts 2 – i18n或本地化示例
  • struts2中的本地化(i18n)
  • Struts 2 I18N(Struts 2 Interationalization)