内容学习于:edu.aliyun.com


1. 国际化程序实现原理

  所谓的国际化的程序指的是同一个程序代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的。
通过分析之后可以发现,如果要想实现国际化的程序开发,那么要解决的问题就在于以下两点:

  •   如何可以定义保存文字的文件信息;
  •   如何可以根据不同的区域语言的编码读取指定的资源信息。

2. Locale类

  通过分析可以发现,如果要想实现国际化,那么首先需要解决的就是不同国家用户的区域和语言编码问题,而在java.util包里面提供有一个专门描述区域和语言编码的类: Locale, 而后主要可以使用Locale类中的两个构造方法进行实例化:

  •   构造方法:public Locale(String language)
  •   构造方法:public Locale(String language,String country)

实例化Locale类对象代码:

public class JavaAPIDemo {
    public static void main(String[] args) throws ParseException {
        Locale locale = new Locale("zh","CN");//中文
        System.out.println(locale);
    }
}

结果:

zh_CN

  如果说现在要想自动获得当前的运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化:

  •   获取默认环境:public static Locale getDefault()

获取默认环境代码:

public class JavaAPIDemo {
    public static void main(String[] args) throws ParseException {
        Locale locale = Locale.getDefault();
        System.out.println(locale);
    }
}

结果:

zh_CN

  在实际的开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化开发,Locale 也将世界上一些比较著名的国家的编码设置为了常量。

使用常用国家语言代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        Locale locale = Locale.CHINA;
        System.out.println(locale);
    }
}

结果:

zh_CN

  <mark>使用常量的优势在于可以避免一些区域编码信息的繁琐。</mark>

3. 配置资源文件

  <mark>在IDEA环境下需要将资源文件的默认编码改成urf-8,避免读取乱码</mark>
  如下图所示:

  国际化程序的实现过程之中,语言文字是最为重要的内容,所以来讲在此类程序里面可以将所有的语言文字的信息直接保存在资源文件之中,并且资源文件的定义要求如下:

  • a. 所有的资源文件一定要定义在CLASSPATH之中,允许你的资源文件在包里面;
  • b. 资源文件的后缀必须是“*.properties",所以严格意义上来讲可以将其称为属性文件;
    • I. 资源文件最初的时候命名与类命名要求一致,但是现在这一原则也在不断被打破;
    • II. 资源文件一定要与国际化程序进行接轨,所以一般的国际化“资源文件名称_语言_国家.properties";
  • c. 资源文件中的所有的数据采用字符串形式定义,利用“key=value" 的形式进行保存,即:程序通过key加载value; .

  定义一个资源文件:

com.xzzz.message.Messages.properties
info = 欢迎您

4. 读取资源文件

  现在已经准备好了资源文件,那么随后就需要进行资源文件的读取操作了,而读取资源文件主要依靠的是java.util. ResourceBundle类完成,此类定义如下:

  •   public abstract class ResourceBundle extends Object

  ResourceBundle是一个抽象类,如果说现在要想进行此类对象的实例化可以直接利用该类中提供的一个static方法完成:

  •   public static final ResourceBundle getBundle(String baseName)

读取资源文件代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        ResourceBundle rb = ResourceBundle.getBundle("com.xzzz.message.Messages");//读取资源文件
        String val = rb.getString("info");
        System.out.println(val);
    }
}

结果:

欢迎您

5. 实现国际化程序开发

  现在国际化程序的实现前期准备已经全部完成了,也就是说依靠资源文件、Locale、 ResourceBundle类 就可以实现国际化的处理操作,那么下面来进行国际化的程序实现(核心关键:读取资源信息)。

com.xzzz.message.Messages_zh_CN.properties com.xzzz.message.Messages_en_US.properties
欢迎您的访问!! Welcome!

  现在加上没有默认的区域的资源文件,一共定义了三个资源:
  如下图所示:

默认情况下资源读取代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        ResourceBundle rb = ResourceBundle.getBundle("com.xzzz.message.Messages");//读取资源文件
        String val = rb.getString("info");
        System.out.println(val);
    }
}

结果:

欢迎您的访问!!

  此时在利用ResourceBundle类读取资源的时候并没有设置一个明确的Locale 对象,但是发现“Messages_ zh_ CN"文件起作用了,因为这个方法里面默认加载的就是当前本地的Locale的资源:

public static final ResourceBundle getBundle(String baseName)
{
	Class<?> caller = Reflection.getCallerClass();
	return getBundleImpl(baseName, Locale.getDefault(),
                        caller, getDefaultControl(caller, baseName));
}

  如果现在有需要也可以修改当前的Locale环境,则可以使用ResourceBundle类中的如下方法:

  •   public static final ResourceBundle getBundle(String baseName,Locale locale)

读取英文资源文件代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        Locale loc = Locale.US;//设置英文环境
        ResourceBundle rb = ResourceBundle.getBundle("com.xzzz.message.Messages", loc);//读取资源文件
        String val = rb.getString("info");
        System.out.println(val);
    }
}

结果:

Welcome!

读取没有配置的国家资源代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        Locale loc = Locale.GERMAN;//设置德文环境
        ResourceBundle rb = ResourceBundle.getBundle("com.xzzz.message.Messages", loc);//读取资源文件
        String val = rb.getString("info");
        System.out.println(val);
    }
}

结果:

欢迎您的访问!!

  如果现在有指定区域的资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被读取。
  <mark>资源读取顺序:读取指定区域的资源文件>默认的本地资源>公共的资源(没有区域设置)。</mark>

6. 格式化文本显示

  如果说现在某一用户登录成功了,那么一般都会显示这样的信息“Xxx,欢迎您的光临!”,也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则就需要通过<mark>占位符</mark>来进行描述,同时对于读取出来的数据也需要进行消息格式化的处理。

  修改资源文件:

com.xzzz.message.Messages_zh_CN.properties com.xzzz.message.Messages_en_US.properties
info = 欢迎{0}的访问,当前日期是{1}! info = Welcome{0},date{1}!

  <mark>如果有需要则可以继续添加“{1}”“{2}”之类的内容</mark>
  此时如果要进行资源读取则会将占位符的信息一起读取出来,所以此时就需要利用MessageFormat类进行格式化处理。
  如下图所示:

  在MessageFormat类中提供有一个格式化文本的方法:public static String format(String pattern,Object… arguments)

占位符的替换代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        ResourceBundle rb = ResourceBundle.getBundle("com.xzzz.message.Messages");//读取资源文件
        String val = rb.getString("info");
        System.out.println(MessageFormat.format(val,"xzzz",new SimpleDateFormat("yyy-MM-dd").format(new Date())));
    }
}

结果:

欢迎xzzz的访问,当前日期是2020-01-17

  <mark>如果在日后开发的过程之中见到资源文件里面出现有“{0}”、“{1}”的结构表示的都是占位符,该信息一定都要进行格式化。</mark>

如果不是必须的情况下强烈不建议使用国际化开发,因为开发的繁琐度太高了。