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 作为超类.所有对象(包括数组)都实现这个 ...
随机推荐
- 「小程序JAVA实战」小程序的分享和下载功能(69)
转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudefenxianghexiazaigongneng68/ 在小程序上 ...
- HTML5 APP
jquery,bootstrap http://www.bcty365.com/content-74-2640-1.html JS运行效率,浏览器 html+js+css3 css3是在css的 ...
- ubuntu安装rtx
终端安装RTX sudo apt-get install wine 安装wine下的window扩展包安装工具winetricks,在终端下输入: sudo wget http://winetrick ...
- 实现HBase增量入库(HBase删除自定义时间戳行数据)
目录 1. 背景描述 2. 问题描述 3. 解决方案 1. 背景描述 目前在做音乐推荐项目,前期做排序模型优化,任务是使用模型对用户的历史音乐进行排序,有6800多万个用户,约40G的用户数据,使用H ...
- 寻找hash值——把int array看成是一个整数
QUESTION: Write a class DominoChecker that has a method called addBox(int[]) that takes a box of fiv ...
- How to Restart Qt Application
How to restart QtApplication As we know, Restarting Application means to exit current application, t ...
- import c++ project to eclipse cdt with exiting makefile
Step 2: You are now ready to build your project. To build your project, select Project > Build Pr ...
- CoreImage
[CoreImage] CIContext is an object through which Core Image draws the results produced by a filter. ...
- io.fabric8.kubernetes对pv和pvc的增删查改
1.新建maven项目k8stest,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...
- 【转】java遍历实体类的属性和数据类型以及属性值
和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...