JSP国际化/本地化

JSP国际化/本地化

在本章中,我们将讨论JSP中国际化的概念。 在我们继续之前,先了解以下三个重要的术语 -

  • 国际化(i18n) - 表示网站能够提供翻译成访问者语言或国籍的不同版本的内容。
  • 本地化(l10n) - 表示将资源添加到网站以适应特定的地理或文化区域,例如将印地文翻译成网站。
  • 区域 - 这是一个特定的文化或地理区域。 它通常被称为语言符号,后跟一个由下划线分隔的国家符号。 例如,“en_US”代表美国的英文语言环境。

在建立全球网站时应该注意一些项目。 本教程不会给出完整的详细信息,但它将为您提供一个很好的例子,说明如何通过区分其位置(即语言环境)向互联网社区提供不同语言的网页。

JSP可以根据请求者的区域设置选择适当的站点版本,并根据当地语言,文化和要求提供适当的站点版本。 下是返回Locale对象的request对象的方法。

java.util.Locale request.getLocale()

检测区域设置

以下是可用于检测请求者的区域,语言和当地语言环境的重要区域设置方法。以下所有方法显示在请求者浏览器中设置的国家名称和语言名称。

编号 方法 描述
1 String getCountry() 此方法以ISO 3166的两个字母格式为该区域设置返回大写的国家/地区代码。
2 String getDisplayCountry() 此方法返回适合显示给用户的区域设置的国家/地区的名称。
3 String getLanguage() 此方法以ISO 639格式为该语言环境返回小写的语言代码。
4 String getDisplayLanguage() 此方法返回适合显示给用户的语言环境的语言名称。
5 String getISO3Country() 此方法返回此区域设置的国家/地区的三个字母的缩写。
6 String getISO3Language() 此方法返回此语言环境的三个字母的缩写。

示例

为了方便演示,打开Eclise创建一个动态Web项目,其项目结构如下所示 -

以下示例显示如何在JSP中显示请求的语言和关联国家/地区,文件:langcountry.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.Locale"%>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%
    //Get the client Locale
    Locale locale = request.getLocale();
    String language = locale.getLanguage();
    String country = locale.getCountry();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>检测区域设置示例</title>
</head>
<body>
    <div style="margin: auto; width: 90%">
        <center>
            <h1>检测区域设置示例</h1>
        </center>

        <p align="center">
            <%
                out.println("语言 : " + language + "<br />");
                out.println("国家 : " + country + "<br />");
            %>
        </p>
    </div>
</body>
</html>

执行上面示例代码,得到以下结果 -

语言设置

JSP可以输出用西欧语言编写的页面,如英文,西班牙文,德文,法文,意大利文,荷兰文等。这里是设置Content-Language头来正确显示所有的字符。

另一个重要的一点是使用HTML实体显示所有的特殊字符; 例如“ñ”代表“ñ”,而“¡”代表“¡”,如下文件:langset.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.Locale"%>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>

<%
    // Set response content type
    response.setContentType("text/html");

    // Set spanish language code.
    response.setHeader("Content-Language", "es");
    String title = "En Español";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
    <%
        out.print(title);
    %>
</title>
</head>
<body>
    <center>
        <h2>
            <%
                out.print(title);
            %>
        </h2>
    </center>

    <div align="center">
        <p>En Español</p>
        <p>¡Hola Mundo!</p>
    </div>
</body>
</html>

执行上面示例代码,得到以下结果 -

区域特定日期

可以使用java.text.DateFormat类及其静态getDateTimeInstance()方法来格式化特定于语言环境的日期和时间。以下是显示如何格式化特定区域设置日期的示例,文件:locale_date.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.Locale"%>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%@ page import="java.text.DateFormat,java.util.Date"%>

<%
    String title = "区域特定日期";

    //Get the client's Locale
    Locale locale = request.getLocale();

    String date = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale).format(new Date());
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>
    <%
        out.print(title);
    %>
</title>
</head>

<body>
    <center>
        <h2>
            <%
                out.print(title);
            %>
        </h2>
    </center>

    <div align="center">
        <p>
            Local Date:
            <%
            out.print(date);
        %>
        </p>
    </div>
</body>

执行上面示例代码,得到以下结果 -

区域特定货币

可以使用java.txt.NumberFormat类及其静态getCurrencyInstance()方法在特定区域设置中格式化数字,例如:longdouble类型。 以下是显示如何格式化给定区域设置的货币的示例,文件:locale_currency.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.Locale"%>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%@ page import="java.text.NumberFormat,java.util.Date"%>

<%
    String title = "区域特定货币";

    //Get the client's Locale
    Locale locale = request.getLocale();

    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);
%>

<html>

<head>
<title>
    <%
        out.print(title);
    %>
</title>
</head>

<body>
    <center>
        <h1>
            <%
                out.print(title);
            %>
        </h1>
    </center>

    <div align="center">
        <p>
            Formatted Currency:
            <%
            out.print(formattedCurr);
        %>
        </p>
    </div>
</body>
</html>

运行上面示例代码,得到以下结果 -

区域特定百分比格式

可以使用java.txt.NumberFormat类及其静态getPercentInstance()方法来获取特定于区域设置的百分比。 以下示例显示如何格式化特定区域设置的百分比。文件:** -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>

<%
   String title = "Locale Specific Percentage";

   //Get the client's Locale
   Locale locale = request.getLocale( );

   NumberFormat nft = NumberFormat.getPercentInstance(locale);
   String formattedPerc = nft.format(0.51);
%>

运行上面示例代码,得到以下结果 -