JSP Интернационализация

Прежде чем начать, необходимо объяснить несколько важных понятий:

  • Интернационализация (i18n): это означает, что страница отображает разные переведённые версии в зависимости от языка или страны посетителя.
  • Локализация (l10n): добавление ресурсов на веб-сайт для его адаптации к разным регионам и культурам. Например, версия веб-сайта на хинди.
  • Локаль: это конкретный регион или культура, обычно рассматриваемые как код языка и код страны, соединённые подчёркиванием. Например, "en_US" обозначает локаль английского языка (США).

Если вы хотите создать глобализованный веб-сайт, нужно учесть ряд моментов. В этой главе подробно рассказывается, как решать вопросы интернационализации, и приводятся некоторые примеры для более глубокого понимания.

Контейнер JSP может предоставить правильную версию страницы на основе атрибута locale запроса. Ниже показан синтаксис получения объекта Locale через объект request:

java.util.Locale request.getLocale() 

Определение локали

В следующей таблице перечислены наиболее важные методы объекта Locale, используемые для определения региона, языка и локали объекта request. Все эти методы отображают название страны и название языка в браузере:

Number Метод & Описание
1 String getCountry()Возвращает код страны/региона заглавными английскими буквами или регион в двухбуквенном формате ISO 3166
2 String getDisplayCountry()Возвращает название страны для отображения пользователю
3 String getLanguage()Возвращает код языка в нижнем регистре на английском или регион в формате ISO 639
4 String getDisplayLanguage()Возвращает название языка для отображения пользователю
5 String getISO3Country()Возвращает 3-буквенное сокращение названия страны
6 String getISO3Language()Возвращает 3-буквенное сокращение названия языка

Демонстрация примера

Этот пример показывает, как отобразить язык и страну в JSP:

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%
   //获取客户端本地化信息
   Locale locale = request.getLocale();
   String language = locale.getLanguage();
   String country = locale.getCountry();
%>
<html>
<head>
<title>Detecting Locale</title>
</head>
<body>
<center>
<h1>Detecting Locale</h1>
</center>
<p align="center">
<% 
   out.println("Language : " + language  + "<br />");
   out.println("Country  : " + country   + "<br />");
%>
</p>
</body>
</html>

Настройки языка

JSP может использовать западноевропейские языки для вывода страницы, такие как английский, испанский, немецкий, французский, итальянский и т. д. Отсюда видно, что важно установить заголовок Content-Language для корректного отображения всех символов.

Второй момент: нужно использовать HTML-сущности символов для отображения специальных символов, например, "&#241;" представляет ñ, а "&#161;" представляет ¡ :

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%
    // Set response content type
    response.setContentType("text/html");
    // Set spanish language code.
    response.setHeader("Content-Language", "es");
    String title = "En Espa?ol";

%>
<html>
<head>
<title><%  out.print(title); %></title>
</head>
<body>
<center>
<h1><%  out.print(title); %></h1>
</center>
<div align="center">
<p>En Espa?ol</p>
<p>?Hola Mundo!</p>
</div>
</body>
</html>

Даты с учётом локали

Вы можете использовать класс java.text.DateFormat и его статический метод getDateTimeInstance() для форматирования дат и времени. Следующий пример показывает, как форматировать даты и время в соответствии с указанной локалью:

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%@ page import="java.text.DateFormat,java.util.Date" %>

<%
    String title = "Locale Specific Dates";
    //Get the client's Locale
    Locale locale = request.getLocale( );
    String date = DateFormat.getDateTimeInstance(
                                  DateFormat.FULL, 
                                  DateFormat.SHORT, 
                                  locale).format(new Date( ));
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>Local Date: <%  out.print(date); %></p>
</div>
</body>
</html>

Валюта с учётом локали

Вы можете использовать класс java.text.NumberFormat и его статический метод getCurrencyInstance() для форматирования чисел. Например, типы long и double в валюте с учётом локали. В следующем примере показано, как форматировать валюту в соответствии с указанной локалью:

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%@ page import="java.text.NumberFormat,java.util.Date" %>

<%
    String title = "Locale Specific Currency";
    //Get the client's Locale
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>Formatted Currency: <%  out.print(formattedCurr); %></p>
</div>
</body>
</html>

Проценты с учётом локали

Вы можете использовать класс java.text.NumberFormat и его статический метод getPercentInstance() для форматирования процентов. В следующем примере показано, как форматировать проценты в соответствии с указанной локалью:

<%@ page import="java.io.*,java.util.Locale" %>
<%@ page import="javax.servlet.*,javax.servlet.http.* "%>
<%@ page import="java.text.NumberFormat,java.util.Date" %>

<%
    String title = "Locale Specific Percentage";
    //Get the client's Locale
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getPercentInstance(locale);
    String formattedPerc = nft.format(0.51);
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>Formatted Percentage: <%  out.print(formattedPerc); %></p>
</div>
</body>
</html>
Другие расширения