java国际化概念和使用介绍-mile米乐体育
设计模式
2021年02月06日 15:32
1
1)java.util.locale
用于提供本地信息,通常称它为语言环境。不同的语言、不同的国家和地区采用不同的 locale 对象来表示。2)java.util.resourcebundle
该类称为资源包,包含了特定于语言环境的资源对象。当程序需要一个特定于语言环境的资源时(例如字符串资源),程序可以从适合当前用户语言环境的资源包中加载它。采用这种方式可以编写独立于用户语言环境的程序代码,而与特定语言环境相关的信息则通过资源包来提供。 为了实现 java 程序的国际化,必须事先提供程序所需要的资源文件。资源文件的内容由很多 key-value 对组成,其中 key 是程序使用的部分,而 value 是程序界面的显示。 资源文件的命名可以有如下 3 种形式:- basename.properties。
- basename_language.properties。
- basename_language_country.properties。
- 中国大陆:basename_zh_cn.properties。
- 美国:basename_en_us.properties。
java 支持的语言和国家
java.util.locale类的常用构造方法如下:public locale(string language); public locale(string language, string country)。
其中,language 表示语言,它的取值是由小写的两个字母组成的语言代码。country 表示国家或地区,它的取值是由大写的两个字母组成的国家或地区代码。 实际上,java 并不能支持所有国家和语言,如果需要获取 java 所支持的语言和国家,开发者可以通过调用 locale 类的 getavailablelocales 方法获取,该方法返回一个 locale 数组,该数组中包含了 java 所支持的语言和国家。 下面的 java 程序简单示范了如何获取 java 所支持的国家和语言:import java.util.locale; public class test { public static void main(string[] args) { // 返回java所支持的语言和国家的数组 locale locales[] = locale.getavailablelocales(); // 遍历数组元素,依次获取所支持的国家和语言 for (int i = 0; i < locales.length; i ) { // 打印出所支持的国家和语言 system.out.println(locales[i].getdisplaycountry() "=" locales[i].getcountry() "" locales[i].getdisplaylanguage() "=" locales[i].getlanguage()); } } }
java 程序的国际化
假设有如下简单 java 程序:public class testi18n { public static void main(string[] args) { system.out.println("我要向把不同国家的人民问好:您好!"); } }为了让该程序支持国际化,需要将“我要向不同国家的人民问好:您好!”对应不同语言环境的字符串,定义在不同的资源文件中。 在 web 应用的 src 目录下新建文件 messageresource_zh_cn.properties 和 messageresource_ en_us.properties。然后给资源文件 messageresource_zh_cn.properties 添加“hello=我要向不同国家的人民问好:您好!”内容,保存后可看到如图 1 所示的效果。
import java.util.locale; import java.util.resourcebundle; public class testi18n { public static void main(string[] args) { // 取得系统默认的国家语言环境 locale lc = locale.getdefault(); // 根据国家语言环境加载资源文件 resourcebundle rb = resourcebundle.getbundle("messageresource", lc); // 打印出从资源文件中取得的信息 system.out.println(rb.getstring("hello")); } }上面程序中的打印语句打印的内容是从资源文件中读取的信息。如果在中文环境下运行程序,将打印“我要向不同国家的人民问好:您好!”。 如果在“控制面板”中将计算机的语言环境设置成美国,然后再次运行该程序,将打印“i want to say hello to all world!”。需要注意的是,如果程序找不到对应国家/语言的资源文件,系统该怎么办? 假设以简体中文环境为例,先搜索如下文件:
messageresource_zh_cn.properties
如果没有找到国家/语言都匹配的资源文件,再搜索语言匹配文件,即搜索如下文件:messageresource_zh.properties
如果上面的文件还没有搜索到,则搜索 basename 匹配的文件,即搜索如下文件:messageresource.properties
如果上面 3 个文件都找不到,则系统将出现异常。带占位符的国际化信息
在资源文件中消息文本可以带有参数,例如:welcome={0},欢迎学习 spring mvc。
花括号中的数字是一个占位符,可以被动态的数据替换。在消息文本中占位符可以使用 0~9 的数字,也就是说消息文本的参数最多可以有 10 个。例如:welcome={0},欢迎学习 spring mvc,今天是星期{1}。
如果要替换消息文本中的占位符,可以使用 java.text.messageformat 类,该类提供了一个静态方法 format,用来格式化带参数的文本。format 方法的定义如下:public static string format(string pattern,object ...arguments)
其中,pattern 字符串就是一个带占位符的字符串,消息文本中的数字占位符将按照方法参数的顺序(从第二个参数开始)被替换。 替换占位符的示例代码如下:import java.text.messageformat; import java.util.locale; import java.util.resourcebundle; public class testformat { public static void main(string[] args) { // 取得系统默认的国家语言环境 locale lc = locale.getdefault(); // 根据国家语言环境加载资源文件 resourcebundle rb = resourcebundle.getbundle("messageresource", lc); // 从资源文件中取得的信息 string msg = rb.getstring("welcome"); // 替换消息文本中的占位符,消息文本中的数字占位符将按照参数的顺序 // (从第二个参数开始)被替换,即“我”替换{0}、“5”替换{1} string msgfor = messageformat.format(msg, "我", "5"); system.out.println(msgfor); } }
展开全文