【问题标题】:i18n Interceptor usage in Struts2Struts2 中 i18n 拦截器的使用
【发布时间】:2013-10-23 15:46:00
【问题描述】:

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

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

<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{
  .........

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

【问题讨论】:

  • 你想做什么?如果您想更改语言环境,则无需执行任何操作来更改它。

标签: java jsp struts2 internationalization struts2-interceptors


【解决方案1】:

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

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

来自the official documentation

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

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

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


一些使用示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多