您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第三季学习笔记-程序国际化
发布时间:2017-08-10 14:47:02编辑:雪饮阅读()
对国际化程序的理解
Internationalization:国际化程序可以这样理解
Internationalization一般简称i18n,i是首字母,n是末字母,18是首末字母之间相隔的字母数。
同一套程序代码可以在各个语言环境下进行使用。
各个语言环境下,只是语言显示的不同,那么具体的程序操作本身都是一样的,那么国际化程序完成的就是这样的一个功能。
Locale类
Locale对象表示了特定的地理、政治和文化地区。需要Locale来执行其任务的操作称为语言环境敏感的操作,它使用Locale为用户量身定制信息。例如,显示一个数值就是语言环境敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值。
使用此类中的构造方法来创建Locale:
Locale(String language)
Locale(String language,String country)
构造方法中的language, country值可以通过此处来获取:
图中的”[]”之间的内容的“-”左边的值就是language的值
图中的”[]”之间的内容的“-”右边的值就是country的值
通过静态方法创建Locale:
getDefault()
示例代码:
package com.vince.i18n;
import java.util.Locale;
public class I18nDemo {
public static void main(String[] args) {
//创建一个本地语言环境对象
Locale locale=new Locale("zh","CN");
//如果不知道某个国家的语言环境对象的Language、country或者只知其一则使用如下常量来创建
//如果在eclipse中会自动提示可选项
Locale locale2=Locale.US;
//如果直接不知道该用什么语言环境,则可以直接调用用户当前系统的语言环境
Locale locale3=Locale.getDefault();
}
}
ResourceBundle类
国际化的实现核心在于显示的语言上,通常的做法是将其定义成若干个属性文件(文件后缀是*.properties),属性文件中的格式采用”key=value”的格式进行操作。
ResourceBundle类表示的是一个资源文件的读取操作,所有的资源文件需要使用ResourceBundle进行读取,读取的时候不需要加上文件的后缀。
getBundle(String baseName)
getBundle(String baseName,Locale locale)
getString(String key)
示例:
完整代码:
package com.vince.i18n;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
public class I18nDemo {
public static void main(String[] args) {
//创建一个本地语言环境对象
Locale locale=new Locale("zh","CN");
//如果不知道某个国家的语言环境对象的Language、country或者只知其一则使用如下常量来创建
//如果在eclipse中会自动提示可选项
Locale locale2=Locale.US;
//如果直接不知道该用什么语言环境,则可以直接调用用户当前系统的语言环境
Locale locale3=Locale.getDefault();
//模拟用户登录
//getBundle的第一个参数格式完整"包名.语言文件前缀"
//getBundle第二个参数规定了根据第一个参数获取的语言文件列表中进行筛选的依据,如这里用的local就只读取中文的那个语言文件
//getBundle第二个参数如果在语言文件列表中找不到,则默认载入当前系统的语言文件,此处即info_zh_CN.properties
//ResourceBundle类只能读取语言配置文件,不能向语言配置文件中写数据
ResourceBundle res=ResourceBundle.getBundle("com.vince.i18n.info",locale);
Scanner input=new Scanner(System.in);
//从绑定的资源文件(属性文件)中根据key获取对应的value
String inputKey=res.getString("input");
String usernameKey=res.getString("username");
String passwordKey=res.getString("password");
String infoSuccessKey=res.getString("info.success");
String infoErrorKey=res.getString("info.error");
//请输入用户名
System.out.println(inputKey+usernameKey);
String username=input.next();
//请输入密码
System.out.println(inputKey+usernameKey);
String password=input.next();
if("admin".equals(username) && "123".equals(password)){
System.out.println(infoSuccessKey);
}
else{
System.out.println(infoErrorKey);
}
}
}
创建中文语言文件:
info是可以自定义的_zh_CN的zh和CN是和Locale(String language,String country)构造方法的language与country对应的
然后这里前面的”key=”(这里如”username=”)输入完后直接输值后就会自动生成unicode编码的值。
info.success这种格式和username这种不带”.”的格式没有特别意义,都是key,只要key不重复即可
创建英文语言文件:
选择此处:
直接ctrl+c,ctrl+v复制一份中文的然后修改为英文的:
然后把新的语言文件中的key不变,val修改即可。
技巧:eclipse中当输入一个类名后若该类需要导入包,则可以使用alt+/快捷键导入包
处理动态文本
前面的示例读取的内容都是固定的,如果现在假设要想打印这样的信息”欢迎你,xxx”,具体的名字不是固定的,那么就要使用动态文本进行程序的处理。
进行动态的文本处理,必须使用java.text.MessageFormat类完成。这个类是java.text.Format的子类。
添加占位符示例:
中文语言配置文件添加动态文本占位符后如下:
username=\u7528\u6237\u540D
password=\u8BF7\u8F93\u5165\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u767B\u5F55\u6210\u529F{1}{2}{0}
info.error=\u767B\u5F55\u5931\u8D25{0}{1}{2}
主程序添加动态文本占位符处理后完整代码:
package com.vince.i18n;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
public class I18nDemo {
public static void main(String[] args) {
//创建一个本地语言环境对象
Locale locale=new Locale("zh","CN");
//如果不知道某个国家的语言环境对象的Language、country或者只知其一则使用如下常量来创建
//如果在eclipse中会自动提示可选项
Locale locale2=Locale.US;
//如果直接不知道该用什么语言环境,则可以直接调用用户当前系统的语言环境
Locale locale3=Locale.getDefault();
//模拟用户登录
//getBundle的第一个参数格式完整"包名.语言文件前缀"
//getBundle第二个参数规定了根据第一个参数获取的语言文件列表中进行筛选的依据,如这里用的local就只读取中文的那个语言文件
//getBundle第二个参数如果在语言文件列表中找不到,则默认载入当前系统的语言文件,此处即info_zh_CN.properties
//ResourceBundle类只能读取语言配置文件,不能向语言配置文件中写数据
ResourceBundle res=ResourceBundle.getBundle("com.vince.i18n.info",locale);
Scanner input=new Scanner(System.in);
//从绑定的资源文件(属性文件)中根据key获取对应的value
String inputKey=res.getString("input");
String usernameKey=res.getString("username");
String passwordKey=res.getString("password");
String infoSuccessKey=res.getString("info.success");
String infoErrorKey=res.getString("info.error");
//请输入用户名
System.out.println(inputKey+usernameKey);
String username=input.next();
//请输入密码
System.out.println(inputKey+passwordKey);
String password=input.next();
if("admin".equals(username) && "123".equals(password)){
//处理动态文本(模式,真正要替换的值)
//format第一个参数为原语言配置文件的key通过getString取出的值
//format第二个参数为第一个参数再语言配置文件中的第一个参数所在key的{0}占位符替换内容
//format第三个参数为第一个参数再语言配置文件中的第一个参数所在key的{1}占位符替换内容
//format第n个参数为第一个参数再语言配置文件中的第一个参数所在key的{n-1}占位符替换内容
//如果某个占位符没有被替换则原样输出,如{0}这个没有被替换则直接输出{0}
String success=MessageFormat.format(infoSuccessKey,username);
System.out.println(success);
}
else{
String fail=MessageFormat.format(infoErrorKey,username);
System.out.println(fail);
}
}
}
关键字词:javase,国际化