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 : "[email protected]" <[email protected]>
À : Struts Users Mailing List <[email protected]>
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 <[email protected]>
To: Struts Users Mailing List <[email protected]>
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 <[email protected]>
À : Struts Users Mailing List <[email protected]>
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:[email protected]]
Sent: Friday, August 14, 2009 9:11 PM
To: [email protected]
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 [email protected]
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.