程序多语言实际就是在不同的地区根据主机不同的设定去匹配与之对应的语言环境。
要实现多语言环境首先可以通过Locale类创建一个本地语言环境对象,如下有三种方式:
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
第一个是通过指定语言和地区指定;
第二个是通过语言代码构造语言环境
第三个是获取此JAVA虚拟机实例的当前默认语言环境
然后就是语言的自定义了
实际上这里就是通过读取不同的配置文件获取不同的语言对应的字符,因此这里就用到了ResourceBundle工具类绑定资源文件。
资源文件的命名包含了语言环境的代码,我创建了下面两个中文和英文的语言文件:
IDEA直接识别不同语言环境的文件并将他们放在一起(因为它们的基本名称相同)
这里的资源文件是通过键值对的方式存储的,如下info_zh_CN.properties:
username=\u7528\u6237\u540d
passwd=\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u6B22\u8FCE\uff0c{0}
info.error=\u767B\u5f55
这里定义的是汉语的资源文件,通过key=value的方式保存值,直接通过key去获取就可以了,其中info.success=\u6B22\u8FCE\uff0c{0}这一行的最后一个{0}代表的是通配符,用于后续动态文本处理在下面会用得到。
在通过ResourceBundle工具类绑定资源文件名如下:
ResourceBundle res = ResourceBundle.getBundle("MultiLanguage.info", locale1);
通过第一个参数指定资源文件,资源文件是包名.文件基本名(基本名不包括语言部分(_en_US)和资源后缀部分(.properties)),然后通过第二个参数指定当前的语言环境,然后就可以根据不同的语言环境寻找不同的资源文件,从中读取不同的语言字符,从属性文件中通过key获取value值如下:
String input = res.getString("input");
直接通过之前new的ResourceBundle类的getString方法通过在参数中传入key的值就可返回要取到的value的值。其中之前说到的动态文本处理使用到java.text.MessageFormat类,用来处理动态文本,这里简单使用如下:
String success = MessageFormat.format(infoSuccess, userName);
其中format是MessgeFormat的一个静态方法,该方法的第一个参数就是要进行动态处理的字符串,infoSuccess就是之前获取到的包含通配符{0}的一个字符串,后续的参数个数可变,分别对应前面字符串中的通配符,这样修改之后就可以达到动态处理文本了。
下面例子是一个模拟用户登陆的例子,可以通过分别指定不同的locale进而显示不同的语言,下面分别是各个文件的源码,如下:
LocaleDemo.java
package MultiLanguage;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
/**
* Created by zhuxinquan on 16-5-30.
* MultiLanguage
*/
public class LocaleDemo {
public static void main(String[] args) {
//创建一个本地语言环境对象(中文)
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
//通过ResourceBundle工具类绑定资源文件(包名.文件名(基本名称不包括语言部分和后缀部分))
ResourceBundle res = ResourceBundle.getBundle("MultiLanguage.info", locale);
//模拟用户登陆
Scanner in = new Scanner(System.in);
//从属性文件中根据key获取value值
String input = res.getString("input");
String username = res.getString("username");
String passwd = res.getString("passwd");
String infoSuccess = res.getString("info.success");
String infoError = res.getString("info.error");
System.out.println(input + username);
String userName = in.next();
System.out.println(input + passwd) ;
String password = in.next();
if("admin".equals(userName) && "123".equals(password)){
//处理动态文本(模式, 要替换的值……)
String success = MessageFormat.format(infoSuccess, userName);
System.out.println(success);
}else {
System.out.println(infoError);
}
}
}
info_zh_CN.properties
username=\u7528\u6237\u540d
passwd=\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u6B22\u8FCE\uff0c{0}
info.error=\u767B\u5f55
在上面的文件当中实际分别为中文的unicode编码。
info_en_US.properties
username=username
passwd=passwd
input=input
info.success=welcome,{0}
info.error=error
当语言环境使用locale时执行如下:
当语言环境使用locale1时执行如下: