我想使一个网站多语言。
我有一个普通的拦截器堆栈,其中包含
<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{ .........
但是它没有用?!我是否缺少某些东西,还是应该编写自己的拦截器?
始终I18nInterceptor为每个Action 运行拦截器…它是defaultStack(在 struts- default.xml中 配置的)一部分,它存在是有原因的。
I18nInterceptor
defaultStack
它以一种简单的方式工作:如果有一个名为的请求参数request_locale,它将新的语言环境设置为会话。然后,在调用getText()或类似函数从本地化包中获取正确的消息时,将读取该值。
request_locale
getText()
从官方文档中:
拦截器,用于将会话中指定的语言环境设置为当前操作请求的语言环境。此外,此拦截器还将查找特定的HTTP请求参数,并将语言环境设置为提供的任何值。这意味着该拦截器可用于允许您的应用程序动态更改用户会话的语言环境,或者仅更改当前请求的语言环境(自XWork 2.1.3起)。这对于需要多语言支持并希望用户能够随时设置其语言首选项的应用程序非常有用。在执行此拦截器期间,将删除locale参数,以确保未在操作中没有典型对应设置程序的操作(例如request_locale)上设置属性。 例如,使用默认参数名称,对 foo.action?request_locale = en_US 的请求 ,然后将美国英语的语言环境保存在用户的会话中,并将用于以后的所有请求。 如果没有设置语言环境(例如第一次访问),则拦截器将使用浏览器语言环境。
拦截器,用于将会话中指定的语言环境设置为当前操作请求的语言环境。此外,此拦截器还将查找特定的HTTP请求参数,并将语言环境设置为提供的任何值。这意味着该拦截器可用于允许您的应用程序动态更改用户会话的语言环境,或者仅更改当前请求的语言环境(自XWork 2.1.3起)。这对于需要多语言支持并希望用户能够随时设置其语言首选项的应用程序非常有用。在执行此拦截器期间,将删除locale参数,以确保未在操作中没有典型对应设置程序的操作(例如request_locale)上设置属性。
例如,使用默认参数名称,对 foo.action?request_locale = en_US 的请求 ,然后将美国英语的语言环境保存在用户的会话中,并将用于以后的所有请求。
如果没有设置语言环境(例如第一次访问),则拦截器将使用浏览器语言环境。
一些用法示例: