文章目录

  • 1. 背景
  • 2. 思路
  • 3. 所需类支持
  • 3.1 获取java 支持的国家和语言
  • 4. 使用
  • 5. 使用 MessageFormat 处理包含占位符的字符串
  • 5.1 使用类文件代替属性文件


1. 背景

国际化是指应用程序运行时,可根据客户端请求来自的国家语言的不同而现实不同的界面。

国际化的英文单词是:internationalization,所以简称 I18N,18表示中间省略了18个字母。

2. 思路

将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就提供对一个的资源文件。资源文件就是 key-value 对,每个资源文件中的 key 是不变的,但是value 随着不同的国家语言而改变。

如下图所示:提供了中文、英语、法语三种语言

java表数据国际化 java 国际化文件_System

business.ok=成功
business.fail=系统错误,请稍后重试
business.ok=ok
business.fail=Error, please try again later
business.ok=ok
business.fail=Erreur, veuillez réessayer plus tard

资源文件的命名可以有如下三种形式:

  • baseName_language_country.properties
  • baseName_language.properties
  • baseName.properties
    其中baseName是资源文件的基本名,用户可随意指定;而language和county 都不可随意变化,必须是java 所支持的语言和国家。

3. 所需类支持

  1. 用于加载国家、语言资源包
java.util.ResourceBundle
  1. 用于封装特定的国家语言环境
java.util.Locale
  1. 用于格式化带占位符的字符串
java.text.MessageFormat

3.1 获取java 支持的国家和语言

public class Test {
    public static void main(String[] args) {
        Locale aDefault = Locale.getDefault();
        System.out.println("系统默认语言:" + aDefault);
        Locale[] list = Locale.getAvailableLocales();
        for (Locale locale : list
             ) {
            System.out.print(locale.getCountry() + " ");
            System.out.print(locale.getDisplayCountry()+ " ");
            System.out.print(locale.getLanguage() + " ");
            System.out.print(locale.getDisplayLanguage() + " ");
            System.out.println();
        }
    }
}

java表数据国际化 java 国际化文件_java表数据国际化_02

4. 使用

java表数据国际化 java 国际化文件_java表数据国际化_03

hello=你好呀!
hello=hello world!
public class Test {
    public static void main(String[] args) {
        // 取得系统默认的国家语言
        Locale locale = Locale.getDefault(Locale.Category.FORMAT);
        ResourceBundle message = ResourceBundle.getBundle("message", locale);
        System.out.println(message.getString("hello"));
    }
}

java表数据国际化 java 国际化文件_资源文件_04

5. 使用 MessageFormat 处理包含占位符的字符串

有些输出内容我们希望是根据实际情况而改变的,这个时候就可以使用占位符

hello=你好,{0},{1}
hello=hello {0},{1}!
public class Test {
    public static void main(String[] args) {
        // 取得系统默认的国家语言
        Locale locale = Locale.getDefault(Locale.Category.FORMAT);
        ResourceBundle message = ResourceBundle.getBundle("message", locale);
        String msg = message.getString("hello");
        String result = MessageFormat.format(msg, "中国", "我爱你");
        System.out.println(result);
    }
}

java表数据国际化 java 国际化文件_System_05

5.1 使用类文件代替属性文件

条件:

  • 类名必须是 baseName_language_country
  • 必须继承 ListResourceBundle
public class message_zh_CN extends ListResourceBundle {

    private final Object[][] myDate = {
            {"msg", "你好呀,{0},{1}"},
            {"msg1", "想起远方的山川"}
    };

    @Override
    protected Object[][] getContents() {
        return myDate;
    }
}
public class Test {
    public static void main(String[] args) {
        // 取得系统默认的国家语言
        Locale locale = Locale.getDefault(Locale.Category.FORMAT);
        ResourceBundle message = ResourceBundle.getBundle("message", locale);
        String msg = message.getString("msg1");
        String result = MessageFormat.format(msg, "中国", "我爱你");
        System.out.println(result);
    }
}

java表数据国际化 java 国际化文件_java表数据国际化_06