Internacionalizacion de portlets en Liferay

De ChuWiki
Revisión del 10:02 28 ene 2014 de Chudiang (Discusión | contribuciones) (Textos desde javascript)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Veamos aquí cómo mostrar los textos de nuestros portlets en el idioma que ha elegido el usuario de Liferay.


Ficheros de etiquetas

Los textos en los distintos idiomas deben ponerse en ficheros .properties de java. En el fichero portlet.xml debemos indicar dónde dejamos estos ficheros. Debemos añadir en portlet.xml algo como

<portlet-app ....>
   <portlet ...>
        ...
        <resource-bundle>content/Language</resource-bundle>
        ...
   </portlet>
</portlet-app>

donde content/Language indica que estarán en el classpath en un directorio de nombre content y el nombre de los ficheros comenzarán con Language.

Es importante colocar esta etiqueta en el orden que se admiten las etiquetas dentro del tag ''<portlet>''. La siguiente lista muestra el orden esperado de estas etiquetas, extraído del xsd

<element name="description" .../>
<element name="portlet-name" .../>
<element name="display-name" .../>
<element name="portlet-class" .../>
<element name="init-param" .../>
<element name="expiration-cache" .../>
<element name="cache-scope" .../>
<element name="supports" .../>
<element name="supported-locale" .../>
<element name="resource-bundle" .../>       <!-- Aqui es la posicion esperada -->
<element name="portlet-info" .../>
<element name="portlet-preferences" .../>
<element name="security-role-ref" .../>
<element name="supported-processing-event" .../>
<element name="supported-publishing-event" .../>
<element name="supported-public-render-parameter" .../>
<element name="container-runtime-option" .../>

Una vez hecho esto, dentro del classpath de nuestro portlet debemos tener accesible un directorio content y dentro de él varios ficheros Language... de properties con las etiquetas en los distintos idiomas. Lo de content y Language es porque así lo hemos puesto en el tag ''<resource-bundle>''.

El mecanismo para estos ficheros es el habitual de internacionalización en java, que explicamos brevemente

Necesitamos un fichero Language.properties en el que estarán los textos en el idioma que se quiera usar por defecto si el idioma elegido por el usuario no está disponible. Una buena elección para este fichero es inglés o el idioma habitual de nuestros usuarios, por ejemplo, español para un portal español. El contenido de ese fichero tiene la siguiente pinta

saludo = Buenos dias
despedida = Nos vemos
...

donde saludo y despedida son las claves que queramos para identificar los textos y son las claves que usaremos en nuestro programa para obtener dichos textos.

Ahora vamos añadiendo ficheros Language_es.properties para los textos en español, Language_en.properties para inglés, Language_fr.properties para francés, etc, etc. Por supuesto, los códigos _es, _en, _fr para cada idioma están estandarizados y no nos los podemos inventar.

Podemos añadir variantes del idioma, por ejemplo, podemos crear Language_en_uk.properties para el inglés de Inglaterra y Language_en_us.properties para el de Estados Unidos. Igualmente, las terminaciones _uk, _us de los paises son estándar.

No es necesario definir todos los textos en todos los ficheros. Si el usuario elige Inglés de Estados Unidos y nuestro código busca el texto cuya clave es "saludo", se bucará en el fichero Language_en_us.properties. Si no se encuentra, se buscará en Language_en.properties y si tampoco se encuentra ahí, se buscará en Language.properties. Por ello, si el saludo fuese igual para Inglaterra que para Estados Unidos, bastaría con ponerlo en el fichero Language_en.properties y no es necesario repetirlo en Language_en_us.properties y Language_en_uk.properties. Y si nuestro idioma por defecto es inglés y lo hemos puesto en Language.properties, no es neceario ponerlo tampoco en Language_en.properties.

Textos en el JSP

Liferay nos ofrece una etiqueta (un tag) para poder poner textos simplemente indicando la clave de dicho texto. La etiqueta se pone de esta manera

...
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui"%>
...
<p><liferay-ui:message key="saludo"/></p>

Esto hará que se busque la clave saludo en los ficheros y se mostrará el saludo en el idioma del usuario, siempre que se encuentre en el fichero adecuado.

Textos desde el código java

Desde el código java de nuestro portlet (el lado del servidor) no deberíamos decidir el idioma del texto. La técnica habitual consiste en meter la clave del texto que se quiere mostrar en algún sitio que sea accesible luego desde el jsp que se encarga de la visualización. Por ejemplo, si en nuestra clase java que hace de portlet tenemos una acción en un método así

public class NuestroPortlet extends MVCPortlet {
   ...
   public void unaAccionDeNuestroPorlet (ActionRequest request, ActionResponse response) {
       ....
       response.setRenderParameter("clave para response", "saludo");
   }
}

Metemos en ActionResponse, con el método setRenderParameter(), un parámetro de clave clave para response y cuyo valor es la clave del texto que queremos mostrar. Luego, en el jsp, haríamos algo como esto

<%
   String saludo = renderRequest.getParameter("clave para response");
%>
<p><liferay-ui:message key="<%= saludo %>"/></p>

En cualquier caso, tanto desde java como desde el JSP, disponemos de la clase LanguageUtil que tiene varios métodos get() para obtener el texto a partir de su clave ... y del locale que queremos o de la configuración del portlet (PortletConfig).

Textos desde javascript

Si es el código javascript de nuestro porlet el que debe mostrar el texto, Liferay nos ofrece una API javascript que permite obtener el texto en el idioma del usuario a partir de su clave. En código javascript para obtener dicho texto es tan sencillo como

alert ( Liferay.Language.get('saludo') );