`
jdluojing
  • 浏览: 18014 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Struts2学习笔记(十五) 国际化(Internationalization)

 
阅读更多

概述

国际化(Internationalization),通途的讲,就是让软件实现对多种语言的支持。可以通过简单的设置就可以从一种语言切换到另一种语言。用的最多的地方就是在应用程序的界面表示上。我们经常接触到一些软件,他们支持多种语言,并且可以随用户的切换。比如我们常用的eclipse就是。通常在实现多语言支持时尽量保持亮点:

(1)不给软件开发带来过多的额外负担。

(2)实现语言切换或者添加新语言支持不需要修改已经完工的软件(代码)

Struts2也提供了对国际化的支持,它的国际化功能建立在Java自带的国际化的基础之上,并且对它做了更好的扩展,使得我们在Struts2中使用国际化功能变得更加轻松。

Java内置的国际化支持

在java中与国际化相关的有两个最重要的类:ResourceBoundle和Local。其中Local用于提供地区和语言信息,而ResourceBoundle就负责加载和解析我们编写的国际化信息文档。要实现对不同语言的支持就需要我们在加载资源文件的时候指定一个Local对象,那么ResourceBoundle就会根据我们提供的Local对象来查找相应的资源文件。

下面我们就利用Java内置的国际化支持来做一个练习:

public class Test {

public static void main(String[] args) {

ResourceBundle b = ResourceBundle.getBundle("message");

String msg = b.getString("hello");

System.out.println(msg);

}

}

我们在Src(classpath)目录下新建一个message.properties文件,内容如下:

msg = hello world

运行程序,正确输出hello world。

我们将程序稍加修改:

ResourceBundle b =ResourceBundle.getBundle("message",Locale.SIMPLIFIED_CHINESE);

在src(classpath)目录下再新建一个message_zh_CN.properties文件:

msg=\u4F60\u597D\uFF01 (你好!)

再次运行程序,控制台将输出”你好!”而不再是”helloworld”了,这就是因为我们指定了Local对象。一般在web引用程序中,这个参数都是通过浏览器来传递。

这里要说明一下,刚才我们新建的message_zh_CN.properties文件的名字不是随便起的。要想让Java能够自动识别这些资源文件,那么我们的文件命名具有一定的规则:

basename_languageCode_countryCode.properties

如果只是有basename而没有语言代码和国家代码,那么就是我们在程序中使用系统默认Local对象时会读取的文件,另外就是我们指定了Local但是找不到相应的资源文件时也会读取这个文件。

这些语言代码和国家代码,我们都可以从网上查到,一般不需要我们死记硬背。下面是一些常见的语言代码和国家代码:


提醒:如果使用中文,那么这些中文必须保存为unicode编码。

向国际化信息传参数

有时候我们在消息输出时才能确定消息的具体内容,那么我们可以使用一些方法来实现国际化信息的参数传递(实际是对字符串的处理)(此例摘自网上):

消息文件:

abela = your order({0})is confirmed,can not be modified

测试类:

1. publicclassTest{

2. publicstaticvoidmain(String[]args){

3. //选择中文

4. Localelocale1=Locale.SIMPLIFIED_CHINESE;

5. //选择message这组文件

6. ResourceBundlebundle1=ResourceBundle.getBundle("message",locale1);

7. //选择其中的labela这一项

8. Stringmessage=bundle1.getString("labela");

9. //将参数合成进读出的国际化信息

10. Stringinfo=MessageFormat.format(message,"201009290001");

11. System.out.println(info);

12. }

13. }

输出:yourorder(201009290001)isconfirmed,cannotbemodified

除了使用properties文件之外,Java还支持通过类文件来提供这些消息信息。这个可以在网上找些参考资料。另外就是Java自带的国际化功能,对资源文件的位置有些限制,如果我们将上面的message.propterties移动到Test类所在的目录,运行程序就会报错,找不到资源文件。Struts2中对资源文件的位置更加灵活,我们可以在多个地方配置这些顺序,框架会按照一定的优先级来寻找。

Struts2中的国际化支持

我们在学习验证框架的时候就已经开始接触到Struts2的国际化功能了。那时我们只是将错误信息放置在ActionClass.properties文件中。并且可以通过从ActionSupport类中继承来的getText方法来获取对应的信息。后来我们学习输入校验时也用到了这些知识。现在我们已经知道ActionSupport类实现了TextProvider接口,实际上是通过TextProvider的实现类TextProviderSupport类来完成一些功能的,底层还是使用了Java内建的国际化支持功能。不过做了一些优化,使用起来更加方便了。

资源文件查找顺序:

(1)Action类属性文件。该文件的名字(basename)和相关的Action类名字相同并且存放在相同的目录下。

(2)Action类实现的接口的属性文件(包括父类实现的接口)。

(3)Action类的各个父类的属性文件。

(4)如果Action实现了ModelDriven接口,那么Struts2将调用getModel方法并从域对象的类开始沿着继承关系进行(1)(2)(3)顺序的搜索。

(5)默认的包文件属性。(package.properties)

(6)集成关系中下一个父包中包属性文件

(7)全局资源。

全局资源需要我们在struts.xml中使用常量指定:

<constantname="struts.custom.i18n.resources"value="message"/>

如果有多组,用逗号隔开。这些属性文件必须放在Classpath下。

注:上面说的这些顺序都是覆盖关系,即只要一找到合适的资源,就不再继续搜索!

下面我们动手做一个实例,首先定义一个空的接口ITest,并且编写ITest.properties文件:

msg= I'm from ITest

接下来写一个Test动作实现Itest接口:

public class Test extends ActionSupport implements ITest {

	private String msg;

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	@Override
	public String execute() throws Exception {
		
		msg = getText("msg");
		return SUCCESS;
	}
}

Success.jsp中输出Test的msg属性。

在浏览器中访问test动作(配置略):


下面我们再为Test类编写对应的属性文件:

msg = I'm from Test

再次在浏览器中访问测试:


由此可以看出Struts在寻找资源文件时的顺序。

使用标签完成国际化信息显示

在Action中我们可以通过使用getText方法来获取国际化信息,但是在视图页面,我们就需要使用另一种方式了。一种方式是使用OGNL表达式来调用getText方法。另外Struts2还提供了两个用于国际化的标签。这里我们只做大致的了解,关于标签的使用,需要的时候可以查看手册。

text标签

这个标签有两个属性:

name:指定要在属性文件中检索的key

var:指定了属性,相当于将检索出来的值放入该变量中(该变量压入valueStack),而不是输出,在后面的标签中可以通过引用该变量名来获取对应的值。

<s:text name="msg" var="v"></s:text>

<s:property value="#v"/>

使用该标签进行国际化信息输出时就相当于在<s:property>标签中调用getText方法。

通过这个标签还可以实现我们前面说的国际化消息参数化的功能。通过在其中嵌套<s:param>标签来实现。

资源文件:msg = I'm from {0}

调用:

<s:text name="msg">

<s:param>struts2</s:param>

</s:text>

输出:I'm from {0}

没有正确解析,修改了下,去掉资源文件中 I’m中的单引号,解析正常。

i18n标签

i18n标签将加载一个自定义的ResourceBopundle。可能需要使用定制ResourceBoundle的原因:

(1)你想利用ListResourceBoundle把一些键与一些非String对象关联起来

(2)你希望对某个键进行某种预处理

(3)消息来自一个比较特殊或少间的资源,需要进行某种转换才能输出

如果给定的定制ResourceBoundle没有找到,那么他会去搜索默认的资源文件。

我们使用i18n来指定消息文件的来源,但是还是要使用text标签来进行显示(处理)。I18n标签有一个name属性,它是用来指定我们要加载的资源的。

(1)全局级国际化信息资源:直接用文件前缀名即可—message。

(2)包级国际化信息资源:用这个包的全限定名+package—cn.javass.i18n.package

(3)类级国际化信息资源:用这个类的全限定名—cn.javass. i18n.I18NAction。

我们将刚才做的实例稍加修改,我们只需要在success.jsp中做如下修改:

<body>

<s:text name="msg"></s:text><br>

<s:i18n name="action.ITest">

<s:text name="msg"></s:text>

</s:i18n>

</body>

输出:


第一个没有使用i18n标签,因此按照普通顺序搜索到Test.properties文件中的消息。第二个由于我们使用了i18n标签,那么就会从我们指定的ITest.properties开始寻找,找到了那就输出。

如果使用类来作为ResourceBoundle,那么它的优先级高于属性文件。

手动选择语言

默认情况下,服务器根据浏览器提供的地理位置信息来决定使用的Local。但是某些情况下可能我们需要能够手动选择页面使用的语言。当然,使用在浏览器中修改语言设置的方法可以实现,不过Struts2还提供了其他的选择。

(1) 常量设置

通过在struts.xml中设置<constantname="struts.locale"value="zh_CN"/>常量来设置语言。

(2) 参数方式

用户只要在提交请求的时候加上request_locale这个参数,并提供对应的值就可以自由选择语言了。

这得力于Struts2的i18n内建拦截器,defaultStack拦截器栈引用了i18n拦截器,因此,能很方便的由用户来选择语言。

i18n拦截器在Action运行之前会检查请求中是否包含了一个叫做“request_locale”的参数,如果存在此参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置。除此之外,i18n拦截器还会把这个Locale对象放到名为WW_TRANS_I18N_LOCALE的Session属性中去,而这个属性也会覆盖Struts2的常量设置和浏览器的语言设置。因此,只需要传入一次request_locale参数,session就会记住用户的选择,整个网站就会都变成用户选择的语言了。

我们将刚才的实例再修改一下,分别新建一个Test_zh_CN.properties文件和一个Test_en_US.properties文件。

Test_zh_CN.properties

msg = \u4F60\u597D\uFF01 (你好!)

Test_en_US.properties

msg = I'm from Test

success.jsp中使用text标签显示msg消息。

我们在浏览器中访问test.action。由于我们没有做任何设置,那么页面肯定是显示的中文。


我们在请求中加上request_local=en_US参数再访问:


可以看到页面显示出了英文,并且即使我们去掉请求参数再次访问,页面还是显示英文。

注:三种方式的优先级别:请求参数 >struts.xml中配置常量 > 浏览器设置




分享到:
评论

相关推荐

    struts2四天的学习笔记

    8. **国际化(Internationalization, i18n)**:Struts2支持多语言环境,通过资源包(Properties文件)实现不同语言的切换,提供更好的用户体验。 9. **异常处理**:Struts2允许定义全局和Action级别的异常处理策略...

    struts2学习笔记十六(第16讲.Struts2的国际化)

    Struts2作为一款流行的Java Web框架,其国际化(Internationalization,简称i18n)功能是为了解决网站内容在不同国家和地区的显示问题。在第16讲中,我们将深入探讨Struts2如何实现这一功能,以确保应用程序能够根据...

    struts2学习笔记

    9. **国际化(Internationalization, i18n)**: Struts2支持多语言环境,可以通过资源包(Properties文件)来实现界面文本的国际化。 10. **结果类型(Result Types)**: 结果类型定义了请求完成后如何处理,例如...

    struts2.1.8 学习笔记

    10. **国际化(Internationalization,i18n)**:Struts2支持多语言资源文件,可以在全局、包或Action级别设置,方便实现应用的国际化。 11. **过滤器配置**:在`web.xml`中,Struts2的过滤器类由`org.apache....

    struts2学习笔记十八(第18讲.Struts2深入探索)

    7. **Struts2的国际化(Internationalization, i18n)**: Struts2提供了方便的国际化支持,通过资源包(Properties文件)可以实现多语言环境下的应用。开发者需要了解如何创建和使用资源包,以及在Action和视图中...

    Struts2_学习笔记.zip

    这个"Struts2_学习笔记"包含了关于Struts2框架的深入学习资料,是理解并掌握Struts2核心概念和技术的关键。 Struts2的核心设计理念是模型-视图-控制器(MVC)架构模式,它简化了Java Web开发,将业务逻辑、数据展示...

    struts2.1.8学习笔记

    8. **国际化(Internationalization, i18n)**:Struts2提供了对多语言的支持,开发者可以通过资源文件管理不同语言的文本信息。 9. **异常处理**:Struts2允许自定义全局和Action级别的异常处理策略,方便统一处理...

    struts2 学习资料

    这个"struts2 学习资料"包含了关于Struts2的基础到进阶的学习资源,可能是教程文档、示例代码或者是相关的学习笔记。 Struts2框架的核心特性包括: 1. **Action类**:在Struts2中,Action类是业务逻辑的载体,它...

    struts2笔记 风中叶

    总的来说,"风中叶"的Struts2学习笔记涵盖了Struts2框架的基础知识、核心组件、配置方式、异常处理、国际化策略以及与其他技术的整合,是学习和理解Struts2框架不可多得的参考资料。通过这份笔记,读者将能够深入...

    struts-2.3.4笔记

    7. **国际化(Internationalization, i18n)**:Struts 2 支持多语言应用,通过资源包(properties 文件)管理不同语言的文本。 8. **插件体系**:Struts 2 的插件架构允许开发者扩展框架功能,如上传组件、REST ...

    圣思园struts2笔记

    Lesson 5和6可能涉及到更高级的主题,比如国际化(Internationalization)、异常处理和文件上传下载。在Struts2中,可以很方便地实现多语言支持,只需要提供不同语言的资源文件。异常处理则可以通过全局异常映射器...

    struts2.zip例子

    7. **国际化支持**:Struts2提供了i18n(Internationalization)支持,允许开发者为不同地区提供本地化的显示内容,通过资源包(properties文件)来管理。 8. **结果类型**:Struts2允许开发者定义不同的结果类型,...

    struts2笔记

    Struts2支持在全局、包、Action范围内进行资源文件的国际化管理,方便地实现多语言应用。 **搭建Struts2环境**: - 下载Struts2和Spring的jar包,源码和API文档。 - 在`web.xml`中配置Struts2的MVC启动配置,通常...

    struts2的框架特性

    8. **国际化支持(Internationalization, I18N)**:Struts2内置了对多语言的支持,可以通过配置文件轻松实现应用程序的国际化。 9. **Ajax支持**:Struts2提供了Ajax插件,能够与jQuery和其他JavaScript库很好地...

    Java/JavaEE 学习笔记

    Struts学习笔记...............263 Struts2.0..263 第一章 MVC Model.........................263 第二章 Struts Basic264 第三章 Action,Result & Struts2 Tag Library......................267 第四章 Data ...

    Struts1.x_Project.zip

    通过分析这个Struts1.x_Project,我们可以学习到如何配置Struts框架,理解ActionForm、Action、Struts-config.xml的作用,以及如何实现I18N和表单验证。同时,项目的数据库操作部分也是Java Web开发中重要的实践环节...

    J2EE学习笔记(J2ee初学者必备手册)

    Struts学习笔记...............263 Struts2.0..263 第一章 MVC Model.........................263 第二章 Struts Basic264 第三章 Action,Result & Struts2 Tag Library......................267 第四章 Data ...

    Struts 學習筆記.doc

    在学习笔记中,你可能会看到关于配置文件`struts-config.xml`的详细讲解,它是Struts框架的核心配置文件,用于定义Action、Form Bean、Controller以及其他组件的设置。 此外,笔记可能还会介绍如何使用Struts标签库...

    struts教程指南

    - "struts笔记.pdf":这是一份个人学习笔记,可能包含了一些实践经验和技巧,有助于你快速上手和解决问题。 通过这些资源,你将能够逐步掌握Struts框架,从创建简单的Action到构建复杂的MVC应用,从而在Java Web...

    spring学习笔记

    5. **Part 5: Spring 3 MVC Internationalization & Localization Tutorial with Example in Eclipse** - 这一部分将深入到国际化和本地化,教读者如何为不同语言和文化设置提供支持。 6. **Part 6: Spring 3 MVC ...

Global site tag (gtag.js) - Google Analytics