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与国际化的更多相关文章

  1. Java的国际化(i18n)

    http://blog.csdn.net/csuliky/article/details/4225800 1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, ...

  2. JAVA实现国际化

    1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...

  3. Java:国际化

    Java的国际化: 资源文件的命名可以有如下三种形式:baseName _ language _country.properties baseName _language.properties bas ...

  4. Java程序国际化学习代码一

    Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...

  5. java基础---->java中国际化的实现

    应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...

  6. java对国际化的支持

    国际化的英文为Internationalization,这个也太长了,所以它又称为I18n(英文单词 internationalization的首末字符i和n,18为中间的字符数). 除了i18n还有 ...

  7. JAVA 原始国际化例子

    import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public cla ...

  8. Java语言国际化

    事实上,Java语言不可能支持所有国家和语言,如需要获取Java语言所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含 ...

  9. java语言国际化--ResouceBundle、struts

    一.Java国际化 我们使用java.lang.Locale来构造Java国际化的情境. java.lang.Locale代表特定的地理.政治和文化.需要Locale来执行其任务的操作叫语言环境敏感的 ...

随机推荐

  1. linux下的显示有中国农历的日历ccal

    1.linux下的显示有中国农历的日历ccal

  2. 献给写作者的 Markdown 新手指南及语法

    烈推荐所有写作者学习和掌握该语言.为什么?可以参考: 『为什么作家应该用 Markdown 保存自己的文稿』. 『Markdown写作浅谈』 让你专注于文字而不是排版. 标题 只需要在文本前面加上 # ...

  3. 目标检测之hog(梯度方向直方图)---hog简介0

    梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征.Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功 ...

  4. Linux - 命令行 管道(Pipelines) 具体解释

    命令行 管道(Pipelines) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24249529 管道操作符" ...

  5. 解决pod search出来的库不是最新

    为了让CocoaPods的引入不显示警告,在Podfile最上方加上: inhibit_all_warnings! pod search 一些第三方SDK,发现并不是最新版本,那是因为你的本地repo ...

  6. hive job oom问题

    错误信息例如以下:Container [pid=26845,containerID=container_1419056923480_0212_02_000001] is running beyond ...

  7. Java 学习 day05

    01-面向对象(概述) 面向对象 -- 冰箱.打开:冰箱.存储:冰箱.关闭: 02-面向对象(举例) 使用和指挥 -- 对象,不需要关注过程,只关注结果: 一切皆对象,万物皆对象  -- 自<T ...

  8. 内存MCE错误导致暴力扩充messages日志 以及chattr记录

    由于放假,好久没登过服务器,今天登上服务器查看日志意外发现:/var/log/messages文件竟然被撑到20多个G!!!赶紧查看是什么情况,首先,20多个G的文件根本无法查看,因此,我想到了spl ...

  9. 九度OJ 1009:二叉搜索树 (二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6321 解决:2767 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需 ...

  10. 解决Ubuntu(乌班图)vi/vim模式下粘贴的代码内容会多出的空格的问题

    vi/vim模式下的粘贴 因为linux系统和win系统的差异性,有时候在win环境运行的python代码会放在Linux系统上执行,这个时候就需要把win系统上IDE上的代码copy下来,在Linu ...