在Struts2中使用I18n Interceptor

时间:2013-10-23 15:46:01

标签: java jsp struts2 internationalization struts2-interceptors

我想让网站多语言。

我有一个包含

的普通拦截器堆栈
<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{
  .........

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

1 个答案:

答案 0 :(得分:4)

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

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

来自the official documentation

  

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

     

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

     

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


一些用法示例: