随笔-34  评论-1965  文章-0  trackbacks-0

国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么web框架,它都是必须掌握的技能。

其实,struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入file-name_xx_xx.properties(其中file-name为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用标志输出即可。

不过,所谓“没有最好,只有更好”。struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。

国际化hello world

下面让我们看一个例子——helloworld。这个例子演示如何根据用户浏览器的设置输出相应的helloworld。

  1. 在eclipse创建工程配置开发和运行环境(如果对这个步骤有问题,可以参考我早前的文章《为struts 2.0做好准备》)。
  2. 在src文件夹中加入struts.properties文件,内容如下:
    struts.custom.i18n.resources=globalmessages
    struts 2.0有两个配置文件,struts.xml和struts.properties都是放在web-inf/classes/下。
    • struts.xml用于应用程序相关的配置
    • struts.properties用于struts 2.0的运行时(runtime)的配置
  3. 在src文件夹中加入globalmessages_en_us.properties文件,内容如下:
    helloworld=hello world!
  4. 在src文件夹中加入globalmessages_zh_cn.properties文件,内容如下:
    helloworld=你好,世界!
    在此想和大家分享一个不错的编写properties文件的eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等unicode文本时,就不必再使用native2ascii编码了。您可以通过eclipse中的软件升级(software update)安装此插件,步骤如下:
    1、展开eclipse的help菜单,将鼠标移到software update子项,在出现的子菜单中点击find and install;
    2、在install/update对话框中选择search for new features to install,点击next;
    3、在install对话框中点击new remote site;
    4、在new update site对话框的name填入“propedit”或其它任意非空字符串,在url中填入http://propedit.sourceforge.jp/eclipse/updates/;
    5、在site to include to search列表中,除上一步加入的site外的其它选项去掉,点击finsih;
    6、在弹出的updates对话框中的select the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于eclipse 3.2版本的朋友);
    7、点击finish关闭对话框;
    8、在下载后,同意安装,再按提示重启eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,eclpise中所有properties文件的文件名前有绿色的p的图标作为标识。
  5. 在webcontent文件夹下加入helloworl.jsp文件,内容如下:
    <%@ page  contenttype="text/html; charset=utf-8"%>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
       
    <title>hello worldtitle>
    head>
    <body>
       
    <h2><s:text name="helloworld"/>h2>
       
    <h2><s:property value="%{gettext('helloworld')}"/>h2>
    body>
    html>
  6. 发布运行应用程序,在浏览器地址栏中输入 ,出现图1所示页面。
    图1 中文输出
    图1 中文输出
  7. 将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。
    图2 英文输出
    图2 英文输出
上面的例子的做法,与struts 1.x的做法相似,似乎并不能体现struts 2.0的优势。不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。其实,这就是struts 2.0的一个优势,因为它默认支持el,所示我们可以用gettext方法来简洁地取得国际化字符串。另外更普遍的情况——在使用ui表单标志时,gettext可以用来设置label属性,例如:
<s:textfield name="name" label="%{gettext('username')}"/>

资源文件查找顺序

之所以说struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在struts 2.0中有下面几种方法:

  1. 使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;
  2. 使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_xx.properties文件。这就适用于在包中不同类访问的资源;
  3. 使用action范围的资源文件。做法为action的包下新建文件名(除文件扩展名外)与action类名同样的资源文件。它只能在该action中访问。如此一来,我们就可以在不同的action里使用相同的properties名表示不同的值。例如,在actonone中title为“动作一”,而同样用title在actiontwo表示“动作二”,节省一些命名工夫;
  4. 使用标志访问特定路径的properties文件。使用方法请参考我早前的文章《常用的struts 2.0的标志(tag)介绍》。在您使用这一方法时,请注意标志的范围。在之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,struts 2.0就会输出默认值(国际化字符串的名字)。

上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而struts 2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示:

图3 资源文件查找顺序图
图3 资源文件查找顺序图

