4

我想制作一个多语言网站。

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

<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 拦截器始终针对所有操作运行,但没有得到解决方案。因为仅当用户单击 locale-manager 操作时,区域设置才会更改。

我尝试删除拦截器堆栈并将 i18n 拦截器仅添加到 LocaleManager 如下

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

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

4

1 回答 1

4

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

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

官方文档

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

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

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


一些使用示例:

于 2013-10-23T16:14:53.347 回答