Jak internacjonalizować aplikację internetową Java?

Dowiedziałem się od Google, że Internacjonalizacja jest procesem, dzięki któremu mogę dokonać aplikacja internetowa do obsługi wszystkich języków. Chcę zrozumieć Unicode dla procesu internacjonalizacji, więc dowiedziałem się o Unicode z tutaj i tam .

Jestem w stanie zrozumieć o Unicode, że jak charset ustawiony w zakodowane do bajtów i ponownie bajty dekodowane do znaków. Ale nie wiem, jak iść dalej. Chcę się nauczyć porównywać struny i muszę wiem jak wdrożyć internacjonalizację w mojej aplikacji internetowej. Jakieś Sugestie? Proszę mnie poprowadzić.

Mój Cel:

Moim głównym celem jest opracowanie aplikacji internetowej do tłumaczenia (z angielskiego na arabski i odwrotnie). Chcę podążać za internacjonalizacją. Chciałbym uruchomić moją aplikację internetową do tłumaczenia we wszystkich trzech przeglądarkach mianowicie FF, Chrome, IE. Jak to osiągnąć?

Author: informatik01, 2010-11-25

3 answers

W przypadku podstawowego webaplikacji JSP / Servlet, podstawowym podejściem byłoby użycie JSTL fmt taglib W połączeniu z zestawami zasobów. Pakiety zasobów zawierają pary klucz-wartość, gdzie klucz jest stałą, która jest taka sama dla wszystkich języków, a wartość różni się w zależności od języka. Pakiety zasobów są zwykle plikami właściwości , które są ładowane przez ResourceBundle API. Można to jednak dostosować tak, aby można było ładować pary klucz-wartość na przykład z bazy danych.

Oto przykład, jak umiędzynarodowić formularz logowania aplikacji webowej za pomocą pakietów zasobów opartych na plikach właściwości.


  1. Utwórz następujące pliki i umieść je w jakimś pakiecie, np. com.example.i18n (W przypadku Mavena, umieść je w strukturze pakietu wewnątrz src/main/resources).

    text.properties (zawiera pary klucz-wartość w domyślnym języku, Zwykle angielskim)

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

    text_nl.properties (contains Dutch (nl) key-value pary)

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

    text_es.properties (zawiera hiszpańskie (es) pary klucz-wartość)

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

    Nazwa pliku pakietu zasobów powinna być zgodna z następującym wzorem name_ll_CC.properties. Część _ll powinna być małą literą ISO 693-1 kod języka. Jest to opcjonalne i wymagane tylko wtedy, gdy część _CC jest obecna. Część _CC powinna być wielką literą kod kraju ISO 3166-1 Alpha-2 . Jest opcjonalny i często używany tylko do rozróżniania języka specyficznego dla danego kraju dialekty, jak Amerykański Angielski (_en_US) i Brytyjski Angielski (_en_GB).


  2. Jeśli nie jest to jeszcze zrobione, zainstaluj JSTL. Jeśli korzystasz z kontenera Servlet 2.5 lub nowszego (Tomcat 6.0 i tak dalej) i twoje web.xml jest zadeklarowane jako zgodne ze specyfikacją Servlet 2.5, po prostu umieść jstl-1.2.jar w folderze webapp /WEB-INF/lib.


  3. Utwórz poniższy przykładowy plik JSP i umieść go w treści WWW folder.

    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>
    

    <c:set var="language"> zarządza bieżącym językiem. Jeżeli język został dostarczony jako parametr żądania( przez listę rozwijaną języka), wtedy zostanie ustawiony. W przeciwnym razie, jeśli język był już wcześniej ustawiony w sesji, trzymaj się go. W przeciwnym razie użyj ustawień regionalnych podanych przez użytkownika w nagłówku żądania.

    <fmt:setLocale> ustawia ustawienia regionalne dla pakietu zasobów. Ważne jest, aby ta linia była przed <fmt:setBundle>.

    <fmt:setBundle> inicjalizuje pakiet zasobów według jego podstawowej nazwy (tj. pełnej kwalifikowanej nazwy pakietu, dopóki nie będzie miał jedynej nazwy bez specyfikacji _ll_CC).

    <fmt:message> pobiera wartość wiadomości za pomocą określonego klucza bundle.

    The <html lang="${language}"> informuje searchboty w jakim języku jest strona, aby nie została oznaczona jako duplicate content (tak więc, dobre dla SEO).

    Menu rozwijane język zostanie natychmiast przesłane przez JavaScript, gdy wybrany zostanie inny język, a strona zostanie odświeżona za pomocą nowo wybrany język.


Należy jednak pamiętać, że pliki właściwości są domyślnie odczytywane przy użyciu kodowania znaków ISO-8859-1. Trzeba by uciec przed nimi przez Unicode escapes. Można to zrobić za pomocą dostarczonego przez JDK narzędzia native2ascii.exe. Zobacz również ten artykuł sekcja aby uzyskać więcej szczegółów.

Teoretyczną alternatywą byłoby dostarczenie pakietu z niestandardowym Control załadować te pliki jako UTF-8, ale to niestety nie obsługiwane przez podstawowy taglib JSTL fmt. Trzeba by to wszystko załatwić samemu z pomocą Filter. Istnieją frameworki (MVC), które mogą sobie z tym poradzić w bardziej przejrzysty sposób, jak JSF, Zobacz także ten artykuł.

 214
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 10:49:14

Oprócz tego, co powiedział BalusC, musisz zadbać o kierunkowość (ponieważ angielski jest napisany od lewej do prawej, a Arabski na odwrót). Najprostszym sposobem byłoby dodanie atrybutu dir do html elementu strony JSP i zewnętrzenie go, więc wartość pochodzi z pliku właściwości (podobnie jak z innymi elementami lub atrybutami):

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

Ponadto jest kilka problemów ze stylizacją takiej aplikacji - należy przynajmniej unikać absolutnego pozycjonowania. Jeśli nie możesz unikaj tego z jakiegoś powodu, możesz użyć różnych arkuszy stylów na (każdy?) języka lub zrobić coś, co jest verboten , czyli używać tabel do zarządzania układem. Jeśli chcesz użyć elementów div, sugerowałbym użycie względnego pozycjonowania z" symetrycznymi " atrybutami stylu lewego i prawego( oba mają tę samą wartość), ponieważ to sprawia, że kierunkowość przełączania działa.

Możesz znaleźć więcej o dwukierunkowych stronach internetowych tutaj.

 26
Author: Paweł Dyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-25 16:57:14

Na podstawie tego tutoriala , używam następującego silnika aplikacji Gae-Google:

Plik jsp w następujący sposób:

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

I dodanie plików o nazwach: app.properties (domyślnie) i app_fr.properties (i tak dalej dla każdego języka). Każdy z tych plików powinien zawierać potrzebne ciągi znaków w następujący sposób: key: value_in_language, np. app_fr.properties zawiera:

greeting=Bonjour!

app.properties zawiera:

greeting=Hello!

To wszystko

 2
Author: Ronen Rabinovici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 21:28:52