Java ResourceBundle国际化需严格命名(如messages_zh_CN.properties)、显式传入Locale、用native2ascii处理中文乱码,且缓存全局不可热更新。
Java 的 Locale 与 ResourceBundle 能实现基础国际化,但默认机制容易踩坑——比如资源文件未加载、fallback 逻辑不符合预期、或乱码导致键值全为空字符串。
如何正确命名和放置 ResourceBundle 文件
文件名必须严格匹配 basename_language_country_variant 格式,且全部小写;ResourceBundle.getBundle() 不会自动识别大写或中划线分隔的目录结构。
- 正确示例:
messages_zh_CN.properties、messages_en_US.properties,放在类路径根目录或与调用类同包下 - 错误写法:
Messages_zh-CN.properties(含大写、中划线)、messages_zh_CN.txt(非 .properties 后缀) - 若使用模块系统(Java 9+),需在
module-info.java中显式opens包给java.base
为什么 ResourceBundle.getBundle() 总是返回默认语言资源
根本原因常是 Locale 实例未被正确传递,或 JVM 默认 Locale 覆盖了你指定的值。该方法默认启用“父类链回退”(parent chain fallback),但只按 zh_CN → zh → default 逐级查找,不会跨语种跳转(如 zh_CN → en_US)。
- 显式传入
Locale:用ResourceBundle.getBundle("messages", new Locale("zh", "CN")),而非依赖Locale.getDefault() - 禁用自动 fallback:传入
ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_PROPERTIES) - 验证当前 JVM 区域设置:
System.out.println(Locale.getDefault()),避免 IDE 或启动脚本覆盖(如-Duser.language=ja)
Properties 文件中文乱码怎么解决
ResourceBundle 加载 .properties 时**强制使用 ISO-8859-1 编码**,直接写中文会导致乱码或读成空字符串。不能靠 IDE 文件编码设置绕过。