这篇博客主要是总结一下程序国家化的相关的知识。
1.对程序国际化的处理
国际化程序可以这样理解:
(1)同一套程序代码可以在各个语言环境下进行使用。
(2)各个语言环境下,只是语言显示不同那么具体的程序操作本身都是一样的,那么国家化程序完成的就是这个功能。
2.Locale类
Locale对象表示了特定的地理、政治和文化地区。需要Locale来执行其任务的操作称为语言环境敏感操作,它使用
Locale为用户量身定制信息。例如,显示一个数值就是语言敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值
使用此类中的构造方法来创建Locale
Locale(String language)
Locale(String language,String country)
通过静态方法创建 Locale.getDefault()
3.ResourceBundle类
国际化实现的核心在于显示的语言上,通常的做法是将其定义成若干个属性文件(文件的后缀名是*.properties),属性文件的格式采用“key=value”的格式进行操作。
注意 在给*.properties文件命名的时候,文件名有两部分组成,一部分是基名,而另一部分就是固定的格式了。例如,创建一个汉语的properties文件,基本为info(可以随便取名),其固定部分为 _zh_CN,所以文件的名称为 info_zh_CN.properties.当不知道一个国家的简写和语言的简写的时候,可以去网上百度一下,一旦写错,则无法争取读取。
还有一个问题就是在读取*.properties文件中的数据时候,容易出现乱码的情况,为了解决这个问题,尝试了很多的办法,提供一种比较好用的办法,只要将idea按照下图进行配置就可以了,简单粗暴。
ResourceBundle类表示的是一个资源文件件的读取操作,所有的资源文件需要使用ResourceBundle进行读取,读取的时候不需要加上文件的后缀
getBundle(String baseName)
getBundle(String baseName,Locale locale)
getString(String key)
4.处理动态文本
前面的示例读取的内容都是固定的,如果现在假设想要打印这样的信息,
“欢迎你,XXX”,具体的名字是不固定的那么就要使用动态文本进行程序的处理进行动态的文本处理,必须使用java.text.MessageFormat类来完成这个类是java.text.Format的子类.其实原理很简单,就是在*.properties文件中使用占位符,在代码执行的时候根据实际情况来替换占位符号就可以了。
public class I18nDemo {
public static void main(String args[])
{
//创建一个本地语言环境对象
Locale locale = new Locale("zh","CN");
//第二种获取语言环境
Locale locale1 = Locale.US;
//获得默认的语言环境
Locale locale2=Locale.getDefault();
//第一个参数为基名,在这里就是info
//通过ResourceBundle工具类绑定资源文件(包名.基本名称(前缀))
ResourceBundle res = ResourceBundle.getBundle("com.java.www.start1.info",locale);
//模拟用户登录功能
Scanner input = new Scanner(System.in);
//从绑定的资源文件中根据key获取相应的value
String inputValue= null;
String usernameValue=null;
String passwordValue=null;
String infosuccessValue=null;
String infoerrorValue=null;
inputValue=res.getString("input");
usernameValue=res.getString("username");
passwordValue=res.getString("password");
infosuccessValue=res.getString("info.success");
infoerrorValue=res.getString("info.error");
System.out.println(inputValue+usernameValue);
String username =input.next();
System.out.println(inputValue+passwordValue);
String password =input.next();
if(("admin".equals(username))&&("123".equals(password)))
{
//处理动态文本(模式(带占位符的字符串),真正要替换的值)
String success=MessageFormat.format(infosuccessValue,username);
System.out.println(success);
}
else
{
System.out.println(infoerrorValue);
}
}
}
(properties文件中的内容见上面的截图)