0

我已经实现了一个自定义 ActionMapper,它从 URI(URI 本身,而不是请求参数)获取语言环境。在 ActionMapper.getMapping() 中,如何设置当前操作的区域设置?

以下是我考虑过的一些想法:

  • ActionContext.getCurrent().setLocale()。不幸的是,似乎在调用操作时创建了一个新的 ActionContext,并且语言环境被重置为默认值。
  • 设置参数request_locale,将被i18n拦截器处理。不幸的是,i18n 拦截器坚持不仅要为当前操作设置区域设置,还要为当前会话设置区域设置,这会引发异常,因为我的应用程序没有启用会话。
  • 通过实现 setLocale() 设置参数并在操作本身中对其进行处理。直截了当,但这意味着没有一个拦截器可以访问语言环境。
  • 设置一个参数并编写一个拦截器(基本上做与 i18n 拦截器相同的事情,而不假设会话支持)。对于这样一个简单的问题似乎有点矫枉过正,更不用说重新发明轮子了。

有什么简单的方法可以实现这一目标吗?

4

2 回答 2

1

您可以在设置参数时使用提供的 I18nInterceptor:request_only_locale

而不是 request_locale

request_only_locale 仅存储请求的区域设置,不涉及会话。

干杯,基督徒

于 2011-04-20T08:31:56.503 回答
0

我确实最终设置了一个参数“locale”,并重写了 i18n 拦截器以使用它。

从 Struts 2.1.1 开始,ActionMapping 中的参数与请求参数是分开的。actionMappingParams 拦截器接受这些参数并将它们应用于动作对象。但是,我希望我的 i18n 拦截器使用“语言环境”参数而不是将其传递给操作,我是这样做的:

private static final String LOCALE_PARAMETER = "locale";

public String intercept(ActionInvocation invocation) throws Exception {
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext()
        .get(ServletActionContext.ACTION_MAPPING);
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER);

    if(locale != null) {
        ActionContext.getContext().setLocale(locale);
    }

    return invocation.invoke();
}

此自定义 i18n 拦截器必须位于拦截器堆栈中的 actionMappingParams 之前。

于 2009-09-01T08:22:07.690 回答