struts2国际化支持

几年之前,应用程序开发者能够考虑到仅仅支持他们本国的只使用一种语言(或者有时候是 两种)和通常只有一种数量表现方式(例如日期、数字、货币值)的应用。然而,基于web技术的应用程序的爆炸性增长,以及将这些应用程序部署在 Internet或其它被广泛访问的网络之上,已经在很多情况下使得国家的边界淡化到不可见。这种情况转变成为一种对于应用程序支持国际化 (internationalization,经常被称做"i18n",因为18是字母"i"和字母"n"之间的字母个数)和本地化的需求。国际化是商业 系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。

Java国际化思路

Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。

Java程序的国际化主要通过如下3个类完成

Java.util.ResourceBundle:用于加载资源包
        Java.util.Locale:对应一个特定的国家/地区、语言环境
        Java.text.MessageFormat:用于将消息格式化

资源文件 
             为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多的 key-value对,其中key是程序使用的部分,而value是程序的显示部分。

资源文件的命名可以是如下3种形式:
                 baseName_language_country.properties
                 baseName_language.properties
                 baseName.properties

其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家。

Java支持的国家和语言 
            事实上,Java不可能支持所有的国家和语言,可以通过Locale类的getAvailableLocale方法获取支持的,该方法返回一个Locale数组,该数组中包含了所有支持的国家和语言。
             Locale [ ] locales = Locale.getAvailableLocales();

下面是程序示例:

[java] view plaincopy

  1. package com.ascent.i18n.test;
  2. import java.util.*;
  3. public class LocalTest {
  4. public static void main(String[] args) {
  5. Locale [] locales = Locale.getAvailableLocales();
  6. for(Locale locale:locales){
  7. //输出所有支持的国家 System.out.print(locale.getDisplayCountry()+":"+locale.getCountry());
  8. //输出所有支出的语言 System.out.println(locale.getDisplayLanguage()+":"+locale.getLanguage());
  9. }
  10. }
  11. }

程序会打印出所有支持的国家和语言

使用资源文件完成程序国际化

《1》首先编写两个资源文件,例如:
                     resource_zh_CN.properties
                     title=标题

resource_en_US.properties
                     title=title

《2》中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。
                  命令: native2ascii resource_zh_CN..properties  teme.properties
                           然后在将转好的编码拷贝替换到resource_zh_CN.properties,替换后是:
                    title=\u6807\u9898

国际化实例

[java] view plaincopy

  1. package com.ascent.i18n.test;
  2. import java.util.*;
  3. public class ResourceBundleTest {
  4. public static void main(String[] args) {
  5. //设置本地区语言(默认)
  6. Locale locale = Locale.getDefault();
  7. //可以使用Local的常量设置具体的语言环境
  8. //Locale locale = Locale.US;
  9. //根据地区不同加载不同的资源文件
  10. ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
  11. //根据key获得value值
  12. String title = rb.getString("title");
  13. System.out.println(title);
  14. }
  15. }<span style="color:#ff0000;">
  16. </span>

Java国际化包含占位符的消息

以上在资源文件配置的消息都是简单的消息,假如消息中含有参数,即有参数占位,我们
如何实现呢?例如下面消息:
英文:hello=Hello,{0}!Today is {1}.
中文:hello=你好,{0}!今天是{1}.

此时,我们需要使用MessageFormat类,该类有个很有用的静态的方法
format(String pattern,Object… values) 
返回后面多个参数值填充前面pattern字符串,其中pattern字符串就是一个带占位符的字符串。

[java] view plaincopy

  1. package com.ascent.i18n.test;
  2. import java.util.Date;
  3. import java.util.Locale;
  4. import java.util.ResourceBundle;
  5. import java.text.*;
  6. public class MessageFormatTest {
  7. public static void main(String[] args) {
  8. Locale locale = Locale.getDefault();
  9. ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
  10. String hello = rb.getString("hello");
  11. String result = MessageFormat.format(hello, "焦学理",new Date());
  12. System.out.println(result);
  13. }
  14. }

Struts 2的国际化入门

Struts 2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息---整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步封装,从而简化了应用程序的国际化。

Struts 2中加载全局资源文件
  
       Struts 2提供了很多加载国际化资源文件的方式,最简单.最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在 struts..xml文件中配置常量,还是在在struts.properties文件中配置常量,只需要配置 struts.custom.i18n.resources常量即可。

配置struts.custom.i18n.resources常量时,该常量值为全局国际化资源文件的baseName。

假如系统需要加载的国际化资源文件的baseName为properties/message,则我们
           可以在struts.properties文件中指定如下一行:
                    struts.custom.i18n.resources= properties.message

或者更好的做法是在struts.xml文件中配置如下的一个常量:
  
             <!-- 定义资源文件的位置和类型 -->
                 <constant name="struts.custom.i18n.resources" value="properties/message"/>

访问国际化资源

