Java 中的国际化
国际化 ,英文叫 internationalization 单词太长 ,又被简称为 i18n(取头取尾中间有18个字母)不经大声呼喊 ,这都行 !接着看什么是国际化 , 国际化是指让产品或是程序在无需做出改变的情况下就能够适应不同语言和地区的需要 。同样是打招呼在中国你会说 “ 你好 ” ,在美国你会说 “ Hello ” ,你看 ,你已经是 i18n 了 。
在 Java 中实现国际化主要是借助一个工具类 ResourceBundle ,核心的思想就是 ,对不同的语言环境提供一个不同的资源文件 。所以说先来看看资源文件怎么定义的 。
定义相应的资源文件 ,我们将资源文件放在一个资源包(就是平常的一个包)中 ,一个资源包中每个资源文件必须拥有共同的基名 。除了基名 ,每个文件的名称中还必须有标识其本地信息的附加部分 ,例如 :一个资源包的基名是 “ message ” ,则与中文(中国)、英文(美国)环境相对应的资源文件名分别为 :
message_zh_CN.properties
message_en_US.properties

这里需要注意的是 ,资源文件通常采用键值对的形式 ,并且资源文件中采用的是 properties 格式文件 ,所以文件中的所有字符都必须是 ascll 码 ,不能保存为中文的 ,Java 中提供 了 native2ascll 工具用于将中文转化为 ascll 码 。所以在编写 properties 文件的时候写的是中文 ,一回车就自动被编码了 。

下面就是具体的编码了 ,在 Java API 中提供了一个 ResourceBundle 类用于描述一个资源包 ,并且 ResourceBundle 类提供了相应的静态方法 getBundle ,这个方法可以根据来访者的国家地区自动绑定对应的资源文件 。
import java.util.Locale;
import java.util.ResourceBundle; public class I18n{ public static void test() {
// 设置定制的语言国家代码
Locale locale1 = new Locale("en_US");
Locale locale2 = Locale.getDefault();
// 获得资源文件
ResourceBundle rb = ResourceBundle.getBundle("message.i18n.message", locale2);
// 获得相应的key值
String greeting = rb.getString("greeting");
String userInfo = rb.getString("name"); System.out.println(greeting);
System.out.println(userInfo);
} public static void main(String[] args) {
test();
}
}
//你好
//余6路
以上就是一些固定文本的国际化 ,固定文本包括菜单名 ,导航条 ,系统提示信息等 ,都是我们手工配置在 properties 文件中的 ,但有些数据 ,比方说 ,数值 ,货币 ,时间 ,日期等由于可能在程序运行时动态产生 ,所以无法像文字一样简单地将它们从应用程序中分离出来 ,而需要特殊处理 。Java 提供了解决这些问题的 API 。
简单的说一下 Locale 这个类 ,英语介绍是这样的
A Locale object represents a specific geographical , political , or cultural region . An operation that requires a Locale to perform its task is called locale-sensitive and uses the Locale to tailor information for the user .
翻译过来就是说 Locate 对象代表特定的地理 ,政治或文化区域 。需要 Locate 设置执行任务的操作称为敏感区域( 包含 Locate 的类就是敏感区域 ) ,使用 Locate 为用户定制信息 。
关于日期的国际化我们使用工具类 DateFormat ,看一下该类的结构图 。

