zoukankan      html  css  js  c++  java
  • Java 国际化标准程序实现

    国际化程序实现

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

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

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

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

    info = u4E2Du534Eu4EBAu6C11u5171u548Cu56FD
    

    这里的 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=u4E2Du534Eu4EBAu6C11u5171u548Cu56FD
    msg =u59D3u540D{0}u5F53u524Du65F6u95F4{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 类用于指定读取的资源文件的语言环境

  • 相关阅读:
    asp.net mvc让我告诉你请求从哪里来
    我也要学iOS逆向工程--函数
    我也要学iOS逆向工程--全局变量
    我也要学C语言-第十九章:命令行参数
    使用docker搭建nfs实现容器间共享文件
    Golang控制goroutine的启动与关闭
    我是如何用Go语言搭建自己的博客的
    让我们一起Go(十三)
    让我们一起Go(十二)
    让我们一起Go(十一)
  • 原文地址:https://www.cnblogs.com/wangyuyang1016/p/11143954.html
Copyright © 2011-2022 走看看