[loc-en-dev] Equality of base locale and LocaleServiceProvider implementation

Yoshito Umaoka y.umaoka at gmail.com
Thu Mar 12 21:22:07 PDT 2009


Hi folks

The very first proposal suggested that locale service look up is done by 
base locale, then a service provider may or may not use information 
taken from extensions.  For example, NumberFormat#getInstance(Locale) 
look for a NumberFormatServiceProvider implementation which support the 
Locale if the support is not available in JDK.  The set of Locales 
supported by a LocaleServiceProvider is resolved by an array of Locales 
returned by getAvailableLocales implemented by each provider.  In this 
scenario, the original design proposal suggested to compare a Locale 
returned by getAvailableLocales with the requested Locale only for the 
base locale portion (language, script, region and variant).  We did not 
look into this area in detail, because we tried to wrap up the APIs in 
Locale itself first.  I noticed there is a potential problem in this 
scenario.  The existing LocaleServiceProvider implementations do not 
know about the extensions.  If you have two Locales with the same base 
locale, but one with no extensions, another with LDML extensions such as 
nu=arab (number system is Arabic).  For these two Locales, 
localeA.equals(localeB) returns false, because they are different.  If 
an existing LocaleServiceProvider implementation depends on 
Locale#equals, it may not work as expected (I thing it's not practical, 
but possible...)  Of course, even a LocaleServiceProvider return null, 
it does not cause any disaster (because it's the contract - for Locale 
which cannot be handled by a LocaleServicePoriver implementation, it can 
return null, then JDK has a fallback logic.)

First of all, do we care this potential compatibility problem?  This 
happens - if someone request a Locale with an extension and if the 
Locale is not supported by JDK and if its base locale is supported by a 
custom SPI implementation and if the SPI implementation depends on 
Locale#equals to identify a Locale..  Even those ifs are all true, it 
still return a service object (but fallback is involved).

If we think we cannot break this, then, we still have several options.

Option 1: If a LocaleServiceProvider claims that the requested Locale's 
base locale is supported, then, JDK calls the provider implementation 
with full Locale (including extensions).  If it returns null, JDK tries 
the requested Locale's base locale only.
Option 2: Add parallel APIs in SPI - for example, in addition to 
NumberFormatProvider#getNumberInstance(Locale), add a method 
NumberFormatProvider#getNumberInstanceEx(Locale).  JDK calls "Ex" 
version with extension (the default implementation is to return null), 
then if it returns null, call regular version without extensions.

Well, these are somewhat ugly.  So if possible, I'd like to ignore this 
potential compatibility issue.  Do you have any opinions?

While thinking various scenarios, I'm feeling that we should provide an 
easy way to compare two locales excluding exceptions.  I proposed 
getBaseLocale before because I thought it might have a good use case.  
I'm considering such API again.  Actually, 
Locale#hasSameBaseLocale(Locale) would do for this purpose (do not need 
to create a Locale).


Thanks,
Yoshito



More information about the locale-enhancement-dev mailing list