`
wangzl2222
  • 浏览: 150931 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

国际化

阅读更多

看到一篇好文章引用过来,方便大家学习,特此引用过来

下面用实例来体会一下,先给出本章完成之后的项目结构的截图:

3.2  简单实例

假设我们有如下程序,程序的作用是打印出一个字符串

package cn.com.chengang.spring;

public class MessageTest {

    public static void main(String[] args) {

        String str = "ChenGang";

        System.out.println(str);

    }

}

现在,我们要让这个程序能够根据使用者的语言情况输出不同的字符,比如:对英文使用者输出“ChenGang”,对中文使用者输出“陈刚”,对台湾使用输出“陳剛”等等。这个需求的实现方法如下:

1、创建一系列的资源文件

cn.com.chengang.spring包下创建以下文件:

1messages.properties(默认:英文),内容仅一句,如下

chengang=Giles

chengang”是键值,Giles是要输出的英文字符串

2messages_zh_CN.properties(简体中文)

chengang=\u9648\u521A

\u9648\u521A”是UNICODE码,对应的中文是“陈刚”

3messages_ zh_TW.properties(繁体中文)

chengang=\u9673\u525B

\u9673\u525B”对应的中文是“陳剛”

 

附注:由于中文是要转换成UNICODE码,在编辑和阅读上有诸多不便,如果是用EclipseIDE,则有一个编辑资源文件的插件jinto,下载网址是http://www.guh-software.de/,用它打开的资源文件如下图所示,可以看到三个资源在一个界面反映了出来。

如果你不用Eclipse,而是用EditplugsJDK的方式来编程(现在还有这样的原始人吗?),你也可以用JDK自带的native2ascii.exe程序来将中文字串转成UNICODE码。Ant中还提供了一个相应的任务:<native2ascii encoding="GBK" src="${src}" dest="${build}"/>,其中GBK是一个中国的字符集。

 

2、修改bean.xml

Spring自带的org.springframework.context.support.ResourceBundleMessageSource类注册到bean.xml中,这个类的作用是获取资源文件的内容,注册到IoCbean.xml文件中是为了自动获得此类的对象(Spring做了一些简化编程的处理)。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

       <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

       <bean id="American" class="cn.com.chengang.spring.American"/>

       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

              <property name="basenames">

                     <list>

                            <value>cn.com.chengang.spring.messages</value>

                     </list>

              </property>

       </bean>

</beans>

代码说明:

l           id="messageSource" 的设置是不变的、必须的。

l           ResourceBundleMessageSourceSpring的一个Message类。这里还有一个选择,用ReloadableResourceBundleMessageSource类,此类可以提供不用重启即可重新加载资源文件的特性(前者对资源文件只加载一次)。对于那种有热修改资源文件的需求,后者比较合适,只是后者在效率上有可能有损耗,因为至少要多一些检查资源文件是否改变的代码(这只是我的猜测,我没有仔佃去读这段的源码)。

l           basenames”是不变的、必须的。它是ResourceBundleMessageSource的一个属性,在源代码中的定义是“private String[] basenames;”,可见它是一个字符串数组。

l           cn.com.chengang.spring.messages”是把资源文件的位置传入到basenames属性中。注意:三个资源文件只需要将共同的主名(红色字体)传入:messages.propertiesmessages_zh_CN.propertiesmessages_zh_TW.properties

 

3、使用。修改MessageTest类,如下

package cn.com.chengang.spring;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MessageTest {

    public static void main(String[] args) {

        ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");

        String str = ctx.getMessage("chengang", null, null);

        System.out.println(str);

    }

}

代码说明:

1main方法里

l           第一句取得bean.xml文件的配置信息。

l           第二句从资源文件里得到键值chengang对应的字符串。

l           第三句将字符串打印出来,结果是打印的是“陈刚”,说明读取的是messages_zh_CN.properties资源文件。

2ctx.getMessage("chengang", null, null);有三个参数:

l           第一个是资源文件的键值;

l           第二个是资源文件字符串的参数,由于本字符串没有参数,所以用一个null(后面给出了一个用到字符串参数的实例);

l           第三个是一个java.util. Locale类型的参数。参数为null,则表示根据使用者的语言环境来选择Locale,因为我用的是中文版的windows,所以在取字符串时它自动选择了messages_zh_CN.properties资源文件。
   
这其中还有一个控制点在JVMJVM会根据当前操作系统的语言环境进行相应处理,我们可以通过在JVM启动参数中追加“-Duser.language=zh_TW”来设定当前JVM语言类型,通过JVM级的设定,也可以实现自动切换所使用的资源文件类型。
   
所以这里面的控制语言的方式有三种:从最低层的操作系统的Locale设定,到更上一层的JVMLocale设定,再到程序一级的Locale设定。

3.3  资源文件的其他使用方式:

package cn.com.chengang.spring;

import java.util.Locale;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import org.springframework.context.support.ResourceBundleMessageSource;

public class MessageTest {

    public static void main(String[] args) {

        ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");

        String str = ctx.getMessage("chengang", null, null);

        System.out.println(str); //输出“陈刚”

        /*

         * 使用了messages.properties

         */

        str = ctx.getMessage("chengang", null, new Locale(""));

        System.out.println(str);//输出“Giles

        /*

         * 使用了messages_zh_CN.properties

         */

        str = ctx.getMessage("chengang", null, new Locale("zh", "CN"));

        System.out.println(str);//输出“陈刚”

        /*

         * 使用了messages_zh_TW.properties

         */

        str = ctx.getMessage("chengang", null, new Locale("zh", "TW"));

        System.out.println(str);//输出“陳剛”

        /*

         * 使用了messages_zh_TW.properties,从这里可见资源文件的起名可以很随意,

         * 比如我们建立一个messages_123.properties,在传参数时候就可以这样:

         * new Locale("123"),一样也可以取出messages_123.properties中的值

         */

        str = ctx.getMessage("chengang", null, new Locale("zh_TW"));

        System.out.println(str);//输出“陳剛”

        /*

         * 当找不到相应的资源文件时,使用了messages_zh_CN.properties

         */

        str = ctx.getMessage("chengang", null, new Locale("abcd"));

        System.out.println(str);//输出“陈刚”

         /**

         * 不通过IoC注册,直接使用ResourceBundleMessageSource类的写法。

         */

        ResourceBundleMessageSource s = new ResourceBundleMessageSource();

        s.setBasename("cn.com.chengang.spring.messages");

        str = s.getMessage("chengang", null, null);

        System.out.println(str);//输出“陈刚”

    }

}

代码说明:

前面说过控制语言的方式有三种:从最低层的操作系统的Locale设定,到更上一层的JVMLocale设定,再到程序一级的Locale设定。我认为最佳的方法是在程序一级进行控制:定义一个统一的Locale静态变量,然后整个系统中只使用这一个变量,以后就可以通过界面操作设置此Locale变量的值,让用户来选择他所需的软件语言。而且我们也可以将此静态变量设成null值,来自动选择资源文件。

另外,Locale里也定义了一些常量,我们可以直接使用而不必去new一个Locale对象,如:“Locale.ENGLISH”。

 

3.4  再一个实例

这个实例演示了如何使用多个资源文件,以及如何使用字符串参数

1)在cn.com.chengang.spring包下再创建一个资源文件messagesOther_zh_CN.properties

chengang.info=\u9648\u521A\uFF0C\u7F51\u540D\uFF1A{0}\uFF0C\u82F1\u6587\u540D\uFF1A{1}\uFF0CBlog\uFF1A{2}

其中UNICODE字符串对应的中文是:“陈刚,网名:{0},英文名:{1}Blog{2}”,这个字符串一共有三个参数。

2)修改 bean.xml文件

因为basenames属性是一个数组,当然也就可以接收多个资源文件设定。具体修改如下面的红字部份

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

       <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

       <bean id="American" class="cn.com.chengang.spring.American"/>

       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

              <property name="basenames">

                     <list>

                            <value>cn.com.chengang.spring.messages</value>

                            <value>cn.com.chengang.spring.messagesOther</value>

                     </list>

              </property>

       </bean>

</beans>

 

3)修改MessageTest类,加入几行使用的代码

        String[] strArgs = new String[3];

        strArgs[0]="混北民工";

        strArgs[1]="Giles";

        strArgs[2]="http://blog.csdn.net/glchengang";

        str = ctx.getMessage("chengang.info", strArgs, null);

        System.out.println(str);

打印出来的结果就是:“陈刚,网名:混北民工,英文名:GilesBloghttp://blog.csdn.net/glchengang

 

3.5  国际化的实践建议

l           建议一个包对应一个资源文件。不要整个系统都使用一个资源文件来翻译,这样单个文档的体积就太大了,不利于维护;当然,也不必一个类对应一个资源文件,这样资源文件又太多了。

l           建议资源文件和其翻译类/包在同一目录下。不过,如果是要将软件打成一外JAR包或WAR包,建议把资源文件分离出来,这样可以修改资源文件,而不必再次打包。

l           建议字符串项的键值上加上其所在的类名。比如:上面的chengangchengang.info最好是取名成MessageTest.chengangMessageTest.chengang.info。这样查找使用此键值的类会方便很多。

 

 

原文地址http://www.chinaitpower.com/A200507/2005-07-27/170780.html

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C# winform 国际化

    在C# WinForm应用开发中,国际化(Internationalization)是一个重要的功能,允许应用程序适应不同语言和文化环境。本文将深入探讨如何实现C# WinForm应用的国际化,包括菜单国际化和资源国际化。 首先,我们需要...

    Android 一键国际化

    在Android应用开发中,为了使应用能够适应全球市场,国际化的支持是必不可少的。"Android 一键国际化"是一个针对Android Studio的高效插件,旨在帮助开发者便捷地为应用添加多语言支持,尤其对于那些需要快速扩展到...

    Nacos实现SpringBoot国际化的增强

    阅读本文之前,你应该了解过SpringBoot的国际化实现与原理,在这里简单介绍下: 1. 国际化 国际化(internationalization),又称为i18n(因为这个单词从i到n有18个英文字母,因此命名)。对于某些应用系统而言,它...

    C#语言国际化方法

    ### C#语言国际化方法 #### 一、引言 随着全球化的不断推进,软件产品和服务越来越多地面向国际用户。为了适应不同国家和地区用户的语言习惯,软件的多语言支持变得尤为重要。C#作为一种广泛使用的编程语言,在...

    Kiwi国际化全流程解决方案

    《Kiwi国际化全流程解决方案》 在当今全球化的背景下,软件产品的国际化和本地化已经成为不可或缺的环节,特别是对于JavaScript开发者来说,理解并掌握这一流程至关重要。本文将深入探讨Kiwi项目提供的国际化全流程...

    国际化标签库

    国际化标签库是一种软件开发工具,主要用于支持多语言环境下的应用程序。在现代软件开发中,特别是在全球范围内使用的产品或服务中,支持多种语言是至关重要的。国际化标签库提供了一种标准化的方式来管理和显示各种...

    file input 按钮国际化

    在IT行业中,"国际化"(Internationalization)是一个重要的概念,特别是在开发支持多语言的应用程序时。这个过程涉及设计和构建应用程序的方式,使得它可以适应不同地区的文化、语言和格式要求。"file input 按钮...

    js 国际化实现

    JavaScript(简称JS)国际化(i18n,国际化英文单词“internationalization”的缩写)是为网站或应用程序提供多语言支持的过程。这个过程涉及到将文本、日期、数字和其他文化特定的元素从源语言(通常是英语)转换成...

    spring 国际化 spring mvc

    Spring MVC 国际化实现详解 在 Spring MVC 框架中,实现国际化是...基于浏览器语言的国际化配置可以实现客户浏览器语言国际化,而基于动态加载的国际化配置可以实现基于请求的国际化配置或基于 Session 的国际化配置。

    国际化字符转码_国际化

    国际化字符转码是IT领域中一个重要的概念,特别是在软件开发和网页设计中,因为全球化的市场需求使得软件和服务需要支持多种语言和字符集。这个过程涉及到将不同编码格式的字符转换成统一的标准,以便在不同的系统和...

    js文件中实现国际化

    JavaScript(简称JS)是网页开发中的重要脚本语言,它为开发者提供了丰富的功能,其中之一就是实现国际化(i18n,Internationalization)。国际化是让软件能够适应不同地区、语言和文化背景的重要特性,使得应用程序...

    java 实现国际化 中英文语言切换

    Java 实现国际化是一种重要的软件开发技术,特别是在构建多语言支持的应用程序时。国际化(i18n)使得软件能够适应不同国家和地区的语言环境,包括中文和英文。在这个主题中,我们将深入探讨如何使用Java和JSP进行...

    国际化 必备工具 java编写

    在IT行业中,国际化(i18n,Internationalization)是一个重要的概念,特别是在软件开发领域,它涉及使软件能够适应不同语言和地区的需求。Java作为一种广泛使用的编程语言,提供了强大的国际化支持。本篇将深入探讨...

    Dojo基础3国际化

    Dojo 是一个强大的 JavaScript 库,它提供了丰富的功能,包括对国际化的支持。在Dojo中,国际化(i18n)使得应用可以适应不同语言和文化环境,从而为全球用户提供一致的体验。以下是Dojo国际化的主要方面: 一、...

    Android中实现文字、图片资源国际化案例

    在Android应用开发中,为了使应用能够适应全球不同的语言环境,开发者通常会采用资源国际化(i18n,Internationalization)技术。这个过程涉及到将应用中的文本和图片资源分离出来,以便根据不同地区创建对应的翻译...

    h5国际化demo[i18n实现]

    在IT行业中,"国际化"(Internationalization,通常缩写为i18n)是指设计和开发软件或网站,使其能够适应不同地区的语言和文化习俗。H5(HTML5)是现代网页开发的标准,它提供了丰富的功能和接口,使得实现国际化变...

    国际化软件概论:软件国际化

    ### 国际化软件概论:软件国际化 #### 一、引言 在全球化的背景下,随着信息技术的迅猛发展,软件产业面临着前所未有的挑战与机遇。软件不仅需要满足本地市场需求,还要适应不同国家和地区的需求,这就催生了软件...

    SpringBoot消息国际化配置实现过程解析

    SpringBoot 消息国际化配置实现过程解析 SpringBoot 消息国际化配置实现过程解析是指在 SpringBoot 项目中实现消息国际化配置的过程。该过程主要涉及到消息配置文件的管理、语言信息的设置、LocaleContext 的使用、...

    ssm框架上实现国际化/多语言

    在SSM框架上实现国际化和多语言功能,可以使得应用程序能够适应不同国家和地区用户的语言需求,提升用户体验。以下将详细介绍如何在SSM框架中实现这一功能。 首先,我们需要理解“国际化”(Internationalization)...

    i18next html 国际化

    前段页面的国际化,运用jquery-i18next js做国际化处理,i18n实现前端国际化,页面的多语言切换,本例切换了中英文,运用cookie存取使得刷新页面仍然保持当前语言 1、通过请求不同的语言文件,达到国际化前端的效果...

Global site tag (gtag.js) - Google Analytics