¿Cómo internacionalizar/localizar una aplicación web JSP/Servlet?

Resuelto IamIronMAN asked hace 13 años • 3 respuestas

Aprendí de Google que la internacionalización es el proceso mediante el cual puedo hacer que mi aplicación web utilice todos los idiomas. Quiero entender Unicode para el proceso de internacionalización, así que aprendí sobre Unicode de aquí y de allá .

Puedo entender acerca de Unicode cómo un conjunto de caracteres se codifica en bytes y nuevamente los bytes se decodifican en un conjunto de caracteres. Pero no sé cómo seguir adelante. Quiero aprender a 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 principal objetivo es desarrollar una aplicación web para traducción (inglés a árabe y viceversa). Quiero seguir la Internacionalización. Deseo ejecutar mi aplicación web para traducción en los tres navegadores, a saber, FF, Chrome e IE. ¿Cómo logro esto?

IamIronMAN avatar Nov 25 '10 17:11 IamIronMAN
Aceptado

En el caso de una aplicación web JSP/Servlet básica, el enfoque básico sería utilizar JSTL fmttaglib en combinación con paquetes de recursos . Los paquetes de recursos contienen pares clave-valor donde la clave es una constante que es la misma para todos los idiomas y el valor difiere según el idioma. Los paquetes de recursos suelen ser archivos de propiedades que se cargan mediante ResourceBundleAPI. Sin embargo, esto se puede personalizar para que pueda cargar los pares clave-valor desde, por ejemplo, una base de datos.

A continuación se muestra 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, por ejemplo 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 nlpares clave-valor en holandés ( ))

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

    text_es.properties(contiene espares clave-valor en español ( ))

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

    El nombre del archivo del paquete de recursos debe seguir el siguiente patrón name_ll_CC.properties. La _llparte debe ser el código de idioma ISO 693-1 en minúsculas . Es opcional y solo se requiere cuando la _CCpieza está presente. La _CCparte debe ser el código de país ISO 3166-1 Alpha-2 en mayúsculas . Es opcional y, a menudo, solo se usa para distinguir entre dialectos de idiomas específicos de un país, como el inglés americano ( _en_US) y el inglés británico ( _en_GB).


  2. Si aún no lo ha hecho, instale JSTL según las instrucciones de esta respuesta: ¿ Cómo instalar JSTL? El uri absoluto: http://java.sun.com/jstl/core no se puede resolver .


  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>
    

    Gestiona <c:set var="language">el idioma actual. Si el idioma se proporcionó como parámetro de solicitud (mediante el menú desplegable de idiomas), se configurará. De lo contrario, si el idioma ya se configuró previamente en la sesión, manténgalo. De lo contrario, utilice la configuración regional proporcionada por el usuario en el encabezado de la solicitud.

    Establece <fmt:setLocale>la configuración regional para el paquete de recursos. Es importante que esta línea esté antes del <fmt:setBundle>.

    Inicializa <fmt:setBundle>el paquete de recursos por su nombre base (es decir, el nombre completo del paquete hasta el único nombre sin el _ll_CCespecificador).

    Recupera <fmt:message>el valor del mensaje mediante la clave del paquete especificada.

    Informa <html lang="${language}">a los robots de búsqueda 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 idiomas se enviará inmediatamente mediante JavaScript cuando se elija otro idioma y la página se actualizará con el idioma recién elegido.


Sin embargo, debe tener en cuenta que los archivos de propiedades se leen de forma predeterminada utilizando la codificación de caracteres ISO-8859-1. Necesitaría escapar de ellos mediante escapes Unicode. Esto se puede hacer utilizando la native2ascii.exeherramienta proporcionada por JDK. Consulte también la sección de este artículo para obtener más detalles.

Una alternativa teórica sería proporcionar un paquete con una costumbre Controlpara cargar esos archivos como UTF-8, pero desafortunadamente eso no es compatible con la fmtbiblioteca de etiquetas JSTL básica. Debería gestionarlo todo usted mismo con la ayuda de un archivo Filter. Existen marcos (MVC) que pueden manejar esto de una manera más transparente, como JSF, consulte también este artículo .

BalusC avatar Nov 25 '2010 15:11 BalusC

Además de lo que dijo BalusC, hay que tener cuidado con la direccionalidad (ya que el inglés se escribe de izquierda a derecha y el árabe al revés). La forma más sencilla sería agregar dirun atributo al htmlelemento de su página web JSP y externalizarlo, de modo que el valor provenga del archivo de propiedades (al igual que con otros elementos o atributos):

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

Además, existen pocos problemas con el estilo de dicha aplicación; por lo menos, debes evitar el posicionamiento absoluto. Si no puede evitarlo por alguna razón, puede usar diferentes hojas de estilo por (¿cada?) idioma o hacer algo que esté prohibido , es decir, 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" izquierdo y derecho (ambos con el mismo valor), ya que esto es lo que hace que el cambio de direccionalidad funcione.

You could find more about Bi-Directional websites here.

Paweł Dyda avatar Nov 25 '2010 16:11 Paweł Dyda