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

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

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

不过,所谓“没有最好,只有更好”。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 World</title>
    </head>
    <body>
       
    <h2><s:text name="HelloWorld"/></h2>
       
    <h2><s:property value="%{getText('HelloWorld')}"/></h2>
    </body>
    </html>
  6. 发布运行应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.jsp ,出现图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. 使用<s:i18n>标志访问特定路径的properties文件。使用方法请参考我早前的文章《常用的Struts 2.0的标志(Tag)介绍》。在您使用这一方法时,请注意<s:i18n>标志的范围。在<s:i18n name="xxxxx">到</s:i18n>之间,所有的国际化字符串都会在名为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. 使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从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">
<!--
   
function langSelecter_onChanged() {
        document.langForm.submit();
    }
//-->
</script>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<s:bean id="locales" name="tutorial.Locales"/>
<form action="<s:url includeParams="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有<s:form>标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。

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

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

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

分布运行程序,在浏览器的地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.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 阅读(73128) 评论(123)  编辑  收藏 所属分类: Struts 2.0系列
评论共2页: 1 2 下一页 

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

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

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

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

保存 为Hello.properties保存在Hello.class一个目录中
然后改 了 SayHello.jsp的 <title>把原来标签的改成了
<title><s:text name="context.name" /></title>
保存
可浏览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 | crayz
更正下
<title><s:text name="context.name" /></title>
应该是<title><s:text name="context.hello" /></title>
没有写错~
  回复  更多评论
  
# 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 | jiajia
我的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 | ddd
请问,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 | EricaseJang
你好。您的文章很实用。
我想问一下,如果我的文字是通过
<s:i18n name="struts">
<s:text name="demo"/>
</s:i18n>
来读取并显示的,那么有没有办法设置多种语言呢?
必须手动的先判断浏览器语言设置然后指定不同的资源文件吗?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-05-09 13:56 | EricaseJang
呵呵,搞定了。像刚开始那样子就行了。  回复  更多评论
  
# 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。例如
http://localhost:8080/Struts2_i18n/HelloWorld.action?request_locale=zh_CN,
http://localhost:8080/Struts2_i18n/HelloWorld.action?request_locale=en
大约拦截器在拦截到该参数后自动做了String与Locale之间的类型转换。  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-05-29 21:50 | jezz
我也测试了你的第一个例子
控制台报错我没用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 | jezz
我现在成功了!
但是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 | tafse
你好,我在Action中用ActionContext.getContext().setLocale(Locale.TAIWAN)设置区域,但是一直不成功,只显示在properties中的名字,这是为什么?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-06-25 11:29 | king
你好。问下你的例子有源码吗 ?
能不能给发个阿!!!!
谢谢!!!!!!!!!
majun4678@163.com  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-06-29 11:51 | eric
如何解决显示时中文乱码的问题?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 | yiwuyun
many thanks 没有你的提点,我始终找不到乱码的根源 。下了你说的那个插件之后,马上就查出自己文件中的乱码了。  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-07-23 15:38 | abao
struts.custom.i18n.resources=globalMessages 后面的值和前面的东西表示什么?是写死的吗?
<%@taglib prefix="s" uri="/struts-tags"%>这里的URI指向哪里啊?
为什么在JSP中调用<s:出错?????
<h2><s:text name="HelloWorld"/></h2>
<h2><s:property value="%{getText('HelloWorld')}"/></h2>
  回复  更多评论
  
# 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 | aaron
@crayz


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

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

max哥..你真是我的偶像. 是你让我觉得struts2如此的容易。.
拜一拜!  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-08-31 17:22 | tf
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,下载地址:http://propedit.sourceforge.jp/eclipse/updates/
还想问一下其他的朋友,如果不用这个插件,怎么才能输入中文不报错!!!!!!!  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-09-24 11:44 | Jackson
@初级
如果不装这个插件的话,我是把内容先输入记事本中,然后在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 中使用带参数的国际化资源,
请问怎么用?。。

**拦截器
<validators>
。。。。。。。。。。
<field name="birthday">
<field-validator type="date">
<message key="date.format.bad" />
</field-validator>
</field>
</validators>
------------------------
**国际化资源文件
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 中使用
<message key="{}errors.required" />
这种应该怎么用。。?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-11-21 17:10 | feng
max:
能不能给我份源码呀 是那个《为Struts 2.0做好准备》的源码
我现在在看struts2的国际化
想具体的看一下 可是不知道如何入手 谢谢了
我的email: duguzhongnuo@163.com
谢谢了  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2007-11-21 17:13 | feng
我按照你的方法做了个例子
可是出不来 是不是文件的存放路径有关呀
急 急 急  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-11-22 16:26 | leesword
请问我用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 | hahha
@大貓
怎么出来的  回复  更多评论
  
# 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 | Jasen Hsu
@crayz
struts.custom.i18n.resources=pa.properties
后缀除去
struts.custom.i18n.resources=pa  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2007-12-28 16:13 | ElgooG
不好用啊  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-01-07 16:11 | apple
谢谢你这长时间来教授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 | Leasen
楼上的可能是路径放的不对 你放SRC目录下试一下

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

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

publicclass Locales {

public Map<String, Locale> getLocales() {

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

public void setCurrent(Locale cur){
this.current = cur;
}

Map<String, Locale> locales =new Hashtable<String, Locale>(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
@winnow
你用bean标签取这个类的实例时,传入current参数就可以了。current参数取的时候和设置那个select的value一样的,取session,没有的话取浏览器设置。
<s:bean id="locales" name="Locales">
<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>

  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-03-29 13:01 | shenxinhui
@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 | yjwxfpl
效果出不来,可以发份源码到我的邮箱不??
谢谢:liuhuajun17@tom.com
路径的问题搞得头都大啦!!!  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-06-02 17:20 | gj123
建立包一级的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 | bampool
谢谢

struts2中还有一种嵌入参数动态应用方案,希望能加以描述
<s:text id="title" name="item.edit"><s:param><s:text name="employee"/></s:param></s:text>


item.edit={0} bearbeiten
  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-06-18 16:56 | kiki
max大哥,<s:property value="%{getText('HelloWorld')}" />怎么显示的是空的阿?
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%20Files/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%20Files/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%20Files/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%20Files/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%20Files/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%20Files/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%20Files/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%20Files/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 | kiki
。。。
搞定了,我把*.properties,struts.xml几个文件都放到src文件夹下就搞定了,原来是放在webRoot下的classes文件夹下的,搞错了好像,应该放在web-inf文件夹下的classes文件夹下。

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

^_^,一个不小心就错了  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-06-18 19:25 | kiki
<c:out value="${a>b?'a>b':'a<=b'}" />
请问这个在struts2里要怎么输出呢?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-08-06 11:48 | winny
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-08-12 15:14 | an
<form action="<s:url includeParams="get" encode="true"/>" name="langForm" 里边的<s:url includeParams="get" encode="true"/>,其中 includeParams="get" 的作用是改变语言的时候把当前url下的request参数保留下来吧?
例如:url: http://xxxx.action?para1=value1
改变语言后,希望是http://xxxx.action?para1=value1&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 | wangs130
为什么jsp就不拦截,/* 不是拦截所有文件吗?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-10-06 10:36 | N.J.Paul
eclipse3.4,应该用那个版本的propedit插件呢?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-04 20:30 | Charles
@bird

浏览器的工具-Internet选项-语言-把美国英语放在最上面  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-12-05 15:30 | txy
我照你的方法去做了,但选择下拉框索引没有反应? 请问这是什么原因
谢谢!  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2008-12-05 16:02 | txy
ok了,谢谢!  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-10 10:55 | aaa
test  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2008-12-10 11:05 | aaa
你好!我也是按你说的方法这样用的:
<%@page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<s:include value="LangSelector.jsp"/>
<h2><s:text name="HelloWorld"/></h2>
开始运行时初始页面是对的,但为什么选择下拉菜单后没有变化?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-01-21 15:34 | 胡炯
我不知道怎么用你说的那个插件来进行转码???谢谢   回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-03-26 02:22 | this
@tf
字符编码错了  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-04-09 01:20 | hoist
写的很好,要点突出  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-04-12 10:11 | 舞命小丢
好文章啊!正需要呢  回复  更多评论
  
# re: 在Struts 2.0中國際化(i18n)您的應用程序[未登录] 2009-04-15 16:37 | wind
推 看了你的這篇文章,又更了解 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 | hoist
假如要动态进行国际化,比如一篇文章要多个语言版本,要同时有数据库支持,可能比较麻烦吧?  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-05-20 14:56 | 服装批发
谢谢分享  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2009-05-22 01:02 | sadfdf
很想 研究國際化 但是老是沒興趣  回复  更多评论
  
# 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 | yanqing
第二个例子,怎么浏览器中什么也没有,也是按你的例子那样弄得,不知道哪儿错了。不过,那个HelloWorld好像没赋值吧,怎么取出来的那个值  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2011-08-15 10:22 | test
@bird
工具--》internate选项--》语言  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序[未登录] 2011-09-28 14:01 | hunter
812866605@qq.com 求一份源码,谢谢啦  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2011-12-29 15:21 | 幸运皮
谢谢楼主分享,谢谢指点思路.  回复  更多评论
  
# 关于中文乱码的问题 2012-09-14 17:18 | alexie
今天按照例子做了下,发现当浏览器用中文的时候,会出现乱码,上面的文章中也没有介绍方法,搜了下可以参考下面的:
==========================
解决的方法(如果没有安插件的话):
在你安装的jdk里找到native2ascii.exe这个可执行文件,打开,然后把你要显示的中文字粘贴到里面,点回车,会出来一串字符,再把这串字符输入到globalMessages_zh_CN.properties这个文件里就可以了
  回复  更多评论
  
# re: 在Struts 2.0中国际化(i18n)您的应用程序 2012-12-26 16:01 | zhb
你好 messiiiii,使用了struts2的国际化,项目发布运行后,大约是在session失效的时间过后,切换中文(给request_locale赋值:zh_CN)的时候无法得到中文,页面显示了资源文件中的key值,但其他语言是正常的,请问这是什么原因呢?  回复  更多评论
  
评论共2页: 1 2 下一页 

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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问