目录

  1. 什么是 JSP 国际化
  2. 为什么要使用国际化
  3. JSP 国际化的实现方法
  4. 代码示例
  1. 核心组件与工具
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 JSP 国际化

JSP 国际化(Internationalization,简称 i18n)是指在 JSP 应用中支持多语言和地区特定内容的过程。它通过动态加载资源文件(通常为 .properties 文件),根据用户的语言偏好(如浏览器设置或手动选择)显示相应的文本、日期、货币等格式。JSP 国际化依赖 Java 的 ResourceBundleLocale 类。


为什么要使用国际化

  • 全球化需求:满足不同国家和地区用户的使用习惯。
  • 用户体验:提供母语界面,提升友好度。
  • 市场扩展:支持多语言有助于进入国际市场。
  • 灵活性:无需修改代码即可添加新语言。

JSP 国际化的实现方法

JSP 国际化主要通过以下步骤实现:

  1. 创建资源文件:为每种语言编写 .properties 文件,存储键值对。
  2. 设置 Locale:根据用户请求或配置确定语言环境。
  3. 加载资源:使用 ResourceBundle 或 JSTL 的 <fmt> 标签获取翻译内容。
  4. 格式化输出:处理日期、数字等本地化格式。

代码示例

资源文件

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_USzh_CN)。
  • ResourceBundle:加载 .properties 文件。
  • JSTL <fmt> 标签
  • <fmt:setLocale>:设置语言环境。
  • <fmt:setBundle>:指定资源文件。
  • <fmt:message>:获取翻译文本。
  • <fmt:formatDate>:格式化日期。
  • java.text:提供 DateFormatNumberFormat

工作原理详解

  1. Locale 确定:从请求参数、会话、浏览器 Accept-Language 头或默认值获取。
  2. 资源加载:根据 Localebasename 查找匹配的 .properties 文件。
  3. 文本替换:JSTL 标签或 ResourceBundle.getString() 获取键对应的值。
  4. 格式化处理:应用本地化规则(如日期、货币格式)。

优点与应用场景

优点

  • 易扩展:只需新增资源文件即可支持新语言。
  • 一致性:统一管理多语言内容。
  • 动态切换:运行时调整语言无需重启。

应用场景

  • 多语言网站(如电商、新闻门户)。
  • 日期和货币格式化。
  • 用户个性化设置(如语言偏好)。

常见问题与注意事项

  1. 资源文件未加载
  • 检查文件路径和命名,确保在类路径下。
  1. 编码问题
  • .properties 文件需使用 ISO-8859-1 编码,中文需转义(\uXXXX),或用工具(如 native2ascii)转换。
  • 推荐直接使用 UTF-8(现代容器支持)。
  1. Locale 未生效
  • 确保 <fmt:setLocale><fmt:message> 前执行。
  1. 缓存问题
  • 修改资源文件后需重启服务器或清缓存。
  1. 性能优化
  • 避免在每个请求中重复加载资源,使用会话或应用级别缓存。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的国际化示例(例如动态加载数据库资源),请告诉我,我会进一步扩展!