angle-left

Blogues

Internationalisation avec Liferay

L'internationalisation est le besoin de décliner son site/application en plusieurs langues et de donner l'opportunité à ses utilisateurs de choisir la langue qui leur convient le mieux.

Liferay traite l'aspect "internationalisation" suivant plusieurs angles:

  1. Configuration des langues
  2. Déterminer la langue du site à afficher par défaut
  3. Portlet de changement de langue
  4. Les taglib pour pouvoir, de façon transparante, adresser les différentes langues
  5. Les boites à outil pour gérer les différentes langues
  6. La saisie d'information en multi-langue

Configuration des langues

La configuration des langues peut s'effectuer depuis la console d'administration ou depuis le fichier de configuration portal-ext.properties

company.default.locale=en_US
locales.enabled=fr_FR,en_US

Déterminer la langue du site à afficher par défaut

Lorsqu'un utilisateur arrive sur le site, Liferay est capable de rediriger ce dernier vers la langue du navigateur sous réserve que cette langue soit évidemment activée

locale.default.request=true
locale.prepend.friendly.url.style=2

Personnellement, je préfère appliquer le style "2" qui force l'affichage de la locale dans l'URL. Mais comme vous le lirez dans la documentation sur portal-ext.properties, il existe d'autres valeurs pour d'autres comportements.

Portlet de changement de langue

Liferay met à disposition un portlet "language" qui permet de passer d'une langue à l'autre. Mais... De façon pragmatique, il est d'usage de préférer afficher ce portlet depuis les bandeaux d'entête et donc l'intégrer au thème. Pour ce faire, il suffit de glisser le code suivant dans son thème Velocity:

#set ($VOID = $velocityPortletPreferences.setValue('portlet-setup-show-borders', 'false'))
#set ($VOID = $velocityPortletPreferences.setValue('displayStyle', '2'))
#set ($instanceId = 'E3j8')
#set ($VOID = $theme.runtime("82", '', $velocityPortletPreferences.toString()))
#set ($VOID = $velocityPortletPreferences.reset())

Vous pouvez jonglez entre les styles d'affichage (displayStyle) - drapeau, texte court, texte long - mais il y'a un problème de cache qui peut se produire et qui mériterait à lui seul un article car le problème est redondant quand on intègre un portlet de cette façon dans un thème.

Les taglib pour pouvoir, de façon transparante, adresser les différentes langues

Liferay vous met à disposition des dizaines de taglib pour faire tout et n'importe quoi. Pour un nombre très important de ces taglib, vous avez l'opportunité d'afficher du texte. Par défaut, Liferay attend que vous lui donniez une "clé" et non pas le texte directement. Derrière, Liferay ira appliquer la traduction adéquate fonction du contexte de la page. Quelques exemples qui parlent d'eux mêmes:

<liferay-ui:error exception="<%=EmailAddressException.class %>" message="invalid-email-address"/>
<liferay-ui:message key="contact-description"/>
<aui:input label="contact-email" name="email" helpMessage="contact-email-help" />
<aui:select name="reason" label="contact-reason"/>
<aui:button type="submit" value="contact-submit"/>

Les boites à outil pour gérer les différentes langues

Il peut arriver que le texte doive être traduit côté backend pour une raison x ou y. Dans ce cas, plusieurs méthodes/outils sont disponibles pour vous simplifier la vie:

LanguageUtil.get(Locale locale,String key);
LanguageUtil.format(Locale locale,String pattern,List<Object> arguments);

Pour plus de détails, le mieux est de se tourner vers la javadoc.

La saisie d'information en multi-langue

C'est probablement l'une dernières choses que j'ai découverte sur Liferay à l'heure où je rédige la première version de cet article. Et c'est très puissant. En effet, Liferay vous donne tous les outils pour vous simplifier la vie comme jamais. Imaginez que vous ayez à demander à votre utilisateur de saisir un titre applicable en français et un autre en anglais. En fait, rien de plus simple à gérer avec Liferay.

<aui:input type="text" name="title" label="title-label" localized="true" />

En introduisant l'attribut "localized", vous allez automatiquement faire apparaitre des petits drapeaux en dessous de votre champ de saisi. Ces drapeaux correspondront à la liste de locales que vous avez activé sur votre site. En cliquant sur chaque drapeau, vous donnez la possibilité à l'utilisateur de saisir une valeur différente selon la langue.

Côté controlleur, il faut exploiter l'information.

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

Avec cette petite routine, vous récupérez automatiquement l'ensemble des valeurs de votre champ, pour chaque langue. Si vous devez persistez l'information, il ne faudra pas oublier de déclarer votre champ comme "internationalisable".

<entity name="MonObjet" local-service="true" remote-service="false">
    <column name="title" type="String" localized="true"></column>
</entity>

Il arrive de devoir générer le XML correspondant à la valeur du champ persisté. Et pour le coup, la solution ne se trouve pas facilement alors je la partage avec vous:

String xml = LocalizationUtil.updateLocalization(titleMap, StringPool.BLANK, "title", LocaleUtil.getDefault().toLanguageTag());

 

J'espère que cet article vous éclairera sur l'internationalisation avec Liferay. Il manque sans aucun doute des détails , n'hésitez pas à me contacter ou à commenter dans ce cas. L'article sera enrichi au fil de l'eau.

Plus d'entrées de blog

Gérer les erreurs dans le JSP

Liferay vous propose d'utiliser le taglib liferay-ui:error pour afficher proprement les...

Liferay: utiliser les hints pour contrôler la longueur des champs

Liferay regorge de bonnes suprises, l'une d'entre elles est la gestion des hints. En version...

Ajouter des commentaires

Blogueurs récents

Eric COQUELIN
Publications: 5
étoiles: 1
Données: 24/05/18