【Java 基础】23 国际化


在全球化的今天,开发支持多语言的应用变得越来越重要,也变得较为常见。

1.概念

国际化是一种使应用程序能够适应不同语言的技术

国际化就是指一个程序可以同时去适应各个国家的语言。例如,如果使用程序的是中国人,那么就会显示中文。如果使用程序的是英国人,那么就显示英语

2.原理

例如:

现在需要一个程序,去同时适应中文和英文的显示

这个时候我们就需要一个国际化支持了,那该如何去实现呢?

在这里插入图片描述

其实挺简单的,我们事先准备一组资源文件,然后里面都是通过 key-value 的形式保存信息,再根据 key一组资源文件 中寻找对应的资源文件中的 value 然后返回

在 Java 中,如果要实现这个国际化需求,那么就离不开下面的 3 个主要类:

1)Locale

用于表示一个国家语言类, java.util.Locale 类表示一个特定的区域,用于确定程序应该使用哪种语言规则。可以通过 Locale 类来创建一个特定的区域设置。

2)ResourceBundle

用于访问资源文件 , java.util.ResourceBundle 类用于加载特定于语言环境的资源文件。资源文件通常是 key-value 的集合,其中 key 是字符串,value 可以是字符串、数字等。

3)MessageFormat

用于格式化资源文件的占位符, java.text.MessageFormat 类用于格式化消息,支持将占位符替换为特定的值,这在处理动态文本时非常有用。

3.例子

上面说了下国际化的概念及原理,接下来就让我们来试一试吧

1)准备资源文件

首先,我们为每种语言创建一个资源文件,其中包含了程序中显示的所有文本消息。资源文件通常以 .properties 后缀结尾

  • message_zh_CN.properties

    msg = 你好世界
    dynamic_msg = {0} 说:你好世界
    
  • message_en_US.properties

    msg = Hello world
    dynamic_msg =  {0} say:Hello world
    

2)加载资源文件

使用 ResourceBundle 来加载特定于语言环境的资源文件

示例代码:

public class Demo {
    public static void main(String[] args) {
        // 设置区域
        Locale cn = new Locale("zh", "CN");
        // 获取资源
        ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);
        // 获取消息
        System.out.println(cnBundle.getString("msg"));

        // 设置区域
        Locale en = new Locale("en", "US");
        // 获取资源
        ResourceBundle enBundle = ResourceBundle.getBundle("message", en);
        // 获取消息
        System.out.println(enBundle.getString("msg"));
    }
}

输出结果:

你好世界
Hello world

在不同的语言和地区切换时,只需更改 Locale 对象即可。

3)格式化消息(非必须)

如果需要在消息中插入动态值,可以使用 MessageFormat,若没有占位符的话,就不用使用这个

示例代码:

public class Demo {
    public static void main(String[] args) {
        Locale cn = new Locale("zh", "CN");
        ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);
        String cnMsg = cnBundle.getString("dynamic_msg");
        System.out.println(MessageFormat.format(cnMsg, "程序员"));

        Locale en = new Locale("en", "US");
        ResourceBundle enBundle = ResourceBundle.getBundle("message", en);
        String enMsg = enBundle.getString("dynamic_msg");
        System.out.println(MessageFormat.format(enMsg, "Cheney"));
    }
}

输出结果:

程序员 说:你好世界

Cheney say:Hello world

这个可以应用于 非固定的消息上,可以更灵活的处理动态消息

总结

国际化为开发者提供了一种强大的工具,使他们能够轻松地创建多语言的应用程序。通过合理使用 LocaleResourceBundleMessageFormat 便可以实现灵活、可维护的国际化应用。

  • 32
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值