程序国际化及动态处理文本
2016-03-17 19:28
253 查看
一:程序国际化
国际化程序的理解:
I18N :国际化程序
同一套程序代码可以在各个语言环境下进行使用。
各个语言环境下,只是语言显示的不同,那么具体的程序操作本身都是一样的,国际化就是完成这样一个功能。
Locale类:
Locale对象表示了特定的地理,政治和文化区域,需要Locale类来执行其任务的操作称为语言环境敏感的操作,使用Locale为用户量身定制信息。
使用Locale 类中的构造方法来创建、Locale
Locale (String language)
Locale(String language , String country )
通过静态方法创建Locale
getDefault ();
ResourceBundle 类
国际化的实现核心在于显示的语言上,通常的做法是将其定义成若干个属性文件,(文件后缀是 .properties)属性文件中的格式采用”key=value”的格式进行操作。
ResourceBundle类表示的是对一个资源文件的读取操作,所有的资源文件都需要ResourceBundle进行读取,读取的时候不需要加上文件的后缀。
国际化资源文件的命名规则如下:
<资源名>_<语言代码>_<国家/地区代码>.properties
如下:
Info_zh_CN.properties
定义两个资源文件如下:
(配置文件中的资源是按照键值对的形式存储的)
(关于下面的编码可以参考:http://blog.csdn.net/wannerwang/article/details/50876595)
Info_zh_CN.properties
username=\u7528\u6237\u540d
password=\u5bc6\u7801
input=\u8bf7\u8f93\u5165
info.success=\u6b22\u8fce\u4f7f\u7528\u5feb\u64ad
info.error=\u767b\u5f55\u5931\u8d25
Info_en_US.properties:
username=userName
password=passWord
input=please input
info.success=Welcome come to log in QVOD
info.error=Login fail
可以使用 java.util.ResourceBoundle.
ResourceBundle res = ResourceBundle.getBundle("com.xiyou.i18n.info",locale2);
下实例是通过一个用户登录程序,学习java的国际化。
测试类:
public class I18NDemo {
public static void main(String[] args) {
// 创建一个本地语言环境对象(简体中文)
Locale locale = new Locale("zh","US");
Locale locale2 = Locale.US;//方法二
// 模拟用户登录的功能
// 根据locale 的属性选择使用那个配置文件
ResourceBundle res = ResourceBundle.getBundle("com.xiyou.i18n.info",locale2);
Scanner in = new Scanner(System.in);
// 从绑定的资源文件中根据key 获取对应的value值。
String inputKey = res.getString("input");
String username = res.getString("username");
String passWord = res.getString("password");
String Success = res.getString("info.success");
String failure = res.getString("info.error");
System.out.println(inputKey+username);
String usname = in.next();
System.out.println(passWord);
String pass = in.next();
if ("admine".equals(usname) && "123".equals(pass)){
System.out.println(Success);
}else{
System.out.println(failure);
}
}
}
特别注意:自定义的配置文件必须和该类生成的.class文件一个目录下,否则会抛出如下异常:
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name com.xiyou.i18n.info, locale en_US
运行如下(选择的是英文):
please inputuserName
anmine
passWord
1234
Login fail
选择中文如下:
请输入用户名
andmine
密码
345
登录失败
二:处理动态文本
对于前面实例读取的内容都是固定的,如果现在假设想要打印Welcome XXX 具体的内容是不固定的,那么久要使用动态文本进行程序处理,进行动态文本处理就要使用 java.text.MessageFormat 类完成,此类是java.text.Format的子类。
MessageFormat 提供了以与语言无关方式生成连接消息的方式。使用此方法构造向终端用户显示的消息。
MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置。
实现方法如下:
在配置文件中添加占位符{0} ,如下:
info.success=\u6b22\u8fce\u4f7f\u7528\u5feb\u64ad\uff0c{0}
测试类中添加代码:
// 处理动态文本 (第一个参数为模式(配置文件中修改信息), 第二个参数为真正替换的值)
String suinfo = MessageFormat.format(Success, usname);
System.out.println(suinfo);
运行效果如下:
请输入用户名
admine
密码
123
欢迎使用优酷,admine
国际化程序的理解:
I18N :国际化程序
同一套程序代码可以在各个语言环境下进行使用。
各个语言环境下,只是语言显示的不同,那么具体的程序操作本身都是一样的,国际化就是完成这样一个功能。
Locale类:
Locale对象表示了特定的地理,政治和文化区域,需要Locale类来执行其任务的操作称为语言环境敏感的操作,使用Locale为用户量身定制信息。
使用Locale 类中的构造方法来创建、Locale
Locale (String language)
Locale(String language , String country )
通过静态方法创建Locale
getDefault ();
ResourceBundle 类
国际化的实现核心在于显示的语言上,通常的做法是将其定义成若干个属性文件,(文件后缀是 .properties)属性文件中的格式采用”key=value”的格式进行操作。
ResourceBundle类表示的是对一个资源文件的读取操作,所有的资源文件都需要ResourceBundle进行读取,读取的时候不需要加上文件的后缀。
国际化资源文件的命名规则如下:
<资源名>_<语言代码>_<国家/地区代码>.properties
如下:
Info_zh_CN.properties
定义两个资源文件如下:
(配置文件中的资源是按照键值对的形式存储的)
(关于下面的编码可以参考:http://blog.csdn.net/wannerwang/article/details/50876595)
Info_zh_CN.properties
username=\u7528\u6237\u540d
password=\u5bc6\u7801
input=\u8bf7\u8f93\u5165
info.success=\u6b22\u8fce\u4f7f\u7528\u5feb\u64ad
info.error=\u767b\u5f55\u5931\u8d25
Info_en_US.properties:
username=userName
password=passWord
input=please input
info.success=Welcome come to log in QVOD
info.error=Login fail
可以使用 java.util.ResourceBoundle.
ResourceBundle res = ResourceBundle.getBundle("com.xiyou.i18n.info",locale2);
下实例是通过一个用户登录程序,学习java的国际化。
测试类:
public class I18NDemo {
public static void main(String[] args) {
// 创建一个本地语言环境对象(简体中文)
Locale locale = new Locale("zh","US");
Locale locale2 = Locale.US;//方法二
// 模拟用户登录的功能
// 根据locale 的属性选择使用那个配置文件
ResourceBundle res = ResourceBundle.getBundle("com.xiyou.i18n.info",locale2);
Scanner in = new Scanner(System.in);
// 从绑定的资源文件中根据key 获取对应的value值。
String inputKey = res.getString("input");
String username = res.getString("username");
String passWord = res.getString("password");
String Success = res.getString("info.success");
String failure = res.getString("info.error");
System.out.println(inputKey+username);
String usname = in.next();
System.out.println(passWord);
String pass = in.next();
if ("admine".equals(usname) && "123".equals(pass)){
System.out.println(Success);
}else{
System.out.println(failure);
}
}
}
特别注意:自定义的配置文件必须和该类生成的.class文件一个目录下,否则会抛出如下异常:
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name com.xiyou.i18n.info, locale en_US
运行如下(选择的是英文):
please inputuserName
anmine
passWord
1234
Login fail
选择中文如下:
请输入用户名
andmine
密码
345
登录失败
二:处理动态文本
对于前面实例读取的内容都是固定的,如果现在假设想要打印Welcome XXX 具体的内容是不固定的,那么久要使用动态文本进行程序处理,进行动态文本处理就要使用 java.text.MessageFormat 类完成,此类是java.text.Format的子类。
MessageFormat 提供了以与语言无关方式生成连接消息的方式。使用此方法构造向终端用户显示的消息。
MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中的适当位置。
实现方法如下:
static String | format(String pattern, Object... arguments) 创建具有给定模式的 MessageFormat,并用它来格式化给定的参数 |
info.success=\u6b22\u8fce\u4f7f\u7528\u5feb\u64ad\uff0c{0}
测试类中添加代码:
// 处理动态文本 (第一个参数为模式(配置文件中修改信息), 第二个参数为真正替换的值)
String suinfo = MessageFormat.format(Success, usname);
System.out.println(suinfo);
运行效果如下:
请输入用户名
admine
密码
123
欢迎使用优酷,admine
相关文章推荐
- PB中对SQL SERVER 2K 数据库的创建、备份与恢复
- 平衡树Treap模版
- How to tile small texture image onto page as its background
- [置顶] ListView 优化篇:从 BaseViewHolder 到面向 Holder 的思想
- iOS -- 处理推送消息
- 蓝桥杯 - 算法训练 - ALGO-2 最大最小公倍数
- 使用Autolayout对多行文本Label进行布局,高度不准确的解决办法!
- 【iOS】判断苹果的设备是哪种
- CSRF攻击[转]
- Ubuntu command 记录 02
- Android实现播放GIF动画的强大ImageView
- 印度手机,永远的配角?
- 自定义PopWindow,实现简单的回调函数,自己实现简单的CallBack
- iphone手机设置自定义铃声(mac环境下设置)
- 经典DP:固定钱能换多少次+硬币个数限制(2069)
- GCD2:常用用法
- 二叉树建立和遍历
- 求极限
- Implement a TextView with an animation in its left side
- The Adapter of ListView: Just adapt data to view, don’t do anything else