假设我们在某个childaction中调用了gettext("user.title"),struts 2.0的将会执行以下的操作:

  1. 查找childaction_xx_xx.properties文件或childaction.properties;
  2. 查找childaction实现的接口,查找与接口同名的资源文件myinterface.properties;
  3. 查找childaction的父类parentaction的properties文件,文件名为parentaction.properties;
  4. 判断当前childaction是否实现接口modeldriven。如果是,调用getmodel()获得对象,查找与其同名的资源文件;
  5. 查找当前包下的package.properties文件;
  6. 查找当前包的父包,直到最顶层包;
  7. 在值栈(value stack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源;
  8. 查找在struts.properties配置的默认的资源文件,参考例1;
  9. 输出user.title。

参数化国际化字符串

许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在struts 2.0中,我们通过以下两种方法做到这点:

  1. 在资源文件的国际化字符串中使用ognl,格式为${表达式},例如:
    validation.require=${gettext(filename)} is required
  2. 使用中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:
    validation.between=date must between {0, date, short} and {1, date, short}
在显示这些国际化字符时,同样有两种方法设置参数的值:
  1. 使用标志的value0、value1...valuen的属性,如:
    <s:text name="validation.required" value0="user name"/>
  2. 使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:
    <s:text name="validation.required">
       
    <s:param value="user name"/>
    s:text>

让用户方便地选择语言

开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在struts 2.0中,通过actioncontext.getcontext().setlocale(locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(scenario),所以struts 2.0为您提供了一个名i18n的拦截器(interceptor),并在默认情况下将其注册到拦截器链(interceptor chain)中。它的原理为在执行action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化locale对象,并将其设为用户默认的区域(locale),最后,将此locale对象保存在session的名为“ww_trans_i18n_locale”的属性中。

下面,我将提供一完整示例演示它的使用方法。

package tutorial;

import java.util.hashtable;
import java.util.locale;
import java.util.map;

publicclass locales {
   
public map<string, locale> getlocales() {
       map
<string, locale> locales =new hashtable<string, locale>(2);
       locales.put(
"american english", locale.us);
       locales.put(
"simplified chinese", locale.china);
       
return locales;
   }

}
tutorial/locales.java

<%@taglib prefix="s" uri="/struts-tags"%>
<script type="text/javascript">

script>
<s:set name="session_locale" value="#session['ww_trans_i18n_locale']"/>
<s:bean id="locales" name="tutorial.locales"/>
<form action="get" encode="true"/>" name="langform" 
    style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
    language:
<s:select label="language" 
        list
="#locales.locales" listkey="value"    listvalue="key"
        value
="#session_locale == null ? locale : #session_locale"
        name
="request_locale" id="langselecter" 
        onchange
="langselecter_onchanged()" theme="simple"/>
form>
langselector.jsp

上述代码的原理为,langselector.jsp先实例化一个locales对象,并把对象的map类型的属性locales赋予下拉列表(select) 。如此一来,下拉列表就获得可用语言的列表。大家看到langselector有标志和一段javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到action。在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“ww_trans_i18n_locale”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。

你可以把langselector.jsp作为一个控件使用,方法是在jsp页面中把它包含进来,代码如下所示:
<s:include value="/langselector.jsp"/>

在例1中的hellloworld.jsp中后加入上述代码,并在struts.xml中新建action,代码如下:
<action name="helloworld">
   
<result>/helloworld.jspresult>
action>

或者,如果你多个jsp需要实现上述功能,你可以使用下面的通用配置,而不是为每一个jsp页面都新建一个action。
<action name="*">
   
<result>/{1}.jspresult>
action>

分布运行程序,在浏览器的地址栏中输入,出现图4所示页面:
图3 helloworld.action
图3 helloworld.action

在下拉列表中,选择“american english”,出现图5所示页面:
图3 helloworld.action
图4 helloworld.action
可能大家会问为什么一定要通过action来访问页面呢?
你可以试一下不用action而直接用jsp的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。这表示不能正常运行的。其原因为如果直接使用jsp访问页面,struts 2.0在web.xml的配置的过滤器(filter)就不会工作,所以拦截器链也不会工作。
posted on 2006-11-01 19:06 max 阅读(72866) 评论(123)     所属分类: struts 2.0系列
评论共2页: 1   

评论:
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-03-23 19:43 |
辛苦啦:)
请教一个问题,我想把list里的内容存在资源文件中,比如说:
我写了两个单选钮分别用来表示男和女,我试验了好多次都
行不通,多谢了!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-03-24 22:32 | max
@coombe
你可以用gettext()在代码读取资源文件。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-03-27 09:41 |
非常感谢^_^
不过,如果我没猜错的话,你是想让我在action的input方法里用gettext读出资源,然后再生成list对象传到页面。

这种方法是可行的,不过有时也会出问题。比如说,我给页面添加了自动校验功能,如果校验失败,list对象就没了:(在execute方法里再传一遍都不行:(

后来实在没办法,我就把它放到了session里了。但是感觉这种方法太龌龊了,所以就问你一下啦:)

我现在的做法是把list里的元素单个保存在资源文件里,然后在页面里读出来之后再拼装。不知道你有没有更好的方法?
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-12 09:57 |
你好~刚接触struts的新手
我依照你的 为struts 2.0做好准备 测试成功
然后在想自己添加properties文件 。
定义一个properties文件 里面添加了
context.hello=it's a fine day today

保存 为hello.properties保存在hello.class一个目录中
然后改 了 sayhello.jsp的 把原来标签的改成了 <br><title><s:text name="context.name" />
保存
可浏览sayhello.jsp时标题显示为context.name而不是我定义的
it's a fine day today
用gettext 的话则出现 标题为空的情况


接着我按照文档 把hello.properties文件改成
package.properties放 到跟目录 失败
放到classes目录 失败..
放到tutorial目录也 失败


自定义properties文件
在classes文件夹中新建 struts.properties
添加了 struts.custom.i18n.resources=pa.properties
hello.properties也相应改成了pa.properties 放到classes文件夹
也失败了..
已经困惑两天了..
你看我哪里出错了?
struts.xml 和web.xml都没动
lib加了最需要的5个jar(我用的是2.06之有个core.jar 没有struts2-api和struts2-extra.jar)
运行环境是tomcat 6.0

谢谢了

  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-12 09:59 |
更正下
<s:text name="context.name" />
应该是<s:text name="context.hello" />
没有写错~
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-13 09:50 | max
@crayz
可能你漏了什么东西,要不我把我的源代码发给你。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-16 22:37 |
propedit插件里的vi插件包是模拟vi编辑器环境的吧?我看不需要安装。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-23 15:30 |
我的action名字叫loginaction,我在同一个包下面建了loginaction.properties的文件,就是不能读资源文件里的信息,请问是不是要有什么jar包,我现在的jar有:commons-logging-1.0.4.jar,
commons-validator-1.3.0.jar,freemarker-2.3.8.jar,ognl-2.6.11.jar,struts2-core-2.0.6.jar,xwork-2.0.1.jar  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-24 13:08 |
请问,properties文件,需要设置什么编码?

默认识iso-8859-1的, 无法输入中文。。

还有, propedit偶得无法更新, 提示需要其他的包。。。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-04-24 16:06 |
我使用struts.properties配置的struts.custom.i18n.resources=globalmessages 国际化就可以

可是在对应的包下面放package.properties 内容一样
国际化就显示不了

  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-04-24 16:40 |
试验了一下,基本情况是这样的
只有在struts.properties中配置的struts.custom.i18n.resources=xxxxxx
才适用于所有的jsp页面

如果是定义的package级别的,或者action级别的多语种x.properties文件
必须要通过访问定义的xxx.action才可以填充jsp页面的多语种信息

  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-04-25 09:38 | max
@jiajia
应该不是欠jar包的问题,因为一般欠jar包,都会有classnotfoundexception的。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-09 11:51 |
你好。您的文章很实用。
我想问一下,如果我的文字是通过



来读取并显示的,那么有没有办法设置多种语言呢?
必须手动的先判断浏览器语言设置然后指定不同的资源文件吗?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-09 13:56 |
呵呵,搞定了。像刚开始那样子就行了。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-19 19:34 |
文个问题,以前用struts1的时候,我喜欢在全局资源文件用用很多带参数的国际化字符串,尤其是和验证有关的,比如errors.required={} is required。这样在velidate中可以使用参数化的调用。感觉很方便。但到了struts2里面,似乎没有这个功能了。想问一下,在struts2中怎么在验证器中实现国际化。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-22 01:43 |
最近又试了一下,直接提交一个带request_locale参数的超链接也可以改变locale。例如
,

大约拦截器在拦截到该参数后自动做了string与locale之间的类型转换。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-29 21:50 |
我也测试了你的第一个例子
控制台报错我没用ide就是手工写的
错误信息如下:
[2007-05-29 21:23:38,290] [http-8080-1] debug com.opensymphony.xwork2.config.con
figurationmanager - checking configurationproviders for reload.
[2007-05-29 21:23:38,321] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=[com.opensymphony.xwork
2.defaulttextprovider@1142196], property=org]
[2007-05-29 21:23:38,493] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=[com.opensymphony.xwork
2.defaulttextprovider@1142196], property=struts]

哪个struts.properties文件和其他的文件不知道放在那?
如果方便的话就把源文件发给我!谢谢!
我的email:lijie250#gmail.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-30 21:27 | max
@jezz
struts.properties放在src文件夹(源代码的根目录)下。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-30 21:49 |
我现在成功了!
但是tomcat的控制台有很多错误信息!
不知道那设置错了!
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=[com.opensymphony.xwork
2.actionsupport@16877f8, com.opensymphony.xwork2.defaulttextprovider@1d95da8], p
roperty=templatedir]
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=org.apache.struts2.util
.attributemap@5a2eaa, property=templatedir]
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.xwork
mappropertyaccessor - entering getproperty (ognl.ognlcontext@3a55c38f,org.apache
.struts2.util.attributemap@5a2eaa,templatedir)
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=[com.opensymphony.xwork
2.actionsupport@16877f8, com.opensymphony.xwork2.defaulttextprovider@1d95da8], p
roperty=templatedir]
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=[com.opensymphony.xwork
2.actionsupport@16877f8, com.opensymphony.xwork2.defaulttextprovider@1d95da8], p
roperty=templatedir]
[2007-05-30 21:40:35,843] [http-8080-1] debug com.opensymphony.xwork2.util.insta
ntiatingnullhandler - entering nullpropertyvalue [target=org.apache.struts2.util
.attributemap@5a2eaa, property=templatedir]
[2007-05-30 21:40:35,843] [http-8080-1] debug org.apache.struts2.components.uibe
an - rendering template /template/simple/select
[2007-05-30 21:40:35,843] [http-8080-1] debug freemarker.cache - template/simple
/select.ftl[zh_cn,utf-8,parsed] cached copy not yet stale; using cached.
[2007-05-30 21:40:35,843] [http-8080-1] debug org.apache.struts2.components.temp
late.freemarkertemplateengine - rendering template /template/simple/select.ftl
[2007-05-30 21:40:35,859] [http-8080-1] debug freemarker.cache - template/simple
/scripting-events.ftl[zh_cn,utf-8,parsed] cached copy not yet stale; using cache
d.
[2007-05-30 21:40:35,859] [http-8080-1] debug freemarker.cache - template/simple
/common-attributes.ftl[zh_cn,utf-8,parsed] cached copy not yet stale; using cach
ed.
[2007-05-30 21:40:35,859] [http-8080-1] debug com.opensymphony.xwork2.config.con
figurationmanager - checking configurationproviders for reload.  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-06-08 22:04 |
max兄、你说的那个插件安完以后.properties文件是有p字样式绿色标识、但是怎么使用?

