大家好,我是成都[LD],今天给大家带来的是JAVA国际化。如果您用过Struts,那您对国际化应该并不陌生。
通常来说,在代码中我们会夹杂一些字符串,这样其实并不好看,维护起来也不是特别方便。举个例子:假设你开发系统是中文版本,突然来了个需求,需要英文版本,如果你将字符串写在代码里面,这样你又不得不将所有的中文字符替换成英文字符。为了减少这种需求下重复劳动,我们通常会自己去写一个配置文件,然后将所有字符串放在配置文件里面,然后去读这个配置文件等等一系列的操作。当然这属于我们自己的一种解决问题的方法。其实在JDK中已经为我们提供了一种的很好解决方案,那就是国际化。
本文旨在起个引导作用,不会太多做原理上分析,如果想进一步了解,请大家自寻查阅资料,如果有不懂可以给我留言。
开发环境:Windows XP、Eclipse(Kepler)、JDK1.7。
如下代码:如果我们需要将字符串"世界,你好!"做国际化,我们该如何去做。
package ld.i18n; /** * * @author Ld * */ public class Print { public void print(){ System.out.println("世界,你好!"); } }
在Eclipse中已经为我们提供了国际化比较方便的方法,首先在类中单击右键,在弹出菜单中找到Source,然后找到Externalize Strings.如下图所示:
点击这个之后,在弹出对话框中可以选择默认,然后点击Next,然后确定,这样,你会发现你的目录下面生成了一个properties文件,我这里生成的文件叫做message.proerties,并且我们的类中的字符串被替换成Print.0
package ld.i18n; /** * * @author Ld * */ public class Print { public void print(){ System.out.println(Messages.getString("Print.0")); //$NON-NLS-1$ } }
下面我们新建个Main.java调用下Print类的print方法
package ld.i18n; import java.util.Locale; public class Main { public static void main(String[] args) { //Locale.setDefault(Locale.US); new Print().print(); } }
运行一下,控制台打印出:世界,你好!
现在我们要将中文改变为英文,首先拷贝一份messages.properties,将名称改为messages_en_US.properties,并将里面的世界,你好,改为Hello World!同上打开Main.java里面的
//Locale.setDefault(Locale.US);//为什么这么写请大家自己去研究下
注释。运行一下,发现打印出的就是Hello World!
到这里,有的同学可能会发现我上面的字符串在程序编译时就指定了。假设在程序中有变化的字符串该怎么办?
这里我们就需要MessageFormat类的支持(这个类在java.text包中),以Hello World为例。假设我们的World是动态变化的,那么我们可以在properties文件中,将Hello World改为Hello {0},这里的0是第一个参数,因为我们要替换字符串时传入的是个数组,这里和数组下标相对应。因此我们将上述代码进行修改下:
package ld.i18n; import java.text.MessageFormat; /** * * @author Ld * */ public class Print { public void print(String args[]){ System.out.println(MessageFormat.format(Messages.getString("Print.0"),args)); //$NON-NLS-1$ } }
同时修改Main.java为print方法指定参数
package ld.i18n; import java.util.Locale; public class Main { public static void main(String[] args) { Locale.setDefault(Locale.US);; new Print().print(new String[]{"LD"}); } }
运行一下,控制台输出Hello LD!
其实大家可以想一想这个过程,不就是类似于我们自定义配置文件,并通过程序来读取字符串信息的过程吗,只不过JAVA帮我们封装这个读取过程。好了,希望对大家有所帮助!