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國際化/本地化

以下示例顯示如何在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國際化/本地化

語言設置

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>

執行上面示例代碼,得到以下結果 -

JSP國際化/本地化

區域特定日期

可以使用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>

執行上面示例代碼,得到以下結果 -

JSP國際化/本地化

區域特定貨幣

可以使用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>

運行上面示例代碼,得到以下結果 -

JSP國際化/本地化

區域特定百分比格式

可以使用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);
%>

運行上面示例代碼,得到以下結果 -

JSP國際化/本地化