JSP-Đa ngôn ngữ

  • Internationalization (i18n): Nghĩa là kích hoạt một trang có khả năng cung cấp nhiều phiên bản với các ngôn ngữ khác nhau.
  • Localization (l10n): Nghĩa là thêm Resources tới một Website để thích nghi với một khu vực địa lý hoặc miền văn hóa cụ thể.
  • locale: Đây là một khu vực địa lý hoặc văn hóa cụ thể. Nó thường là một ký hiệu ngôn ngữ được theo sau bởi một ký hiệu quốc gia, phân biệt nhau bởi dấu gạch dưới. Ví dụ: en_US biểu diễn English locale cho US.

Có một số khái niệm bạn nên quan tâm trong khi xây dựng một Global Website. Chương này không cung cấp cho bạn chi tiết về điều này, nhưng sẽ cung cấp một ví dụ về cách bạn làm Webpage của bạn thể hiện trong nhiều ngôn ngữ khác nhau tới cộng đồng internet..

Một JSP có thể chọn lựa phiên bản thích hợp của Site dựa trên Locale của người yêu cầu và cung cấp phiên bản Site thích hợp tương ứng với ngôn ngữ, văn hóa, và các yêu cầu khác. Dưới đây là các phương thức của đối tượng Request mà trả về đối tượng Locale:

java.util.Locale request.getLocale() 

Nhận ra Locale

Bảng dưới liệt kê các phương thức quan trọng có thể sử dụng để thăm dò vị trí, ngôn ngữ, văn hóa và locale của người yêu cầu. Tất cả các phương thức này hiển thị tên quốc gia và bộ tên ngôn ngữ trong trình duyệt của người yêu cầu.

STTPhương thức và Miêu tả
1String getCountry()
Phương thức này trả về mã hóa country/region trong dạng chữ hoa cho Locale này trong định dạng ISO 3166 2-letter
2String getDisplayCountry()
Phương thức này trả về một tên của country của locale đó mà thích hợp để hiển thị cho người dùng
3String getLanguage()
Phương thức này trả về mã hóa ngôn ngữ trong dạnh chữ thường cho Locale này trong định dạng ISO 639
4String getDisplayLanguage()
Phương thức này trả về một tên ngôn ngữ của locale đó mà thích hợp hiển thị cho người dùng
5String getISO3Country()
Phương thức này trả về một tên 3 ký tự viết tắt cho country của Locale này
6String getISO3Language()
Phương thức này trả về một tên 3 ký tự viết tắt cho language của Locale này

Ví dụ

Đây là ví dụ minh họa cách bạn hiển thị một language và country liên kết với nó cho một request trong một JSP:

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%
   //Get the client's Locale
   Locale locale = request.getLocale();
   String language = locale.getLanguage();
   String country = locale.getCountry();
%>
<html>

<head>
   <title>Detecting Locale</title>
</head>

<body>
   <center>
      <h1>Detecting Locale</h1>
   </center>
   <p align="center">
      <% out.println("Language : " + language  + " <br />");
      out.println("Country : " + country + "<br />");
      %>
   </p>
</body>

</html>

Thiết lập ngôn ngữ trong JSP

Một JSP có thể đưa ra một trang được viết bằng một Western European language chẳng hạn như English, Spanish, German, French, Italian, Dutch, …. Ở đây, nó là quan trọng để thiết lập trường Content-Language Header để hiển thị tất cả ký tự một cách chính xác.

Điểm thứ hai là để hiển thị tất cả ký tự đặc biệt bởi sử dụng các thực thể (đối tượng) HTML. Ví dụ: “&#241;” biểu diễn “ñ”, và “&#161;” biểu diễn “¡” như sau:

<%@ 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";

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

<body>
   <center>
      <h1>
         <% out.print(title); %>
      </h1>
   </center>
   <div align="center">
      <p>En Español</p>
      <p>¡Hola Mundo!</p>
   </div>
</body>

</html>

Định dạng Date cụ thể cho Locale

Bạn có thể sử dụng lớp java.text.DateFormat và phương thức Static của nó là getDateTimeInstance() để định dạng date và time cụ thể cho Locale. Ví dụ sau minh họa cách định dạng Date cụ thể tới một Locale đã cho:

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

<%
    String title = "Locale Specific Dates";
    //Get the client's Locale
    Locale locale = request.getLocale( );
    String date = DateFormat.getDateTimeInstance(
                                  DateFormat.FULL, 
                                  DateFormat.SHORT, 
                                  locale).format(new Date( ));
%>
<html>
<head>
   <title>
      <% out.print(title); %>
   </title>
</head>

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

</html>

Định dạng Currency cụ thể cho Locale

Bạn có thể sử dụng lớp java.txt.NumberFormat và phương thức Static của nó là getCurrencyInstance() để định dạng Currency cụ thể (kiểu long hoặc double) trong một Locale. Ví dụ sau minh họa cách định dạng Currency cụ thể tới một Locale đã cho:

<%@ 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 Currency";
    //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>

Định dạng Percentage cụ thể cho Locale

Bạn có thể sử dụng lớp java.txt.NumberFormat và phương thức Static của nó là getPercentInstance() để nhận Percentage cụ thể của một Locale. Ví dụ sau minh họa cách định dạng Percentage cụ thể tới một Locale đã cho.

<%@ 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);
%>
<html>

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

<body>
   <center>
      <h1>
         <% out.print(title); %>
      </h1>
   </center>
   <div align="center">
      <p>Formatted Percentage: <% out.print(formattedPerc); %>
      </p>
   </div>
</body>

</html>