程序国际化及动态处理文本

来源:互联网 发布:上海斑马公寓知乎 编辑:程序博客网 时间:2024/06/12 00:47

  一:程序国际化

 国际化程序的理解:

  I18N :国际化程序

 同一套程序代码可以在各个语言环境下进行使用。

 各个语言环境下,只是语言显示的不同,那么具体的程序操作本身都是一样的,国际化就是完成这样一个功能。

 Locale类:

Locale对象表示了特定的地理,政治和文化区域,需要Locale类来执行其任务的操作称为语言环境敏感的操作,使用Locale为用户量身定制信息。

 使用Locale 类中的构造方法来创建、Locale

  Locale String language

  LocaleString 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,并用它来格式化给定的参数

在配置文件中添加占位符{0} ,如下:

info.success=\u6b22\u8fce\u4f7f\u7528\u5feb\u64ad\uff0c{0}

测试类中添加代码:

// 处理动态文本 (第一个参数为模式(配置文件中修改信息), 第二个参数为真正替换的值)

String suinfo = MessageFormat.format(Success, usname);

 System.out.println(suinfo);

运行效果如下:

请输入用户名

admine

密码

123

欢迎使用优酷,admine

0 0
原创粉丝点击