我知道我可以使用"request_locale"参数调用 url,但这不会持续很长时间。也许把它放在饼干里?我不知道该怎么做。
经过几个小时的搜索,我发现:
- apache API 中的死链接很少
- 在会话属性"org.apache.struts.action.LOCALE"中设置区域设置
- 。或"request_locale">
- 。或"request_cookie_locale">
- 。或"WW_TRANS_I18N_LOCALE">
- 在 ActionContext.getContext() 中设置区域设置
- 关于拦截器的一些东西使我的应用程序抛出异常,所以我不知道我是否应该追求......
那里混合了支柱 1 和支柱 2,这并没有让事情变得更容易......
这是我到目前为止所拥有的:
在XML 配置中:
<action name="languageSelection" class="changeSelectionAction">
<result name="input" type="redirect">${redirectUrl}</result>
</action>
我想我会在用户选择语言后使用"输入"返回上一页。 重定向变量在我的操作类中定义。
在网页中:
<webwork:url id="url" action="languageSelection">
<webwork:param name="lang">fr</webwork:param>
</webwork:url>
<webwork:a href="%{url}">French</webwork:a>
这会发送"lang=fr",我可以在我的操作类中读取它。
在行动课中,我有:
HttpServletRequest request = ServletActionContext.getRequest();
String refererUrl = ServletActionContext.getRequest().getHeader("Referer"); // gives me the source page so I can go back to it.
setRedirectUrl(refererUrl);
String[] langs = request.getParameterValues("lang"); // getting the language the user selected
。随之而来的是大量不起作用的垃圾和对编译器的一些侮辱,这些侮辱被注释掉了。
我不是最好的Web开发人员,因此欢迎任何基本的Web建议。
您可以实现一个 i18n 拦截器,它可以将您的语言环境存储在会话或 cookie 中。见 https://struts.apache.org/core-developers/i18n-interceptor.html
<interceptor name="i18nCookie" class="org.apache.struts2.interceptor.I18nInterceptor"/>
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="i18nCookie">
<param name="localeStorage">cookie</param>
</interceptor-ref>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>
我们在默认拦截器堆栈中使用org.apache.struts2.interceptor.I18nInterceptor
。之后,struts 侦听参数request_locale
,每个获取?request_locale=LANGCODE
参数的操作都将更改用户的语言。通常,此设置存储在用户的会话中,因此请确保也启用了用户会话。
使用@TheSlavMan的链接,您可以阅读此拦截器可用的所有可能选项。
当然,一个简单的"更改语言并重定向到页面"操作是可能的。您走在正确的道路上,我的第一个猜测是将lang
参数更改为request_locale
。