ResourceBundle 是 Java 原生国际化方案,通过按 Locale 加载 messages_zh_CN.properties 等键值对文件实现 I18N;需遵循命名规范、处理中文编码、用 ResourceBundle.getBundle() 加载并 getString() 获取文本,支持 MessageFormat 动态占位。

ResourceBundle 是 Java 原生支持国际化的轻量级方案,核心在于把语言文本从代码中抽离,按 Locale 自动加载对应 .properties 文件。不写死字符串、不硬编码语言逻辑,是实现 I18N 的关键起点。
准备符合规范的资源文件
文件名必须遵循 基础名_语言代码_国家代码.properties 格式,Java 才能正确匹配。常见组合有:
- messages.properties:默认资源文件(无后缀),作为兜底 fallback
- messages_zh_CN.properties:中文简体(中国)
- messages_en_US.properties:英文美国
- messages_ja_JP.properties:日文日本
每个文件内容为纯键值对,例如:
greeting=欢迎使用系统! error.required=该字段为必填项
注意:.properties 文件默认用 ISO-8859-1 编码,中文需转成 Unicode 转义(如 \u4F60\u597D),或使用支持 UTF-8 保存并配合工具处理,否则易乱码。
用 Locale 指定语言环境并加载资源
ResourceBundle.getBundle() 是入口方法,传入基础名和 Locale 即可:
Locale zhCN = new Locale("zh", "CN");
ResourceBundle bundle = ResourceBundle.getBundle("messages", zhCN);
Java 查找顺序严格遵循层级回退规则:
- 先找 messages_zh_CN.properties
- 找不到则尝试 messages_zh.properties(仅语言匹配)
- 再找不到则用 messages.properties(默认)
- 全部缺失会抛出 MissingResourceException
也可直接用系统默认 Locale:ResourceBundle.getBundle("messages"),它等价于传入 Locale.getDefault()。
读取与使用资源内容
通过 getString(key) 获取翻译后的文本:
String welcome = bundle.getString("greeting"); // 返回“欢迎使用系统!”
若 key 不存在,会抛出 NullPointerException 或 MissingResourceException,建议加 try-catch 或提前校验。需要动态插入参数时(如“您好,{0}”),搭配 MessageFormat:
String pattern = bundle.getString("welcome.user");
String result = MessageFormat.format(pattern, "张三"); // 输出“您好,张三”
此时 resources 文件中对应项应为:welcome.user=您好,{0}。
提升可用性的实用建议
避免每次调用都新建 ResourceBundle 实例,可封装为静态工具类或单例缓存;键名保持全局统一、语义清晰(如用 button.save 而非 saveBtn);所有资源文件放在 classpath 下(如 src/main/resources),确保能被类加载器找到;上线前务必验证各语言包键数量一致,防止漏翻。

















