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-сущности символов для отображения специальных символов, например, "ñ" представляет ñ, а "¡" представляет ¡ :
<%@ 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>
Другие расширения