国际化程序
2017-08-16 12:49
155 查看
国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序着是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过国际化操作,让一个程序适应各个国家的语言要求。
那么对于各个国家来说,每一个程序的代码是不会有任何变化的,但是只是其显示文字有所差异而已。
程序根据不同的语言环境找到不同的资源文件,之后从资源文件中取出内容,资源文件中的内容都是以key→value的形式保存的,所以在读取的时候通过其key找到对应的value即可。
如果要想实现JAVA程序的国际化操作必须通过以下三个类完成:
java.util.locale:用于表示一个国家语言类
java.util.ResourceBundle:用于访问资源文件
java.text.MessageFormat:格式化资源文件的占位字符串
Locale表示的是本地,实际上使用的是一个ISO编码的封装类。对于各个国家来说都存在一个唯一的编码,那么这种编码就成为ISO编码,使用Locale可以指定好一个具体的国家编码。
例如:中国的编码: zh-CN
英语-美国的编码:en-US
法语的编码:fr-FR
此类事专门完成属性文件读取操作的,读取的时候直接指定文件名称即可(此文件名称一般不需要指定后缀,后缀统一为*.properties),可以根据Locale所指定的区域码来自动选择所需要的资源文件。
public static final ResourceBundle getBundle(String baseName),此方法就是指定要操作的资源文件,此方法找到的是默认的操作系统的语言Locale对象。
public static final ResourceBundle getBundle(String baseName, Localelocale),此方法也是指定操作的资源文件,并传入Locale对象。
public final String getString(String key)根据key取得对应的value
下面通过一道程序来观察资源文件的使用,以及如何使用ResourceBundle读取资源文件。
资源文件命名的时候最好采用单词首字母大写的方式完成。
之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,你好,xxx。那么此时就必须在资源文件中进行一些动态文本的配置,这是占位符,这些符号中的内容暂时不固定,而是在程序执行的时候进行设置的,而想要实现这样的功能,则必须使用MessageFormat类。此类实在java.text包中定义的。
在Format类中还存在数字格式化的Format(NumberFormat)、日期格式化得Format(DateFormat)。
占位符使用(数字)的形式表示,如果现在表示第一个内容“{0}”、第二个内容“{1}”依次类推。
info =\u4F60\u597D,{0},{1}!;
info =HELLO,{0}!;
info =Bonjour,{0}!;
在MessageFormat类中主要使用format()方法,此方法定义如下:
public static String format(String pattern,Object…arguments)
以上的应用已经是国际化的实际操作效果。
所有的要显示的内容实际上都应该放在资源文件中,但是在Java中为了照顾部分习惯于使用类的用户,所以也可以直接使用一个类来存放所有的资源文件内容,但是,此类在操作时必须有一个明显的注意点,必须继承ListResourceBundle。下面以中文信息显示为准:
不管是资源类还是资源文件,找时都是Message,实际上此时需要区分优先级
Message_zh_CN.class
Message_zh_CN.properties
Message.properties
国际化程序实现的思路:程序与显示相分离,根据不同的Local指定的区域找到不同的资源文件并根据其key取得对应的value。
当然,在实际开发中,包括以后的学习struts,都经常使用资源文件的方式保存所有信息内容,其基本原理就是依靠了ResourceBundle类取得资源文件中的内容。
MessageFormat是Format类的子类。
那么对于各个国家来说,每一个程序的代码是不会有任何变化的,但是只是其显示文字有所差异而已。
程序根据不同的语言环境找到不同的资源文件,之后从资源文件中取出内容,资源文件中的内容都是以key→value的形式保存的,所以在读取的时候通过其key找到对应的value即可。
如果要想实现JAVA程序的国际化操作必须通过以下三个类完成:
java.util.locale:用于表示一个国家语言类
java.util.ResourceBundle:用于访问资源文件
java.text.MessageFormat:格式化资源文件的占位字符串
Locale表示的是本地,实际上使用的是一个ISO编码的封装类。对于各个国家来说都存在一个唯一的编码,那么这种编码就成为ISO编码,使用Locale可以指定好一个具体的国家编码。
例如:中国的编码: zh-CN
英语-美国的编码:en-US
法语的编码:fr-FR
此类事专门完成属性文件读取操作的,读取的时候直接指定文件名称即可(此文件名称一般不需要指定后缀,后缀统一为*.properties),可以根据Locale所指定的区域码来自动选择所需要的资源文件。
public static final ResourceBundle getBundle(String baseName),此方法就是指定要操作的资源文件,此方法找到的是默认的操作系统的语言Locale对象。
public static final ResourceBundle getBundle(String baseName, Localelocale),此方法也是指定操作的资源文件,并传入Locale对象。
public final String getString(String key)根据key取得对应的value
下面通过一道程序来观察资源文件的使用,以及如何使用ResourceBundle读取资源文件。
资源文件命名的时候最好采用单词首字母大写的方式完成。
import java.util.ResourceBundle; public class InterDemo01 { public static void main(String args[]){ ResourceBundle rb = ResourceBundle.getBundle("Message"); //找到资源文件,不用编写后缀 System.out.println("内容:" + rb.getString("info")); //从资源文件中取得内容 } }
/*大概了解了ResourceBundle类和资源文件之后,下面结合Locale类一起完成国际化程序的开发。 * 开发要求: * 可以根据不同国家输出不同国家的你好: * 中文:你好! * 英文:Hello! * 法语:Bonjour! * 分别定义不同资源文件,此时需要定义出三个资源文件,同时在定义资源文件时需要制定好此文件对应的语言编码: * 中文:Message_zh_CH.properties * 英文:Message_en_US.properties * 法文:Message_fr_FR.properties * 下面就根据Locale所指定区域的ISO不同,得到不同的资源文件中的内容。 **/ import java.util.ResourceBundle; import java.util.Locale; public class InterDemo02 { public static void main(String args[]){ Locale zhLoc = new Locale("zh","CN"); Locale enLoc = new Locale("en","US"); Locale frLoc = new Locale("fr","FR"); ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc); Resou db98 rceBundle enrb = ResourceBundle.getBundle("Message",enLoc); ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc); System.out.println("中文:" + zhrb.getString("info")); System.out.println("英文:" + enrb.getString("info")); System.out.println("法文:" + frrb.getString("info")); } }以上的信息确实是读取出来了,但是在程序开发中有一点特别需要注意,对于中文的资源文件,应该将其进行Unicode编码,转换为Java认识的16进制,这样可以避免一些系统所带来的乱码问题,此工具为JDK自行提供(native2ascii.exe)。
之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,你好,xxx。那么此时就必须在资源文件中进行一些动态文本的配置,这是占位符,这些符号中的内容暂时不固定,而是在程序执行的时候进行设置的,而想要实现这样的功能,则必须使用MessageFormat类。此类实在java.text包中定义的。
在Format类中还存在数字格式化的Format(NumberFormat)、日期格式化得Format(DateFormat)。
占位符使用(数字)的形式表示,如果现在表示第一个内容“{0}”、第二个内容“{1}”依次类推。
info =\u4F60\u597D,{0},{1}!;
info =HELLO,{0}!;
info =Bonjour,{0}!;
在MessageFormat类中主要使用format()方法,此方法定义如下:
public static String format(String pattern,Object…arguments)
import java.util.ResourceBundle; import java.text.MessageFormat; import java.util.Locale; import java.text.*; public class InterDemo02 { public static void main(String args[]){ Locale zhLoc = new Locale("zh","CN"); Locale enLoc = new Locale("en","US"); Locale frLoc = new Locale("fr","FR"); ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc); ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc); ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc); //依次读取各个属性文件的内容,通过键值读取,此时键值名称统一为info String str1 = zhrb.getString("info"); String str2 = enrb.getString("info"); String str3 = frrb.getString("info"); System.out.println("中文:" + MessageFormat.format(str1, "张三","张三")); System.out.println("英文:" + MessageFormat.format(str2, "zhangsan")); System.out.println("法文:" + MessageFormat.format(str3, "ZHAGNSAN")); } }在JDK1.5之后JAVA增加了新特性的操作,可以向方法中传递可变参数,以前的定义的方法,实际上里面的参数都是固定个数的,那么在JDK1.5之后为了解决操作的麻烦,增加了此特性。测试参数传递:
public class InterDemo03{ public static void main(String args[]){ System.out.print("第一次运行:"); fun("hello","张三","world"); System.out.println(); System.out.print("第二次运行:"); fun("MLDN"); System.out.println(); Object[] arg1 = {"san","zhang","张三"}; System.out.print("第三次运行:"); fun(arg1); System.out.println(); Object[] arg2 = {"zs"}; System.out.print("第四次运行:"); fun(arg2); System.out.println(); Object[] arg3 = {}; System.out.print("第五次运行:"); fun(arg3); } public static void fun(Object...args){ //固定语法,输入任意多个数据,使用数组表示 for(int i = 0 ; i < args.length ; i++){ System.out.print(args[i] + " "); } } }
以上的应用已经是国际化的实际操作效果。
所有的要显示的内容实际上都应该放在资源文件中,但是在Java中为了照顾部分习惯于使用类的用户,所以也可以直接使用一个类来存放所有的资源文件内容,但是,此类在操作时必须有一个明显的注意点,必须继承ListResourceBundle。下面以中文信息显示为准:
import java.util.ListResourceBundle; public class Message_zh_CN extends ListResourceBundle{ private final Object data[][] ={ {"info","你好,{0}!"} }; public Object[][] getContents(){ return data; } } import java.util.ResourceBundle; import java.util.Locale; import java.text.*; public class InterDemo04{ public static void main(String args[]){ Locale zhLoc = new Locale("zh","CN"); ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc); String str = zhrb.getString("info"); System.out.println("中文:" + MessageFormat.format(str, "张三")); } }
不管是资源类还是资源文件,找时都是Message,实际上此时需要区分优先级
Message_zh_CN.class
Message_zh_CN.properties
Message.properties
国际化程序实现的思路:程序与显示相分离,根据不同的Local指定的区域找到不同的资源文件并根据其key取得对应的value。
当然,在实际开发中,包括以后的学习struts,都经常使用资源文件的方式保存所有信息内容,其基本原理就是依靠了ResourceBundle类取得资源文件中的内容。
MessageFormat是Format类的子类。
相关文章推荐
- JAVA 程序实现国际化
- .NET 国际化程序实现大揭秘!
- Struts2国际化--用户自行选择程序语言的实现
- Java程序国际化的简单实现
- Struts1.x系列教程(16):使用LocaleAction类实现国际化的Web程序
- Qt的国际化示例程序以及步骤--实现Qt程序的动态切换语言功能
- 实习总结(七)---Struts 2中的程序国际化
- 国际化程序
- php程序的国际化(转载)
- 国际化程序
- php程序的国际化
- 在Linux程序中实现国际化/本地化
- 【Qt】VS开发Qt程序的国际化使用
- GNU/Linux上程序的国际化和本地化(I18N & I10N)
- Struts1.x系列教程(16):使用LocaleAction类实现国际化的Web程序
- JAVA实现程序多语言(程序国际化)
- 初学Android——相对和线性布局的使用与程序的国际化
- Android程序国际化
- IOS程序名称及内容国际化(本地化)
- 用QT实现程序的国际化