Entrades amb etiqueta multi-idioma .

Bug de regresión - Liferay 6.2 CE GA5

Data de publicació 20/05/16 11:24

Trabajando con la versión 6.2 CE GA5 hemos detectado un bug de regresión relacionado con la gestión de los idiomas, concretamente la incidencia de Liferay LPS-60313. Este bug solo afecta si se trabaja con entornos multi-idioma. En esta entrada de blog vamos a explicar los pasos que hemos seguido para resolver este problema.

Primero de todo, nos aseguramos que la incidencia detectada no esté relacionada con nuestros propios desarrollos. Se vio claramente ya que apareció al hacer el upgrade a la versión 6.2 CE GA5, aún así se revisaron los desarrollos relacionados para estar del todo seguros.

En este punto se empieza a investigar en los foros de Liferay y en el resto de sites relacionados; con esta incidencia en concreto se llegó a preguntar directamente en el foro Liferay y como casi siempre se nos orientó sobre el origen del bug.

Aquí es donde se empieza a aclarar el problema, los comentarios recibidos te permiten hacer un estudio más exhaustivo y llegamos a la incidencia reportada en el sistema de incidencias de Liferay.

Liferay utiliza JIRA para gestionar sus incidencias, con un simple vistazo tienes toda la información necesaria, con la posibilidad de profundizar en los detalles. 

El siguiente paso lógico, es buscar si existe solución por parte de Liferay para evitar realizar trabajos innecesarios. Pero revisando la incidencia JIRA se ve claramente que solo hay solución para las versiones Enterprise (6.2.X EE). En el detalle de la incidencia se explica la causa del problema, de todas formas al no existir fix para la versión CE nos obliga a crear un plugin EXT para su resolución.

Así que el último paso es la creación de un plugin EXT que modificará el CORE de Liferay para cambiar el código que provoca este problema en cuestión. Este EXT en si no es mucho, concretamente solo se modifica una línea del CORE.

Como vemos, la solución (a nivel de programación) ha sido muy sencilla, pero tiene graves implicaciones para la continuidad de la versión que se está utilizando actualmente (6.2.4 CE GA5):

  • La inclusión de un plugin EXT en el sistema. Opción no recomendada por Liferay pero sin fix no queda otra opción.
  • Tener en cuenta la existencia de este nuevo EXT en el caso de hacer futuros upgrade de la instancia de Liferay. Si es necesario su continuación en el caso que no se haya solucionado el bug o si por el contrario se tiene que eliminar.

Espero que os haya servido de ayuda.

Localizar Entidades Custom

Data de publicació 30/03/16 12:55

Hoy explicaré cómo localizar nuestras entidades creadas con el Service Builder de Liferay. Para hacer esto tendremos que modificar el archivo service.xml para la entidad que queramos localizar:

 

<entity name="Entidad" local-service="true" remote-service="true" 
     uuid="true">
     <!-- PK fields -->

     <column name="entidadId" type="long" primary="true" />
        
     ...
        
     <column name="nombre" type="String" localized="true" />

</entity>        …

Asi cuando agamos la acción build service, en vez de generarnos un campo nombre como un objeto String, serà un objeto Map<Locale,String>.

 

Ahora, tendremos que tener en cuenta que tenemos que tratar siempre un objeto Map des de la vista, pasando por el controlador hasta la persistencia. Por ejemplo, el campo nombre se guardará como un xml en base de datos, por lo tanto crear un finder en el service.xml por la columna nombre no sería viable, se debería crear una custom sql que parseará el xml por locale.

 

Des de la vista tendremos la etiqueta liferay-ui:input-localized que nos servirá para añadir campos localizados:

 
<label class="aui-field-label" for="<portlet:namespace />nombre"><liferay-ui:message key="name" /></label>
<liferay-ui:input-localized *xml="" name="nombre" />
* el campo xml es dónde podemos introducir los valores del input, en formato xml.
 
 

Los idiomas disponibles son los especificados en el site (Configurarlo en Site Administration). En la acción podremos recoger el dato de la siguiente manera:

 

Map<Locale,String> nombre = LocalizationUtil.getLocalizationMap(actionRequest, "nombre");

 

Y finalmente, nos faltará modificar los servicios para añadir nuevos objetos localizados:

 

public Entidad addEntidad(Map<Locale,String> nombre, ….) throws SystemException, PortalException {
        Entidad entidad = null;
        
        long entidadId = 
               counterLocalService.increment(Entidad.class.getName());
        
        entidad = entidadPersistence.create(entidadId);
        
        entidad.setCreateDate(DateUtil.newDate());
        entidad.setUserId(userId);
        entidad.setUserName(userName);
 
        entidad.setNombreMap(nombre);
                      …
 
        entidad = entidadPersistence.update(entidad);
}

 