8、在下载后,同意安装,再按提示重启eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,eclpise中所有properties文件的文件名前有绿色的p的图标作为标识。

形似vi的按钮?能否截个图看、或再解释下如何用  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-06-14 09:38 | max
@随风歌唱
很简单,你直接在*.properties文件输入中文字符,在保存的时候,插件自动将其转为ascii编码。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-06-19 11:23 |
你好,我在action中用actioncontext.getcontext().setlocale(locale.taiwan)设置区域,但是一直不成功,只显示在properties中的名字,这是为什么?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-06-25 11:29 |
你好。问下你的例子有源码吗 ?
能不能给发个阿!!!!
谢谢!!!!!!!!!
majun4678@163.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-06-29 11:51 |
如何解决显示时中文乱码的问题?properties文件编码是utf-8,jsp页面也是  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-06-30 23:51 | max
@eric
properties文件应该是ascii编码方式的,如\u4e2d\u6587这样的格式,否则在java中会读到乱码。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-04 17:05 |
你好,我参考按照您的方法也做了国际化的试验,但是遇到下面的问题。
当ie设置为en-us时显示正常:
hello world
hello world
但是当设置成为zh-cn时,却显示为:
helloworld
请问引起这个问题的原因大概是什么呢
谢谢

  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-04 23:28 | max
