Java 国际化 (i18n):打造多语言应用程序
国际化(常缩写为 i18n——取自 internationalization 一词,其中 18 表示首字母 'i' 和尾字母 'n' 之间的字母数量)是一种软件设计过程,旨在使软件能够适应不同的语言和区域特性,而无需修改源代码。在 Java 中,通过内置 API:java.util.Locale、java.util.ResourceBundle 以及一组格式化类,可以优雅而强大地解决此问题。
本文将讲解如何使用标准工具在 Java 应用程序中实现多语言支持。您将学习如何创建本地化文件、动态切换语言以及正确格式化数字、日期和货币。
Java i18n 的核心组件
Java 提供了三个关键元素用于国际化处理:
- Locale —— 代表特定语言和区域的对象(例如,俄罗斯的俄语为
ru_RU,美国的英语为en_US)。 - ResourceBundle —— 用于从
.properties文件或类中加载本地化资源(字符串、消息、标签)的类。 - 格式化器 —— 来自
java.text包的类(NumberFormat、DateFormat、MessageFormat),用于正确显示数字、日期和复合消息。
步骤 1:创建资源文件
存储本地化字符串的传统方式是使用 .properties 文件。它们按照以下规则创建:
Messages.properties # 默认文件(通常是英语)Messages_ru_RU.properties # 俄语(俄罗斯)Messages_de_DE.properties # 德语(德国)Messages_fr.properties # 法语(未指定区域)Messages.properties 文件内容示例(英语,默认):
welcome.message = Welcome to our application!farewell.message = Goodbye!date.format = dd/MM/yyyyMessages_ru_RU.properties 文件内容示例(俄语):
welcome.message = Добро пожаловать в наше приложение!farewell.message = До свидания!date.format = dd.MM.yyyy重要提示:文件必须采用 ISO 8859-1(Latin-1)编码,或对不属于该编码的字符使用 Unicode 转义。对于俄文字母,需要转义,例如 \\u0414\\u043E\\u0431\\u0440\\u043E。然而,在现代开发环境(IntelliJ IDEA、Eclipse)以及使用 Maven/Gradle 构建时,这通常是自动化的。
步骤 2:在代码中加载资源
要使用本地化字符串,只需创建一个 Locale 对象并获取相应的 ResourceBundle:
import java.util.Locale;import java.util.ResourceBundle;
public class I18nDemo { public static void main(String[] args) { // 创建俄语区域对象 Locale ruLocale = new Locale("ru", "RU"); // 加载资源包(文件基本名称为 "Messages") ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale);
// 获取字符串 String welcome = bundle.getString("welcome.message"); String farewell = bundle.getString("farewell.message");
System.out.println(welcome); // Добро пожаловать в наше приложение! System.out.println(farewell); // До свидания! }}如果未找到特定区域的文件,Java 会自动使用默认文件(Messages.properties)。
步骤 3:动态切换语言
在 Web 应用程序中