A priori la méthode setLocale(HttpServletRequest, Locale) devrait suffire
Version imprimable
Je suis allé voir l'API de Struts mais le fait que ma classe LabelsBundle n'etend pas d'Action, il m'est impossible de faire appel à getLocale pour récupérer la Locale que j'aurais affecté avec setLocale.
Par conséquent je pensé qu'ajouter l'attribut :org.apache.struts.Globals.LOCALE_KEY à ma session était peut être une solution plus adéquate.
Désolé pour toutes ces question :?
Voici un exemple pour créer un bouton avec un texte et une image (lié à Struts-Layout), tu devrais faire quelque chose dans le genre...
et un extrait de PropertiesReaderCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 package pack.taglib; import javax.servlet.jsp.tagext.TagSupport; import clemessy.struts.tools.PropertiesReader; import fr.improve.struts.taglib.layout.util.BasicFormUtils; public class BoutonTag extends TagSupport { private static final long serialVersionUID = -3139074133972471309L; private String imageUrl = null; private String label = null; private String action = null; private String mode = null; private String title = null; private String align = null; public String getTitle() { return title == null ? "" : title.trim(); } public void setTitle(String title) { this.title = title; } public String getAction() { return action == null ? "" : action.trim(); } public void setAction(String action) { this.action = action; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getMode() { return mode; } public void setMode(String mode) { this.mode = mode; } public String getAlign() { return align == null ? "right" : align; } public void setAlign(String align) { this.align = align; } public int doEndTag() { StringBuffer sb = new StringBuffer(128); try { boolean ok = false; // Traitement de la condition sur mode // =================================== if ( getMode() != null && getMode().trim().length() > 0 ) { BasicFormUtils bf = new BasicFormUtils(); int mode = bf.getFormDisplayMode(pageContext); if ( getMode().toUpperCase().indexOf("CREATE") != -1 && mode == BasicFormUtils.CREATE_MODE ) ok = true; if ( getMode().toUpperCase().indexOf("EDIT") != -1 && mode == BasicFormUtils.EDIT_MODE ) ok = true; if ( getMode().toUpperCase().indexOf("INSPECT") != -1 && mode == BasicFormUtils.INSPECT_MODE ) ok = true; } else ok = true; // On traite le tag // ================ if ( ok ) { sb.append("<table class=\"bouton\" style=\"float:").append(getAlign()).append("\" cellpadding=\"0\" cellspacing=\"2\"><tr"); if ( getAction().length() > 0 ) sb.append(" onclick=\"executeAction('").append(getAction()).append("')\""); if ( getTitle().length() > 0 ) sb.append(" title=\""); if ( pageContext.getRequest().getLocale() != null ) sb.append( PropertiesReader.getParameter_String("ApplicationResources", pageContext.getRequest().getLocale(), getTitle(), getTitle())); else sb.append( PropertiesReader.getParameter_String("ApplicationResources", getTitle(), getTitle())); sb.append("\""); sb.append(">"); if ( getImageUrl() != null && getImageUrl().trim().length() > 0 ) sb.append("<td style=\"padding-left:5px;\"><img align=\"middle\" border=\"0\" src=\"").append(getImageUrl()).append("\"/></td>"); sb.append("<td align=\"left\">"); if ( pageContext.getRequest().getLocale() != null ) sb.append( PropertiesReader.getParameter_String("ApplicationResources", pageContext.getRequest().getLocale(), getLabel(), getLabel())); else sb.append( PropertiesReader.getParameter_String("ApplicationResources", getLabel(), getLabel())); sb.append("</td>"); sb.append("</tr></table>"); pageContext.getOut().write(sb.toString()); } } catch (Exception e) { // System.out.println("Erreur dans BoutonTag " + e.toString()); } return EVAL_PAGE; } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class PropertiesReader { /** * Récupération du ResourceBundle */ public static ResourceBundle getBundle(String name, Locale locale) { if ( locale != null ) return ResourceBundle.getBundle(name, locale); return ResourceBundle.getBundle(name); } /** * Extraction d'un paramètre au format String */ public static String getParameter_String(String bundle, String property, String defaultValue) { return getParameter_String(bundle, null, property, defaultValue); } public static String getParameter_String(String bundle, Locale locale, String property, String defaultValue) { try { String value = getBundle(bundle, locale).getString(property); if ( value == null ) return defaultValue; return value; } catch (Throwable t) {} return defaultValue; } ... }
Le getLocale faudrait le faire dans ton tagLib et passer cette locale à ta méthode getLabel.
Le setLocale, tu peux le faire dans une action Struts en fonction des paramètres de ton application.
Tu vois le truc ?
Je vois bien ce que tu veux dire...
Mais il me semble que meme dans mes taglibs je n'ai pas accès directement à la méthode getLocale de la classe Action (de struts)
Le moyen que j'ai trouvé actuellement c'est de passer dans la session ma locale en fonction du User depuis une Action Struts comme tu me l'a indiqué.
Ensuite de passer ma session à ma classe LabelsBundle.java
Ou dedans je fais un
Après si tu me dis que je peux directement récupéré ma Locale depuis mon taglib c'est vrai que ce sera peut etre plus propre ... mais je vois pas trop comment faire !Code:(Locale)session.getAttribute(org.apache.struts.Globals.LOCALE_KEY);
A partir de ton tagLib, tu récupères la session dans laquelle est stockée ta locale.
Tu récupères ta locale, et tu la transmets à ta méthode
getLabel.
Oki mais pour récupérer ma Locale depuis ma session il faut bien que je passe par le getAttribut("...");
Car aucune methode n'est défini du style session.getLocale();
Apres il est vrai que c'est beaucoup plus propre de passé uniquement la Locale a ma methode getLabel.
Je vien de lire le dernier post, merci à tous les 2 je pense que j'ai enfin tout compris...
Je galére un peu, on mettra ca sur le coup du début de semaine... :oops:
Je vais tester tout ca alors merci encore !
Sinon, n'hésite pas à suivre l'exemple, ça fonctionne...;)
Je doit me gourrer mais il semblerai que le setLocale(request,locale); et le request.getLocale(); ne corresponde pas forcement.
Dans mon action au login d'un User je fais un:
setLocale(Locale.FRANCE); (si c'est un user francais).
setLocale(Locale.UK); (si c'est un user anglais).
dans mon taglib je passe ma Locale a ma méthode getLabel de cette facon:
this.text = LabelsBundle.getLabel(text,pageContext.getRequest().getLocale());
Or ce que me retourne pageContext.getRequest().getLocale(); ne correspond pas à ce que j'ai mi avec setLocale(); j'ai vérifier avec un system.out.println
De plus l'API Struts indique qu'il affecte la variable Locale à la current session, il me semble que je soit obliger de passer par la session au travers de la variable org.apache.struts.Globals.LOCALE_KEY et pas uniquement avec le request :(
Je suis d'accord avec toi, Struts place la locale dans la session, donc il faut la récupérer dans la session; logique :)
Je rajoute une petite info...
La méthode setLocale(request,locale) de la classe Action Struts affecte en fait la valeur locale à l'attribut de session org.apache.struts.Globals.LOCALE_KEY
Donc du coté Action je fais un setLocale(request,Locale.FRANCE); et dans ma classe de taglib, je fais un (Locale)pageContext.getSession.getAttribute(org.apache.struts.Globals.LOCALE_KEY);
Et je passe le tout à ma methode getLabel.
Voili voilou...
Petit ajout:
Tout semble marcher comme il faut, je récupére bien ma Locale à partir de ma session et l'environnement multi-lingue semble bien cohabité.
Merci encore à fr1man et OButterlin de vos précieuse aide.
@++.