JavaWeb同步学习笔记之一百零二、JavaWeb_国际化之ResourceBundle

JavaWeb_国际化之ResourceBundle

    • 国际化之ResourceBundle

国际化之ResourceBundle

  • 1.ResourceBundle 类
     1)ResourceBundle 类用于描述一个资源包,一个资源包用于包含一组与某个本地环境相关的对象,可以从一个资源包中获取特定于本地环境的对象。对于不同的本地环境,可以有不同的 ResourceBundle 对象与之关联,关联的 ResourceBundle 对象中包含该本地环境下专有的对象。
  • 2.资源包简介
     1)在设计一个国际化应用时,应该把程序显示的文本内容从源程序中分离出来,放在独立的资源文件中,并针对不同的本地环境编写不同的资源文件。这些资源文件被称为应用程序的资源包。
     2)应用程序在运行时,将从与用户的本地环境相对应资源文件中读取名称项对应的值的内容,由于同一个名称项在各个资源文件中对应的值内容是随本地环境信息而改变的,这样就实现了程序的静态文本内容的国际化。
     3)当要为应用程序添加某个新的本地化支持时,只需编写一个适合的本地环境的资源文件即可,不用修改源程序代码。
     4)一个应用程序可以有多个资源包,一个资源包中的每个资源文件都拥有共同的基名。除了基名,每个资源文件的名称中还有标识其本地信息的附加部分。例如:一个资源包的基名是:“myproperties”, 则该资源包中与中文环境相对应的资源文件为: “myproperites_zh.properties”。
     5)一般情况下,每个资源包都有一个默认的资源文件,默认的资源文件不带标识本地信息的附加部分。若应用程序在资源包中找不到某个本地环境匹配的资源文件,最后将选择该资源包中的默认资源文件。
  • 3.资源文件的内部格式
     1)资源文件通常采用 java.util.Properties 类要求的文件格式,其中包含每项资源信息的名称项和值内容,每个名称项用于唯一地标识一个资源信息,值内容用于指定资源信息在某个本地环境下的内容。
     2)一个资源包中的所有资源文件中通常都应包含相同的名称项,与各个本地环境对应的资源文件中为这些名称项设置的值分别是适合该本地环境的内容。
     3)资源文件完全遵循 java.util.Properties 类要求的文件格式,它要求资源文件中的字符必须全部为有效的 ASCII 字符。若资源文件中要包含非 ASCII 的字符,必须将它们转化成”\uXXXX”形式的转移序列,其中 XXXX 是该字符的 Unicode 编码的十六进制数值。
  • 4.单元测试类
    I18nTest .java
/**  
 * All rights Reserved,Designed By XS
 * @Title: I18nTest.java
 * @Package com.xs.i18n
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月23日 下午8:02:52
 * @version V1.0
 */
package com.xs.i18n;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

import org.junit.jupiter.api.Test;

/**   
 * @ClassName: I18nTest
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月23日 下午8:02:52
 * @version V1.0
 */
class I18nTest {
	
	/**
	 * ResourceBundle: 资源包类.
	 * 
	 * 1. 在类路径下需要有对应的资源文件: baseName.properties. 其中 baseName 是基名.
	 * 2. 可以使用 基名_语言代码_国家代码.properties 来添加不同国家或地区的资源文件. i18n_zh_CN.properties
	 * 3. 要求所有基名相同的资源文件的 key 必须完全一致. 
	 * 4. 可以使用 native2ascii 命令来得到 汉字 对一个的 asc 码. Eclipse 内置了工具
	 * 5. 可以调用 ResourceBundle 的 getBundle(基名, Locale 实例) 获取获取 ResourceBundle 对象
	 * 6. 可以调用 ResourceBundle 的 getString(key) 来获取资源文件的 value 字符串的值. 
	 * 7. 结合 DateFormat, NumberFormat, MessageFormat 即可实现国际化. 
	 * 
	 */
	@Test
	void testResourceBundle() {
		
		Locale locale = Locale.US;
		ResourceBundle resourceBundle = ResourceBundle.getBundle("i18n", locale);
		
		System.out.println(resourceBundle.getString("date"));
		System.out.println(resourceBundle.getString("salary"));
		
		locale = Locale.CHINA;
		resourceBundle = ResourceBundle.getBundle("i18n", locale);
		System.out.println(resourceBundle.getString("date"));
		System.out.println(resourceBundle.getString("salary"));
		
		String dateLable = resourceBundle.getString("date");
		String salLable = resourceBundle.getString("salary");
		
		String str = "{0}:{1}, {2}:{3}";
		
		Date date = new Date();
		double sal = 12345.12;
		
		DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
		String dateStr = dateFormat.format(date);
		
		NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
		String salStr = numberFormat.format(sal);
		
		String result = MessageFormat.format(str, dateLable, dateStr, salLable, salStr);
		System.out.println(result);
		
	}
	
}
  • 5.i18n.properties
date=Date
salary=Salary
  • 6.i18n_en_US.properties
date=Date
salary=Salary
  • 7.i18n_zh_CN.properties
date=\u65E5\u671F
salary=\u5DE5\u8D44

你可能感兴趣的:(JavaWeb)