本文主要介绍国际化中比较重要的类Locale
,ResourceBundle
,MessageFormat
java.util.Locale
Locale表示地区,在国际化中是一个非常重要的类。
基本方法
1 | import java.util.Locale; |
可以看出Locale其实是由两部分组成,即{语言}_{地区}
获取
有多种方法获取Locale,常用的如下:
1 | // 获取Java虚拟机默认的语言环境,可以通过setDefault(Locale newLocale)修改 |
示例
下面通过示例演示在不同Locale下日期和货币表现形式
1 | import java.text.DateFormat; |
java.util.ResourceBundle
ResourceBundle可以加载和读取不同语言包,展示不同语言文本。
语言资源文件命名
1 | // 加载语言资源文件 |
上面的代码表示加载i18n文件夹下所有baseName
为server的资源文件。资源文件命名规则如下:
摘自ResourceBundle.getBundle(String baseName, Locale locale, ClassLoader loader)方法注释
1 | baseName + "_" + language + "_" + script + "_" + country + "_" + variant |
常用的资源文件命名如下:
1 | baseName + "_" + language + "_" + country |
如以下命名:
1 | server_en |
语言资源文件加载
假设默认Locale为Locale("en")
,以常用的properties文件为例,有以下资源文件:
1 | server.properties |
调用方法ResourceBundle.getBundle(String baseName, Locale targetLocale)
:
1 | 如果 targetLocale = Locale("zh"),加载文件 server_zh.properties,server.properties; |
1 | //获取对应语言文本 |
上面代码中,参数key
即为资源文件中的键,当获取到第一个不为null
的值时,返回结果
示例
新建资源文件
新建文件夹i18n
,并在文件夹下新建国际化资源文件,结构如下:
1 | - src/main/ |
在资源文件中写入如下内容:
1 | # 在server_en.properties写入 |
新建测试类
1 | public class ResourceBundleTest { |
java.text.MessageFormat
MessageFormat用于替换字符串(类似String.format(String format, Object... args)
),生成不同语言环境下的文本。
1 | public class MessageFormatTest { |
使用占位符
占位符索引从0开始,即非负整数。
摘自MessageFormat类注释
1 | FormatElement: |
如:
1 | MessageFormat.format("this is {0,number,#.##}", 1.2444); // this is 1.24 |
使用单引号
单个单引号会被忽略,两个单引号显示为一个单引号
1 | MessageFormat.format("{0} is 'a cat", "dd"); // dd is a cat |
单个单引号会使其后面的占位符失效
1 | MessageFormat.format("a b' {0} is", "c"); // a b {0} is |
使用左花括号
单个左花括号不支持
1 | MessageFormat.format("a { {0} i's", "c"); // IllegalArgumentException |