应该找不到对应的国际化字符串所致,请检查你的globalmessages_zh_cn.properties文件的内容是否正确。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-11 13:29 |
many thanks 没有你的提点,我始终找不到乱码的根源 。下了你说的那个插件之后,马上就查出自己文件中的乱码了。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-23 15:38 |
struts.custom.i18n.resources=globalmessages 后面的值和前面的东西表示什么?是写死的吗?
<%@taglib prefix="s" uri="/struts-tags"%>这里的uri指向哪里啊?
为什么在jsp中调用



  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-23 23:56 | max
@abao
1、struts.custom.i18n.resources=globalmessages配置struts 2的全局资源文件的位置,你可以写成struts.custom.i18n.resources=xxx.xx形式;

2、<%@taglib prefix="s" uri="/struts-tags"%>的uri其实指向的是:struts2-core-2.0.8.jar中的meta-inf/struts-tags.tld文件;

3、你所谓的出错是什么意思?ide的提示,如果只是如此可以不用理会;否则请检查struts2-core-2.0.8.jar是否在你的“build path”里面。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-07-27 17:55 |
@crayz


把所有文件保存,
重新启动tomcat,
重新打开ie进行浏览

我也遇到和你一样的问题,就这样解决了
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-07-28 21:26 |
@yiwuyun
哈哈,给大家补充一下,我在实践中发现的。
如果表单提交的时候使用就不会出现乱码,
但是用提交就会出现乱码。可能struts2.0内部会自动实现转换吧,
而不会自动转换。还有一个有趣的现象,你把prefix="s" 改为
prefix="ww" 再把后面的所有改为一样可以正常运行。
而且还不止,你改为其他任意的都可以。比如改为当然前面的也要改。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-13 12:46 |
博主,我建的工程老是报脚本错误。您能否给我一份您的源码?我的邮箱:crazycl@163.com。谢谢您了。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-17 08:30 |
max大哥,你太猛了. 你现在是我的目标.
我现在每天都到你这学struts2.0.  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-17 11:22 |
十分感谢你的关于struts 2的一系列文章,最近我正在学习struts 2,你的文章讲解的很全面细致,所以很感谢你的文章!
请问你的文章来源是哪里,能不能共享一下,因为我赶时间,另外请问你关于struts2与webwork2有什么区别和进步,有没有这方面的文章,多谢指教!
希望楼主能够指教,我的email:wychi714813@yahoo.com.cn  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-23 21:26 |
max 哥..
我按照你的东西来写。他提示错误.
麻烦你把第二个的源代码给我一份.谢谢max哥了
9803912@qq.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-23 21:36 |
max哥.不用传了。我调通了。
原来是一个包的名字写错啦..

max哥..你真是我的偶像. 是你让我觉得struts2如此的容易。.
拜一拜!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-08-31 17:22 |
globalmessages_zh_cn.propertiesl里输入中文后保存就会出错,
请问max这是什么原因?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-09-09 16:52 |
@tf
你是不没装max说的插件,就是那个propedit,我开始没装输入中文就报错,但是装上后就好了,我eclipse用3.2,下载的是propedit_4.4.0.zip,这个适合eclipse 3.0 3.1 3.2,下载地址:
还想问一下其他的朋友,如果不用这个插件,怎么才能输入中文不报错!!!!!!!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-09-24 11:44 |
@初级
如果不装这个插件的话,我是把内容先输入记事本中,然后在dos下运行native2ascii.exe,将记事本中的内容拷贝到dos环境下,回车就可以输出中文的ascii码了!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-10-05 13:37 |
@想飛就飛:
"如果是定义的package级别的,或者action级别的多语种x.properties文件
必须要通过访问定义的xxx.action才可以填充jsp页面的多语种信息"
您可以把實例發一份給我嗎?謝謝,我的郵箱是anne.yang@stella.com.hk
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-10-05 13:40 |
@max:
上面的問題,max先生有時間的話能給我發個實例嗎?謝謝了!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-10-06 10:54 |
大家都忙著過節了吧,我終於鼓搗出來了!
不過還是要謝謝max和想飛就飛所指的方向!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-10-09 11:05 |
如果你的第2个例子输入/helloworld.jsp的时候语言能改变就更好了。
例子上要求的时候/helloworld.action,感觉这样不好,怎么才能直接输入/helloworld.jsp,选择语言就能起作用?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-11-19 16:03 |
我想在拦截器的中使用参数化的国际化资源,
比如说我想用 message 的 key 中使用带参数的国际化资源,
请问怎么用?。。

**拦截器

。。。。。。。。。。






------------------------
**国际化资源文件
date.format.bad={0}日期格式错误

---------------------
请问 这两个地方应该怎么写,才能在页面得到如下效果:
** 生日日期格式错误
谢谢!!
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-11-20 14:05 |
@不用名字行不行
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-05-19 19:34 | 不用名字行不行
问个问题,以前用struts1的时候,我喜欢在全局资源文件用用很多带参数的国际化字符串,尤其是和验证有关的,比如errors.required= {} is required。这样在velidate中可以使用参数化的调用。感觉很方便。但到了struts2里面,似乎没有这个功能了。想问一下,在 struts2中怎么在验证器中实现国际化。
------------
我也遇到了这个问题,就是想在xxx-validation.xml 中使用

这种应该怎么用。。?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-11-21 17:10 |
max:
能不能给我份源码呀 是那个《为struts 2.0做好准备》的源码
我现在在看struts2的国际化
想具体的看一下 可是不知道如何入手 谢谢了
我的email: duguzhongnuo@163.com
谢谢了  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-11-21 17:13 |
我按照你的方法做了个例子
可是出不来 是不是文件的存放路径有关呀
急 急 急  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-11-22 16:26 |
请问我用struts 2 在 action 里面设置

session.put(globals.locale_key,
locale.china);
之后,它的跳转页面又包含其他页面时,(例如这个action 跳到index.jsp,index.jsp 又包括header.jsp,header.jsp 包含有国际化字段)这个locale信息不能传到header.jsp页面,也就不能实现国际化,我在struts1里面都可以成功的,不知道在struts2里面为何会这样,能不能解决呢?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-11-23 14:34 |
@leesword
需要通过action 来访问 jsp 。。  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-11-26 15:18 |
@大貓
怎么出来的  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-12-03 16:06 |
请问 max :

struts.xml , struts.properties , productaction-conversion.properties,
globalmessages.properties,globalmessages_zh_cn.properties

这些配置文件 默认 都要 放在 classpath下面 , 也就是 \web-inf\classes下面.

这样文件多的时候总感觉有点乱,

有没有 办法 把这些文件 分别放在不同文件夹下面. 在 web.xml里面指定一下地址.  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-12-04 09:00 |
请教一下 :

langselector.jsp 文件中 :

value="#session_locale == null ? locale : #session_locale"

这句话 ? 后面的 locale 是什么意思,是哪里来的 ?

谢谢  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-12-11 17:07 |
@crayz
struts.custom.i18n.resources=pa.properties
后缀除去
struts.custom.i18n.resources=pa  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2007-12-28 16:13 |
不好用啊  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-01-07 16:11 |
谢谢你这长时间来教授struts2,就是问你下,为什么在我的struts.properties配置文件不起作用啊,就是说随便写什么都没反映,例如加上struts.custom.i18n.resources=globalmessages
但globalmessages_zh_cn.properties根本就没加载,是什么 原因啊???
struts.properties配置文件能自动加载吗?还需要想哪个文件里配置它的位置吗???
谢谢楼主,告诉我的struts.properties配置文件不起作用的原因??
我的油箱:dujian886@126.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-01-08 17:21 |
楼上的可能是路径放的不对 你放src目录下试一下

麻烦楼主把国际化例子的源码发一份给我,先谢过了

leasen@gmail.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-02-22 17:47 |
学习  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-02-28 14:57 |
您好 能否发份源码给我 我弄的总是有问题,中文不显示
hua_xing_dong@sina.com  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-03-13 02:42 |
@coombe
你可以像例子里面那样把list以list或者map形式放在一个类里面,然后在页面用bean标签取出来,这不过需要在这个类里面取国际化资源,这个和action类里面取有点不一样,如下:

publicclass locales {

public map getlocales() {

//引入变量,用户locale
private locale current;

public void setcurrent(locale cur){
this.current = cur;
}

map locales =new hashtable(2);

//用 java.util.resourcebundle声明一个资源束来获取国家化资源。
resourcebundle bundle = resourcebundle.getbundle("mymessageresource" , current);

//把国际化资源中的消息添加到map key当中
locales.put(bundle.getstring("american english"), locale.us);
locales.put(bundle.getstring("simplified chinese"), locale.china);
return locales;
}
}

打完收工!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-03-13 02:46 |
@winnow
你用bean标签取这个类的实例时,传入current参数就可以了。current参数取的时候和设置那个select的value一样的,取session,没有的话取浏览器设置。




  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-03-29 13:01 |
@override
public void validate() {
if( "".equals(this.getusername().trim()) || null == this.getusername()) {

this.addfielderror("username", this.gettext("username.validation"));
}
if( "".equals(this.getpassword()) || null == this.getpassword() ) {

this.addfielderror("password", this.gettext("password.validation"));
}
}

username.validation={0} is required!
password.validation={0} is required!


{0} 这个参数怎么传递进去呀?大哥 帮忙解决一下  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-04-07 18:10 |
国际化的功能是很好,但在radio 和select表单中的list内如何写呢? 我实验了很多写法都没成功.
可以给一个例子吗?
不胜感谢!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-04-30 16:06 |
效果出不来,可以发份源码到我的邮箱不??
谢谢:liuhuajun17@tom.com
路径的问题搞得头都大啦!!!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-06-02 17:20 |
建立包一级的properties,怎么都出不来呢~~
我有个package为test,其中包含一个action为hello.class
那我的包一级的properties是应该放在哪?文件名叫什么?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-06-05 19:00 |
我照你的方法去做了,但选择下拉框索引没有反应? 请问这是什么原因  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-06-07 22:42 |
谢谢

struts2中还有一种嵌入参数动态应用方案,希望能加以描述



item.edit={0} bearbeiten
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-06-18 16:56 |
max大哥,怎么显示的是空的阿?
struts.custom.i18n.resources=globalmessages
这个也是没有问题的阿

