English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Прежде чем мы начнем, давайте рассмотрим три важные термина:
Международизация (i18n):Это означает, что сайт предоставляет версии контента, переведенного на язык или страну посетителя.
Локализация (l10n):Это означает добавление ресурсов на сайт, чтобы он адаптировался к определенному географическому или культурному региону, например, перевод сайта на хинди (Hindi).
Настройка региона (locale):Это особая культурная или географическая зона. Обычно это означает символ языка, за которым следует нижний подчеркивание и символ страны. Например, "en_US" означает настройку региона для английского языка в США.
При создании глобального сайта есть несколько моментов, которые необходимо учитывать. В этом руководстве не будет рассмотрены все детали этих моментов, но оно将通过 отличный пример показать, как веб-страницы могут отображаться на различных языках с помощью дифференцированного позиционирования (т.е. настройки региона).
Servlet может выбирать соответствующую версию сайта в зависимости от настроек региона запросителя и предоставлять соответствующую версию сайта на местном языке, культуре и потребностях. Ниже приведен метод, возвращающий объект Locale в объекте запроса.
java.util.Locale request.getLocale()
Ниже перечислены важные методы настройки региона, которые вы можете использовать для определения географического положения, языка и настроек запросителя. Все методы показывают имя страны и имя языка, установленные в браузере запросителя.
Номер | Методы и описание |
---|---|
1 | String getCountry() Этот метод возвращает код страны/территории в формате ISO 3166 из двух больших букв. |
2 | String getDisplayCountry() Этот метод возвращает имя страны, подходящее для отображения пользователю в настройках региона. |
3 | String getLanguage() Этот метод возвращает код языка в формате ISO 639 в нижнем регистре. |
4 | String getDisplayLanguage() Этот метод возвращает имя языка, подходящее для отображения пользователю в настройках региона. |
5 | String getISO3Country() Этот метод возвращает трехбуквенный код страны для заданного региона. |
6 | String getISO3Language() Этот метод возвращает трехбуквенный код языка для заданного региона. |
Этот пример демонстрирует, как можно отобразить язык и связанную с ним страну для определенного запроса:
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> } }
Servlet может выводить страницы, написанные на западноевропейских языках (например, английский, испанский, немецкий, французский, итальянский, голландский и т.д.). Здесь очень важно установить заголовок Content-Language, чтобы корректно отображать все символы.
Второй点是 использование 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;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> } }
Вы можете использовать класс 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;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> } }
Вы можете использовать класс 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;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> } }
Вы можете использовать класс 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;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> } }