Java 国际化 i18n

国际化信息也成为本地化信息,一般需要2个条件才能确定一个特定的国际化信息,分别是:“语言类型” 和 “国家/地区信息”,Java 为国际化提供了一系列类支持;
常用的“语言类型” 和 “国家/地区信息”代码如下:
语言类型代码:
中文 zh
英语 en
日语 ja
法语 fr
国家/地区代码:
中国大陆 CN
中国香港 HK
美国 US
英国 EN
完整语言代码可以参见:http://www.lingoes.cn/zh/translator/langcode.htm
完整国家/地区代码可以参见:http://www.loc.gov/standards/iso639-2/php/English_list.php

以下示例代码的完整代码地址:https://gitee.com/assad/springframework-test-i18n

Locale

java.util.Locale 是表示“语言”和“国家/地区”的本地化类,是 Java 创建国际化应用的基础,以下是一些示例使用:
//带有语言和国际地区信息的 Locale

Locale local1 = new Locale("zh","CN");

//带有语言信息的 Locale

Locale local2 = new Locale("zh");

//等同于 Locale("zh","CN");

Locale locale3 = Locale.CHINA;

//等同于 Locale("zh");

Locale locale4 = Locale.CHINESE;

//获取默认Locale

Locale defaultLocale = Locale.getDefault();

如果在测试时需要改变系统默认的本地化设置,可以在启动JVM时通过命令参数指定:
java -Duser.language=zh -Duser.region=CN MainClass 

本地化工具类

Java 的 java.text 包提供了一系列支持本地化格式化操作的工具类,如:NumberFormat,DateFormat,MessageFormat

DateFormat

java.text.DateFormat 用于对日期时间进行本地化格式化操作,本身实现为一个工厂类,可以通过 DataFormat.getXxxInstance() 获取实例;

① 格式化日期

Date date = new Date();

Locale locale = new Locale("en","US");

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM,locale);

String fmtStr = dateFormat.format(date); //fmtStr = "Dec 1, 2017"

② 格式化时间

Date date = new Date();

Locale locale = new Locale("en","US");

DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM,locale);

String fmtStr = dateFormat.format(date); //fmtStr = "4:46:21 PM"

③ 格式化日期时间

Date date = new Date();

Locale locale = new Locale("en","US");

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,locale6);

String fmtStr = dateFormat.format(date); //fmtStr = "Dec 1, 2017 4:48:06 PM"

其中 DataFormat.getXxxInstance() 的 dateStyle / timeStyle 参数包含以下可用常量:
  • DateFormat.SHORT:如:7/24/98   4:49 PM
  • DateFormat.MEDIUM:如 :24-Jul-98,4:49:05 PM
  • DateFormat.LONG:如:July 24, 1998  4:49:05 PM EST
  • DateFormat.FULL:如:Friday,July 24, 1998    4:49:05 o'clock PM EST

NumberFormat

java.text.NumberFormat 用于对数字进行本地化格式化操作,身实现为一个工厂类,可以通过 DataFormat.getXxxInstance() 获取实例;
如:DataFormat.geCurrencyInstance() 格式化数字为本地化货币字符串;
        DataFormat.gePercentInstance() 格式化数字为本地化百分比字符串等;

① 普通数字格式化

double value = 2333.33;

Locale locale = new Locale("en","US");

NumberFormat numberFmt = NumberFormat.getInstance(locale);

String fmtStr = numberFmt.format(value);  //fmtStr = "2,333.33"

② 货币格式化

double value = 2333.33;

Locale locale = new Locale("zh","CN");

NumberFormat numberFmt = NumberFormat.getCurrencyInstance(locale);

String fmtStr = numberFmt.format(value);  //fmtStr = "¥2,333.33"

③ 本地化数字字符串转换为数字

使用 NumberFromat 实例的 parse() 方法,可以将本地化货币字符串,百分比字符串,本地化数字字符串等转换回 java.lang.Number 的一个实例;
//将一个本地化的货币字符串转化为double类型;

String currStr = "¥2,333.33";

NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);

Number num = numberFormat.parse(currStr);

double value = num.doubleValue();   //value=2333.33

MessageFormat

java.text.MessageFormat 在 DateFormat , NumberFormat 的基础上提供了强大的占位符字符串格式化功能,支持时间、数字、对象属性的格式化;
//格式化模板字符串

String pattern1 = "{0},您于 {1,date,short} 支付 {2,number,currency} ";

String pattern2 = "{0} ,you paid {2,number,currency} at {1,date,short} ";

//动态替换格式化字符串的占位符的参数

Object[] params = {"Al-assad",new Date(),1.0E3};

//使用指定本地化对象格式化信息

MessageFormat  msgFmt1 = new MessageFormat(pattern1,Locale.CHINA);

