IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment gérer l'internationalisation (I18N) et/ou la localisation avec Struts ? : Le ResourceBundle
auteur : Lionel Roux (aka RanDomX)
Struts supporte nativement le mécanisme d'internationalisation et de localisation offert par la plateforme Java : Le  ResourceBundle et la  Locale.

Pour obtenir un ResourceBundle foo.bar.MyResourceBundle, il suffit de créer un ou plusieurs fichiers dans le répertoire /foo/bar/ :
  • MyResourceBunble.properties : ce fichier contient les messages de la langue par défaut pour votre application.
  • MyResourceBundle_XX.properties : ce fichier contient les mêmes messages dans la langue dont le code ISO est XX

Ex : si votre langue par défaut est l'anglais, vous aurez dans MyResourceBundle.properties une entrée du type :

default.welcome=hello
Si vous souhaitez supporter le francais, vous aurez dans le fichier MyResourceBundle_fr.properties la même entrée :

default.welcome=bonjour
Il en sera de même pour toutes les langues et vous aurez autant de fichiers .properties que de langues que vous supporterez.

Il vous faudra ensuite déclarer ces ressources dans le descripteur de configuration de votre application (struts-config.xml) :

<message-resources parameter="foo.bar.MyResourceBundle" />
Attention: il ne faut pas préciser l'extension du fichier (.properties) et ne pas spécifier les codes ISO.
Il faut aussi absolument veiller à ce que le fichier soit accessible dans le CLASSPATH.

Dans les pages JSP, il faut déclarer l'internationalisation avec l'attribut locale du tag <html:html> :

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <html:html locale="true"> .. page content ... </html:html >

Comment changer de langue à la demande avec Struts ?
auteur : Lionel Roux (aka RanDomX)
Pour changer la langue à la demande, il faut créer une action qui va mettre à jour la locale dans l'objet request.
La locale fait partie des attributs d'une requète http et est donc conservée durant la navigation.
De plus, la JVM charge tous les bundles au démarrage. Toutes les langues définies sont donc accessibles.

Imaginons trois liens :

<html:link href=switch.do?lang='fr'&cty='FR'>FR</html:link> <html:link href=switch.do?lang='en'&cty='EN'>EN</html:link> <html:link href=switch.do?lang='en'&cty='US'>US</html:link>
Ces liens pointent sur une Action "SwitchAction" définie dans le mapping par l'alias "switch".

public class SwithLangAction extends Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //récupération des paramètres passés et de l'url du referer String country = request.getParameter("cty"); String language = request.getParameter("lang"); String referer = request.getAttribute("REFERER"); HttpSession session = request.getSession(); ActionForward forward = null; // définition de la locale setLocale( request, new Locale( language, country ) ); // redirection vers une page définie par défaut if( source==null ) { forward = (mapping.findForward("success")); } // redirection vers l'url du referrer. else { forward = new RedirectingActionForward(); forward.setPath( source ); } return forward; } }
Attention: certains serveurs ne transmettent pas le referer. Il faut donc explicitement le récupérer (dans un ActionForm par exemple).


Comment formater une valeur d'un bean avec Struts ? : Les attributs "format" et "formatkey"
auteur : Lionel Roux (aka RanDomX)
Il faut utiliser l'attribut format du tag <bean:write>.

<bean:write name='mybean' property='number' format='#,##0.00' />
Ainsi, si la valeur numérique de la variable number de l'ActionForm référencé par "mybean" vaut 123456789, elle sera affichée 123,456,789.00, conformément au pattern #,##0.00 .

Vous pouvez aussi localiser les patterns de formatage, pour différencier ceux-ci en fonction de la langue. Pour ce faire, il faut embarquer ceux-ci dans les bundles de ressources.

Ex :

number.format=#,##0.00
il faut ensuite utiliser:

<bean:write name='mybean' property='number' format='#,##0.00' formatkey='number.format'/>
Attention: le pattern utilisé doit être compatible avec la langue. Par exemple, '#,##0.00' ne fonctionnera pas avec la locale 'fr', puisque c'est un pattern anglais.