Struts2即可以在JSP页面中通过标签输出国际化消息,也可以在Action类中输出国际化消息,不管采用哪种方式,Struts2都提供了支持, 使用起来非常简单。

Struts2访问国际化消息主要在如下3种方式:
 
           1)为了在JSP页面中输出国际化消息,可以使用Struts2的<s:text…/>标签,该标签可以指定
               一个name 属性,该属性指定了国际化资源文件中的key.

2) 为了在Action类中访问国际化消息,可以使用ActionSupport类的getText方法,该方法可以接受一个name 参数,该参数指定了国际化资源文件中的key .

3) 为了在该表单元 Label里输出国际化信息,可以为该表单标签指定一个key属性, 该key指定了国际化资源文件中的key.

以项目中的登陆国际化为例,下面我们要做的是在项目中src下添加properties文件夹,下面添加资源文件 message_zh_CN.properties和message_en_US.properties

例如:
                 #资源文件的内容就是key-value对

message_zh_CN.properties内容:

loginPage=loginPage
                 errorPage=errorPage
                 welcomePage=welcomePage
                 showBooksPage=showBooksPage

message_en_US.properties内容:

loginPage=登陆页面
                  errorPage=错误页面
                  welcomePage=成功欢迎页面
                  showBooksPage=图书展现页面

提供了上面两份资源文件后,系统会根据浏览者所在的Locale来加载对应的语言资源文件.

[html] view plaincopy

  1. <%@ page language="java" contentType="text/html; charset=utf-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <html>
  4. <head>
  5. <!—使用s:text 标签输出国际化消息-->
  6. <title><s:text name="loginPage"/></title>
  7. </head>
  8. <body>
  9. <h3><s:text name="loginTip"/></h3>
  10. <!—在表单元素中使用key来指定国际化消息的key-->
  11. <s:form action="Login" method="post">
  12. <s:textfield name="username" key="user"/>
  13. <s:password name="password" key="password"/>
  14. <s:submit name="submit" key="submit" />
  15. </s:form>
  16. </body>
  17. </html>

上面的JSP页面中使用了<s:text…/>标签来直接输出国际化信息,也通过在表单元素中指定key属性来输出国际化信息.通过这种方式,就可以完成JSP页面中普通文本.表单元素标签的国际化.

如果在简体中文环境下,浏览该页面将看到如下图所示的页面

如果在控制面板中修改语言/区域,将机器的语言/区域环境修改成美国英语环境,再次浏览
该页面,将看到如下图页面

如果为了在Action中访问国际化消息,则可以利用ActionSupport类的getText方法.
下面是本示例应用中Action类的代码:

[java] view plaincopy

  1. public class LoginAction extends ActionSupport{
  2. public String execute(){
  3. if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
  4. ActionContext.getContext().getSession().put("user", this.getUsername());
  5. return SUCCESS;
  6. }
  7. return ERROR;
  8. }
  9. //完成输入校验需要重写的validate方法(读取资源文件getText(String str))
  10. public void validate(){
  11. //调用getText方法取出国际化信息
  12. if(getUsername()==null||"".equals(this.getUsername().trim())){
  13. this.addFieldError("username", this.getText("username.required"));
  14. }
  15. if(this.getPassword()==null||"".equals(this.getPassword().trim())){
  16. this.addFieldError("password", this.getText("password.required"));
  17. }
  18. }
  19. }

通过在Action类中调用ActionSupport类的getText通过这种方式,就可以取得国际化资源文
件中的国际化消息。通过这种方式,即使Action需要设置在下一个页面显示的信息,也无需
直接设置字符串常量,而是使用国际化消息的key来输出,从而实现程序的国际化。

参数化国际化字符串 (带有占位符)
许多情况下,我们都需要在运行时(runtime)为国际化字符插入一些参数,例如在输入验证
提示信息的时候。在Struts 2.0中,我们通过可以方便地做到这点。

《1》.如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使
用多个<s:param…/>标签来填充消息中的占位符。第一个<s:param…/>标签指定第一个占位
符值,第二个<s:param…/>标签指定第二个占位符值……依此类推。

实例中国际化资源文件中有如下国际化消息:
  
 #带占位符的国际化信息
    welcomeTip=欢迎,{0},您已经登陆成功!

《2》.如果需要在Action中填充国际化消息里的占位符,则可以通过在调用getText方法时使
用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充
占位符。该方法的第二个参数既可以是一个字符串数组,也可以是字符串组成的List对象,从
而完成对占位符,字符串数组、字符串集合中第二个元素将填充第二个占位符,依此类推。

为了在Action类中输出占位符的消息,我们在Action类中调用ActionSupport类的getText方
法,调用该方法时,传入用于填充占位符的参数值。访问该带占位符消息的Action类如下:

[java] view plaincopy

  1. public String execute(){
  2. if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
  3. //调用getText方法取出国际化信息,使用字符串数组传入占位符的参数值(          request范围)
  4. ActionContext.getContext().put("user", this.getText("welcomeTip",                   new String[]{this.getUsername()}));
  5. return SUCCESS;
  6. }
  7. return ERROR;
  8. }

