Internationalization 软件国际化,通俗的讲就是企业开发的软件可以在多个不同的语言环境下方便使用,通常也被简称为i18n,因为Internationalization 中间有18个单词,通理的还有K8S之类的简称。
Java中对于软件国际化的支持主要是通过Locale类来实现的。Locale类有一个很重要的构造器:
Locale(String language, String country)
从参数可以看出,构造一个代表特定语言环境的Locale需要传入语言和国家编码,前者的定义来自于IANA的定义,具体查找某个国家的语言可以在 IANA SUBTAG LANGUAGE 中查找,Type: language 是语言编码,Type: region 是国家编码。Java中默认给我们提供了很多示例:
如:
TAIWAN 中国台湾地区 CHINA 中国大陆地区 US 美国地区
如何为应用设置默认使用的语言环境呢?Java给我们提供了一个API,即
Locale.setDefault(Locale newLoce)
有了代表某个地区的Locale类,那么它如何和我们日常开发的软件结合起来使用呢?这里就引申出了另外一个类 ResourceBundle,ResourceBundle可以和一个Locale相关联,用来表示特定地区的资源。
使用方式如下:baseName代表的是Resource Bundle的基础名称,如图中的 exception。
ResourceBundle bundle = ResourceBundle.getBundle("exception");
在项目开发中通常会将这种信息资源定义为一个properties文件,实际上就是通过简单的key=value对实现键值对映射。
除了上面的两个类之外,通常还一起搭配使用的还有MessageFormat类,它是用来做信息格式化的。它也会关联一个Locale对象,通过在待格式化的字符串中留下{0}、{1}等占位符,然后通过
format(String value, Object...arguments) 进行格式化即可。