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 作为超类.所有对象(包括数组)都实现这个 ...
随机推荐
- jQuery用FormData对象实现文件上传以及如何通过ajax下载文件
之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看--跑偏了(⊙o⊙)-,我的意思就是用框架实现比较简单,但是如果 ...
- SC命令安装window服务
sc create Styler binpath= "D:\Styler\Styler.exe" start= auto displayname= "Styler&quo ...
- typedef用法和与define的区别
typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍typed ...
- the difference between fopen&open
[the difference between fopen&open] fopen是C标准API,open是linux系统调用,层次上fopen基于open,在其之上.fopen有缓存,ope ...
- 16.3Sum Closest (Two-Pointers)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- 二叉树叶子顺序遍历 · binary tree leaves order traversal
[抄题]: 给定一个二叉树,像这样收集树节点:收集并移除所有叶子,重复,直到树为空. 给出一个二叉树: 1 / \ 2 3 / \ 4 5 返回 [[4, 5, 3], [2], [1]]. [暴力解 ...
- QByteArray to QString
QByteArray => QString void BarEngine::ByteArrayToString(QByteArray &ba, QString &str) { i ...
- DBA的工作职责和每日工作
DBA一般职责 1.安装和升级数据库服务器,以及应用程序工具构建和配置网络环境. 2.熟悉数据库系统的存储结构预测未来的存储需求,制订数据库的存储方案. 3.根据开发人员设计的应用系统需求创建数据库存 ...
- vue elementui form表单验证
最近我们公司将前端框架由easyui 改为 vue+elementui .自学vue两周 就开始了爬坑之路.业余时间给大家分享一下心得,技术新手加上第一次分享(小激动),有什么不足的地方欢迎大家指正, ...
- SQLServer锁的机制
SQLServer锁的机制:共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新(BU)