it-swarm.com.de

Wie internationalisiere ich eine Java Webanwendung?

Ich habe von Google erfahren, dass Internationalisierung der Prozess ist, mit dem ich meine Webanwendung so gestalten kann, dass alle Sprachen verwendet werden. Ich möchte Unicode für den Internationalisierungsprozess verstehen, daher habe ich Unicode von hier und dort gelernt.

Ich kann über Unicode verstehen, dass ein Zeichensatz in Byte codiert und wieder in Zeichensatz decodiert wird. Aber ich weiß nicht, wie ich weiter vorankommen soll. Ich möchte lernen, wie man Zeichenfolgen vergleicht, und ich möchte wissen, wie man Internationalisierung in meiner Webanwendung implementiert. Irgendwelche Vorschläge bitte? Bitte führen Sie mich.

Mein Ziel:

Mein Hauptziel ist die Entwicklung einer Webanwendung für die Übersetzung (Englisch nach Arabisch und umgekehrt). Ich möchte der Internationalisierung folgen. Ich möchte meine Webanwendung für die Übersetzung in allen drei Browsern ausführen, nämlich FF, Chrome, IE. Wie erreiche ich das?

80
IamIronMAN

Im Falle einer grundlegenden JSP/Servlet-Webanwendung würde der grundlegende Ansatz darin bestehen, JSTL fmt taglib in Kombination zu verwenden mit Ressourcenbündel . Ressourcenpakete enthalten Schlüssel-Wert-Paare, bei denen der Schlüssel eine Konstante ist, die für alle Sprachen gleich ist und deren Wert sich je nach Sprache unterscheidet. Ressourcenpakete sind normalerweise Eigenschaftendateien , die von ResourceBundle API geladen werden. Dies kann jedoch so angepasst werden, dass Sie die Schlüssel-Wert-Paare beispielsweise aus einer Datenbank laden können.

Im Folgenden finden Sie ein Beispiel für die Internationalisierung des Anmeldeformulars Ihrer Webanwendung mit auf Eigenschaftendateien basierenden Ressourcenpaketen.


  1. Erstellen Sie die folgenden Dateien und fügen Sie sie in ein Paket ein, z. com.example.i18n (Im Falle von Maven, fügen Sie diese in die Paketstruktur in src/main/resources Ein).

    text.properties (Enthält Schlüssel-Wert-Paare in der Standardsprache, normalerweise Englisch)

     login.label.username = Benutzername 
     login.label.password = Passwort 
     login.button.submit = Anmelden 
    

    text_nl.properties (Enthält niederländische (nl) Schlüsselwertpaare)

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

    text_es.properties (Enthält spanische (es) Schlüsselwertpaare)

     login.label.username = Benutzerkennzahl 
     login.label.password = Contraseña 
     login.button.submit = Acceder 
    

    Der Dateiname des Ressourcenpakets sollte dem folgenden Muster entsprechen name_ll_CC.properties. Der Teil _ll Sollte in Kleinbuchstaben geschrieben sein ISO 693-1 Sprachcode. Es ist optional und nur erforderlich, wenn der Teil _CC Vorhanden ist. Der Teil _CC Sollte in Großbuchstaben angegeben werden ISO 3166-1 Alpha-2 Ländercode. Es ist optional und wird oft nur zur Unterscheidung zwischen länderspezifischen Sprachdialekten verwendet, wie Amerikanisches Englisch (_en_US) Und Britisches Englisch (_en_GB).


  2. Falls noch nicht geschehen, installieren Sie JSTL. Wenn Sie mit einem Servlet 2.5-Container oder einer neueren Version (Tomcat 6.0 usw.) arbeiten und Ihr web.xml Als konform mit der Servlet 2.5-Spezifikation deklariert ist, geben Sie einfach jstl-1.2.jar ein im Ordner /WEB-INF/lib von webapp.


  3. Erstellen Sie die folgende JSP-Beispieldatei und legen Sie sie im Webinhaltsordner ab.

    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>
    

    Der <c:set var="language"> Verwaltet die aktuelle Sprache. Wenn die Sprache als Anforderungsparameter angegeben wurde (per Sprachauswahl), wird sie gesetzt. Andernfalls, wenn die Sprache bereits in der Sitzung festgelegt wurde, bleiben Sie stattdessen bei dieser. Verwenden Sie ansonsten das vom Benutzer angegebene Gebietsschema im Anforderungsheader.

    Mit <fmt:setLocale> Wird das Gebietsschema für das Ressourcenpaket festgelegt. Es ist wichtig, dass diese Zeile vor dem <fmt:setBundle> Steht.

    Das <fmt:setBundle> Initialisiert das Ressourcenpaket anhand seines Basisnamens (dh des vollständigen qualifizierten Paketnamens bis zum alleinigen Namen ohne den _ll_CC - Bezeichner).

    Mit <fmt:message> Wird der Nachrichtenwert über den angegebenen Paketschlüssel abgerufen.

    Der <html lang="${language}"> Informiert die Suchmaschinen darüber, in welcher Sprache sich die Seite befindet, damit sie nicht als doppelter Inhalt markiert wird (daher gut für SEO).

    Die Sprachauswahl wird sofort von JavaScript gesendet, wenn eine andere Sprache ausgewählt wird, und die Seite wird mit der neu ausgewählten Sprache aktualisiert.


