Servlet Internationalisierung
Bevor wir beginnen, sehen wir uns drei wichtige Begriffe an:
- Internationalisierung (i18n):Das bedeutet, dass eine Website verschiedene Versionen von Inhalten bereitstellt, die in die Sprache oder Nationalität des Besuchers übersetzt sind.
- Lokalisierung (l10n):Das bedeutet, einer Website Ressourcen hinzuzufügen, um sie an eine bestimmte geografische oder kulturelle Region anzupassen, zum Beispiel die Übersetzung der Website ins Hindi.
- Locale:Dies ist eine bestimmte kulturelle oder geografische Region. Sie wird normalerweise durch ein Sprachsymbol dargestellt, gefolgt von einem Unterstrich und einem Ländersymbol. Zum Beispiel steht "en_US" für das englische Locale für die USA.
Beim Aufbau einer globalen Website gibt es einige Überlegungen. Dieses Tutorial wird nicht alle Details dieser Überlegungen behandeln, sondern anhand eines guten Beispiels zeigen, wie Webseiten durch differenzierte Positionierung (d. h. Locale) in verschiedenen Sprachen dargestellt werden können.
Ein Servlet kann die geeignete Version der Website basierend auf dem Locale des Anfragenden auswählen und die entsprechende Version der Website gemäß der lokalen Sprache, Kultur und den Anforderungen bereitstellen. Nachfolgend sind die Methoden des Request-Objekts aufgeführt, die Locale-Objekte zurückgeben.
java.util.Locale request.getLocale()
Locale ermitteln
Nachfolgend finden Sie eine Liste wichtiger Locale-Methoden, mit denen Sie den geografischen Standort, die Sprache und das Locale des Anfragenden ermitteln können. Alle folgenden Methoden zeigen den im Browser des Anfragenden eingestellten Ländernamen und Sprachnamen an.
| Seq. | Methode & Beschreibung |
|---|---|
| 1 | String getCountry() Diese Methode gibt den Länder-/Regionscode des Locale-Objekts im ISO-3166-Format mit 2 Großbuchstaben zurück. |
| 2 | String getDisplayCountry() Diese Methode gibt den für die Anzeige für den Benutzer geeigneten Namen des Landes des Locale-Objekts zurück. |
| 3 | String getLanguage() Diese Methode gibt den Sprachcode des Locale-Objekts im ISO-639-Format mit Kleinbuchstaben zurück. |
| 4 | String getDisplayLanguage() Diese Methode gibt den für die Anzeige für den Benutzer geeigneten Namen der Sprache des Locale-Objekts zurück. |
| 5 | String getISO3Country() Diese Methode gibt die Dreibuchstabenabkürzung des Landes des Locale-Objekts zurück. |
| 6 | String getISO3Language() Diese Methode gibt die dreibuchstabige Abkürzung der Sprache des Locale zurück. |
Beispiel
Dieses Beispiel zeigt, wie die Sprache und das zugehörige Land einer Anfrage angezeigt werden:
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>");
}
}
Spracheinstellungen
Ein Servlet kann Seiten ausgeben, die in westeuropäischen Sprachen verfasst sind (wie Englisch, Spanisch, Deutsch, Französisch, Italienisch, Niederländisch usw.). Hier ist das Festlegen des Content-Language-Headers sehr wichtig, um alle Zeichen korrekt anzuzeigen.
Der zweite Punkt ist, HTML-Entities zu verwenden, um alle Sonderzeichen anzuzeigen, zum Beispiel steht "ñ" für "ñ", "¡" für "¡", wie unten gezeigt:
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ñol";
String docType = "<!DOCTYPE html> \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>");
}
}
Locale-spezifische Datumsangaben
Sie können die Klasse java.text.DateFormat und ihre statische Methode getDateTimeInstance() verwenden, um Datums- und Zeitangaben zu formatieren, die spezifisch für ein Locale sind. Das folgende Beispiel zeigt, wie Datumsangaben spezifisch für ein gegebenes Locale formatiert werden:
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>");
}
}
Gebietsschemaspezifische Währung
Sie können die Klasse java.text.NumberFormat und ihre statische Methode getCurrencyInstance() verwenden, um Zahlen (wie den Typ long oder double) in eine lokalspezifische Währung zu formatieren. Das folgende Beispiel zeigt, wie Währungsangaben spezifisch für ein gegebenes Locale formatiert werden:
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>");
}
}
Gebietsschemaspezifische Prozentangaben
Sie können die Klasse java.text.NumberFormat und ihre statische Methode getPercentInstance() verwenden, um lokalspezifische Prozentwerte zu formatieren. Das folgende Beispiel zeigt, wie Prozentwerte spezifisch für ein gegebenes Locale formatiert werden:
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>");
}
}
Andere Erweiterungen