Java与国际化
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称。
Java使用java.util.ResourceBundle与java.util.Locale来实现国际化。不同IDE的国际化提供不同的功能支持,便于处理国际化的资源,这里以NetBeans 9.0为例。
国际化有三个重要概念
- 地区(Locale)信息;
- 资源包(Resource bundle);
- 基础名称(Base name);
地区信息可以由一个语言编码(Language code)与可选的地区编码(Country code)来指定。
语言编码由ISO-639定义,由两个小写字母表示,例如ca(Catalan,加拿大文)、zh(Chinese,中文)。
地区编码由ISO-3166定义,由两个大写字面表示,例如IT(Italy,意大利)、TW(Taiwan,台湾)、CN(China,中国)。
Java中,使用java.util.Locale类来表示地区信息,可以使用静态方法getDefault()获取默认的地区信息,与当前的操作系统有关。或者使用构造函数生成实例,指定语言编码和地区编码。
Locale defaulLocale = Locale.getDefault(); Locale locale = new Locale("zh", "CN"); |
或者使用内置的静态实例:
Java的时间相关API,例如Calendar的静态方法getInstance(),都使用到了Local,没用指定编译器默认使用默认的的地区信息(Local.getDefual()的返回值)。
资源包Java中通常使用.properties文件,NetBeans中在Other分类的模板中,可以新建该类型文件。注意,该类型文件需要存放在默认包(default-pack)中:
这样,NetBeans编译后,会把.properties转存到程序的CLASSPATH路径下。
NetBeans环境下,自动编译的程序,默认的CLASSPATH为:
<workspace>\<project name>\build\classes |
其他环境下,可以使用获取系统属性java.class.path,查看CLASSPATH路径。
System.getProperty("java.class.path") |
在NetBeans中,双击或右键-Edit打开.properties文件会使用文本编码模式。文件内容格式与通常的properties文件格式一样。#开头注释,key=value格式。
如果使用右键-Open打开.properties文件,会使用专用的属性编辑模式。
可以使用右键-Add-Locale…,为当前的配置文件添加国际化版本。
在出现的窗口里选择语言。
会自动新建添加地区信息的文件:
未添加地区信息的名称,称为基础名称,这个例子中,content就是基础名称。
使用专用模式会有各种语言的对比视图:
创建好资源包后,Java提供java.util.ResourceBundle读取资源包。使用静态方法getBundle()获取ResourceBundle实例。
// 获取content资源包 ResourceBundle res = ResourceBundle.getBundle("content"); System.out.println(res.getString("com.foundkey.hello") + "!"); System.out.println(res.getString("com.foundkey.world") + "!"); Locale locale = new Locale("zh", "CN"); // 获取content_zh_CN资源包,找不到使用content资源包。 ResourceBundle zHres = ResourceBundle.getBundle("content", locale); System.out.println(zHres.getString("com.foundkey.hello") + "!"); System.out.println(zHres.getString("com.foundkey.world") + "!"); |
传入基础名称,获取指定资源。补充地区信息,可以获取指定区域的资源。如果找不到指定区域的资源包,会使用基础名称的资源包。输出如下:
Hello! World! 你好! 世界! |
Java中,字符采用Unicode编码,如果.properties的编码不是Unicode编码,可以使用JDK工具native2ascii工具来进行转换。
例如:
将GBK编码的demo_zh_CN.txt文件转换为Unicode。
native2ascii -encoding GBK demo_zh_CN.txt demo_zh_CN.properties |
正常显示中文,并使用UTF-8编码保存。
native2ascii -revers -encoding UTF-8 demo_zh_CN.txt demo_zh_CN.properties |
Java与国际化的更多相关文章
- Java的国际化(i18n)
http://blog.csdn.net/csuliky/article/details/4225800 1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, ...
- JAVA实现国际化
1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...
- Java:国际化
Java的国际化: 资源文件的命名可以有如下三种形式:baseName _ language _country.properties baseName _language.properties bas ...
- Java程序国际化学习代码一
Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...
- java基础---->java中国际化的实现
应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...
- java对国际化的支持
国际化的英文为Internationalization,这个也太长了,所以它又称为I18n(英文单词 internationalization的首末字符i和n,18为中间的字符数). 除了i18n还有 ...
- JAVA 原始国际化例子
import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public cla ...
- Java语言国际化
事实上,Java语言不可能支持所有国家和语言,如需要获取Java语言所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含 ...
- java语言国际化--ResouceBundle、struts
一.Java国际化 我们使用java.lang.Locale来构造Java国际化的情境. java.lang.Locale代表特定的地理.政治和文化.需要Locale来执行其任务的操作叫语言环境敏感的 ...
随机推荐
- VueJS组件之间通过props交互及验证
props 是父组件用来传递数据的一个自定义属性.父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop". 父组件通过props ...
- CPU核心电压与VID电压
1.CPU核心电压与VID电压的区别 VID是CPU电压识别信号,CPU的工作电压就是由VID来定义的,CPU核心电压是CPU正常工作所需的电压 原理: (1)通常主板上用硬件VID确定BOOT VI ...
- 常用js特效
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.sr ...
- Druid——阿里巴巴的开源项目(关于数据库连接、监控)
相关文章 0.Druid首页——jdbc连接池,监控组件 1.阿里巴巴的开源项目Druid(关于数据库连接) 2.ITeye谈Druid 3.DBCP(DataBase connection pool ...
- Linux 批量替换的一种实现方式
替换某目录下所有文件中的某个字符: sed -i 's/origin_str/new_str/g' `grep origin_str -rl ./` origin_str:被替换的字符串: new_s ...
- Linux的经常使用命令(1) - 指定执行级别
命令:init [0123456] 执行级别 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重新启动 经常使用执行级别是3 ...
- EasyNVR H5无插件摄像机直播解决方案前端解析之:关于直播页面和视频列表页面切换的问题
关于直播页面和视频列表页面切换 为了给用户更好的用户体验,并且更好的让用户快速简洁的了解实时的视频直播信息.一般多会分为列表展示和实时的视频直播展示. 表面上只是两个视图之间的随意切换,其实切换的两个 ...
- android菜鸟学习笔记10----Intent及<intent-filter>
关于Bundle: 注意到Activity的onCreate()方法的签名是protected void onCreate(Bundle savedInstanceState),其参数是一个Bundl ...
- JAVA数据类型(转)
java中数据的基本类型分为: 基本数据类型和引用数据类型,对此不多介绍: 接下来讨论一下java中数据类型存储在哪 基本数据类型存储在哪,取决于基本类型在哪声明: 1 ...
- 九度OJ 1151:位操作练习 (位操作)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1679 解决:924 题目描述: 给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形 ...