通过上面的带参数的getText方法,就可以为国际化消息的占位符传入参数了。

为了在JSP页面中输出带两个占位符的国际化消息,只需要为<s:text…/>标签指定<s:param…/>子标签即可。下面是welcome.jsp页面的代码:

[html] view plaincopy

  1. <body>
  2. <!--使用s:text标签输出welcomeTip对应的国际化信息-->
  3. <s:text name="welcomeTip">
  4. <!--使用s:param为国际化信息的占位符传入参数-->
  5. <s:param><s:property value="username"/></s:param>
  6. </s:text>
  7. <br><br>
  8. <!-- 输出request范围内的user值(资源文件取值)-->
  9. request:${requestScope.user}
  10. <br>
  11. <a href="getBooks.action"><s:text name="welcomeLink"/></a>
  12. </body>

上面的页面使用${requestScope.user}输出的是Action类中取出的国际化消息,而通过
<s:text…/>标签取出的是另一个国际化消息,且使用了<param…/>标签为该国际化消息
的占位符指定了占位符值。登录成功进入后如图所示:

struts2国际化支持

时间: 2024-12-17 06:56:35

struts2国际化支持的相关文章

Struts2国际化

一:简单理解 国际化简称i18n,其来源是英文单词 internationalization的首末字符i 和n.18为中间的字符数. 随着全球经济的一体化,软件开发者应该开发出支持多国语言.国际化的Web应用.对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果. 国际化文件的命名规则: 1.基本名.properties 如:message.properties 2.基本名_语言编码_国家编码.properties 如:message_zh_CN.properties, messa

【转】Struts2国际化

原文章:http://www.cnblogs.com/hellokitty1/p/5083663.html 简单理解     国际化简称i18n,其来源是英文单词 internationalization的首末字符i 和n.18为中间的字符数.     随着全球经济的一体化,软件开发者应该开发出支持多国语言.国际化的Web应用.对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果.     国际化文件的命名规则:           1.基本名.properties 如:messa

[JavaWeb基础] 016.Struts2 国际化配置

如果一个软件想要让其受众是全球或者是几个国家的人,那么这个软件就需要支持多种语言,那么我们就需要软件的国际化去对一些文字信息进行国际化处理.web也一样,当外国人打开我们的网站,要是看到满屏幕的中文,他估计就傻了,好比我们看英文的,或者其他语言的网站时候也不舒服.那么,下面我们就来介绍下使用struts2如何来处理国际化. 1.首先要在strust.xml中在<struts>标签下配置<constant name="struts.custom.i18n.resources&qu

(六)Struts2 国际化

所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:国际化简介 国际化(Internationlization),通俗地讲,就是让软件实现对多种语言的支持. 让美国人看到的是英语,让中国人看到的汉语 第二节:Struts2 国际化设置 <constant name="struts.custom.i18n.resources" value="wishwzp"></consta

struts2学习(10)struts2国际化

一.国际化简介: 二.struts2国际化设置: struts.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dt

gettext模块实现Python国际化支持

1.gettext模块介绍 gettext模块为Python模块和应用程序提供国际化(i18n)和本地化(l10n)服务.它提供两套API,一套高层的类似于GNU gettext的API和一套基于类的API.前者适用于单语言的场景,并且语言的选择通常依赖于用户的locale,会全局性地影响到你整个应用程序语言的转译.后者允许你在一个python模块内进行本地化,非常适用于在应用程序运行时切换你的语言. 2.通用步骤 (1)无论是使用哪一套API,都必须提取可以翻译的字符串并且生成一个翻译模板文件

(转)QT中文乱码与国际化支持

Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性.Qt本身提供的linguist工具,用来实现翻译过程十分方便.MFC中利用资源DLL切换资源,或使用多个RC文件进行不同语言版本编译等方法都十分麻烦,如果你曾经使用过MFC,QT解决多语言问题的便捷性绝对会让你感觉是一种享受.本文讨论以下几个方面内容: 1.  QT中解决中文乱码的方法: 2.  QT中实现国家化支持. 3.  对话框实现多语言 一.       中文乱码 1.  在程序中直接使用中文,需要在程序

【Struts2系列】Struts2 国际化资源文件的机制原理

[Struts2国际化资源文件定义的3种范围方法] 1)全局的国际化资源文件,对所有的Action和View都有效 定义方式: 在struts.xml中增加全局资源文件定路径定义:        <constant name="struts.custom.i18n.resources" value="globalMessage"></constant> 对应的资源文件为classpath根目录位置: globalMessage.propert

struts2国际化全例 错误解决

在struts2中需要做国际化的有: jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化 在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过 view plaincopy to clipboardprint? <constant name="struts.custom.i18n.resources" value="message"></constant> 其中的message就