サーブレット-国際化

先に進む前に、3つの重要な用語を説明しましょう-

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

  • Localization (l10n) −これは、特定の地理的または文化的地域に適応するためにWebサイトにリソースを追加することを意味します。

  • locale−これは特定の文化的または地理的な地域です。これは通常、アンダースコアで区切られた国の記号が後に続く言語記号と呼ばれます。たとえば、「en_US」は米国の英語ロケールを表します。

グローバルなウェブサイトを構築する際に注意しなければならない項目がいくつかあります。このチュートリアルでは、これについて完全に詳しく説明することはできませんが、場所、つまりロケールを区別することにより、さまざまな言語でWebページをインターネットコミュニティに提供する方法の良い例を示します。

サーブレットは、リクエスターのロケールに基づいてサイトの適切なバージョンを取得し、現地の言語、文化、および要件に応じて適切なサイトバージョンを提供できます。以下は、ロケールオブジェクトを返すリクエストオブジェクトのメソッドです。

java.util.Locale request.getLocale()

ロケールの検出

以下は、リクエスターの場所、言語、そしてもちろんロケールを検出するために使用できる重要なロケールメソッドです。以下のすべてのメソッドは、リクエスターのブラウザーで設定された国名と言語名を表示します。

シニア番号 方法と説明
1

String getCountry()

このメソッドは、このロケールの国/地域コードをISO 31662文字形式で大文字で返します。

2

String getDisplayCountry()

このメソッドは、ユーザーに表示するのに適したロケールの国の名前を返します。

3

String getLanguage()

このメソッドは、このロケールの言語コードを小文字でISO639形式で返します。

4

String getDisplayLanguage()

このメソッドは、ユーザーへの表示に適したロケールの言語の名前を返します。

5

String getISO3Country()

このメソッドは、このロケールの国の3文字の省略形を返します。

6

String 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 {
   
      //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>"
      );
   }
}

言語設定

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

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 {

      // 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&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 {
      
      // 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>"
      );
   }
}

ロケール固有の通貨

java.txt.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 {

      // 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>"
      );
   }
}

ロケール固有のパーセンテージ

java.txt.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 {
      
      // 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>"
      );
   }
}