Internationalisation des servlets


Avant de commencer, examinons trois termes importants :

  • Internationalisation (i18n) : Cela signifie qu'un site Web propose différentes versions de contenus traduits dans la langue ou la nationalité du visiteur.

  • Localisation (l10n) : Cela signifie ajouter des ressources à un site Web pour l'adapter à une zone géographique ou culturelle spécifique, comme par exemple traduire le site Web en hindi (hindi ).

  • Local : Il s'agit d'une zone culturelle ou géographique particulière. Il fait généralement référence au symbole de la langue suivi d'un trait de soulignement et du symbole du pays. Par exemple, « en_US » représente la langue anglaise pour les États-Unis.

Il y a certaines considérations à prendre en compte lors de la création d'un site Web mondial. Ce didacticiel n'entrera pas dans les détails de ces considérations, mais il vous donnera un bon exemple de la façon d'utiliser le ciblage différentiel (c'est-à-dire les paramètres régionaux) pour afficher une page dans différentes langues.

La servlet peut récupérer la version appropriée du site Web en fonction des paramètres régionaux du demandeur et proposer la version appropriée du site Web en fonction de la langue, de la culture et des besoins locaux. Voici les méthodes de l'objet de requête qui renvoient des objets Locale.

java.util.Locale request.getLocale()

Détection des paramètres régionaux

Vous trouverez ci-dessous des méthodes de paramètres régionaux importantes que vous pouvez utiliser pour détecter la géolocalisation, la langue et les paramètres régionaux du demandeur. Toutes les méthodes ci-dessous affichent le nom du pays et le nom de la langue définis dans le navigateur du demandeur.

Numéro de sérieMéthode et description
1
序号方法 & 描述
1String getCountry()
该方法以 2 个大写字母形式的 ISO 3166 格式返回该区域设置的国家/地区代码。
2String getDisplayCountry()
该方法返回适合向用户显示的区域设置的国家的名称。
3String getLanguage()
该方法以小写字母形式的 ISO 639 格式返回该区域设置的语言代码。
4String getDisplayLanguage()
该方法返回适合向用户显示的区域设置的语言的名称。
5String getISO3Country()
该方法返回该区域设置的国家的三个字母缩写。
6String getISO3Language()
该方法返回该区域设置的语言的三个字母的缩写。
String getCountry()<🎜>
Cette méthode renvoie le pays de cette locale au format ISO 3166 avec 2 lettres majuscules/Zone code.
2<🎜>String getDisplayCountry()<🎜>
Cette méthode renvoie le nom du pays adapté aux paramètres régionaux affichés l'utilisateur.
3<🎜>String getLanguage()<🎜>
Cette méthode renvoie les paramètres régionaux dans le code de langue au format ISO 639 minuscule.
4<🎜>String getDisplayLanguage()<🎜>
Cette méthode renvoie le nom de la langue appropriée pour les paramètres régionaux affichés l'utilisateur.
5<🎜>String getISO3Country()<🎜>
Cette méthode renvoie l'abréviation à trois lettres du pays pour cette locale .
6<🎜>String getISO3Language()<🎜>
Cette méthode renvoie l'abréviation à trois lettres de la langue de cette locale .

Exemple

Cet exemple montre comment afficher la langue et le pays associé d'une requête :

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");
      PrintWriter out = response.getWriter();

      String title = "检测区域设置";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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>");
  }
}

Paramètres de langue

Servlet peut afficher dans les langues d'Europe occidentale ( comme l'anglais, l'espagnol, l'allemand, le français, l'italien, le néerlandais, etc.). Ici, afin d'afficher correctement tous les caractères, il est très important de définir l'en-tête Content-Language.

Le deuxième point consiste à utiliser des entités HTML pour afficher tous les caractères spéciaux, par exemple, "ñ" signifie "ñ", "¡" signifie "¡", comme suit :

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");
    PrintWriter out = response.getWriter();
    // 设置西班牙语言代码
    response.setHeader("Content-Language", "es");

    String title = "En Espa&ntilde;ol";
    String docType =
     "<!doctype html public \"-//w3c//dtd html 4.0 " +
     "transitional//en\">\n";
     out.println(docType +
     "<html>\n" +
     "<head><title>" + title + "</title></head>\n" +
     "<body bgcolor=\"#f0f0f0\">\n" +
     "<h1>" + "En Espa&ntilde;ol:" + "</h1>\n" +
     "<h1>" + "&iexcl;Hola Mundo!" + "</h1>\n" +
     "</body></html>");
  }
}

Dates spécifiques aux paramètres régionaux

Vous pouvez utiliser la classe java.text.DateFormat et sa méthode statique getDateTimeInstance() pour formater les dates et heures spécifiques aux paramètres régionaux. L'exemple suivant montre comment formater une date spécifique à une locale donnée :

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");
    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 public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + date + "</h1>\n" +
      "</body></html>");
  }
}

Devise spécifique à la locale

Vous pouvez utiliser la classe java.text.NumberFormat et sa méthode statique getCurrencyInstance() pour formater un nombre (tel que long ou double) dans une devise spécifique aux paramètres régionaux. L'exemple suivant montre comment formater une devise spécifique à une locale donnée :

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");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);

    String title = "特定于区域设置的货币";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedCurr + "</h1>\n" +
      "</body></html>");
  }
}

Pourcentage spécifique à la locale

Vous pouvez utiliser la classe java.text.NumberFormat et sa méthode statique getPercentInstance() pour formater pourcentages spécifiques aux paramètres régionaux. L'exemple suivant montre comment formater un pourcentage spécifique à une région donnée :

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");
    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 public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedPerc + "</h1>\n" +
      "</body></html>");
  }
}