2013-10-23 105 views
4

我想使网站多语言。i18n Struts2中的拦截器使用

我有一个包含

<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拦截器总是运行所有的动作,这是没有得到解决方案。因为用户单击区域设置管理器操作时,区域设置才会更改。

我试图删除拦截器栈和国际化的拦截只LocaleManager添加如下

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

但它没有工作?!我错过了什么,或者我应该写自己的拦截器?

+0

你到底想干什么?如果你想改变语言环境,那么你不需要采取行动来改变它。 –

回答

4

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

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

the official documentation

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

例如,使用默认参数名称,以 的foo.action?request_locale请求= EN_US,则美国英语语言环境是 保存在用户的会话,将用于以后的所有请求。

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


一些有用的例子: