[opencms-dev] Solved: Problem with locale opencms changed JVM (Possible bug in OpenCms set locale JVM)
Claus Priisholm
cpr at codedroids.com
Thu Oct 22 11:45:49 CEST 2009
I haven't run into this problem, but I can see how it can be a problem
if you run other applications in the same JVM that rely on the JVMs
Locale-settng.
From reading the comment the real problem is that there is no
*_en.properties files to be found and the setDefaultLocale() is supposed
to work around that problem.
But by doing so it effects the entire VM which sounds like a bad thing
(from the JavaDoc for Locale.setDefault(): "Since changing the default
locale may affect many different areas of functionality, this method
should only be used if the caller is prepared to reinitialize
locale-sensitive code running within the same Java Virtual Machine.")
It seems that the right solution is to add *_en.properties files to
OpenCms (maybe as a locale module) and thus avoid overriding the default
locale for the JVM. I think this would make OpenCms a nicer citizen
inside the JVM.
Anyway your solution basically nullifies the setDefaultLocale() hack as
far as I can see so if you JVM is already set to use pt_BR as default,
then a shorter version would be:
private static void setDefaultLocale() {
m_defaultLocale = Locale.getDefault();
}
And as the result you now have the problem as described in the comment
for the method that you may get the pt_BR version of an localized
resource rather than the English (which of course may not be a problem
in your case).
Deiverson Silveira wrote:
> Hi List,
>
> About problem with JVM, I believe it is a bug in opencms, when he goes
> to set a locale that has more than 2 parts (fr_CA, pt_BR), i have module
> pt_BR ok, but code dont reading pt_BR and set locale JVM, i change class
> CmsLocaleManager.java in package org.opencms.i18n:
>
> /**
> * Sets the default locale of the Java VM to <code>{@link
> Locale#ENGLISH}</code> if the
> * current default has any other language then English set.<p>
> *
> * This is required because otherwise the default (English) resource
> bundles
> * would not be displayed for the English locale if a translated
> default locale exists.<p>
> *
> * Here's an example of how this issues shows up:
> * On a German server, the default locale usually is <code>{@link
> Locale#GERMAN}</code>.
> * All English translations for OpenCms are located in the "default"
> message files, for example
> * <code>org.opencms.i18n.message.properties</code>. If the German
> localization is installed, it will be
> * located in <code>org.opencms.i18n.message_de.properties</code>.
> If user has English selected
> * as his locale, the default Java lookup mechanism first tries to find
> * <code>org.opencms.i18n.message_en.properties</code>. However,
> this file does not exist, since the
> * English localization is kept in the default file. Next, the Java
> lookup mechanism tries to find the servers
> * default locale, which in this example is German. Since there is a
> German message file, the Java lookup mechanism
> * is finished and uses this German localization, not the default
> file. Therefore the
> * user get the German localization, not the English one.
> * Setting the default locale explicitly to English avoids this
> issue.<p>
> */
> private static void setDefaultLocale() {
>
> // set the default locale to english
> // this is required because otherwise the default (english)
> resource bundles
> // would not be displayed for the english locale if a translated
> locale exists
>
> Locale oldLocale = Locale.getDefault();
> if
> (!(Locale.ENGLISH.getLanguage().equals(oldLocale.getLanguage()))) {
> // default language is not English
> try {
> Locale.setDefault(Locale.ENGLISH);
> if (CmsLog.INIT.isInfoEnabled()) {
> CmsLog.INIT.info
> <http://CmsLog.INIT.info>(Messages.get().getBundle().key(
> Messages.INIT_I18N_DEFAULT_LOCALE_2,
> Locale.ENGLISH,
> oldLocale));
> }
> } catch (Exception e) {
> // any Exception: the locale has not been changed, so
> there may be issues with the English
> // localization but OpenCms will run in general
> CmsLog.INIT.error(Messages.get().getBundle().key(
> Messages.LOG_UNABLE_TO_SET_DEFAULT_LOCALE_2,
> Locale.ENGLISH,
> oldLocale), e);
> }
> } else {
> if (CmsLog.INIT.isInfoEnabled()) {
> CmsLog.INIT.info
> <http://CmsLog.INIT.info>(Messages.get().getBundle().key(Messages.INIT_I18N_KEEPING_DEFAULT_LOCALE_1,
> oldLocale));
> }
> }
>
> // initialize the static member with the new default
> m_defaultLocale = Locale.getDefault();
> }
>
>
>
>
> I change method for this and set JVM ok:
>
>
>
> private static void setDefaultLocale() {
>
> // set the default locale to english
> // this is required because otherwise the default (english)
> resource bundles
> // would not be displayed for the english locale if a translated
> locale exists
>
> Locale oldLocale = Locale.getDefault();
> Locale loc = new Locale("pt","BR");
>
> try {
> Locale.setDefault(loc);
> if (CmsLog.INIT.isInfoEnabled()) {
> CmsLog.INIT.info
> <http://CmsLog.INIT.info>(Messages.get().getBundle().key(
> Messages.INIT_I18N_DEFAULT_LOCALE_2,
> loc,
> oldLocale));
> }
> } catch (Exception e) {
> // any Exception: the locale has not been changed, so
> there may be issues with the English
> // localization but OpenCms will run in general
> CmsLog.INIT.error(Messages.get().getBundle().key(
> Messages.LOG_UNABLE_TO_SET_DEFAULT_LOCALE_2,
> loc,
> oldLocale), e);
> }
>
> // initialize the static member with the new default
> m_defaultLocale = Locale.getDefault();
> }
>
>
> SUCESS! This Work others system/projects, opencms dont impact in jvm
> when pt_BR... but the jvm will be forever by setting pt_BR! I Belive
> other people must have the same problem when more project in server
> aplication!
>
>
> ------------------------------------------------------------------------
>
>
> _______________________________________________
> This mail is sent to you from the opencms-dev mailing list
> To change your list options, or to unsubscribe from the list, please visit
> http://lists.opencms.org/mailman/listinfo/opencms-dev
--
Claus Priisholm, CodeDroids ApS
Phone: +45 48 22 46 46
cpr (you know what) codedroids.com - http://www.codedroids.com
cpr (you know what) interlet.dk - http://www.interlet.dk
--
Javadocs and other OpenCms stuff:
http://www.codedroids.com/community/opencms
More information about the opencms-dev
mailing list