82 votes

Comment internationaliser/localiser une application web JSP/Servlet ?

J'ai appris de Google que l'internationalisation est le processus par lequel je peux rendre mon application web à utiliser toutes les langues. Je veux comprendre Unicode pour le processus d'internationalisation, donc j'ai appris sur Unicode à partir de ici et .

Je suis capable de comprendre l'Unicode, comment un jeu de caractères est encodé en octets et comment les octets sont décodés en jeu de caractères. Mais je ne sais pas comment aller plus loin. Je veux apprendre comment comparer des chaînes de caractères et j'ai besoin de savoir comment mettre en œuvre l'internationalisation dans mon application Web. Des suggestions s'il vous plaît ? Veuillez me guider.

Mon objectif :

Mon objectif principal est de développer une application Web pour la traduction (de l'anglais vers l'arabe et vice versa). Je veux respecter l'internationalisation. Je souhaite faire fonctionner mon application Web pour la traduction dans les trois navigateurs, à savoir FF, Chrome, IE. Comment puis-je y parvenir ?

223voto

BalusC Points 498232

Dans le cas d'une application web JSP/Servlet de base, l'approche de base consisterait à utiliser JSTL fmt taglib en combinaison avec paquets de ressources . Les paquets de ressources contiennent des paires clé-valeur où la clé est une constante qui est la même pour toutes les langues et où la valeur diffère selon la langue. Les paquets de ressources sont généralement fichiers de propriétés qui sont chargés par ResourceBundle API. Celle-ci peut toutefois être personnalisée de manière à ce que vous puissiez charger les paires clé-valeur à partir, par exemple, d'une base de données.

