[ http://issues.apache.org/struts/browse/STR-2923?page=all ]
Paul Benedict updated STR-2923:
-------------------------------
Component/s: Core
Fix Version/s: 1.3.6
Affects Version/s: 1.3.5
1.2.9
> PropertyMessageResources.getMessage uses loadLocale in wrong order
> ------------------------------------------------------------------
>
> Key: STR-2923
> URL: http://issues.apache.org/struts/browse/STR-2923
> Project: Struts 1
> Issue Type: Bug
> Components: Core
> Affects Versions: 1.2.9, 1.2 Family, 1.3.5
> Environment: default locale on windows platform is fi_FI
> Reporter: Antti Tirkkonen
> Priority: Minor
> Fix For: 1.3.6
>
>
> if you have following messagebundles:
> bundle_fi.properties
> bundle.properties
> And want to any other locale except fi to use bundle.properties. It is not
> possible without setting JVM default locale something else than fi locale.
> Problem with this approach is that you possible end up effecting behaviour of
> other software running on the same JVM.
> To solve this problem PropertyMessageResources.getMessage implementation
> could be changed to do locale loading in different order.
> current order is: asked locale, asked locale minus underscore, JVM default
> locale, no locale
> proposed order: asked locale, asked locale minus underscore, no locale, JVM
> default locale
> Current code:
> public String getMessage(Locale locale, String key) {
> if (log.isDebugEnabled()) {
> log.debug("getMessage(" + locale + "," + key + ")");
> }
> String localeKey = localeKey(locale);
> String originalKey = messageKey(localeKey, key);
> String messageKey = null;
> String message = null;
> int underscore = 0;
> boolean addIt = false;
> while (true) {
> loadLocale(localeKey);
> messageKey = messageKey(localeKey, key);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> if (addIt) {
> messages.put(originalKey, message);
> }
> return (message);
> }
> }
> addIt = true;
> underscore = localeKey.lastIndexOf("_");
> if (underscore < 0) {
> break;
> }
> localeKey = localeKey.substring(0, underscore);
> }
> if (!defaultLocale.equals(locale)) {
> localeKey = localeKey(defaultLocale);
> messageKey = messageKey(localeKey, key);
> loadLocale(localeKey);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> messages.put(originalKey, message);
> return (message);
> }
> }
> }
> localeKey = "";
> messageKey = messageKey(localeKey, key);
> loadLocale(localeKey);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> messages.put(originalKey, message);
> return (message);
> }
> }
> if (returnNull) {
> return (null);
> } else {
> return ("???" + messageKey(locale, key) + "???");
> }
> }
> proposed code:
> public String getMessage(Locale locale, String key) {
> if (log.isDebugEnabled()) {
> log.debug("getMessage(" + locale + "," + key + ")");
> }
> String localeKey = localeKey(locale);
> String originalKey = messageKey(localeKey, key);
> String messageKey = null;
> String message = null;
> int underscore = 0;
> boolean addIt = false;
> while (true) {
> loadLocale(localeKey);
> messageKey = messageKey(localeKey, key);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> if (addIt) {
> messages.put(originalKey, message);
> }
> return (message);
> }
> }
> addIt = true;
> underscore = localeKey.lastIndexOf("_");
> if (underscore < 0) {
> break;
> }
> localeKey = localeKey.substring(0, underscore);
> }
> localeKey = "";
> messageKey = messageKey(localeKey, key);
> loadLocale(localeKey);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> messages.put(originalKey, message);
> return (message);
> }
> }
> if (!defaultLocale.equals(locale)) {
> localeKey = localeKey(defaultLocale);
> messageKey = messageKey(localeKey, key);
> loadLocale(localeKey);
> synchronized (messages) {
> message = (String)messages.get(messageKey);
> if (message != null) {
> messages.put(originalKey, message);
> return (message);
> }
> }
> }
> if (returnNull) {
> return (null);
> } else {
> return ("???" + messageKey(locale, key) + "???");
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira