Re: Locale.getDefault bug in JDK 1.7
On Mon, 22 Aug 2011 11:22:06 -0700 (PDT), Lew <lewbloch@gmail.com>
wrote, quoted or indirectly quoted someone who said :
Roedy's output shows that the locale default is US. However, it doesn't sh=
ow how he thinks the OS is set to CA; presumably it's set in his BIOS or ot=
her low-level. I'd like to see Roedy's program expanded to show the result=
s of 'getDefault()' after a 'setDefault()' to Canada. I'd also like to see=
the values of the OS's LANG and LANGUAGE envars, or equivalents. Finally,=
I'd like to see what Java has for the user.language, user.country, and use=
r.variant system properties.
I have windows 7 64 bit. I set the country and language in the control
panel. Windows does not export user.country and user.language to the
set environment. You have to get at it programmatically.
Here is the SSCCE with the changes you requested. It works ok with JDK
1.6 but not 1.7 on Windows 7 64 bit.
To see the problem, configure your windows 7 to a country something
other than USA, then run this SSCCE under JDK 1.7 (and perhaps other
combinations).
/*
* [TestLocale.java]
*
* Summary: Get the Locale.
*
* Copyright: (c) 2011 Roedy Green, Canadian Mind Products,
http://mindprod.com
*
* Licence: This software may be copied and used freely for any
purpose but military.
* http://mindprod.com/contact/nonmil.html
*
* Requires: JDK 1.7+
*
* Created with: JetBrains IntelliJ IDEA IDE
http://www.jetbrains.com/idea/
*
* Version History:
* 1.0 2011-08-21
*/
package com.mindprod.example;
import java.util.Locale;
import static java.lang.System.out;
/**
* Display the Locale
*
* @author Roedy Green, Canadian Mind Products
* @version 1.1 2011-08-23 add Lew Bloch's requested extensions,
display of user.country and setDefault.
* @since 2011-08-21
*/
public final class TestLocale
{
// -------------------------- STATIC METHODS
--------------------------
/**
* display fields of a Locale
*
* @param l the Locale
* @param desc description of the Locale
*/
private static void showLocale( String desc, Locale l )
{
out.println( desc );
out.println( "display:" + l.getDisplayName() );
out.println( "country:" + l.getCountry() );
out.println( "ISO3:" + l.getISO3Country() );
out.println( "display country:" + l.getDisplayCountry() );
out.println( "language:" + l.getLanguage() );
out.println( "display language:" + l.getDisplayLanguage() );
out.println( "user.country:" + System.getProperty(
"user.country", "n/a" ) );
out.println( "user.language:" + System.getProperty(
"user.language", "n/a" ) );
out.println();
}
// --------------------------- main() method
---------------------------
/**
* Display current Locale
*
* @param args not used
*/
public static void main( String[] args )
{
// various ways to get a Locale
// demonstrates bugs in Windows 7 64-bit JDK 1.7 when country
is configured in control panel as Canada.
// user.country reports as US instead of CA
// Locale.getDefault.getCountry() reports US instead of CA
Locale defaultLocale = Locale.getDefault(); // browser/JVM
default
showLocale( "D E F A U L T", defaultLocale );
Locale specifiedLocale = new Locale( "en", "US" ); //
language/country
showLocale( "N E W E N U S", specifiedLocale );
Locale localeConstant = Locale.CANADA_FRENCH; // static final
constants
showLocale( "C A N A D A _ F R E N C H", localeConstant );
Locale.setDefault( Locale.CANADA );
Locale forcedDefault = Locale.getDefault();
showLocale( "F O R C E D D E F A U L T", forcedDefault );
// Locale serverLocale = request.getLocale(); // in a servlet
to get remote user's locale
}
}
Results from TestLocale
D E F A U L T
display:English (United States) <-- should be Canada when country
configured as Canada in the control panel
country:US
ISO3:USA
display country:United States
language:en
display language:English
user.country:US <-- should be Canada
user.language:en
N E W E N U S
display:English (United States)
country:US
ISO3:USA
display country:United States
language:en
display language:English
user.country:US
user.language:en
C A N A D A _ F R E N C H
display:French (Canada)
country:CA
ISO3:CAN
display country:Canada
language:fr
display language:French
user.country:US
user.language:en
F O R C E D D E F A U L T
display:English (Canada)
country:CA
ISO3:CAN
display country:Canada
language:en
display language:English
user.country:US <-- should be Canada
user.language:en
--
Roedy Green Canadian Mind Products
http://mindprod.com
The modern conservative is engaged in one of man's oldest exercises in moral philosophy; that is,
the search for a superior moral justification for selfishness.
~ John Kenneth Galbraith (born: 1908-10-15 died: 2006-04-29 at age: 97)