Đa ngôn ngữ (Internationalization) trong Servlet

Trước khi vào bài, chúng tôi giải thích 3 khái niệm quan trọ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 Servlet 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 trong Servlet

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ả
1

String 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

2

String 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

3

String 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

4

String 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

5

String 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

6

String 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ụ

Sau đâ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.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;


public class GetLocale extends HttpServlet{


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      //Get the client's Locale
      Locale locale = request.getLocale();
      String language = locale.getLanguage();
      String country = locale.getCountry();


      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();


      String title = "Detecting Locale";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
        "<html>\n" +
        "<head><title>" + title + "</title></head>\n" +
        "<body bgcolor=\"#f0f0f0\">\n" +
        "<h1 align=\"center\">" + language + "</h1>\n" +
        "<h2 align=\"center\">" + country + "</h2>\n" +
        "</body></html>");
  }
} 

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

Một Servlet 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ụ: "ñ" biểu diễn "ñ", và "¡" biểu diễn "¡" như sau:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;


public class DisplaySpanish extends HttpServlet{


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // Set response content type
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // Set spanish language code.
    response.setHeader("Content-Language", "es");


    String title = "En Español";
    String docType =
     "<!doctype html public \"-//w3c//dtd html 4.0 " +
     "transitional//en\">\n";
     out.println(docType +
     "<html>\n" +
     "<head><title>" + title + "</title></head>\n" +
     "<body bgcolor=\"#f0f0f0\">\n" +
     "<h1>" + "En Español:" + "</h1>\n" +
     "<h1>" + "¡Hola Mundo!" + "</h1>\n" +
     "</body></html>");
  }
} 

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

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:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.DateFormat;
import java.util.Date;


public class DateLocale extends HttpServlet{


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // Set response content type
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    //Get the client's Locale
    Locale locale = request.getLocale( );
    String date = DateFormat.getDateTimeInstance(
                                  DateFormat.FULL, 
                                  DateFormat.SHORT, 
                                  locale).format(new Date( ));


    String title = "Locale Specific Dates";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + date + "</h1>\n" +
      "</body></html>");
  }

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

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 hiện tại (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:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;


public class CurrencyLocale extends HttpServlet{


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // Set response content type
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    //Get the client's Locale
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);


    String title = "Locale Specific Currency";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedCurr + "</h1>\n" +
      "</body></html>");
  }
} 

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

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.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;


public class PercentageLocale extends HttpServlet{


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // Set response content type
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    //Get the client's Locale
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getPercentInstance(locale);
    String formattedPerc = nft.format(0.51);


    String title = "Locale Specific Percentage";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedPerc + "</h1>\n" +
      "</body></html>");
  }
} 

Bình luận