After digging into Struts2 code, here is what I discovered: this bug is simply caused by the normal behavior of getBundle (http://java.sun.com/j2se/1.4.2/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String,%20java.util.Locale,%20java.lang.ClassLoader))
Here is the explanation In my Struts2 application I have the following language files: default_de.properties default_fr.properties default.properties (contains EN) JVM Defaut Locale: fr_FR Scenario 1: struts.locale not set so fr_FR is the default When hitting the first action, default_fr.properties is used OK Scenario2: Now I want to switch to English so I append ?request_locale=en to the URL According to getBundle algorithm: 1) default_en.properties is looked but not found 2) default_fr.properties is found and used KO Scenario 3: struts.locale is set to en_US When hitting the first action, we are in the same case as scenario 2 because JVM default is still fr_FR The issue lay in LocalizedTextUtil.findResourceBundle(String bundleName, Locale locale) because here we only know that the user wants the given locale but we have no idea of what is the fallback locale. Proposed solutions: 1) default.properties should always match JVM language. Because an application may be developped for several country it means forcing default JVM with -Duser.language=XX. But this is not a good solution because the same JVM may host several applications with possibly different default Locale. 2) Force JVM default locale on Struts startup to be equal to struts.locale. The main concern is I'm not sure it will works fine with multi-threading and it will have many side effects (like changing language for stacktraces in the log) 3) Clean solution : have a clear separation between requested locale (with potentialy a default struts.default.request.locale) and default local (mean the locale that is contained in the resource bundle without extension). Then use the Java 1.6 feature (I know, I know, don't shout at me) ResourceBundle.Control that allow to change the fallback locale. Interesting read: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086301 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4303146 It seems that JSF implements its own lookup algorithm. IMHO this is the only solution if you don't want to use the JDK 1.6 feature ResourceBundle.Control. Regards, Julien ________________________________ De : "mailtolouis2020-str...@yahoo.com" <mailtolouis2020-str...@yahoo.com> À : Struts Users Mailing List <user@struts.apache.org> Envoyé le : Vendredi, 14 Août 2009, 18h12mn 52s Objet : Re: Re : Struts2 + I18N Not long ago, someone also got similar problem: http://markmail.org/message/mozukqgrnhfbq7od?q=s2+and+default+locale/language+list:org.apache.struts.users/ ________________________________ From: Julien HENRY <henr...@yahoo.fr> To: Struts Users Mailing List <user@struts.apache.org> Sent: Friday, August 14, 2009 4:52:28 PM Subject: Re : Struts2 + I18N Hi, AFAIK this is the same as adding <constant name="struts.locale" value="en" /> in struts.xml. BTW I tried your suggestion without much improvement. I even tried to rename default.properties in default_en.properties => still no english. ________________________________ De : BALAJI CRB <balaji_...@spanservices.com> À : Struts Users Mailing List <user@struts.apache.org> Envoyé le : Vendredi, 14 Août 2009, 17h47mn 37s Objet : RE: Struts2 + I18N Hi, Use struts.locale=en in your struts.properties file. Hope this works. Regards, Balaji C R B -----Original Message----- From: Julien HENRY [mailto:henr...@yahoo.fr] Sent: Friday, August 14, 2009 9:11 PM To: user@struts.apache.org Subject: Struts2 + I18N Hi, In my Struts2 application I have the following language files: default_de.properties default_fr.properties default.properties (contains EN) When I start my application, the application is in French (probably because JVM default locale is french). Then I tried to change language by appending ?request_locale=XX in the URL. Adding ?request_locale=de works fine. All texts are in German. Adding ?request_locale=en doesn't work. All texts are in French. I tried to add <constant name="struts.locale" value="en" /> to struts.xml but no luck. How can I tell Struts that the default.properties file is English? Thanks, Julien DISCLAIMER: This email message and all attachments are confidential and may contain information that is privileged, confidential or exempt from disclosure under applicable law. If you are not the intended recipient, you are notified that any dissemination, distribution or copying of this email is strictly prohibited. If you have received this email in error, please notify us immediately by return email or to mailad...@spanservices.com and destroy the original message. Opinions, conclusions, and other information in this message that do not relate to the official business of SPAN, shall be understood to be neither given nor endorsed by SPAN.