Servlet 国際化

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

  • 国際化(i18n):これは、Webサイトが訪問者の言語や国籍に翻訳された異なるバージョンのコンテンツを提供することを意味します。
  • ローカリゼーション(l10n):これは、特定の地理的または文化的な地域に適合するようにWebサイトにリソースを追加することを意味します。例えば、Webサイトをヒンディー語(Hindi)に翻訳することです。
  • ロケール(locale):これは特別な文化的または地理的な地域です。通常、言語記号の後にアンダースコアと国記号が続きます。例えば、"en_US"は米国向けの英語ロケールを表します。

グローバルなWebサイトを構築する際には、いくつかの注意事項があります。このチュートリアルでは、これらの注意事項の完全な詳細は説明しませんが、優れた例を通して、ロケールによってWebページを異なる言語で表示する方法を示します。

Servletは、リクエスタのロケールに基づいて対応するバージョンのWebサイトを選択し、現地の言語、文化、ニーズに応じたWebサイトのバージョンを提供できます。以下は、requestオブジェクトでLocaleオブジェクトを返すメソッドです。

java.util.Locale request.getLocale() 

ロケールの検出

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

番号メソッド & 説明
1String getCountry()
このメソッドは、ISO 3166形式の2文字の大文字で、このロケールの国/地域コードを返します。
2String getDisplayCountry()
このメソッドは、ユーザーに表示するのに適したロケールの国名を返します。
3String getLanguage()
このメソッドは、ISO 639形式の小文字で、このロケールの言語コードを返します。
4String getDisplayLanguage()
このメソッドは、ユーザーに表示するのに適したロケールの言語名を返します。
5String getISO3Country()
このメソッドは、このロケールの国の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;charset=UTF-8");
      PrintWriter out = response.getWriter();

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

言語設定

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

2つ目は、HTMLエンティティを使用してすべての特殊文字を表示することです。例えば、"&#241;"は"ñ"を表し、"&#161;"は"¡"を表します。以下に示します:

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;charset=UTF-8");
    PrintWriter out = response.getWriter();
    // 设置西班牙语言代码
    response.setHeader("Content-Language", "es");

    String title = "En Espa&ntilde;ol";
    String docType = "<!DOCTYPE html> \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;charset=UTF-8");
    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> \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;charset=UTF-8");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);

    String title = "特定于区域设置的货币";
    String docType = "<!DOCTYPE html> \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;charset=UTF-8");
    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> \n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#F0F0F0\">\n" +
      "<h1 align=\"center\">" + formattedPerc + "</h1>\n" +
      "</body></html>");
  }
} 
その他の拡張