国际化程序实现

所谓的国家化应用指的就是根据当前的语言环境读取指定的语言资源文件。

如果要想实现国际化的操作,那么首先要解决的问题就是如何读取资源文件的问题;所谓的资源文件 就是指文件后缀名称为:“*.properties”,里面保存的内容按照“key = value”的形式保存。

  • 定义一个 Message.properties
info = 中华人民共和国

但是在properties文件中保存也并不是这样,而是会将中文转成UNICODE编码

info = \u4E2D\u534E\u4EBA\u6C11\u5171\u548C\u56FD

这里的 info 是这个信息的 key ;以后可以根据这个 key 取得对象的 value

资源读取

  • java.util.ResourceBundle

在对properties文件进行资源读取的时候就需要使用 ResourceBundle 类

  • ResourceBundle是一个抽象类,类中有一个方法用于取得本类对象:

    • 根据当前语言环境取出:
    public static final ResourceBundle getBundle(String baseName);
    • 根据指定语言环境取出:
    public static final ResourceBundle getBundle(String baseName , Locale locale);

读取内容

  • 简单读取:

    public final String getString(String key);
  • 格式化文本:(java.text.MessageFormat)

    public static String format(String pattern , Object … argume)
  • 实例分析:(简单读取)

package helloworld;

import java.util.ResourceBundle;

public class TestDemo {
public static void main(String [] args) {
ResourceBundle rb = ResourceBundle.getBundle("Message");
// 访问资源文件properties时,只需要提供文件名即可不要后缀格式名
System.out.println(rb.getString("info"));
}
}
  • 实例分析:(格式化文本)
修改 properties 文件内容
info=\u4E2D\u534E\u4EBA\u6C11\u5171\u548C\u56FD
msg =\u59D3\u540D{0}\u5F53\u524D\u65F6\u95F4{1}

现在的 properties 文件中出现了{*}占位符,因为format()方法传可变长参数。

package helloworld;

import java.text.MessageFormat;
import java.util.Date;
import java.util.ResourceBundle; public class TestDemo {
public static void main(String [] args) {
ResourceBundle rb = ResourceBundle.getBundle("Message");
// 访问资源文件properties时,只需要提供文件名即可不要后缀格式名
String str = rb.getString("msg");
System.out.println( MessageFormat.format(str,"王宇阳",new Date()));
}
}

如果需要根据国家语言不同输出不同的资源内容,则需要 Locale

Locale类保存的是一个国家的区域和语言编码,例如:中国 zh_CN

在定义资源文件的时候加上指定的语言编码

  • 范例:定义中文的资源文件

    Messages_zh_CN.properties

    msg = 欢迎 {0} 光临
  • 范例:定义英文的资源文件

    Messages_en_US.properties

    msg = Hello {0}
  • 设置的baseName(区域和语言编码)一定是Messages,所有的语言代码由 Locale类 设置

    • 构造方法:
    public Locale (String language , String country);
    • 取得当前语言环境
    public static Locale getDefault();
  • 实例:读取中文的资源文件

public class TestDemo {
public static void main(String [] args) {
Locale loc = new Locale("zh","CN"); //明确定义国家的语言
ResourceBundle rb = ResourceBundle.getBundle("Messages",loc);
// 访问资源文件properties时,只需要提供文件名即可不要后缀格式名
String str = rb.getString("msg");
System.out.println(MessageFormat.format(str, "王宇阳"));
}
}
  • 实例:读取英文的资源文档
public class TestDemo {
public static void main(String [] args) {
Locale loc = new Locale("en","US"); //明确定义国家的语言
ResourceBundle rb = ResourceBundle.getBundle("Messages",loc);
// 访问资源文件properties时,只需要提供文件名即可不要后缀格式名
String str = rb.getString("msg");
System.out.println(MessageFormat.format(str, "yuyang_Wang"));
}
}

在上两则实例中,我们通过对 Locale类对象 loc设置了指定的国家和区域,properties资源会根据 Locale 设置的baseName来进行调用指定的baseName的资源文档。

总结

  • 资源文件:文件名称的每个单词首字母大写,后缀为:*.properties

  • 通过ResourceBundle类可以读取在指定的CLASSPATH下的资源文件

  • Locale 类用于指定读取的资源文件的语言环境

最新文章

  1. ASP.NET MVC中viewData、viewBag和templateData的区别
  2. mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
  3. DB2 create partitioned table
  4. 如何获取网页上的LOGO
  5. CSS3画三角形原理
  6. 多线程 Worker Thread 模式
  7. BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
  8. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
  9. JS函数与BOM
  10. 添加无登录权限的SSH用户命令
  11. CVE-2017-11882漏洞利用
  12. 在CentOS7上实现NFS共享
  13. sv时序组合和时序逻辑
  14. 一、SQL定义变量
  15. java poi解析excel报错处理
  16. spring boot 项目 热启动
  17. Android 增加JNI
  18. 30款免费的手机UI设计资源
  19. 用pycharm提交代码,冲突之后文件丢失找回方法
  20. No module named MYSQLdb 报错

热门文章

  1. ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示
  2. elementui移动dialog
  3. JS---BOM基本知识 (顶级对象,系统对话框,加载事件,location对象, history对象, navigator对象)
  4. IT兄弟连 HTML5教程 CSS3属性特效 transition过渡
  5. LeetCode 二叉树的锯齿形层次遍历
  6. Prometheus学习系列(四)之Prometheus 配置说明
  7. 使用jeecg-boot心得
  8. 解决idea中mysql连接失败Could not create connection to database server. Attempted reconnect 3 times. Giving up.
  9. nginx 配置实例-反向代理
  10. 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