Java国际化——ResourceBundle基本使用

背景:企业项目中,往往面对国际的。针对不同地区语言,ResourceBundle主要用来处理本地化资源和国际化资源的问题,向用户展示合理的界面显示。

ResourceBundle

官方解释:一堆有着相同前缀名称但有着不同语言后缀名称的属性文件的集合,且至少包含2个有着相似前缀名称的属性文件。
用途:从适合当前用户语言环境的资源包,一适应不同语言环境,后期提示语均在配置文件中,修改便捷。

配合Locale使用:查询Java所支持的国家和语言,方便查询强制化Local属性。

package study;

import java.util.Locale;
import java.util.ResourceBundle;

public class Test {
    public static void main(String[] args) {
        Locale[] localeList = Locale.getAvailableLocales();
        //遍历数组的每个元素,依次获取所支持的国家和语言
        for (int i = 0; i < localeList.length ; i++ )
        {
            System.out.println(localeList[i].getCountry()+ "( "+localeList[i].getDisplayCountry() +")   "
                    +localeList[i].getLanguage()+"("+localeList[i].getDisplayLanguage()+")");

        }
}

加载顺序

优先级:本地化资源(默认)>加载系统默认>加载默认的资源文件。
不存在:java.util.MissingResourceException。

本地资源构建:新建myconfig.properties相关文件
myconfig.properties:local=default
myconfig_zh_CN.properties:local=zh_CN
myconfig_en_US.properties:local=en_US

package study;
import java.util.Locale;
import java.util.ResourceBundle;
public class Test {
    public static void main(String[] args) {
        //取得系统默认的国家/语言环境
        System.out.println("=================");
        //获取本地语言地区属性
        System.out.println("default:"+Locale.getDefault());
        //加载默认src下,但是不能读取其他文件加载,本class在src.study下,所以需要加前缀。
        ResourceBundle resourceBundle0 = ResourceBundle.getBundle("study.myconfig");
        System.out.println(resourceBundle0.getString("local"));
        System.out.println("=================");
        //中文测试
        Locale locale1 = new Locale("zh", "CN");
        ResourceBundle resourceBundle1 = ResourceBundle.getBundle("study.myconfig",locale1);
        System.out.println(resourceBundle1.getString("local"));
        System.out.println("=================");
        //英文测试
        Locale locale2 = new Locale("en", "US");
        ResourceBundle resourceBundle2 = ResourceBundle.getBundle("study.myconfig",locale2);
        System.out.println(resourceBundle2.getString("local"));
        System.out.println("=================");
         //德文测试,但不存在该语言的Properties
        Locale locale3 = new Locale("de", "GR");
        ResourceBundle resourceBundle3 = ResourceBundle.getBundle("study.myconfig",locale3);
        System.out.println(resourceBundle3.getString("local"));
}

    

测试结果:配置文件都存在.png
顺序:对于中国用户:中国>默认。英国用户:英国>默认。 德国:中国>默认(德国不存在,但是不是直接走默认,而是先走中国,中国是本地化资源!!!)
特别:
1.属性key-value,若上级资源中没有key,则去下级资源中寻找。
2.优先走本地化资源文件。若不存在,则走不带后缀文件,本地化资源文件不等于默认不带后缀的配置文件。

删除myconfig_zh_CN.properties:

本地资源不存在.png
顺序:对于中国用户:默认。英国用户:英国>默认。 德国:默认(德国不存在,但是不是直接走默认,而是先走中国,中国是本地化资源!!!)

其他注意:
报错:Can’t find bundle for base name myconfig, locale xx_XX。查找文件路径是否正确。

  • 直接配置,src下读取,但是内部文件夹,需要前缀读取。
  • src路径下的文件在编译后会放到WEB-INF/clases路径下(默认的classpath)
  • 直接放到WEB-INF下的话,是不在classpath下的
编码:

底层读取Properties文件是根据字节流的形式,防止中文乱码,建议配置文件存在中文等,使用Unicode字符集进行配置。
源码片段:

 else if (format.equals("java.properties")) {
                final String resourceName = toResourceName0(bundleName, "properties");
                if (resourceName == null) {
                    return bundle;
                }
                final ClassLoader classLoader = loader;
                final boolean reloadFlag = reload;
                InputStream stream = null;
                try {
                    stream = AccessController.doPrivileged(
                        new PrivilegedExceptionAction<InputStream>() {
                            public InputStream run() throws IOException {
                                InputStream is = null;
                                if (reloadFlag) {
                                    URL url = classLoader.getResource(resourceName);
                                    if (url != null) {
                                        URLConnection connection = url.openConnection();
                                        if (connection != null) {
                                            // Disable caches to get fresh data for
                                            // reloading.
                                            connection.setUseCaches(false);
                                            is = connection.getInputStream();
                                        }
                                    }
                                } else {
                                    is = classLoader.getResourceAsStream(resourceName);
                                }
                                return is;
                            }
                        });
                } catch (PrivilegedActionException e) {
                    throw (IOException) e.getException();
                }
               
经验

1.可以通过只配置myconfig.properties来全局变量,不配置其他语言文件。
2.企业项目中,配合PropertyUtils,设置map.properties,不打包,当国际化各个配置文件找不到相应提示,提供一个类别管理的报错。
3.编码问题请使用Unicode字符集输入,可以使用在线转码工具也可以配合java自带的native2ascii.exe
4.配合NumberFormat ,DateFormat进行String处理

补充

Properties补充:
https://www.cnblogs.com/alfredinchange/p/5384760.html
ResourceBundle运行会自行将配置文件打包,也可以根据情况自己配合idea打包:https://segmentfault.com/a/1190000016496715
Spring相关:https://blog.csdn.net/u010882791/article/details/83756717

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现后端提示信息国际化的方式主要有两种:使用JavaResourceBundle类和使用Spring框架提供的MessageSource接口。下面分别介绍这两种方式的实现方法。 1. 使用JavaResourceBundle类 在Java中,可以使用ResourceBundle类来实现国际化资源的管理和加载。ResourceBundle类可以根据不同的语言环境,加载对应的资源文件,并获取其中的提示信息。 首先,需要在项目中创建不同语言的资源文件,例如: ``` messages.properties messages_zh_CN.properties messages_en_US.properties ``` 其中,messages.properties是默认的资源文件,用于存储默认语言的提示信息。messages_zh_CN.properties和messages_en_US.properties分别是中文和英文的资源文件,用于存储对应语言的提示信息。 接下来,编写Java代码,使用ResourceBundle类加载对应的资源文件,并获取其中的提示信息。示例代码如下: ```java String language = "zh_CN"; // 获取当前用户的语言环境 ResourceBundle rb = ResourceBundle.getBundle("messages", new Locale(language)); // 加载对应的资源文件 String message = rb.getString("hello"); // 获取提示信息 ``` 在上述示例代码中,首先获取当前用户的语言环境,然后使用ResourceBundle类根据不同的语言环境,加载对应的资源文件。最后通过getString方法获取对应的提示信息。 2. 使用Spring框架提供的MessageSource接口 在Spring框架中,提供了MessageSource接口来实现国际化资源的管理和加载。MessageSource接口可以根据不同的语言环境,加载对应的资源文件,并获取其中的提示信息。 首先,需要在Spring配置文件中配置MessageSource bean,例如: ```xml <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages" /> </bean> ``` 其中,basename属性指定资源文件的前缀,Spring会自动根据不同的语言环境,加载对应的资源文件。 接下来,在Java代码中使用@Autowired注解注入MessageSource bean,并使用getMessage方法获取对应的提示信息。示例代码如下: ```java @Autowired private MessageSource messageSource; public String getMessage(String code) { String language = "zh_CN"; // 获取当前用户的语言环境 Object[] args = new Object[]{}; // 可选参数 String defaultMessage = "default message"; // 默认提示信息 return messageSource.getMessage(code, args, defaultMessage, new Locale(language)); // 获取提示信息 } ``` 在上述示例代码中,首先使用@Autowired注解注入MessageSource bean,然后使用getMessage方法获取对应的提示信息。getMessage方法的第一个参数是提示信息的键值,第二个参数是可选参数,第三个参数是默认提示信息,第四个参数是语言环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值