Beachten Sie jedoch, dass Eigenschaftendateien standardmäßig mit der ISO-8859-1-Zeichencodierung gelesen werden. Sie müssten ihnen durch Unicode-Flucht entkommen. Dies kann mit dem von JDK bereitgestellten Tool native2ascii.exe Durchgeführt werden. Siehe auch dieser Artikelabschnitt für weitere Einzelheiten.

Eine theoretische Alternative wäre, ein Bundle mit einem benutzerdefinierten Control zu versehen, um diese Dateien als UTF-8 zu laden. Dies wird jedoch von der grundlegenden JSTL-Taglib fmt leider nicht unterstützt . Sie müssten alles selbst mit Hilfe eines Filter verwalten. Es gibt (MVC-) Frameworks, die dies transparenter handhaben können, wie JSF, siehe auch dieser Artikel .

218
BalusC

Zusätzlich zu dem, was BalusC gesagt hat, muss auf die Richtwirkung geachtet werden (da Englisch von links nach rechts und Arabisch umgekehrt geschrieben wird). Der einfachste Weg wäre, das dir-Attribut zum html-Element Ihrer JSP-Webseite hinzuzufügen und es zu externalisieren, damit der Wert aus der Eigenschaftendatei stammt (genau wie bei anderen Elementen oder Attributen):

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

Es gibt auch einige Probleme mit dem Styling einer solchen Anwendung - Sie sollten zumindest eine absolute Positionierung vermeiden. Wenn Sie dies aus irgendeinem Grund nicht vermeiden können, können Sie entweder unterschiedliche Stylesheets pro (jeder?) Sprache verwenden oder etwas tun, das verboten ist , dh Tabellen verwenden zur Verwaltung des Layouts. Wenn Sie div-Elemente verwenden möchten, würde ich vorschlagen, die relative Positionierung mit "symmetrischen" linken und rechten Stilattributen (beide mit demselben Wert) zu verwenden, da dies das Umschalten der Richtungsabhängigkeit ermöglicht.

Weitere Informationen zu bidirektionalen Websites finden Sie hier .

26
Paweł Dyda

basierend auf diesem Tutorial verwende ich auf GAE - Googles App Engine:

Eine JSP-Datei wie folgt:

<%@ 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>

Und füge die folgenden Dateien hinzu: app.properties (Standard) und app_fr.properties (und so weiter für jede Sprache). Jede dieser Dateien sollte die folgenden Zeichenfolgen enthalten: key: value_in_language, z. app_fr.properties enthält:

greeting=Bonjour!

app.properties enthält:

greeting=Hello!

Das ist alles

2