web-dev-qa-db-fra.com

Comment internationaliser une application Web Java?

J'ai appris de Google que l'internationalisation est le processus par lequel je peux faire en sorte que mon application Web utilise toutes les langues. Je veux comprendre Unicode pour le processus d'internationalisation, j'ai donc appris l'existence de Unicode par ici et .

Je suis capable de comprendre à propos d'Unicode la façon dont un jeu de caractères est codé en octets et octets décodés en jeu de caractères. Mais je ne sais pas comment aller plus loin. Je veux apprendre à comparer des chaînes et j'ai besoin de savoir comment implémenter l'internationalisation dans mon application Web. Des suggestions s'il vous plaît? Guidez-moi s'il-vous-plaît.

Mon objectif:

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

80
IamIronMAN

Dans le cas d'une application Web JSP/Servlet de base, l'approche de base serait d'utiliser JSTL fmt taglib en combinaison avec ensembles de ressources . Les ensembles de ressources contiennent des paires clé-valeur dans lesquelles la clé est une constante identique pour toutes les langues et la valeur diffère d'une langue à l'autre. Les ensembles de ressources sont généralement fichiers de propriétés et sont chargés par ResourceBundle API. Cela peut toutefois être personnalisé afin 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 avec des regroupements de ressources basés sur des fichiers de propriétés.


  1. Créez les fichiers suivants et mettez-les dans un package, par exemple. com.example.i18n (Dans le cas de Maven, mettez-les dans la structure du paquet dans src/main/resources).

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

     login.label.username = nom d'utilisateur 
     login.label.password = mot de passe 
     login.button.submit = Connectez-vous 
    

    text_nl.properties (Contient le 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 d'utilisateurs 
     login.label.password = Contrase 
     login.button.submit = Acceder 
    

    Le nom de fichier du regroupement de ressources doit respecter le modèle suivant name_ll_CC.properties. La partie _ll Doit être le code de langue ISO 693-1 minuscule. Il est facultatif et requis uniquement lorsque la partie _CC Est présente. La partie _CC Devrait être le code pays majuscule ISO 3166-1 Alpha-2 . Il est facultatif et souvent utilisé uniquement pour distinguer des dialectes 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. Si vous utilisez un conteneur Servlet 2.5 ou plus récent (Tomcat 6.0 et ainsi de suite) et que votre web.xml Est déclaré conforme à la spécification Servlet 2.5, il suffit de mettre jstl-1.2.jar dans le dossier /WEB-INF/lib de la Webapp.


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

    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 <c:set var="language"> Gère la langue actuelle. Si la langue a été fournie en tant que paramètre de demande (par liste déroulante de langue), elle sera définie. Sinon, si la langue était déjà définie dans la session, respectez-la plutôt. Sinon, utilisez les paramètres régionaux fournis par l'utilisateur dans l'en-tête de la demande.

    Le <fmt:setLocale> Définit les paramètres régionaux du groupe de ressources. Il est important que cette ligne soit avant le <fmt:setBundle>.

    Le <fmt:setBundle> Initialise le groupe de ressources par son nom de base (c'est-à-dire le nom complet du package qualifié jusqu'à ce que le nom soit unique sans le spécificateur _ll_CC).

    Le <fmt:message> Récupère la valeur du message à l'aide de la clé de paquet spécifiée.

    Le <html lang="${language}"> Informe le moteur de recherche de la langue de la page afin qu'elle ne soit pas marquée en tant que contenu dupliqué (donc utile pour le référencement).

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


Cependant, vous devez garder à l'esprit que les fichiers de propriétés sont lus par défaut à l'aide du codage de caractères ISO-8859-1. Vous auriez besoin de leur échapper par des échappements Unicode. Cela peut être fait à l'aide de l'outil native2ascii.exe Fourni par JDK. Voir aussi cette section d'article pour plus de détails.

Une alternative théorique serait de fournir un paquet avec une commande personnalisée Control pour charger ces fichiers au format UTF-8, mais ce n'est malheureusement pas supporté par le JSTL de base fmt taglib . Vous auriez besoin de tout gérer vous-même avec l'aide d'un Filter. Il existe des frameworks (MVC) capables de gérer cela de manière plus transparente, comme JSF, voir aussi cet article .

218
BalusC

En plus de ce que BalusC a dit, vous devez faire attention à la direction (car l'anglais est écrit de gauche à droite et l'arabe inversement). Le moyen le plus simple consiste à ajouter l'attribut dir à l'élément html de votre page Web JSP et à l'externaliser. La valeur provient donc du fichier de propriétés (comme avec d'autres éléments ou attributs):

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

En outre, le style d'une telle application pose peu de problèmes - évitez au minimum d'éviter un positionnement absolu. Si vous ne pouvez pas l'éviter pour une raison quelconque, vous pouvez utiliser différentes feuilles de style par langue ou faire quelque chose qui est verboten , c'est-à-dire utiliser des tableaux. pour gérer la mise en page. Si vous souhaitez utiliser des éléments div, nous vous suggérons d'utiliser un positionnement relatif avec des attributs de style gauche et droit "symétriques" (les deux ayant la même valeur), car c'est ce qui permet de changer de direction.

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

26
Paweł Dyda

basé sur ce tutoriel , j'utilise les éléments suivants sur GAE - App Engine de Google:

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 (valeur par défaut) et app_fr.properties (et ainsi de suite pour toutes les langues). Chacun de ces fichiers doit contenir les chaînes dont vous avez besoin, comme suit: key: value_in_language, par exemple. app_fr.properties contient:

greeting=Bonjour!

app.properties contient:

greeting=Hello!

C'est tout

2
Ronen Rabinovici