Pregunta ¿Cómo internacionalizar una aplicación web Java?


Aprendí de Google que la internacionalización es el proceso por el cual puedo hacer que mi aplicación web para usar todos los idiomas. Quiero entender Unicode para el proceso de internacionalización, así que aprendí acerca de Unicode desde aquí y ahí.

Puedo entender sobre Unicode que cómo un conjunto de caracteres codificado en bytes y de nuevo decodificados en charset. Pero no sé cómo avanzar más. Quiero aprender cómo comparar cadenas y necesito saber cómo implementar la internacionalización en mi aplicación web. Alguna sugerencia por favor? Por favor guíame.

Mi objetivo:

Mi objetivo principal es desarrollar una aplicación web para traducción (inglés a árabe y viceversa). Quiero seguir Internacionalización. Deseo ejecutar mi aplicación web para traducción en los tres navegadores, a saber, FF, Chrome, IE. ¿Cómo logro esto?


74
2017-11-25 10:33


origen


Respuestas:


En el caso de una aplicación de JSP / Servlet básica, el enfoque básico sería usar JSTL  fmt taglib en combinación con paquetes de recursos. Los paquetes de recursos contienen pares clave-valor donde la clave es una constante que es igual para todos los idiomas y el valor difiere por idioma. Los paquetes de recursos son usualmente archivos de propiedades que son cargados por ResourceBundle API. Sin embargo, esto puede personalizarse para que pueda cargar los pares clave-valor de, por ejemplo, una base de datos.

Aquí hay un ejemplo de cómo internacionalizar el formulario de inicio de sesión de su aplicación web con paquetes de recursos basados ​​en archivos de propiedades.


  1. Cree los siguientes archivos y colóquelos en algún paquete, p. com.example.i18n (en el caso de Maven, colóquelos en la estructura del paquete dentro src/main/resources)

    text.properties (contiene pares clave-valor en el idioma predeterminado, generalmente inglés)

    login.label.username = Nombre de usuario
    login.label.password = Contraseña
    login.button.submit = Iniciar sesión
    

    text_nl.properties (contiene holandés (nl) pares clave-valor)

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

    text_es.properties (contiene español (es) pares clave-valor)

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

    El nombre de archivo del paquete de recursos debe adherirse al siguiente patrón name_ll_CC.properties. los _ll parte debe ser la minúscula ISO 693-1 Código de lenguaje. Es opcional y solo se requiere cuando el _CC parte está presente. los _CC parte debe ser la mayúscula ISO 3166-1 Alpha-2 código de país. Es opcional y, a menudo, solo se usa para distinguir entre dialectos de idiomas específicos del país, como inglés americano (_en_US) y Inglés británico (_en_GB)


  2. Si aún no lo hiciste, instala JSTL. Si está ejecutando en un contenedor Servlet 2.5 o posterior (Tomcat 6.0 y así sucesivamente) y su web.xml se declara conforme a la especificación Servlet 2.5, luego simplemente pon jstl-1.2.jaren aplicaciones de webapp /WEB-INF/lib carpeta.


  3. Cree el siguiente archivo JSP de ejemplo y colóquelo en la carpeta de contenido 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>
    

    los <c:set var="language"> maneja el idioma actual. Si el idioma fue proporcionado como parámetro de solicitud (por menú desplegable de idioma), entonces se establecerá. De lo contrario, si el idioma ya estaba configurado previamente en la sesión, apéguese a él en su lugar. De lo contrario, use la configuración regional proporcionada por el usuario en el encabezado de la solicitud.

    los <fmt:setLocale> establece la configuración regional para el paquete de recursos. Es importante que esta línea sea antes de el <fmt:setBundle>.

    los <fmt:setBundle> inicializa el paquete de recursos por su nombre base (es decir, el nombre completo del paquete calificado hasta con el nombre exclusivo sin el _ll_CC especificador).

    los <fmt:message> recupera el valor del mensaje mediante la clave de paquete especificada.

    los <html lang="${language}"> informa a los buscadores en qué idioma está la página para que no se marque como contenido duplicado (por lo tanto, es bueno para SEO).

    El menú desplegable de idioma se enviará inmediatamente por JavaScript cuando se elija otro idioma y la página se actualizará con el idioma elegido.


Sin embargo, debe tener en cuenta que los archivos de propiedades se leen por defecto utilizando la codificación de caracteres ISO-8859-1. Tendría que escapar de ellos mediante escapes Unicode. Esto se puede hacer utilizando el JDK-suministrado native2ascii.exe herramienta. Ver también esta sección del artículo para más detalles.

Una alternativa teórica sería proporcionar un paquete con una costumbre Control cargar esos archivos como UTF-8, pero lamentablemente no es compatible con el JSTL básico fmt taglib. Debería gestionarlo usted mismo con la ayuda de un Filter. Hay marcos (MVC) que pueden manejar esto de una manera más transparente, como JSF, ver también Este artículo.


210
2017-11-25 15:24



Además de lo que dijo BalusC, debes preocuparte por la direccionalidad (ya que el inglés está escrito de izquierda a derecha y el árabe al revés). La forma más fácil sería agregar dir atribuir a html elemento de su página web JSP y exteriorizarlo, por lo que el valor proviene del archivo de propiedades (al igual que con otros elementos o atributos):

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

Además, existen pocos problemas con el diseño de dicha aplicación; por lo menos debe evitar el posicionamiento absoluto. Si no puede evitar eso por alguna razón, puede usar diferentes hojas de estilo por (¿cada?) Idioma o hacer algo que sea verboten, eso es usar tablas para administrar el diseño. Si desea utilizar elementos div, le sugiero que utilice el posicionamiento relativo con atributos de estilo "simétricos" de izquierda y derecha (ambos tienen el mismo valor), ya que esto es lo que hace que la direccionalidad de conmutación funcione.

Puede encontrar más acerca de los sitios web bidireccionales aquí.


24
2017-11-25 16:57



Residencia en este tutorial, Estoy usando lo siguiente en GAE - App Engine de Google:

Un archivo jsp de la siguiente manera:

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

Y agregando los archivos nombrados: app.properties (predeterminado) y app_fr.properties (y así sucesivamente para cada idioma). Cada uno de estos archivos debe contener las cadenas que necesita de la siguiente manera: key: value_in_language, p. Ej. app_fr.properties contiene:

greeting=Bonjour!

app.propertiescontiene:

greeting=Hello!

Eso es todo


1
2018-06-17 20:47