java学习笔记—国际化(41)
国际化:internationalization即I18N。
举例:
本科高校的网站,一般的都有中文和英文两种页面风格。因此将这种根据不同用户群体显示不同的页面风格的方式称之为页面的国际化。
翻译 VS 国际化
翻译:Chrome
国际化:主要做的是页面的显示信息的国际化,至于文件等其他的资源是无法进行国际化。
1 国际化的原理

- 获取用户的本地信息
Locale通过静态属性获取区域对象。
- 准备不同区域国家的需要显示的资源
全部使用properties配置文件进行实现。但是文件名需要按照指定的规则进行书写。
规范: 基本名_语言名.properties
基本名是随意的,语言名是固定可以参考浏览器的语言。
- 根据区域语言信息查找指定的资源进行显示
ResourceBundle 的静态方法static ResourceBundle getBundle(String baseName,
Locale locale)
绑定资源的原理:获取资源基本名和区域语言名锁定资源名。
String getString(String key)
一 体验
1. 编写两个如下的资源文件
greet_zh.properties
hello=\u4F60\u597D
greet_en.properties
hello=Hello
2. 实现一个如下的java类
public static void main(String[] args) {
// 获取本地区域信息
Locale locale = Locale.US;
// 绑定资源
ResourceBundle bundler = ResourceBundle.getBundle("cn.itcast.ps.greet", locale);
System.out.println(bundler.getString("hello"));
}
总结:
如果没有可视化编辑器那么直接使用native2ascii.exe进行中文的转码。
国际化变量
1 日期国际化
DateFormat该类主要提供的是以不同的区域显示不同的日期格式。
根据区域信息格式化和解析日期数据。
static DateFormat getDateInstance(int style, Locale aLocale) à 获取日期实例
static DateFormat getTimeInstance(int style, Locale aLocale) à 获取时间实例
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)à 获取日期和时间
Date parse(String source) à 解析日期
String format(Object obj) à 格式化日期
举例:
获取日期和时间
Long
2013年1月21日 下午04时16分41秒
January , :: PM CST
FULL
2013年1月21日 星期一 下午04时18分19秒 CST
Monday, January , :: PM CST
MEDIUM
-- ::
Jan , :: PM
SHORT
-- 下午4:
// : PM
练习:将以下的字符号串解析为日期对象。
String date = “2013年1月21日 下午4:20”;解析为日期对象。
Long Short
public static void main(String[] args) throws Exception{
//I18NDate();
String date = "2013年1月21日 下午4:20";
Locale locale = Locale.CHINA;
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, locale);
Date new_date = format.parse(date);
System.out.println(new_date);
}
数字国际化
NumberFormat
static NumberFormat getInstance(Locale inLocale) 国际化普通数字
static NumberFormat getCurrencyInstance(Locale inLocale) 国际化货币
static NumberFormat getPercentInstance(Locale inLocale) 国际化百分比
国际化
String format(Object obj)
Number parse(String source)
举例:
public static void main(String[] args) throws Exception{
// 获取国际化普通数字的对象
Locale locale = Locale.CHINA;
NumberFormat format = NumberFormat.getInstance(locale);
String str = format.format(123456.789);
System.out.println(str);
locale = Locale.CHINA;
format = NumberFormat.getCurrencyInstance(locale);
str = format.format(123456.789);
System.out.println(str);
locale = Locale.CHINA;
format = NumberFormat.getPercentInstance(locale);
str = format.format(0.789);
System.out.println(str);
}
练习:将String str = "¥123.7";解析为数字。
public static void main(String[] args) throws Exception{
//I18NNumber();
String str = "¥123.7";
Locale locale = Locale.CHINA;
NumberFormat format = NumberFormat.getCurrencyInstance(locale);
Number num = format.parse(str);
System.out.println(num.doubleValue()*);
}
动态文本国际化
public static void main(String[] args) throws Exception{
String str = "On {0}, a hurricance destroyed {1} houses and caused {2} of damage.";
String date = "Jul 3, 1998 12:30 PM";
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US);
Date new_date = format.parse(date);
Double money = new Double(1E7);
NumberFormat numfor = NumberFormat.getCurrencyInstance(Locale.CHINA);
String new_str = numfor.format(money);
Object[] os = new Object[]{new_date,new Integer(),new_str}
MessageFormat msg_for = new MessageFormat(str,Locale.CHINA);
String for_str = msg_for.format(os);
System.out.println(for_str);
}
以上的动态文本国际化每次需要将所有需要国际化的数据单独的进行国际化好之后逐一的进行填充。因此比较繁琐,可以使用以下的模式字符串。
public static void main(String[] args) throws Exception{
String pattern = "At {0, time, short} on {0, date}, a hurricance destroyed "
+ "{1} houses and caused {2, number, currency} of damage.";
String datetimeString = "Jul 3, 1998 12:30 PM";
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US);
Date new_date = format.parse(datetimeString);
Object[] os = new Object[]{new_date,new Integer(),new Double(1E7)};
MessageFormat msg_for = new MessageFormat(pattern,Locale.US);
String for_str = msg_for.format(os);
System.out.println(for_str);
}
案例一:实现登陆的国际化
<body>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="in" %>
<in:setLocale value="${pageContext.request.locale}"/>
<in:setBundle basename="cn.itcast.login.greet" var="bund" scope="page"/>
<form action="">
<table align="center" border="">
<tr>
<td><in:message bundle="${pageScope.bund}" key="name"/></td>
<td><input type="text" name="uname"></td>
</tr>
<tr>
<td><in:message bundle="${pageScope.bund}" key="psw"/></td>
<td><input type="text" name="uname"></td>
</tr>
<tr>
<td colspan="">
<input type="submit" value='<in:message bundle="${pageScope.bund}" key="submit"/>'>
<input type="reset" value='<in:message bundle="${pageScope.bund}" key="reset"/>'>
</td>
</tr>
</table>
</form>
</body>
后期在Struts2.x中需要使用struts的国际化标签。
java学习笔记—国际化(41)的更多相关文章
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- java学习笔记12--国际化
java学习笔记12--国际化 国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过 ...
- 20145231第二周Java学习笔记
20145231 <Java程序设计>第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本,再看视频,然后实践敲代码,最后根据学习笔记总结完成博客. 第三章:基础语法 知识点比 ...
- Java学习笔记之---API的应用
Java学习笔记之---API的应用 (一)Object类 java.lang.Object 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个 ...
随机推荐
- leetcode561
public class Solution { public int ArrayPairSum(int[] nums) { var list = nums.OrderBy(x => x).ToL ...
- 「小程序JAVA实战」小程序的springboot后台拦截器(61)
转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudespringboothoutailanjieqi60/ 之前咱们把 ...
- c++经典排序算法全集(转)
C++排序算法全集 排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高. 一.简单排序算法 由于程序比较简单,所以没有加什么注释.所有的程序都给出了完 ...
- python中os.system()的返回值
[python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...
- 使用java代码编辑oracle数据库
package com.hanqi; import java.io.IOException; import java.sql.Connection; import java.sql.DriverMan ...
- Unity Shader-简单均值模糊
http://blog.csdn.net/puppet_master/article/details/52547442 与Amplify中的Simple Blur例子实现一样
- ios 解决Wkwebview闪烁问题
// 网页闪烁问题 if ([self.webView.realWebView isKindOfClass:[WKWebView class]]) { ((WKWebView * ...
- entity_class实体类
对应数据库中表,并继承基础模型类~
- socket收发消息
.socket通讯类 using System; using System.Collections.Generic; using System.Net; using System.Net.Socket ...
- innobackupex工作原理
写篇文章凑个数,基本是翻译,建议看原文. http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/how_innobackupex ...