English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Международизация Servlet

Прежде чем мы начнем, давайте рассмотрим три важные термина:

  • Международизация (i18n):Это означает, что сайт предоставляет версии контента, переведенного на язык или страну посетителя.

  • Локализация (l10n):Это означает добавление ресурсов на сайт, чтобы он адаптировался к определенному географическому или культурному региону, например, перевод сайта на хинди (Hindi).

  • Настройка региона (locale):Это особая культурная или географическая зона. Обычно это означает символ языка, за которым следует нижний подчеркивание и символ страны. Например, "en_US" означает настройку региона для английского языка в США.

При создании глобального сайта есть несколько моментов, которые необходимо учитывать. В этом руководстве не будет рассмотрены все детали этих моментов, но оно将通过 отличный пример показать, как веб-страницы могут отображаться на различных языках с помощью дифференцированного позиционирования (т.е. настройки региона).

Servlet может выбирать соответствующую версию сайта в зависимости от настроек региона запросителя и предоставлять соответствующую версию сайта на местном языке, культуре и потребностях. Ниже приведен метод, возвращающий объект Locale в объекте запроса.

java.util.Locale request.getLocale()

Обнаружение настроек региона

Ниже перечислены важные методы настройки региона, которые вы можете использовать для определения географического положения, языка и настроек запросителя. Все методы показывают имя страны и имя языка, установленные в браузере запросителя.

НомерМетоды и описание
1String getCountry()
Этот метод возвращает код страны/территории в формате ISO 3166 из двух больших букв.
2String getDisplayCountry()
Этот метод возвращает имя страны, подходящее для отображения пользователю в настройках региона.
3String getLanguage()
Этот метод возвращает код языка в формате ISO 639 в нижнем регистре.
4String getDisplayLanguage()
Этот метод возвращает имя языка, подходящее для отображения пользователю в настройках региона.
5String getISO3Country()
Этот метод возвращает трехбуквенный код страны для заданного региона.
6String 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>
  }
}