DateFormat 有很多不同的构造器 ,而且在构造器中还可以指定不同的时间显示模式 ,我就不一一演示了 ,下面给出示例代码 。
public class DateFormatTest {
public static void main(String[] args) throws ParseException {
Date date = new Date();
DateFormat df = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.CHINA);
String str = df.format(date);
System.out.println(str); // 2018-8-6
df = DateFormat.getTimeInstance(DateFormat.LONG, Locale.CHINA);
System.out.println(df.format(date)); // 下午07时58分26秒
df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, Locale.CHINA);
System.out.println(df.format(date)); // 2018年8月6日 星期一 下午7:58
// 得到默认的DateFormat
df = DateFormat.getInstance();
System.out.println(df.format(date)); // 18-8-6 下午7:58
// 使用DateFormat反向把一个字符串格式化成一个日期对象
String dateString = "2018年8月6日 星期一 下午7:58";
DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, Locale.CHINA);
Date date2 = df2.parse(dateString); // 这里可能会有异常,字符串的格式和 DateFormat 设置的格式不一致时就会报错。
System.out.println(date2); // Mon Aug 06 19:58:00 CST 2018
}
}
动态文本国际化使用工具类 MessageFormat ,MessageFormat 允许开发人员用占位符替换掉字符串中的敏感数据( 即国际化相关的数据 )字符串中的 {0} {1} {2} {3} 就是占位符 。
public class MessageFormatTest {
public static void main(String[] args) {
/* 测试数据
greeting=Welcome
name=YJK
age=18
pattern={0},{1},your age is {2}.
*/
ResourceBundle rb = ResourceBundle.getBundle("message.i18n.message_en_US",Locale.US);
String greeting = rb.getString("greeting");
String name = rb.getString("name");
String age = rb.getString("age");
// 得到模式字符串
String pattern = rb.getString("message");
// 实例化MessageFormat对象,并装载相应的模式字符串
MessageFormat format = new MessageFormat(pattern);
// format 方法需要一个 Object 的数组。
Object[] params = {greeting, name, age};
// 格式化模式字符串,参数数组中指定占位符相应的替换对象
String string = format.format(params);
System.out.println(string);
}
}
//Welcome,YJK,your age is 18.
NumberFormat 类可以将一个数值格式化为符合某个国家地区习惯的数值字符串 ,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值 。 对应的方法分别是 format 和 parse 。
public class NumberFormatTest {
public static void main(String[] args) throws ParseException{
int price = 18;
// NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA); // ¥18.00
// NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US); // $18.00
// NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.JAPAN); // ¥18
// 获得处理货币的 NumberFormat 实例对象
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.FRANCE); // 18,00 €
System.out.println(nf.format(price));
String s = "18,00 €";
nf = NumberFormat.getCurrencyInstance(Locale.FRANCE);
// 以法国的货币来解析 18,00 € 得到的结果是 18.0
System.out.println(nf.parse(s).doubleValue());
double d = 0.1;
// 获得处理整数的NumberFormat实例对象。
nf = NumberFormat.getIntegerInstance(); // 0
// 获得处理百分比数值的 NumberFormat 实例对象
nf = NumberFormat.getPercentInstance();
System.out.println(nf.format(d)); // 10%
}
}
Java 中的国际化的更多相关文章
- [Java 进阶]Java中的国际化
背景知识 现代软件开发,往往做出的应用程序不止给一个国家的人去使用.不同国家的人往往存在语言文字不通的问题.由此产生了国际化(internationalization).多语言(multi-langu ...
- Java中的国际化
一.什么是国际化? 国际化是指应用程序运行时,可根据客户端请求来自的国家/地区.语言的不同而显示不同的界面. 二.Java如何实现国际化? Java程序的国际化思路是将程序中的标签.提示等信息放在资源 ...
- [Java中实现国际化] - 配合thymeleaf实现中英文自动切换(多语言)
MOOC该链接第三章第二节 尚硅谷SpringBoot全集 web开发国际化 xjbo (7天,过期可以留言索取) resources下建立文件 上到下为: 默认的,英语(美国),中文(中国) en ...
- java 中 ResourceBundle 使用 国际化使用
java 中 ResourceBundle 使用 可以根据以下类进行获取国际化文件: package org.mybatis.generator.internal.util.messages; imp ...
- java基础---->java中国际化的实现
应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...
- Java系列:国际化(zz)
国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...
- Java中的日期操作
在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...
- struts2中的国际化
[java] view plaincopy 实现struts2中国际化其实非常简单 首先,struts2中的国际化是通过资源文件来配置的. 资源文件分为:action类级,package类级,还有we ...
- Java中基础类库使用
Java中基础类库: 在这里我仅仅介绍几种我个人觉得会常常使用的 1:Object类中的Clone机制仅仅是对对象进行浅层次的克隆,假设须要进行深层次的克隆的话那么就要自己写(详细Clone方法请參考 ...
随机推荐
- 活学活用,CSS清除浮动的4种方法
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近. CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受. 1.结尾处加空div标签 ...
- 【leetcode 简单】 第九十六题 最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不 ...
- REX系统了解1
REX是高通开发出来的一个操作系统,起初它是为了在Inter 80186处理器上应用而开发的,到后来才转变成应用在ARM这种微处理器上.他历经了很多版本,代码也越来越多,功能也越来越完善.REX只用不 ...
- ActiveMQ 使用场景
ActiveMQ 安装测试就不做介绍了,下面我说说ActiveMQ 使用场景.(松耦合与ActiveMQ) 1.非均匀应用集成 ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 ...
- Flask:文件配置方式实践及其中的各种问题记录
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2, 提示: 1.请查看本文后面的“18-07-17 11:18重大纠正” ! 2.flask run命令运行时传入参数 ...
- Flask:使用jsonify()转换为JSON的数据在Chrome显示为Unicode编码
Chrome 66,Flask 1.0.2,MongoDB 3.6.3, 创建了一个Flask应用,在将MongoDB中的数据使用PyMongo包获取后,再使用jsonify转换为JSON格式发送回请 ...
- 【前端vue开发架构】vue开发单页项目架构总结
为营销活动设计的前端架构 主要的技术栈为 Vuejs,Webpack,请自行阅读如下技术或者框架的文档: 一.基础说明: node (https://nodejs.org/en/) npm (http ...
- UFLDL 教程学习笔记(四)
课程地址:http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/ 在之前的练习中,图片比较小, ...
- 洛谷P2149 Elaxia的路线
传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...
- JS、JQ实现焦点图轮播效果
JS实现焦点图轮播效果 效果图: 代码如下,复制即可使用: (不过里面的图片路径需要自己改成自己的图片路径,否则是没有图片显示的哦) <!DOCTYPE html> <html> ...