[loc-en-dev] Backward Compatibility Note

Naoto Sato naoto.sato at oracle.com
Thu Jul 22 15:11:14 PDT 2010


(7/22/10 2:29 PM), Doug Felt wrote:
>
>
> On Wed, Jul 21, 2010 at 3:17 PM, Naoto Sato <naoto.sato at oracle.com
> <mailto:naoto.sato at oracle.com>> wrote:
>
>     Actually reading the "Equality of two Locales" section reminds me
>     that Locale.readObject() should also append extensions for ja_JP_JP
>     and th_TH_TH as well as the constructors.
>
> Yes, it should.
>
>     And, what should writeObject() do? Remove the redundant extension or
>     keep it?
>
> I expect it should write out the full state of the Locale.

Sounds reasonable. If the serialized object is read on a prior JDK, it 
would still be compatible.

Naoto

>
>     Naoto
>
>
>     (7/19/10 11:41 PM), Yoshito Umaoka wrote:
>
>         Hi folks,
>
>         Belows is the draft contents for "compatibility note" for
>         submitting the
>         proposal. If you find any issues or have something to add,
>         please reply
>         to this message. I'm expecting that Steven will consolidate
>         inpputs and
>         update the contents.
>
>         -Yoshito
>
>         ------------------------
>         1. Locale#toString()
>
>         Locales supported by the current version of Java (Locales
>         returned by
>         Locale.getAvailableLocales()) still return the exact same String
>         representation by toString() method for exact two exceptions. These
>         exceptions are Locale("ja", "JP", "JP") and Locale("th", "TH",
>         "TH").
>         With the new proposal, toString() returns
>         "ja_JP_JP_#u-ca-japanese" and
>         "th_TH_TH_#u-nu-thai".
>
>         Although a String returned by this method might not represent all of
>         Locale's field information (for exmaple, Locale without
>         languag/country,
>         but non-empty variant returns empty String), some Java
>         application may
>         rely on toString() to get field information. For these two Locales,
>         typical assumption (language + '_" + country + '_') is still
>         applicable.
>         When such implementation tries to get the variant field, they
>         will be
>         "JP_#u-ca-japanese" and "TH_#u-nu-thai". So it may return false
>         result.
>
>         However, these two Locales are never used as a system default Locale
>         (unless you explicitly specify -Duser.variant=xxxx). Also, the
>         proposed
>         representation append the extra part as look like yet another
>         variant
>         subpart, so the common locale string truncation algorithm
>         (chopping out
>         segments from right) still reasonably works.
>
>         2. Equality of two Locales
>
>         With the current Java implementation, if two Locales have the same
>         language, country and variant, these two Locales are equal. This
>         assumption is no longer true with the new proposal
>         (script/extensions
>         must be also same). However, this assumption is still true for all
>         currently supported Locales. Two Locales not satisfying the
>         assumption
>         could be generated only when a user call new proposed APIs (such as
>         Locale.forLanguageTag(String) or Builder APIs), In addition to this,
>         equality of two Locales should be checked by Locale#equals(Object),
>         which is updated to compare script/extensions as well.
>         Therefore, we do
>         not think any backward compatibility problems arise with this
>         change.
>
>         3. ResourceBundle.Control#getCandidateLocales(String, Locale)
>
>         List of Locales generated by the proposed default implementation of
>         getCandidateLocales(String, Locale) will change only for Chinese and
>         Norwegian. This change is intended for allowing users to package
>         bundles
>         cleanly. For a Chinese (or a Norwegian) Locale, the new proposed
>         behavior inserts some extra Locales in the result. However,
>         candidate
>         Locales generated by the current Java implementation will be still
>         appeared in the list in the original ordering even with the new
>         proposed
>         implementation. For example, for a given request Locale "zh_CN",
>         extra
>         entries with script "zh_Hans_CN" and "zh_Hans" are inserted, but
>         still
>         contains "zh_CN", "zh" and ROOT in this order. Because a Locale with
>         script cannot be created by the current Java implementation, it is
>         really unlikely that a user has two different sets of bundles - one
>         group including script / another group without script.
>         Therefore, the
>         behavior change discussed here does not introduce any practical
>         compatibility problems.
>
>         4. ResourceBundle.Control#toBundleName(String, Locale)
>
>         A Locale with non-empty script is mapped to a bundle name with
>         suffix
>         _<lang>_<script>. The current implementation may consider the second
>         suffix subtag would be a country. However, script is always in
>         4-letter/title case and country(region) must be always
>         two-letter. So it
>         is not possible to mix them up unless a user specifies 4-letter
>         country
>         in the existing Locale constructor (and it's illegal even now - the
>         existing implementation just does not check the validity).
>         Therefore,
>         this concern is ignorable.
>
>
>



More information about the locale-enhancement-dev mailing list