目录
什么是 JSP 国际化
JSP 国际化(Internationalization,简称 i18n)是指在 JSP 应用中支持多语言和地区特定内容的过程。它通过动态加载资源文件(通常为 .properties
文件),根据用户的语言偏好(如浏览器设置或手动选择)显示相应的文本、日期、货币等格式。JSP 国际化依赖 Java 的 ResourceBundle
和 Locale
类。
为什么要使用国际化
- 全球化需求:满足不同国家和地区用户的使用习惯。
- 用户体验:提供母语界面,提升友好度。
- 市场扩展:支持多语言有助于进入国际市场。
- 灵活性:无需修改代码即可添加新语言。
JSP 国际化的实现方法
JSP 国际化主要通过以下步骤实现:
- 创建资源文件:为每种语言编写
.properties
文件,存储键值对。 - 设置 Locale:根据用户请求或配置确定语言环境。
- 加载资源:使用
ResourceBundle
或 JSTL 的<fmt>
标签获取翻译内容。 - 格式化输出:处理日期、数字等本地化格式。
代码示例
资源文件
messages_en_US.properties
(英文)
welcome=Welcome to our website!
login=Login
date.format=MM/dd/yyyy
messages_zh_CN.properties
(中文)
welcome=欢迎访问我们的网站!
login=登录
date.format=yyyy-MM-dd
- 存放位置:通常放在
WEB-INF/classes/
或源码的resources
目录下。 - 命名规则:
basename_language_country.properties
(如messages_en_US
)。
JSP 页面
使用 JSTL 的 <fmt>
标签实现国际化:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>JSP 国际化示例</title>
</head>
<body>
<!-- 设置语言和资源文件 -->
<fmt:setLocale value="${param.lang != null ? param.lang : 'en_US'}"/>
<fmt:setBundle basename="messages"/>
<h1><fmt:message key="welcome"/></h1>
<p><fmt:message key="login"/></p>
<!-- 格式化日期 -->
<jsp:useBean id="now" class="java.util.Date"/>
<fmt:formatDate value="${now}" pattern="${fn:substringAfter(requestScope['javax.servlet.forward.request_uri'], 'date.format')}"/>
<!-- 语言切换 -->
<p>选择语言:
<a href="?lang=en_US">English</a> |
<a href="?lang=zh_CN">中文</a>
</p>
</body>
</html>
Servlet 设置语言
可选:通过 Servlet 动态设置 Locale
。
package com.example;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Locale;
public class LanguageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String lang = request.getParameter("lang");
if (lang != null) {
Locale locale = new Locale(lang.split("_")[0], lang.split("_")[1]);
request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", locale);
}
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
运行结果:
?lang=en_US
:显示 “Welcome to our website!” 和日期如 “03/26/2025″。?lang=zh_CN
:显示 “欢迎访问我们的网站!” 和日期如 “2025-03-26″。
核心组件与工具
- Locale:表示语言和地区(如
en_US
、zh_CN
)。 - ResourceBundle:加载
.properties
文件。 - JSTL
<fmt>
标签: <fmt:setLocale>
:设置语言环境。<fmt:setBundle>
:指定资源文件。<fmt:message>
:获取翻译文本。<fmt:formatDate>
:格式化日期。- java.text:提供
DateFormat
和NumberFormat
。
工作原理详解
- Locale 确定:从请求参数、会话、浏览器
Accept-Language
头或默认值获取。 - 资源加载:根据
Locale
和basename
查找匹配的.properties
文件。 - 文本替换:JSTL 标签或
ResourceBundle.getString()
获取键对应的值。 - 格式化处理:应用本地化规则(如日期、货币格式)。
优点与应用场景
优点
- 易扩展:只需新增资源文件即可支持新语言。
- 一致性:统一管理多语言内容。
- 动态切换:运行时调整语言无需重启。
应用场景
- 多语言网站(如电商、新闻门户)。
- 日期和货币格式化。
- 用户个性化设置(如语言偏好)。
常见问题与注意事项
- 资源文件未加载:
- 检查文件路径和命名,确保在类路径下。
- 编码问题:
.properties
文件需使用ISO-8859-1
编码,中文需转义(\uXXXX
),或用工具(如native2ascii
)转换。- 推荐直接使用 UTF-8(现代容器支持)。
- Locale 未生效:
- 确保
<fmt:setLocale>
在<fmt:message>
前执行。
- 缓存问题:
- 修改资源文件后需重启服务器或清缓存。
- 性能优化:
- 避免在每个请求中重复加载资源,使用会话或应用级别缓存。
参考资料与出站链接
- 官方文档:
- Java EE 8 JSTL 规范(英文)
- Oracle 国际化教程(英文)
- 学习资源:
- W3Schools JSTL 国际化(英文)
- CSDN JSP 国际化实践(中文)
- 工具支持:
- Apache Tomcat:运行国际化 JSP。
如果您需要更复杂的国际化示例(例如动态加载数据库资源),请告诉我,我会进一步扩展!
发表回复