MessageFormat msgFmt2 = new MessageFormat(pattern2,Locale.US);

String msg1 = msgFmt1.format(params);   //"Al-assad,您于 17-12-1 支付 ¥1,000.00 "

String msg2 = msgFmt2.format(params);   //"Al-assad ,you paid $1,000.00 at 12/1/17 "


资源包 和 ResourceBundle

资源包

在国际化应用中,国际化信息一般以 .properties 文件中键值对的形式存在,国际化资源包的命名格式如下:
<资源名>_<语言代码>_<国家/地区代码>.properties
一个项目包含典型资源包文件如下:
resource.properties       //默认资源包,但程序查到不到当地的本地化资源包时,使用该资源包

resource_zh_CN.properties   //中文资源包

resource_en_US.properties   //英文资源包

......

资源包的示例代码如下:
resource.properties
greeting.common=How are you!

greeting.morning=Good Morning!

greeting.afternoon=Good Afternoon!

resource_zh_CN.properties
greeting.common=\u4F60\u597D!

greeting.morning=\u65E9\u4E0A\u597D!

greeting.afternoon=\u4E0B\u5348\u597D\uFF01

注意在.properties 文件中只能存在ASCII字符,必须将非ASCII字符(如中文字符)转换为相应的Unicode码,以上resource_zh_CN.properties是经过转换后的结果,原本编写时的 Native 编码内容如下:
greeting.common=你好!
gretting.morning=早上好!
gretting.afternoon=下午好!
可以使用 native2ascii.jar 工具实现这一过程,调用的语法如下:
native2ascii [-encoding 编码] [输入文件 [输出文件]]
示例如下:
native2ascii -encoding utf-8 d:\resource_zh_CN_orginal.properties d:\resource_zh_CN.properties
如果开发环境为 Intellij IDEA,可以通过设置【File -> settings -> Editor -> File Encodings -> 勾选 Transparent native-to-ascii conversion】,此时在 IDEA 中可以直接编写 native 的 properties 文件,IDEA 会自动将 native 字符转化为 ascii 字符,同时在 IDEA 视图只能仍然以 native 的方式显示,这对于开发调试十分方方便;

ResouceBundle

java.util.ResourceBundle 用于获取国际化资源包中的键值;

获取国际化资源包中的键值

完整示例代码模块:site.assad.i18n/ResourceBoundle.class,site.assad.i18n/resource
        //使用系统用默认Locale获取资源包

        Locale locale = Locale.getDefault();

        ResourceBundle resourceBundle = ResourceBundle.getBundle("site/assad/i18n/resource"); //指定资源包路径,基于类路径

        //获取资源包中的对应键值

        String common = resourceBundle.getString("greeting.common");   //"你好!"

        String morning = resourceBundle.getString("greeting.morning");  //"早上好!"

        String afternoon = resourceBundle.getString("greeting.afternoon");  //"下午好!"

        //指定Locale获取资源包

        ResourceBundle resourceBundle2 = ResourceBundle.getBundle("site/assad/i18n/resource",Locale.US);

        String common2 = resourceBundle2.getString("greeting.common");   //"How are you!"

在资源文件中使用占位符模板字符串

可以在资源文件中使用占位符模板字符串,同时结合 MessageFormat ,就可以实现在运行时灵活构造国际化信息;
完整示例代码模块:site.assad.i18n/FormatResourceBoundle.class,site.assad.i18n/fmt_resource

fmt_resource.properties
greeting.common=How are you!{0},today is {1,date,short}

greeting.morning=Good morning!{0},now is {1,time,short}

greeting.afternoon=Good afternoon!{0},now is{1,time,short}

调用资源文件中的键值:
//加载本地化资源

ResourceBundle resourceBundle1 = ResourceBundle.getBundle("site/assad/i18n/fmt_resource",Locale.US);

ResourceBundle resourceBundle2 = ResourceBundle.getBundle("site/assad/i18n/fmt_resource",Locale.CHINA);

//动态替换占位符参数

Object[] params = {"Al-assad",new Date()};

//获取本地化键值,并对其进行格式化

String common1 = new MessageFormat(resourceBundle1.getString("greeting.common"),Locale.US).format(params);

String morning1 = new MessageFormat(resourceBundle1.getString("greeting.morning"),Locale.US).format(params);

String afternoon1 = new MessageFormat(resourceBundle1.getString("greeting.afternoon"),Locale.US).format(params);

String common2 = new MessageFormat(resourceBundle2.getString("greeting.common"),Locale.CHINA).format(params);

String morning2 = new MessageFormat(resourceBundle2.getString("greeting.morning"),Locale.CHINA).format(params);

