サーブレットの国際化
始める前に、3 つの重要な用語を見てみましょう:
国際化 (i18n): これは、Web サイトが、訪問者の言語または国籍に翻訳されたさまざまなバージョンのコンテンツを提供することを意味します。
ローカリゼーション (l10n): これは、Web サイトをヒンディー語に翻訳するなど、特定の地理的または文化的地域に適応させるために Web サイトにリソースを追加することを意味します。
ロケール: これは特別な文化的または地理的地域です。通常、言語記号の後にアンダースコアと国記号が続いたものを指します。たとえば、「en_US」は米国の英語ロケールを表します。
グローバル Web サイトを構築する際には、いくつかの考慮事項があります。このチュートリアルでは、これらの考慮事項の詳細については説明しませんが、差分ターゲティング (つまり、ロケール設定) を使用して、さまざまな言語でページをレンダリングする方法の良い例を示します。
サーブレットは、リクエスターのロケールに基づいて適切なバージョンの Web サイトを選択し、現地の言語、文化、ニーズに従って提供できます。以下は、Locale オブジェクトを返すリクエスト オブジェクト内のメソッドです。
java.util.Locale request.getLocale()
ロケールの検出
以下にリストされているのは、地理位置情報、言語、リクエスターのロケールを検出するために使用できる重要なロケール メソッドです。以下のすべてのメソッドは、要求者のブラウザに設定されている国名と言語名を表示します。
シリアル番号 | メソッドと説明 |
---|---|
1 | String get Country() このメソッドは、大文字 2 文字を含む ISO 3166 形式でこのロケールの国コードを返します。 |
2 | String getDisplay Country() このメソッドは、ユーザーに表示されるロケールに適した国の名前を返します。 |
3 | String getLanguage() このメソッドは、このロケールの言語コードを小文字の ISO 639 形式で返します。 |
4 | String getDisplayLanguage() このメソッドは、ユーザーに表示されるロケールに適した言語の名前を返します。 |
5 | String getISO3 Country() このメソッドは、このロケールの国を表す 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 { // 获取客户端的区域设置 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ñ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>"); } }
ロケール固有の日付
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>"); } }