Java Web 国际化(i18n):多语言应用的实现方案
国际化(Internationalization,简称 i18n,因 “internationalization” 首尾字母中间有 18 个字母而得名)是指应用程序能根据用户的语言或地区自动适配内容,提供本地化(Localization,简称 l10n)体验。在 Java Web 中,通过 Locale
类、资源束(ResourceBundle
)及格式化工具,可轻松实现多语言支持。本文将详细介绍国际化的核心概念、实现步骤及最佳实践。
国际化的核心概念
区域设置(Locale)
Locale
类代表特定的语言和地区,由语言代码(如 zh
表示中文,en
表示英文)和国家 / 地区代码(如 CN
表示中国,US
表示美国)组成,格式为 语言代码_国家/地区代码
(如 zh_CN
、en_US
)。
常用 Locale
实例:
1 | Locale china = Locale.CHINA; // 等同于 new Locale("zh", "CN") |
Locale
核心方法:
方法 | 作用描述 |
---|---|
getLanguage() |
获取语言代码(如 zh 、en ) |
getCountry() |
获取国家 / 地区代码(如 CN 、US ) |
getDisplayLanguage() |
获取本地化的语言名称(如 Locale.CHINA 下返回 “中文”) |
getDisplayCountry() |
获取本地化的国家 / 地区名称(如 Locale.US 下返回 “美国”) |
资源束(ResourceBundle)
资源束是存储多语言文本的配置文件集合,通过 ResourceBundle
类加载,根据 Locale
自动匹配对应的语言资源。
命名规则:
资源文件以基础名开头,后跟 _语言代码_国家代码.properties
,默认文件(无区域后缀)作为 fallback:
messages.properties
(默认,当找不到匹配的区域文件时使用)messages_zh_CN.properties
(中文 - 中国)messages_en_US.properties
(英文 - 美国)
格式化工具
针对日期、时间、货币等需要本地化的内容,Java 提供了专用格式化工具:
DateFormat
:日期 / 时间格式化;NumberFormat
:数字 / 货币格式化;MessageFormat
:带占位符的字符串格式化(支持动态参数)。
字符串国际化:基于资源束的实现
创建资源文件
在 src/main/resources
目录下创建以下文件:
(1)默认资源文件(messages.properties
)
1 | # 默认英文(当无匹配区域时使用) |
(2)中文资源文件(messages_zh_CN.properties
)
1 | welcome=欢迎 |
(3)英文(美国)资源文件(messages_en_US.properties
)
1 | welcome=Welcome |
注意:中文资源文件需确保编码正确。若使用 IDE(如 IDEA),可自动处理 Unicode 编码;手动编辑时,需用
native2ascii
工具转换(JDK 自带):
1 native2ascii messages_zh_CN.txt messages_zh_CN.properties
加载资源束并获取字符串
通过 ResourceBundle.getBundle()
加载资源束,根据 Locale
获取对应语言的字符串:
1 | // 获取客户端区域(从请求中获取) |
处理带占位符的字符串
使用 MessageFormat
格式化带参数的字符串(如 greeting=你好,{0}!
中的 {0}
为占位符):
1 | // 格式化带参数的字符串 |
日期与货币的国际化
日期 / 时间格式化(DateFormat
)
DateFormat
会根据 Locale
自动适配日期格式(如中文为 “2023 年 10 月 1 日”,英文为 “Oct 1, 2023”):
1 | // 获取客户端区域 |
货币格式化(NumberFormat
)
NumberFormat
可根据 Locale
适配货币符号和数字格式(如人民币 “¥1,234.56”,美元 “$1,234.56”):
1 | Locale locale = request.getLocale(); |
Web 应用中的国际化实践
获取客户端区域
在 Web 应用中,客户端的 Locale
可通过以下方式获取:
1 | // 方式 1:从请求中获取(基于浏览器的 Accept-Language 头) |
在 JSP 中使用国际化
通过 JSTL 标签库(fmt
标签)可简化 JSP 中的国际化操作:
(1)引入 JSTL 依赖
1 | <dependency> |
(2)JSP 页面中使用
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
允许用户切换语言
提供语言切换功能,将用户选择的 Locale
存储在会话中:
1 |
|
在页面中添加切换链接:
1 | <a href="/change-language?lang=zh_CN">中文</a> |
最佳实践与注意事项
- 资源文件管理:
- 按模块拆分资源文件(如
user_messages.properties
、order_messages.properties
),避免单个文件过大; - 使用版本控制工具管理资源文件,便于多语言团队协作翻译。
- 按模块拆分资源文件(如
- 默认资源文件:
始终提供默认资源文件(messages.properties
),确保在无匹配区域时应用仍能正常运行。 - 动态内容处理:
数据库中的动态内容(如用户生成的文本)需单独设计国际化方案(如多语言字段)。 - 性能优化:
ResourceBundle
会缓存资源文件,避免频繁创建实例;在 JSP 中通过fmt:setBundle
的scope
属性设置缓存范围
v1.3.10