String afternoon2 = new MessageFormat(resourceBundle2.getString("greeting.afternoon"),Locale.CHINA).format(params);

System.out.println(common1+"\n"+morning1+"\n"+afternoon1+"\n"+common2+"\n"+morning2+"\n"+afternoon2);

 /*output:

 How are you!Al-assad,today is 12/1/17

 Good morning!Al-assad,now is 2:22 PM

 Good afternoon!Al-assad,now is2:22 PM

 你好!Al-assad,今天是 17-12-1

 上午好!Al-assad,现在的时间是 下午2:22

 下午好!Al-assad,现在的时间是 下午2:22

 * */

Java 对国际化 (i18n) 的支持资源包的调用相关推荐

  1. minecraft_如何使用资源包改变Minecraft的世界

    minecraft Some people love Minecraft's 8-bit chunky look, while others can't believe a game would lo ...

  2. java国际化——资源包

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 旨在理解 java国际化--资源包 的基础知识 : 2) 本文源代码idea 转自: (利用propertie ...

  3. java i18n_Java i18n – Java的国际化

    java i18n Internationalization in Java or Java i18n is a very important feature. Java provides inter ...

  4. java i18n_Java国际化(i18n)

    Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就 ...

  5. android打包名字,使用jenkins为android工程打包,支持多包名,改资源(踩坑指南)...

    需求 上一篇文章主要写了打包刚开始的配置和参数化构建.这篇文章主要讲一讲在改包名.改资源的打包实践中,常会碰到的问题以及解决办法.如果看博客的人有更好的解决办法,也可以找我交流,关于页面有我联系方式. ...

  6. Java中文处理, 资源包后缀详解

    作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: 02/22/2006 14:42:55 版权声明:可以 ...

  7. java i18n实例_Java国际化(i18n)格式化日期

    本篇文章帮大家学习java国际化(i18n)格式化日期,包含了Java国际化(i18n)格式化日期使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. DateFormat类提 ...

  8. 苹果ios超级签名源码包java版带分发页面支持安卓合并部署教程

    果超级签名是什么我就不在赘述了,项目由java+vue开发 功能: 1.支持登录注册,拥有共有池,可上传证书等基本操作,支持用户自行上传证书 2.支持修改分发页面轮播图,简介,安卓合并 3.ipa签名 ...

  9. 苹果ios超级签名源码包java版带分发页面支持安卓合并

    苹果超级签名是什么我就不在赘述了,项目由java+vue开发 功能: 1.支持登录注册,拥有共有池,可上传证书等基本操作,支持用户自行上传证书 2.支持修改分发页面轮播图,简介,安卓合并 3.ipa签 ...

最新文章

  1. Linux那些事儿 之 戏说USB(27)设备的生命线(十)
  2. 基于分布式的短文本命题实体识别之----人名识别(python实现)
  3. Work with Alexa :Echo匹配连接到Alexa
  4. Linux查看文件夹大小的命令
  5. 【独立游戏】黎明之刃——3D硬核ARPG游戏
  6. 【数理知识】《矩阵论》方保镕老师-目录及关于符号的含义
  7. C# SQLite 数据库操作语句与文件视图管理器
  8. [开发笔记]-winfom ListBox控件选中项上下移动排序
  9. 清理垃圾代码bat_来买个小内存u盘么咯?盘内带电脑垃圾清理.bat那种丨heibai.org...
  10. 基础算法 —— 高精度计算 —— 高精度除法
  11. ModalPopupExtender控件主要有两种使用方式:客户端使用方式和服务器端使用方式
  12. 杭电 2838 牛叉的树状数组
  13. VS2005 + VSS2005 的方法
  14. 2015 2020 r4烧录卡 区别_2020版药典,药用辅料被重视了!
  15. Windows 下使用 TFTPD32+HTTP PXE引导安装linux
  16. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  17. javacore日志分析工具jca
  18. 信号积分变换的公式推导以及几个例子
  19. 蓝色经典钢琴-Cinesamples Piano In Blue v2.3b Kontakt
  20. 树莓派3B+ 编译Qt源码

热门文章

  1. FMS2016设NVMe主题展区 Memblaze展示PBlaze4及FlashRAID
  2. ESP32-S3 master分支开发环境搭建
  3. 【Go Web学习笔记】第一章 搭建Web服务器
  4. Java顺时针打印矩阵
  5. 最小生成树的克鲁斯卡尔算法
  6. 手机射频测试总结(五)——蓝牙部分
  7. python安装出现modify_Win10系统提示“Python 0x80070643安装时发生严重错误”怎么办?...
  8. java计算机毕业设计社区团购系统源码+系统+数据库+lw文档
  9. 想做成功网站需要注意的几个问题
  10. 网络测试工具 iperf 使用指南