サーブレットの国際化


始める前に、3 つの重要な用語を見てみましょう:

  • 国際化 (i18n): これは、Web サイトが、訪問者の言語または国籍に翻訳されたさまざまなバージョンのコンテンツを提供することを意味します。

  • ローカリゼーション (l10n): これは、Web サイトをヒンディー語に翻訳するなど、特定の地理的または文化的地域に適応させるために Web サイトにリソースを追加することを意味します。

  • ロケール: これは特別な文化的または地理的地域です。通常、言語記号の後にアンダースコアと国記号が続いたものを指します。たとえば、「en_US」は米国の英語ロケールを表します。

グローバル Web サイトを構築する際には、いくつかの考慮事項があります。このチュートリアルでは、これらの考慮事項の詳細については説明しませんが、差分ターゲティング (つまり、ロケール設定) を使用して、さまざまな言語でページをレンダリングする方法の良い例を示します。

サーブレットは、リクエスターのロケールに基づいて適切なバージョンの Web サイトを選択し、現地の言語、文化、ニーズに従って提供できます。以下は、Locale オブジェクトを返すリクエスト オブジェクト内のメソッドです。

java.util.Locale request.getLocale()

ロケールの検出

以下にリストされているのは、地理位置情報、言語、リクエスターのロケールを検出するために使用できる重要なロケール メソッドです。以下のすべてのメソッドは、要求者のブラウザに設定されている国名と言語名を表示します。

シリアル番号メソッドと説明
1String get Country()
このメソッドは、大文字 2 文字を含む ISO 3166 形式でこのロケールの国コードを返します。
2String getDisplay Country()
このメソッドは、ユーザーに表示されるロケールに適した国の名前を返します。
3String getLanguage()
このメソッドは、このロケールの言語コードを小文字の ISO 639 形式で返します。
4String getDisplayLanguage()
このメソッドは、ユーザーに表示されるロケールに適した言語の名前を返します。
5String getISO3 Country()
このメソッドは、このロケールの国を表す 3 文字の略称を返します。
6String getISO3Language()
このメソッドは、このロケールの言語の 3 文字の省略形を返します。

この例は、リクエストの言語と関連する国を表示する方法を示しています:

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
  {
      // 获取客户端的区域设置
      Locale locale = request.getLocale();
      String language = locale.getLanguage();
      String country = locale.getCountry();

      // 设置响应内容类型
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String title = "检测区域设置";
      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>");
  }
}

言語設定

サーブレットは西ヨーロッパ言語 (英語、スペイン語、ドイツ語、フランス語、イタリア語、オランダ語、など)によって書かれました。ここで、すべての文字を正しく表示するには、Content-Language ヘッダーを設定することが非常に重要です。

2 番目のポイントは、HTML エンティティを使用してすべての特殊文字を表示することです。たとえば、「ñ」は「ñ」を意味し、「¡」は「¡」を意味します。

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
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 设置西班牙语言代码
    response.setHeader("Content-Language", "es");

    String title = "En Espa&ntilde;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&ntilde;ol:" + "</h1>\n" +
     "<h1>" + "&iexcl;Hola Mundo!" + "</h1>\n" +
     "</body></html>");
  }
}

ロケール固有の日付

java.text.DateFormat クラスとその静的メソッド getDateTimeInstance() を使用して、ロケール固有の日付と時刻をフォーマットできます。次の例は、特定のロケールに固有の日付をフォーマットする方法を示しています。

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
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    String date = DateFormat.getDateTimeInstance(
                                  DateFormat.FULL, 
                                  DateFormat.SHORT, 
                                  locale).format(new Date( ));

    String title = "特定于区域设置的日期";
    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>");
  }
}

ロケール固有の通貨

java.text.NumberFormat クラスとその静的メソッド getCurrencyInstance() を使用してフォーマットできます。 数値 (long やdouble)、ロケール固有の通貨です。次の例は、特定のロケールに固有の通貨を書式設定する方法を示しています。

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
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);

    String title = "特定于区域设置的货币";
    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>");
  }
}

ロケール固有のパーセント

java.text.NumberFormat クラスとその静的メソッド getPercentInstance() ロケール固有のパーセントを使用して書式設定できます。次の例は、特定のロケールに固有のパーセンテージをフォーマットする方法を示しています:

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
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getPercentInstance(locale);
    String formattedPerc = nft.format(0.51);

    String title = "特定于区域设置的百分比";
    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>");
  }
}