十三、国际化

一、国际化

1.1 什么是国际化?


	国际化又简称为 i18n:internationalization
	
	+++ 什么是国际化?
	
			国际化的人:
				人,英语,汉语;  可以说这个人是国际化的人;

			软件的国际化:
				软件
					在中国: 显示中文,以及服务符合中国习惯的文本字符串!
										 1999-09-09
					在美国: 显示英文,以及服务符合他国习惯的文本字符串!
				这种软件,就叫国际化的软件!

		+++ 如何做到国际化的软件,要求:
		
					1.软件中存储特定的字符串
					2.知道浏览器当前使用哪种语言(Locale  )
					

1.2 数据国际化的分类


		1.静态数据国际化
		(网站中显示的固定文本的国际化: “用户名” “密码“)
	
				+++ 静态数据国际化:
						1.存储所有国家显示的文本的字符串
							a)文件: properties
							b)命名:  基础名_语言简称_国家简称.properties
							例如:msg_zh_CN.properties     存储所有中文
							      Msg_en_US.properties    存储所有英文
						
						2.程序中获取
							ResourceBundle类,可以读取国际化的资源文件!
				
		2 动态数据国际化
		  中文:1987-09-191000
		  英文: Sep/09 1987  $100

		  数值,货币,时间,日期等数据由于可能在程序运行时动态产生,
	      所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。	

		 Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
			

	注意:一个合格的国际化软件必须包含静态数据和动态数据的国际化。
    

二、静态数据格式化

2.1 静态数据格式化文件的设置

	
	资源配置文件要求:
			1.资源文件的内容通常采用“关键字=值”的形式。 软件根据关键字检索值显示在页面上。
	 		2. 一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字。
	 		3. 文件: properties
	 		   命名规范: 基础名_语言简称_国家简称.properties
			
					例如:msg_zh_CN.properties     存储所有中文
					      Msg_en_US.properties    存储所有英文	
					      
	 		4. 文件中的所有字符都必须是ASCII字码,对于像中文这样的非ACSII字
	 		   符,须先进行编码。(java提供了一个native2ascII命令用于编码)。
				 例:
					属性文件是不能保存中文的
		


在这里插入图片描述

2.2 Locale 本地化类

	Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!
	
	|--- Locale  
			Locale.getDefault() 获取本地Local环境对象
			
			locale.getCountry() 获取国家简称(CN)
			locale.getDisplayCountry() 获取国家名称
			locale.getLanguage() 获取国家使用的语言
	
	在Http请求中,可以通过request对象,获取请求客户端的本地环境。
			req.getLocale(); //获取请求客户端的本地环境	
				
	public class App {
	
		@Test
		//1. 本地化对象:Locale
		// 封装语言、国家信息的对象,有java.util提供
		public void testLocale() throws Exception {
			// 模拟中国语言等环境
			//Locale locale = Locale.CHINA;
			Locale locale = Locale.getDefault();			// 当前系统默认的语言环境
			System.out.println(locale.getCountry());   		// CN  国家的简称
			System.out.println(locale.getDisplayCountry()); // 国家名称
			System.out.println(locale.getLanguage());		// zh 语言简称
			
			// 模拟美国国家
			Locale l_us = Locale.US;
			System.out.println(l_us.getCountry());
			System.out.println(l_us.getDisplayCountry());
		}
	}
 

2.3 ResourceBundle 工具类

	 1.设置配置文件,存储所有国家显示的文本的字符串
			a)文件: properties
			b)命名规范: 基础名_语言简称_国家简称.properties
			
					例如:msg_zh_CN.properties     存储所有中文
					      Msg_en_US.properties    存储所有英文
					      
	 2.通过ResourceBundle类读取该配置文件	
			+++ 读取配置文件路径设置:
					//读取cn.itcast.f_i18n包下的msg_xx_xx.propertie文件
					ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.f_i18n.msg", locale);	
		
					//读取classpath根目录下的msg_xx_xx.propertie文件
					ResourceBundle bundle = ResourceBundle.getBundle("msg", locale);		
				
		    +++ ResourceBundle会根据获取的Locale对象来获取加载的文件包。
		    
					如果获取的Locale对象是Locale.US, 则会读取 msg_en_US.properties 
					如果获取的Locale对象是Locale.CN, 则会读取 msg_zh_CN.properties
						
2.3.1 读取src目录下的配置文件

在这里插入图片描述

msg_zh_CN.properties

将该文件放在src目录下,即classoath路径下

name=\u59D3\u540D
pwd=\u5BC6\u7801
submit=\u63D0\u4EA4

msg_en_US.properties

将该文件放在src目录下,即classoath路径下

name=NAME
pwd=PWD
submit=SUBMITWE


App.java
	ResourceBundle会根据获取的Locale对象来获取加载的文件包。
			如果获取的Locale对象是Locale.US, 则会读取 msg_en_US.properties 
			如果获取的Locale对象是Locale.CN, 则会读取 msg_zh_CN.properties
public class App {
	public static void main(String[] args) {
		ResourceBundle rb=ResourceBundle.getBundle("msg", Locale.getDefault());
		// 根据key获取配置文件中的值
		System.out.println(rb.getString("name"));
		System.out.println(rb.getString("pwd"));
		System.out.println(rb.getString("submit"));

	}
}

2.3.2 读取特定目录下的配置文件

在这里插入图片描述

msg_zh_CN.properties

将该文件放在org/jsoft/demo目录下