Y ya tendríamos la entidad localizada. Tened en cuenta que para cualquier cosa que hagáis con esta entidad, por ejemplo un search container, ahora tendréis un xml.


¡Espero que os sea útil!

Inputs con multi-idioma

Data de publicació 18/12/15 02:15

En un blog anterior explicamos cómo “Sacar partido de la configuración de un portlet”, utilizaremos ese ejemplo para, a continuación, explicar cómo gestionar la información de los inputs en varios idiomas.

Si bien podemos utilizar keys dentro del portlet para determinar su valor en los distintos idiomas, una opción menos rígida es introducir los valores en los distintos idiomas a través de la configuración del portlet.

En nuestro ejemplo teníamos portlet con un título, una imagen y un listado. Dicho título era fijo, aunque cambiaras el idioma el título mostrado sería el mismo. Ahora lo que queremos es poder decidir el texto que utilizaremos de título en función del idioma en que se visualice la página.

 

Diferencias respecto a lo que teníamos:

configuration.jsp: cambia el tipo de tag usado para los input, en esta ocasión utilizaremos <liferay-ui:input-localized> envuelta por un <aui:field-wrapper>. También cambia la forma de manejar sus valores, ahora utilizaremos la clase LocalizationUtil para tratarlos.

 

configuration.jsp
String localizedTitle = LocalizationUtil.getLocalizationXmlFromPreferences(portletPreferences, renderRequest, "title");
 
<liferay-ui:panel collapsible="<%= true %>" extended="<%= true %>" id="customText" persistState="<%= true %>" title="Text">
    <aui:fieldset cssClass="title-data" label="Title Text">
        <aui:field-wrapper cssClass="lfr-input-text-container" label="Title">
            <liferay-ui:input-localized name="title" xml="<%= localizedTitle %>" />
        </aui:field-wrapper>
    </aui:fieldset>
</liferay-ui:panel>

 

Es posible definir que solo muestre para elegir los idiomas del Site con “availableLocales”.

configuration.jsp
<liferay-ui:input-localized name="title" availableLocales="<%= LanguageUtil.getAvailableLocales(themeDisplay.getSiteGroupId()) %>" xml="<%= localizedTitle %>" />

 

También se puede definir que el idioma por defecto sea el que tiene el Site con “defaultLanguageId”:

configuration.jsp
Locale defaultLocale = LocaleUtil.getSiteDefault();
String defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);
<liferay-ui:input-localized name="title" defaultLanguageId="<%= defaultLanguageId %>" xml="<%= localizedTitle %>" />

 

ConfigurationActionImpl.java: Guardamos los datos localizados.

En este caso, es necesario tratar los datos para poder guardarlos.

 

ConfigurationActionImpl.java
PortletPreferences preferences = actionRequest.getPreferences();
  
// Treat preferences
LocalizationUtil.setLocalizedPreferencesValues(actionRequest, preferences, "title");
  
// Store preferences
preferences.store();
super.processAction(portletConfig, actionRequest, actionResponse);

 

view.jsp: Distinto método de obtener el valor en el idioma actual.

 

  • Obtenemos el valor:
view.jsp
String localizedTitle = LocalizationUtil.getPreferencesValue(preferences, "title", themeDisplay.getLanguageId());

 

  • Utilizamos el valor (ejemplo):
view.jsp
<h1> <%=localizedTitle%> </h1>
<% if (showsImage)  { %>
    <img src="<%=imageLink%>" alt="">
<% } %>
<div><%=contentList%></div>

 

Una vez aplicadas las modificaciones tendremos un nuevo campo en la configuración del portlet con la posibilidad de guardar una información distinta por cada idioma.

Configuration

Espero que os sea de utilidad, un saludo.

 

Bloggers recents Bloggers recents

Oscar Rodríguez
Apunts: 9
Estrelles: 2
Data: 28/09/16
David Berruezo
Apunts: 14
Estrelles: 1
Data: 22/07/16
Javi Martín
Apunts: 2
Estrelles: 1
Data: 20/05/16
Javier Torres
Apunts: 5
Estrelles: 3
Data: 11/04/16
Sergi Mingueza
Apunts: 4
Estrelles: 1
Data: 19/10/15
Matilde Gallardo
Apunts: 1
Estrelles: 0
Data: 26/02/15
Adrià Vilà
Apunts: 4
Estrelles: 4
Data: 31/08/14
Elena Ruiz
Apunts: 1
Estrelles: 2
Data: 13/03/14