背景:企业项目中,往往面对国际的。针对不同地区语言,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("=================");//德文测试,但不存在该语言的PropertiesLocale locale3 = new Locale("de", "GR");ResourceBundle resourceBundle3 = ResourceBundle.getBundle("study.myconfig",locale3);System.out.println(resourceBundle3.getString("local"));
}

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

删除myconfig_zh_CN.properties:


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

其他注意:
报错: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

Java国际化——ResourceBundle基本使用相关推荐

  1. Java国际化ResourceBundle详解

    在Java开发中,ResourceBundle是一种方便地管理本地化资源的机制.它可以使得程序能够根据当前系统环境的语言和国家/地区来自动加载相应的本地化资源文件,从而避免了硬编码和减少了重复的代码. ...

  2. java国际化bundle_Java国际化(i18n)ResourceBundle类

    ResourceBundle类用于存储区域设置敏感的文本和对象. 通常使用属性文件来存储特定于语言环境的文本,然后使用ResourceBundle对象来表示它们. 以下是在基于Java的应用程序中使用 ...

  3. java国际化程序创建属性文件_Java国际化(i18n)ResourceBundle类

    ResourceBundle类用于存储区域设置敏感的文本和对象. 通常使用属性文件来存储特定于语言环境的文本,然后使用ResourceBundle对象来表示它们. 以下是在基于Java的应用程序中使用 ...

  4. java.util.ResourceBundle使用详解

    为什么80%的码农都做不了架构师?>>>      2009-07-29 00:47:17     一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序 ...

  5. java国际化程序创建属性文件,Java程序国际化学习代码一

    Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...

  6. java 国际化 properties_java Properties 读取文件,国际化

    Properties类可以看成一个持久化的Properties文件 Properties文件可以被保存到一个流中或者从流载入 每一个键及其对应值在Properties中都必须是String类型. 注意 ...

  7. java国际化——资源包

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 旨在理解 java国际化--资源包 的基础知识 : 2) 本文源代码idea 转自: (利用propertie ...

  8. web项目上之深入理解Java国际化

    作者:https://blog.csdn.net/yangbo787827967/article/details/81124439 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客 ...

  9. java国际化服务器不识别_国际化踩坑记录java.util.MissingResourceException:

    在做国际化的时候遇到一个bug是无法加载到根目录下的自定义的properties文件 报错如下: java.util.MissingResourceException: Can't find bund ...

最新文章

  1. mysql与sqlserver之间的关系转换
  2. Linux下使用ping出现destination is unreachable的问题可能性
  3. 我们从2021谷歌I/O大会给的谜题中发现了隐藏信息
  4. javaone_JavaOne 2014 –有关提交的一些初步分析
  5. ConcurrentHashMap深度分析(JDK 1.8版本)
  6. 2019-11-20 c语言参考手册
  7. 安卓手机状态栏 定位服务自动关闭_【科普知识】手机多久关机一次?看完才知道白用那么多年手机了!...
  8. Java 标注(Annotation)详解
  9. 网吧破解还原卡的方法总结!!
  10. GB50311-2007综合布线工程设计规范
  11. element-UI中分页组件显示英文的解决方案
  12. 20201220苹果黑解开放-黑解教程 最新iccid
  13. windows下如何用python控制打印机打印_巧用win32print来控制windows系统打印机并推送打印任务...
  14. keepalived结合nginx主备高可用实现
  15. 新数仓系列:开源组件运营(3)
  16. HCIP 综合实验(一)
  17. 数学建模常用算法:启发式优化算法合辑(内含多种智能优化算法,使用java实现算法、详细注释、并进行结果可视化)
  18. 【HarmonyOS】鸿蒙3.0使用WebView进行链接跳转,告警“hwbr_engine_AwContentsClient: Denied starting an intent without a
  19. 企业业务招待费的税前扣除,不要出现以下5个错误!
  20. 2023年深圳CPDA数据分析师认证到这里就对了哦

热门文章

  1. AI教育在中国兴起:如何重塑学习之路?
  2. c语言实现进程调度优先权调度算法和时间片轮转调度算法
  3. Unity 物理系统 -- 刚体简介
  4. 统计学--基于R(第3版)(基于R应用的统计学丛书)作者:贾俊平 习题答案 第十一章
  5. 如何下载MinGW并且安装配置环境
  6. 【计算机毕业设计】6.超市仓库管理系统+vue
  7. JavaScript循环语句for,while,与break,continue配合案例详解
  8. 【算法】25匹马,每次最多赛5匹,最少几次可以赛出前三名?
  9. 思科模拟器CIsco Packet Tracer路由器综合路由配置
  10. tenda v311r