name=\u59D3\u540D
pwd=\u5BC6\u7801
submit=\u63D0\u4EA4

msg_en_US.properties

将该文件放在org/jsoft/demo目录下

name=NAME
pwd=PWD
submit=SUBMITWE


App.java
	ResourceBundle会根据获取的Locale对象来获取加载的文件包。
			如果获取的Locale对象是Locale.US, 则会读取 msg_en_US.properties 
			如果获取的Locale对象是Locale.CN, 则会读取 msg_zh_CN.properties
public class App {
	public static void main(String[] args) {
		//ResourceBundle rb=ResourceBundle.getBundle("msg", Locale.getDefault());
		ResourceBundle rb=ResourceBundle.getBundle("org.jsoft.demo.msg", Locale.CHINA);

		System.out.println(rb.getString("name"));
		System.out.println(rb.getString("pwd"));
		System.out.println(rb.getString("submit"));

	}
}

三、动态数据格式化(动态数据格式化相关API)

	// 国际化 - 动态文本 - 0. 概述
	@Test
	public void testI18N2() throws Exception {
		// 国际化货币
		NumberFormat.getCurrencyInstance();
		
		// 国际化数字
		NumberFormat.getNumberInstance();
		
		// 国际化百分比
		NumberFormat.getPercentInstance();  
		
		// 国际化日期
		DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale)
	}

3.1 案例

	// 国际化 - 动态文本 - 1. 国际化货币
	@Test
	public void testI18N3() throws Exception {
		// 模拟语言环境
		Locale locale = Locale.CHINA;
		// 数据准备
		double number = 100;
		// 工具类
		NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
		// 国际化货币
		String m = nf.format(number);
		// 测试
		System.out.println(m);
	}
	
	//面试题:  代码计算:  $100 * 10  
	@Test
	public void eg() throws Exception {
		String str = "$100";
		int num = 10;
		
		// 1. 分析str值是哪一国家的货币
		Locale us = Locale.US;
		// 2. 国际化工具类
		NumberFormat nf = NumberFormat.getCurrencyInstance(us);
		// 3. 解析str国币
		Number n = nf.parse(str);
		
		System.out.println(n.intValue() * num);
	}
	
	// 国际化 - 动态文本 - 2. 国际化数值
	@Test
	public void testI18N4() throws Exception {
		// 模拟语言环境
		Locale locale = Locale.CHINA;
		NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
		String str = nf.format(1000000000);
		System.out.println(str);
	}
	
	// 国际化 - 动态文本 - 3. 国际化日期
	/*
	 * 日期
	 * 	  FULL   2015年3月4日 星期三
	 * 	  LONG   2015年3月4日
	 * 	  FULL   2015年3月4日 星期三
	 *    MEDIUM 2015-3-4
	 *    SHORT  15-3-4
	 *    
	 * 时间
	 * 	  FULL   下午04时31分59秒 CST
	 * 	  LONG   下午04时32分37秒
	 *    MEDIUM 16:33:00
	 *    SHORT  下午4:33
	 *    
	 * 
	 */
	@Test
	public void testI18N5() throws Exception {
		
		// 日期格式
		int dateStyle = DateFormat.SHORT;
		// 时间格式
		int timeStyle = DateFormat.SHORT;
		
		// 工具类
		DateFormat df = 
			DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.CHINA);		
		String date = df.format(new Date());
		
		System.out.println(date);
	}
	
	// 面试2: 请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象。
	@Test
	public void eg2() throws Exception {
		String str = "09-11-28 上午10时25分39秒 CST";
		// 创建DateFormat工具类,国际化日期
		DateFormat df = DateFormat.getDateTimeInstance(
				DateFormat.SHORT, DateFormat.FULL, Locale.getDefault());
		Date d = df.parse(str);
		
		System.out.println(d);
	}
	

四、jsp页面的国际化

msg_zh_CN.properties

将该文件放在CLASSPATH目录下

user=\u59D3\u540D
pwd=\u5BC6\u7801
submit=\u63D0\u4EA4
title=\u767B\u5F55
msg_en_US.properties

将该文件放在CLASSPATH目录下

user=NAME
pwd=PWD
submit=SUBMITWE
title=Login

index.jsp (没有国际化的登录界面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<form action="./admin?method=login" method="post">
		<table>
			<tr>
				<td>用户名:</td>
				<td><input type="text" name ="name"/> ${msg}</td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name ="pwd"/></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="登录"/></td>
			</tr>			
		</table>
	</form>	
		
</body>
</html>
index_i18n.jsp (国际化的登录界面)
<%@page import="java.util.ResourceBundle"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%
	ResourceBundle rs=ResourceBundle.getBundle("msg", request.getLocale());
%>
<meta charset="UTF-8">
<title><%=rs.getString("title") %></title>
</head>
<body>
	
	
	
	<form action="./admin?method=login" method="post">
		<table>
			<tr>
				<td><%=rs.getString("user") %>:</td>
				<td><input type="text" name ="name"/> ${msg}</td>
			</tr>			<tr>
				<td><%=rs.getString("pwd") %>:</td>
				<td><input type="password" name ="pwd"/></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="<%=rs.getString("submit") %>"/></td>
			</tr>			
		</table>
	</form>	
		
</body>
</html>
测试
在IE浏览器中修改语言环境
		Intenr选项--语言--选择语言设置
访问index_i18n.jsp。会发现根据不同的环境,会显示不同的语言。
发布了113 篇原创文章 · 获赞 0 · 访问量 1284

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/104463875