Localization struts2本地化方法是将区域设置代码嵌入到操作名称中,而不是使用…?request_locale=<;地区代码>;

Localization struts2本地化方法是将区域设置代码嵌入到操作名称中,而不是使用…?request_locale=<;地区代码>;,localization,internationalization,struts2,Localization,Internationalization,Struts2,大家好, 我想在一个用struts 2编写的网站上实现本地化功能。据我所知,这样做的标准方式是以以下方式使用get: http://.../namespace/action_name?request_locale= 然而,我的老板不喜欢这样毛茸茸的url。相反,我需要用以下方式来写: http://.../namespace/a_param//another_param... 我尝试将struts.xml中的动作映射更改为 {2} ... 它不起作用 我把它换成 {2} ...

大家好,

我想在一个用struts 2编写的网站上实现本地化功能。据我所知,这样做的标准方式是以以下方式使用get: http://.../namespace/action_name?request_locale=

然而,我的老板不喜欢这样毛茸茸的url。相反,我需要用以下方式来写:

http://.../namespace/a_param//another_param...

我尝试将struts.xml中的动作映射更改为

{2} ...

它不起作用

我把它换成

{2} ...

它也不起作用,不是吗

顺便说一句,我知道有一个诀窍,就是放置ActionContext.getContext().setLocale(新语言环境(…);实际上,它基本上改变了该实例的区域设置。然而,这种效果似乎只是暂时的(相比之下,i18n在会话中保存所选的区域设置,这基本上使其非常持久)

那么,如何通过在url中嵌入区域设置代码来更改区域设置呢


非常感谢您的帮助=D

我对本地语言没有做太多的工作,但是i18n应该通过标题自动从浏览器中确定正确的本地语言,url中不需要任何内容。只要特定区域设置有语言包,它就会尝试从该文件中提取属性

本页展示了一个使用基本i18n的示例(只看了一会儿,我个人总是从开始,但教程/指南有点枯燥)

为什么您需要引用url中与语言有关的任何内容?就个人而言,如果用户确实希望覆盖默认区域设置,我将提供某种形式的控件(菜单)这样做。然后我将在会话中设置一个变量,然后我将创建一个拦截器,该拦截器将使用会话上的本地参数(当然,如果有值集的话)调用操作上的setLocale。这样,就不需要将参数嵌入到各个页面中,并且本地参数一起不在url中

有一种方法可以满足你对url的需求……我想这与允许在动作名称中使用斜杠的约定和斜杠有关。如果我记得的话,我会发回。但我认为上述方法通常是一种更好的方法

编辑:考虑到您试图实现的目标,我可以看到两种截然不同的解决方案

(一)您可以使用代理,传入的URL www.example.com/en/和www.example.com/fr/可以映射到不同的web应用程序,甚至是同一个web应用程序,但URL会被重新写入适合您的应用程序的表单中。可以这样做的工具包括:iptables、apache mod_rewrite、squid…和其他许多工具。这种类型的解决方案如果在一台服务器上处理多个ip地址/URL/应用程序,则更具价值

2) 您可以设置struts2属性struts.enable.SlassessionNames,然后使用通配符执行以下操作:

<action name="*/*">
  <result>/WEB-INF/content/{1}/{2}.jsp</result>
<action>

/WEB-INF/content/{1}/{2}.jsp
您还可以将参数传递给操作,操作名称中的每个星号都会变成{1}、{2}等等。听起来您可能需要此功能。如果其他人知道我现在不知道如何使用struts2 conventions插件捕获url的一部分,这样动作就可以利用它们,我会觉得很有趣

@四元数

基本意图是,该网站有几个国家级的“子网站”。根据用户的ip地址,他/她将被重定向到国家“子网站”。这就像当你打开www.google.com时,你可能会被重定向到www.google.com.country_域

每个国家的“子网站”都有几种语言,其中有一种默认语言。这就像当你打开谷歌以色列网站时,默认情况下你会看到一个用希伯来语写的网站,尽管你可以通过选择英语来覆盖这个默认选择

在我计划的网站中,以以色列网站和希伯来语为例,应该是这样的:

  • 用户在以色列
  • 他正在打开www.abcdef.com
  • 服务器正在识别客户端在以色列。以色列“子网站”可选择3种语言:希伯来语、阿拉伯语、英语。默认值为希伯来语,但客户端可以覆盖此选项
  • 然后将用户重定向到www.abcdef.com/il/he(“il”代表以色列国家,“he”代表希伯来语)
  • 但用户显然是英国游客,不懂希伯来语或阿拉伯语。所以他/她选择了英语
  • 他/她将被重定向到www.abcdef.com/il/en(“en”代表英语)
  • 下次客户再次在以色列打开www.abcdef.com时(假设cookies和会话仍然存在),他/她将被重定向到www.abcdef.com/il/en

  • thx fr your help=D

    我肯定会把处理区域设置的责任交给一个合适的人

    下面是一个教程

    这个拦截器可以放在一个由所有(或大多数)传入请求共享的公共堆栈中,它将分配区域设置

    ActionContext.getContext().setLocale(locale);
    
    具有适当的逻辑,可以考虑:

    • 查询字符串参数
    • 存储的用户首选项
    • 饼干
    • 会议
    • 浏览器首选项(在请求中)

    最好使用“评论”按钮添加评论,对于这样大的问题,我建议编辑您的原始问题。您对谷歌语言选择的描述不准确。本地/地理位置和首选语言之间存在差异。例如,我在加拿大,但如果我清除浏览器缓存并选择我的首选语言为Chinese/China,则www.google.ca将以中文呈现,而不会首先默认为英语或法语(尽管有)