Voici un exemple d'internationalisation du formulaire de connexion de votre application Web à l'aide de groupes de ressources basés sur des fichiers de propriétés.


  1. Créez les fichiers suivants et placez-les dans un paquetage, par ex. com.example.i18n (dans le cas de Maven, mettez-les dans la structure du paquet à l'intérieur de src/main/resources ).

    text.properties (contient des paires clé-valeur dans la langue par défaut, généralement l'anglais)

     login.label.username = Username
     login.label.password = Password
     login.button.submit = Sign in

    text_nl.properties (contient du néerlandais ( nl ) paires clé-valeur)

     login.label.username = Gebruikersnaam
     login.label.password = Wachtwoord
     login.button.submit = Inloggen

    text_es.properties (contient l'espagnol ( es ) paires clé-valeur)

     login.label.username = Nombre de usuario
     login.label.password = Contraseña
     login.button.submit = Acceder

    Le nom de fichier du paquet de ressources doit respecter le modèle suivant name_ll_CC.properties . Le site _ll doit être la partie minuscule ISO 693-1 code de langue. Il est facultatif et n'est requis que lorsque le _CC est présent. Le site _CC doit être la partie majuscule ISO 3166-1 Alpha-2 le code du pays. Il est facultatif et n'est souvent utilisé que pour faire la distinction entre des dialectes linguistiques spécifiques à un pays, tels que Anglais américain ( _en_US ) et Anglais britannique ( _en_GB ).


  2. Si ce n'est pas encore fait, installez JSTL en suivant les instructions de cette réponse : Comment installer JSTL ? L'uri absolue : http://java.sun.com/jstl/core ne peut être résolue .


  3. Créez l'exemple de fichier JSP suivant et placez-le dans le dossier web content.

    login.jsp

     <%@ page pageEncoding="UTF-8" %>
     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
     <c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
     <fmt:setLocale value="${language}" />
     <fmt:setBundle basename="com.example.i18n.text" />
     <!DOCTYPE html>
     <html lang="${language}">
         <head>
             <title>JSP/JSTL i18n demo</title>
         </head>
         <body>
             <form>
                 <select id="language" name="language" onchange="submit()">
                     <option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
                     <option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
                     <option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
                 </select>
             </form>
             <form method="post">
                 <label for="username"><fmt:message key="login.label.username" />:</label>
                 <input type="text" id="username" name="username">
                 <br>
                 <label for="password"><fmt:message key="login.label.password" />:</label>
                 <input type="password" id="password" name="password">
                 <br>
                 <fmt:message key="login.button.submit" var="buttonValue" />
                 <input type="submit" name="submit" value="${buttonValue}">
             </form>
         </body>
     </html>

    Le site <c:set var="language"> gère la langue actuelle. Si la langue a été fournie en tant que paramètre de la requête (par la liste déroulante des langues), alors elle sera définie. Sinon, si la langue a déjà été définie dans la session, elle sera conservée. Sinon, utiliser la locale fournie par l'utilisateur dans l'en-tête de la requête.

    Le site <fmt:setLocale> définit la locale pour le paquet de ressources. Il est important que cette ligne soit avant le site <fmt:setBundle> .

    Le site <fmt:setBundle> initialise le paquet de ressources par son nom de base (c'est-à-dire le nom complet du paquet qualifié jusqu'au nom unique sans l'attribut _ll_CC ).

    Le site <fmt:message> récupère la valeur du message en fonction de la clé de regroupement spécifiée.

    Le site <html lang="${language}"> informe les robots de recherche de la langue de la page afin qu'elle ne soit pas considérée comme du contenu dupliqué (ce qui est bon pour le référencement).

    La liste déroulante des langues sera immédiatement soumise par JavaScript lorsqu'une autre langue sera choisie et la page sera rafraîchie avec la nouvelle langue choisie.


Vous devez cependant garder à l'esprit que les fichiers de propriétés sont lus par défaut en utilisant le codage de caractères ISO-8859-1. Vous devrez les échapper par des échappatoires unicode. Cela peut être fait en utilisant la fonction native2ascii.exe outil. Voir aussi cette section de l'article pour plus de détails.

Une alternative théorique consisterait à fournir une liasse avec un produit personnalisé. Control pour charger ces fichiers en UTF-8, mais ce n'est malheureusement pas supporté par la JSTL de base. fmt taglib. Vous devrez gérer tout cela vous-même avec l'aide d'une Filter . Il existe des frameworks (MVC) qui peuvent gérer cela de manière plus transparente, comme JSF, voir aussi cet article .

2 votes

Cette solution intéressante présente un problème : la locale extraite de la requête peut être la langue et le pays, comme dans "en_US", ce qui donnerait <html lang="en_US">, qui est un HTML invalide. Il est nécessaire d'utiliser uniquement la partie "en" de la locale comme valeur pour l'attribut lang.

0 votes

Je pensais juste partager avec vous que TapiJI ( code.google.com/a/eclipselabs.org/p/tapiji ) est peut-être une bonne option pour éditer des paquets/fichiers de ressources sans se soucier du codage des caractères.

0 votes

Comment définir par défaut une langue autre que l'anglais, par exemple le chinois ?

26voto

Paweł Dyda Points 10049

En plus de ce que BalusC a dit, vous devez faire attention à la directionalité (puisque l'anglais s'écrit de gauche à droite et l'arabe dans l'autre sens). Le moyen le plus simple serait d'ajouter dir à l'attribut html de votre page Web JSP et l'externaliser, de sorte que la valeur provient du fichier de propriétés (comme pour les autres éléments ou attributs) :

<html dir="${direction}">
...
</html>

En outre, le style de ce type d'application pose quelques problèmes - vous devez pour le moins éviter le positionnement absolu. Si, pour une raison ou une autre, vous ne pouvez pas l'éviter, vous pouvez soit utiliser des feuilles de style différentes pour chaque langue, soit faire quelque chose de plus simple. verboten c'est-à-dire utiliser des tableaux pour gérer la mise en page. Si vous souhaitez utiliser des éléments div, je vous suggère d'utiliser un positionnement relatif avec des attributs de style gauche et droit "symétriques" (ayant tous deux la même valeur), car c'est ce qui permet de faire fonctionner le changement de direction.

Vous pouvez en savoir plus sur les sites web bidirectionnels ici .

7 votes

Oui, en effet, cela doit être pris en compte également.

4 votes

<html dir="RTL"> OU <html dir="LTR"> . La valeur par défaut est <html dir="LTR">

2voto

Ronen Rabinovici Points 413

Sur la base de ce tutoriel J'utilise ce qui suit sur GAE - Google's App Engine :

Un fichier jsp comme suit :

<%@ page import="java.io.* %>
<% 
  String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
  ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
%>                 

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<head>
</head>
<body>
  <p>      
    <%= RB.getString("greeting") %>
  </p>
</body>

Et en ajoutant les fichiers nommés : app.properties (par défaut) et app_fr.properties (et ainsi de suite pour chaque langue). Chacun de ces fichiers doit contenir les chaînes de caractères dont vous avez besoin comme suit : clé:valeur_dans_la_langue, par ex. app_fr.properties contient :

greeting=Bonjour!

app.properties contient :

greeting=Hello!

C'est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X