而且还报下面的错误
debug 2008-06-18 16:49:22.718 [freemark] (): could not find template in cache, creating new one; id=[template/xhtml/text.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:22.812 [freemark] (): compiling freemarker template template/xhtml/text.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/xhtml/text.ftl
debug 2008-06-18 16:49:23.843 [freemark] (): could not find template in cache, creating new one; id=[template/xhtml/controlheader.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:23.875 [freemark] (): compiling freemarker template template/xhtml/controlheader.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/xhtml/controlheader.ftl
debug 2008-06-18 16:49:24.671 [freemark] (): could not find template in cache, creating new one; id=[template/xhtml/controlheader-core.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:24.703 [freemark] (): compiling freemarker template template/xhtml/controlheader-core.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/xhtml/controlheader-core.ftl
debug 2008-06-18 16:49:25.000 [freemark] (): could not find template in cache, creating new one; id=[template/xhtml/tooltip.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:25.031 [freemark] (): compiling freemarker template template/xhtml/tooltip.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/xhtml/tooltip.ftl
debug 2008-06-18 16:49:25.078 [freemark] (): could not find template in cache, creating new one; id=[template/simple/text.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:25.093 [freemark] (): compiling freemarker template template/simple/text.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/simple/text.ftl
debug 2008-06-18 16:49:25.500 [freemark] (): could not find template in cache, creating new one; id=[template/simple/scripting-events.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:25.515 [freemark] (): compiling freemarker template template/simple/scripting-events.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/simple/scripting-events.ftl
debug 2008-06-18 16:49:25.531 [freemark] (): could not find template in cache, creating new one; id=[template/simple/common-attributes.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:25.578 [freemark] (): compiling freemarker template template/simple/common-attributes.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/simple/common-attributes.ftl
debug 2008-06-18 16:49:25.593 [freemark] (): could not find template in cache, creating new one; id=[template/xhtml/controlfooter.ftl[zh_cn,utf-8,parsed] ]
debug 2008-06-18 16:49:25.609 [freemark] (): compiling freemarker template template/xhtml/controlfooter.ftl[zh_cn,utf-8,parsed] from jar:file:/d:/program files/apache-tomcat-5.5.26/webapps/struts2helloworld/web-inf/lib/struts2-core-2.0.9.jar!/template/xhtml/controlfooter.ftl
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-06-18 17:14 |
。。。
搞定了,我把*.properties,struts.xml几个文件都放到src文件夹下就搞定了,原来是放在webroot下的classes文件夹下的,搞错了好像,应该放在web-inf文件夹下的classes文件夹下。

而放在src下面,部署的时候eclipse自然会把它们部署到web-inf/classes文件夹下

^_^,一个不小心就错了  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-06-18 19:25 |

请问这个在struts2里要怎么输出呢?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-08-06 11:48 |

这个插件怎么安装不了  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-08-12 15:14 |
" name="langform" 里边的,其中 includeparams="get" 的作用是改变语言的时候把当前url下的request参数保留下来吧?
例如:url:
改变语言后,希望是&request_locale=zh_cn
不过很遗憾,我试过para1这个参数丢掉了

我系统中其他使用 includeparams="get" 的地方都没问题

请问max,还需要其他地方的什么设置么?
或者,这个是struts2的bug  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-09-24 17:01 |
select表单中的list内如何实现国际化,可以给一个例子吗? 我的邮箱是zhangxh164110@163.com,谢谢  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-09-26 12:23 |
为什么jsp就不拦截,/* 不是拦截所有文件吗?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-10-06 10:36 |
eclipse3.4,应该用那个版本的propedit插件呢?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-04 20:30 |
@bird

浏览器的工具-internet选项-语言-把美国英语放在最上面  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-12-05 15:30 |
我照你的方法去做了,但选择下拉框索引没有反应? 请问这是什么原因
谢谢!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2008-12-05 16:02 |
ok了,谢谢!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-10 10:55 |
test  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-10 11:05 |
你好!我也是按你说的方法这样用的:
<%@page contenttype="text/html; charset=utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>


hello world




开始运行时初始页面是对的,但为什么选择下拉菜单后没有变化?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-01-21 15:34 |
我不知道怎么用你说的那个插件来进行转码???谢谢   回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-03-26 02:22 |
@tf
字符编码错了  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-04-09 01:20 |
写的很好,要点突出  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-04-12 10:11 |
好文章啊!正需要呢  回复  
  
# re: 在struts 2.0中國際化(i18n)您的應用程序[未登录] 2009-04-15 16:37 |
推 看了你的這篇文章,又更了解 struts2了  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-04-17 20:12 |
不错,学习了。  回复  
  
# 看帖要回帖 2009-04-24 17:09 |
怎么所有的都一样 没有特色……  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-05-02 10:38 |
假如要动态进行国际化,比如一篇文章要多个语言版本,要同时有数据库支持,可能比较麻烦吧?  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-05-20 14:56 |
谢谢分享  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-05-22 01:02 |
很想 研究國際化 但是老是沒興趣  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-06-18 11:01 |
挺厉害的 定一个  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2009-09-14 19:16 |
大哥偶想通过jsp页面直接访问,而不是通过action访问,能这样实现吗?
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2011-06-07 18:00 |
很好,谢谢您的无私奉献!  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2011-06-07 18:01 |
很好  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2011-07-25 09:51 |
第二个例子,怎么浏览器中什么也没有,也是按你的例子那样弄得,不知道哪儿错了。不过,那个helloworld好像没赋值吧,怎么取出来的那个值  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2011-08-15 10:22 |
@bird
工具--》internate选项--》语言  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序[未登录] 2011-09-28 14:01 |
812866605@qq.com 求一份源码,谢谢啦  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2011-12-29 15:21 |
谢谢楼主分享,谢谢指点思路.  回复  
  
# 关于中文乱码的问题 2012-09-14 17:18 |
今天按照例子做了下,发现当浏览器用中文的时候,会出现乱码,上面的文章中也没有介绍方法,搜了下可以参考下面的:
==========================
解决的方法(如果没有安插件的话):
在你安装的jdk里找到native2ascii.exe这个可执行文件,打开,然后把你要显示的中文字粘贴到里面,点回车,会出来一串字符,再把这串字符输入到globalmessages_zh_cn.properties这个文件里就可以了
  回复  
  
# re: 在struts 2.0中国际化(i18n)您的应用程序 2012-12-26 16:01 |
你好 messiiiii,使用了struts2的国际化,项目发布运行后,大约是在session失效的时间过后,切换中文(给request_locale赋值:zh_cn)的时候无法得到中文,页面显示了资源文件中的key值,但其他语言是正常的,请问这是什么原因呢?  回复  
  
评论共2页: 1   

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图