Java 国际化 (i18n):完整指南
国际化(缩写为 i18n,源自单词 internationalization,其中首字母 'i' 和尾字母 'n' 之间有 18 个字母)是一种软件设计过程,旨在使软件能够适应不同的语言和地区,而无需修改源代码。Java 提供了一套强大且内置的国际化工具集,使开发人员能够轻松创建多语言应用程序。
在本文中,我们将详细讲解 Java 中 i18n 的核心组件:Locale、ResourceBundle、属性文件和 MessageFormat。您将学习如何正确组织本地化资源以及如何处理与缺少翻译相关的异常。
1. Java 中 i18n 的核心组件
Java 中的国际化基于三个关键元素:
- Locale — 代表特定地理、政治或文化区域的对象。它包含语言、国家(可选)和变体(可选)信息。
- ResourceBundle — 从属性文件 (
.properties) 或其他来源加载本地化资源(字符串、格式)的类。 - 属性文件 — 扩展名为
.properties的文本文件,用于存储键=值对。文件名遵循以下规则:基名_语言_国家.properties。
俄语和英语的文件结构示例:
Messages.properties // 默认文件Messages_en.properties // 英语(通用)Messages_en_US.properties // 英语(美国)Messages_ru_RU.properties // 俄语(俄罗斯)2. 创建属性文件
创建基础文件 Messages.properties(默认值为英语):
greeting=Hellofarewell=Goodbyeapp.name=My Application现在创建俄语本地化文件 Messages_ru_RU.properties:
greeting=Здравствуйтеfarewell=До свиданияapp.name=Моё приложение对于英语(美国)—— Messages_en_US.properties:
greeting=Hellofarewell=Goodbyeapp.name=My Application3. 使用 Locale 和 ResourceBundle
加载本地化字符串的代码如下:
import java.util.Locale;import java.util.ResourceBundle;
public class I18nExample { public static void main(String[] args) { // 设置区域设置(例如,俄语,俄罗斯) Locale ruLocale = new Locale("ru", "RU"); ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale); // 获取本地化字符串 String greeting = bundle.getString("greeting"); String farewell = bundle.getString("farewell"); String appName = bundle.getString("app.name"); System.out.println(greeting + " " + farewell); // Здравствуйте До свидания System.out.println(appName); // Моё приложение }}如果未找到区域设置,Java 会自动使用搜索链:
- 首先查找完全匹配的文件(
Messages_ru_RU.properties)。 - 然后查找不带国家的文件(
Messages_ru.properties)。 - 接着查找基础文件(
Messages.properties)。 - 如果什么都没找到——则抛出
MissingResourceException异常。
4. 使用 MessageFormat 格式化消息
字符串通常包含可变部分。为此使用 MessageFormat。包含动态数据的示例:
<