diff options
author | Jochen Hoenicke <jochen@gnu.org> | 1999-01-25 15:32:18 +0000 |
---|---|---|
committer | Jochen Hoenicke <jochen@gnu.org> | 1999-01-25 15:32:18 +0000 |
commit | 88afac650c3ea2a26cf082d15db2ef548f4fdf31 (patch) | |
tree | a9c445171ea6c611039c11c5843a693b30a3026c /java/util/Locale.java | |
parent | 1de1cf5b2d8ae5446cf3f1b1fd88b1ff58108dba (diff) | |
download | classpath-88afac650c3ea2a26cf082d15db2ef548f4fdf31.tar.gz |
Replaced Locale.java with my version (should be 1.2 compliant and serializable)
Changed three iso639 contry codes to their new variants.
Added properties for german.
Diffstat (limited to 'java/util/Locale.java')
-rw-r--r-- | java/util/Locale.java | 1091 |
1 files changed, 606 insertions, 485 deletions
diff --git a/java/util/Locale.java b/java/util/Locale.java index 57cb5f4a5..388f9abc2 100644 --- a/java/util/Locale.java +++ b/java/util/Locale.java @@ -1,7 +1,24 @@ -package java.util; +/* + * java.util.Locale: part of the Java Class Libraries project. + * Copyright (C) 1998 Jochen Hoenicke + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ -import java.io.Serializable; -import java.io.IOException; +package java.util; /** * Locales represent a specific country and culture. @@ -27,495 +44,599 @@ import java.io.IOException; * Macintosh. When there is more than one variant string, they must * be separated by an underscore (U+005F). * <br><br> - * In order to facilitate easy modification of the locales supported by - * GNU Classpath, language and country code information is stored in - * resource files. - * <br><br> * The default locale is determined by the values of the system properties * user.language, user.region, and user.variant. + * @see ResourceBundle + * @see java.text.Format + * @see java.text.NumberFormat + * @see java.text.Collator + * @author Jochen Hoenicke + * @author Paul Fisher */ -public final class Locale implements Cloneable, Serializable { - private String country; - private String language; - private String variant; - - private transient int hashcode; - - private static Locale defaultL; - private static Properties ISO639A3, ISO3166A3, new639; - - static { - try { - ISO639A3 = new Properties(); - ISO639A3.load(Locale.class.getResourceAsStream( - "/gnu/java/locale/iso639-a3.properties")); - ISO3166A3 = new Properties(); - ISO3166A3.load(Locale.class.getResourceAsStream( - "/gnu/java/locale/iso3166-a3.properties")); - new639 = new Properties(); - new639.load(Locale.class.getResourceAsStream( - "/gnu/java/locale/iso639-a2-old.properties")); - } catch (IOException e) { - throw new Error("Locale init error: " + e); +public class Locale implements java.io.Serializable, Cloneable { + + /** + * Locale which represents the English language. + */ + public static final Locale ENGLISH = new Locale("en", ""); + /** + * Locale which represents the English language. + */ + public static final Locale FRENCH = new Locale("fr", ""); + /** + * Locale which represents the German language. + */ + public static final Locale GERMAN = new Locale("de", ""); + /** + * Locale which represents the Italian language. + */ + public static final Locale ITALIAN = new Locale("it", ""); + /** + * Locale which represents the Japanese language. + */ + public static final Locale JAPANESE = new Locale("ja", ""); + /** + * Locale which represents the Korean language. + */ + public static final Locale KOREAN = new Locale("ko", ""); + /** + * Locale which represents the Chinese language. + */ + public static final Locale CHINESE = new Locale("zh", ""); + /** + * Locale which represents the Chinese language as used in China. + */ + public static final Locale SIMPLIFIED_CHINESE = new Locale("zh", "CN"); + /** + * Locale which represents the Chinese language as used in Taiwan. + * Same as TAIWAN Locale. + */ + public static final Locale TRADITIONAL_CHINESE = new Locale("zh", "TW"); + /** + * Locale which represents France. + */ + public static final Locale FRANCE = new Locale("fr", "FR"); + /** + * Locale which represents Germany. + */ + public static final Locale GERMANY = new Locale("de", "DE"); + /** + * Locale which represents Italy. + */ + public static final Locale ITALY = new Locale("it", "IT"); + /** + * Locale which represents Japan. + */ + public static final Locale JAPAN = new Locale("ja", "JP"); + /** + * Locale which represents Korea. + */ + public static final Locale KOREA = new Locale("ko", "KR"); + /** + * Locale which represents China. + * Same as SIMPLIFIED_CHINESE Locale. + */ + public static final Locale CHINA = SIMPLIFIED_CHINESE; + /** + * Locale which represents the People's Republic of China. + * Same as CHINA Locale. + */ + public static final Locale PRC = CHINA; + /** + * Locale which represents Taiwan. + * Same as TRADITIONAL_CHINESE Locale. + */ + public static final Locale TAIWAN = TRADITIONAL_CHINESE; + /** + * Locale which represents the United Kingdom. + */ + public static final Locale UK = new Locale("en", "GB"); + /** + * Locale which represents the United States. + */ + public static final Locale US = new Locale("en", "US"); + /** + * Locale which represents the English speaking portion of Canada. + */ + public static final Locale CANADA = new Locale("en", "CA"); + /** + * Locale which represents the French speaking portion of Canada. + */ + public static final Locale CANADA_FRENCH = new Locale("fr", "CA"); + + /** + * We are compatible to sun's Locale. + */ + static final long serialVersionUID = 9149081749638150636L; + + /** + * The language code, as returned by getLanguage(). + * @serial + */ + private String language; + /** + * The country code, as returned by getCountry(). + * @serial + */ + private String country; + /** + * The variant code, as returned by getVariant(). + * @serial + */ + private String variant; + /** + * This is the cached hashcode. When writing to stream, we write -1. + * @serial + */ + private int hashcode; + + /** + * Convert old iso639 codes to the new ones. + */ + private String convertLanguage(String language) { + int index = "iw,in,ji".indexOf(language); + if (index != -1) + return "he,id,yi".substring(index, index+2).intern(); + return language.intern(); + } + + /** + * Creates a new locale for the given language and country. + * @param language lowercase two-letter ISO-639 A2 language code. + * @param country uppercase two-letter ISO-3166 A2 contry code. + * @param variant vendor and browser specific. + */ + public Locale(String language, String country, String variant) { + this.language = convertLanguage(language); + this.country = country.intern(); + this.variant = variant.intern(); + this.hashcode = this.language.hashCode() ^ this.country.hashCode() + ^ this.variant.hashCode(); + } + + /** + * Creates a new locale for the given language and country. + * @param language lowercase two-letter ISO-639 A2 language code. + * @param country uppercase two-letter ISO-3166 A2 country code. + */ + public Locale(String language, String country) { + this(language, country, ""); + } + + private static Locale defaultLocale = + new Locale(System.getProperty("user.language", ""), + System.getProperty("user.region", ""), + System.getProperty("user.variant", "")); + + /** + * Returns the default Locale. The default locale is generally + * once set on start up and then never changed. Normally you + * should use this locale for everywhere you need a locale. + * The initial setting matches the default locale, the user has + * chosen. + */ + public static Locale getDefault() { + return defaultLocale; + } + + /** + * Changes the default locale. Normally only called on program + * start up. Note that this doesn't change the locale for other + * programs. + */ + public static void setDefault(Locale newLocale) { + defaultLocale = newLocale; + } + + /** + * Returns the list of available locals. + */ + public static Locale[] getAvailableLocals() { + return new Locale[] { + ENGLISH, FRENCH, GERMAN, ITALIAN, JAPANESE, KOREAN, CHINESE, + UK, US, FRANCE, GERMANY, ITALY, JAPAN, KOREA, CHINA, + PRC, TAIWAN, CANADA, CANADA_FRENCH + }; + } + + /** + * Returns a list of all 2-letter uppercase country codes as defined + * in ISO 3166 + */ + public static String[] getISOCountries() { + return new String[] { + "AF", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", + "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", + "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", + "BW", "BV", "BR", "IO", "BN", "BG", "BF", "BI", "KH", + "CM", "CA", "CV", "KY", "CF", "TD", "CL", "CN", "CX", + "CC", "CO", "KM", "CG", "CK", "CR", "CI", "HR", "CU", + "CY", "CZ", "DK", "DJ", "DM", "DO", "TP", "EC", "EG", + "SV", "GQ", "ER", "EE", "ET", "FK", "FO", "FJ", "FI", + "FR", "FX", "GF", "PF", "TF", "GA", "GM", "GE", "DE", + "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GN", + "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", + "ID", "IR", "IQ", "IE", "IL", "IT", "JM", "JP", "JO", + "KZ", "KE", "KI", "KP", "KR", "KW", "KG", "LA", "LV", + "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MK", + "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", + "MU", "YT", "MX", "FM", "MD", "MC", "MN", "MS", "MA", + "MZ", "MM", "NA", "NR", "NP", "NL", "AN", "NC", "NZ", + "NI", "NE", "NG", "NU", "NF", "MP", "NO", "OM", "PK", + "PW", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", + "PR", "QA", "RE", "RO", "RU", "RW", "KN", "LC", "VC", + "WS", "SM", "ST", "SA", "SN", "SC", "SL", "SG", "SK", + "SI", "SB", "SO", "ZA", "GS", "ES", "LK", "SH", "PM", + "SD", "SR", "SJ", "SZ", "SE", "CH", "SY", "TW", "TJ", + "TZ", "TH", "TG", "TK", "TO", "TT", "TN", "TR", "TM", + "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "UY", + "UZ", "VU", "VA", "VE", "VN", "VG", "VI", "WF", "EH", + "YE", "YU", "ZR", "ZM", "ZW" + }; + } + + /** + * Returns a list of all 2-letter lowercase language codes as defined + * in ISO 639 (both old and new variant). + */ + public static String[] getISOLanguages() { + return new String[] { + "aa", "ab", "af", "am", "ar", "as", "ay", "az", "ba", + "be", "bg", "bh", "bi", "bn", "bo", "br", "ca", "co", + "cs", "cy", "da", "de", "dz", "el", "en", "eo", "es", + "et", "eu", "fa", "fi", "fj", "fo", "fr", "fy", "ga", + "gd", "gl", "gn", "gu", "ha", "iw", "he", "hi", "hr", + "hu", "hy", "ia", "in", "id", "ie", "ik", "is", "it", + "iu", "ja", "jw", "ka", "kk", "kl", "km", "kn", "ko", + "ks", "ku", "ky", "la", "ln", "lo", "lt", "lv", "mg", + "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", + "na", "ne", "nl", "no", "oc", "om", "or", "pa", "pl", + "ps", "pt", "qu", "rm", "rn", "ro", "ru", "rw", "sa", + "sd", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", + "sq", "sr", "ss", "st", "su", "sv", "sw", "ta", "te", + "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", + "tt", "tw", "ug", "uk", "ur", "uz", "vi", "vo", "wo", + "xh", "ji", "yi", "yo", "za", "zh", "zu" + }; + } + + /** + * Returns the language code of this locale. + * @return language code portion of this locale, or an empty String if + * none exists + */ + public String getLanguage() { + return language; + } + + /** + * Returns the country code of this locale. + * @return country code portion of this locale, or an empty String if + * none exists + */ + public String getCountry() { + return country; + } + + /** + * Returns the variant code of this locale. + */ + public String getVariant() { + return variant; + } + + /** + * Gets the string representation of the current locale. This + * consists of the language, the country, and the variant, + * separated by an underscore. If one of this three component is + * missing the underscore will also disappear. + * @return the string representation of this Locale. + */ + public final String toString() { + StringBuffer result = new StringBuffer(language); + String underscore=""; + if (language.length() != 0) + underscore = "_"; + if (country.length() != 0) { + result.append(underscore); + result.append(country); + underscore = "_"; + } + if (variant.length() != 0) { + result.append(underscore); + result.append(variant); + } + return result.toString(); + } + + /** + * Returns the three-letter ISO language abbrevation of this locale. + * @exception MissingResourceException if the three-letter code is not + * known. + */ + public String getISO3Language() throws MissingResourceException { + int index = + ("aa,ab,af,am,ar,as,ay,az,ba,be,bg,bh,bi,bn,bo,br,ca,co,cs,cy,"+ + "da,de,dz,el,en,eo,es,et,eu,fa,fi,fj,fo,fr,fy,ga,gd,gl,gn,gu,"+ + "gv,ha,hi,hr,hu,hy,ia,ie,ik,id,is,it,iu,he,ja,yi,jw,ka,kk,kl,"+ + "km,kn,ko,ks,ku,kw,ky,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mo,mr,"+ + "ms,mt,my,na,ne,nl,no,oc,om,or,pa,pl,ps,pt,qu,rm,rn,ro,ru,rw,"+ + "sa,sd,se,sg,sh,si,sk,sl,sm,sn,so,sq,sr,ss,st,su,sv,sw,ta,te,"+ + "tg,th,ti,tk,tl,tn,to,tr,ts,tt,tw,ug,uk,ur,uz,vi,vo,wo,xh,yo,"+ + "za,zh,zu,").indexOf(language+","); + if (index == -1 || language.length() != 2) + throw new MissingResourceException + ("Can't find ISO3 language for "+language, + "java.util.Locale", language); + + /* Don't read this aloud. This are the three letter language codes + */ + return + ("aarabkaframharaasmaymazebakbelbulbihbisbenbodbrecatcoscescym"+ + "dandeudzoellengepospaesteusfasfinfijfaofrafrygaigdhglggrnguj"+ + "maxhauhinhrvhunhyeinaileipkindislitaikuhebjpnyidjawkatkazkal"+ + "khmkankorkaskurcorkirlatltzlinlaolitlavmlgmrimkdmalmonmolmar"+ + "msamltmyanaunepnldnorociormoripanpolpusporquerohrunronruskin"+ + "sansndsmisagsrpsinslkslvsmosnasomsqisrpsswsotsunsweswatamtel"+ + "tgkthatirtuktgltsntonturtsotattwiuigukrurduzbvievolwolxhoyor"+ + "zhazhozul").substring(index, index+3); + } + + /** + * Returns the three-letter ISO country abbrevation of the locale. + * @exception MissingResourceException if the three-letter code is not + * known. + */ + public String getISO3Country() throws MissingResourceException { + int index = + ("AF,AL,DZ,AS,AD,AO,AI,AQ,AG,AR,AM,AW,AU,AT,AZ,BS,BH,BD,BB,BY,BE,"+ + "BZ,BJ,BM,BT,BO,BA,BW,BV,BR,IO,BN,BG,BF,BI,KH,CM,CA,CV,KY,CF,TD,"+ + "CL,CN,CX,CC,CO,KM,CG,CD,CK,CR,CI,HR,CU,CY,CZ,DK,DJ,DM,DO,TP,EC,"+ + "EG,SV,GQ,ER,EE,ET,FK,FO,FJ,FI,FR,FX,GF,PF,TF,GA,GM,GE,DE,GH,GI,"+ + "GR,GL,GD,GP,GU,GT,GN,GW,GY,HT,HM,VA,HN,HK,HU,IS,IN,ID,IR,IQ,IE,"+ + "IL,IT,JM,JP,JO,KZ,KE,KI,KP,KR,KW,KG,LA,LV,LB,LS,LR,LY,LI,LT,LU,"+ + "MO,MK,MG,MW,MY,MV,ML,MT,MH,MQ,MR,MU,YT,MX,FM,MD,MC,MN,MS,MA,MZ,"+ + "MM,NA,NR,NP,NL,AN,NC,NZ,NI,NE,NG,NU,NF,MP,NO,OM,PK,PW,PA,PG,PY,"+ + "PE,PH,PN,PL,PT,PR,QA,RE,RO,RU,RW,KN,LC,VC,WS,SM,ST,SA,SN,SC,SL,"+ + "SG,SK,SI,SB,SO,ZA,GS,ES,LK,SH,PM,SD,SR,SJ,SZ,SE,CH,SY,TW,TJ,TZ,"+ + "TH,TG,TK,TO,TT,TN,TR,TM,TC,TV,UG,UA,AE,GB,US,UM,UY,UZ,VU,VE,VN,"+ + "VG,VI,WF,EH,YE,YU,ZM,ZW,").indexOf(country+","); + if (index == -1 || language.length() != 2) + throw new MissingResourceException + ("Can't find ISO3 country for "+country, + "java.util.Locale", country); + + /* Don't read this aloud. This are the three letter country codes + */ + return + ("AFGALBDZAASMANDAGOAIAATAATGARGARMABWAUSAUTAZEBHSBHRBGDBRBBLRBEL"+ + "BLZBENBMUBTNBOLBIHBWABVTBRAIOTBRNBGRBFABDIKHMCMRCANCPVCYMCAFTCD"+ + "CHLCHNCXRCCKCOLCOMCOGCODCOKCRICIVHRVCUBCYPCZEDNKDJIDMADOMTMPECU"+ + "EGYSLVGNQERIESTETHFLKFROFJIFINFRAFXXGUFPYFATFGABGMBGEODEUGHAGIB"+ + "GRCGRLGRDGLPGUMGTMGINGNBGUYHTIHMDVATHNDHKGHUNISLINDIDNIRNIRQIRL"+ + "ISRITAJAMJPNJORKAZKENKIRPRKKORKWTKGZLAOLVALBNLSOLBRLBYLIELTULUX"+ + "MACMKDMDGMWIMYSMDVMLIMLTMHLMTQMRTMUSMYTMEXFSMMDAMCOMNGMSRMARMOZ"+ + "MMRNAMNRUNPLNLDANTNCLNZLNICNERNGANIUNFKMNPNOROMNPAKPLWPANPNGPRY"+ + "PERPHLPCNPOLPRTPRIQATREUROMRUSRWAKNALCAVCTWSMSMRSTPSAUSENSYCSLE"+ + "SGPSVKSVNSLBSOMZAFSGSESPLKASHNSPMSDNSURSJMSWZSWECHESYRTWNTJKTZA"+ + "THATGOTKLTONTTOTUNTURTKMTCATUVUGAUKRAREGBRUSAUMIURYUZBVUTVENVNM"+ + "VGBVIRWLFESHYEMYUGZMBZWE").substring(index, index+3); + } + + /** + * Gets the country name suitable for display to the user, formatted + * for the default locale. This has the same effect as + * <pre> + * getDisplayLanguage(Locale.getDefault()); + * </pre> + * + * @return the language name of this locale localized to the + * default locale. If the localized is not found, the ISO code + * is returned. + */ + public String getDisplayLanguage() { + return getDisplayLanguage(getDefault()); } - // setup the default locale - defaultL = new Locale(System.getProperty("user.language", "en"), - System.getProperty("user.region", ""), - System.getProperty("user.variant", "")); - } - - /** - * Locale which represents the English language. - */ - public static final Locale ENGLISH = new Locale("en", ""); - /** - * Locale which represents the English language. - */ - public static final Locale FRENCH = new Locale("fr", ""); - /** - * Locale which represents the German language. - */ - public static final Locale GERMAN = new Locale("de", ""); - /** - * Locale which represents the Italian language. - */ - public static final Locale ITALIAN = new Locale("it", ""); - /** - * Locale which represents the Japanese language. - */ - public static final Locale JAPANESE = new Locale("ja", ""); - /** - * Locale which represents the Korean language. - */ - public static final Locale KOREAN = new Locale("ko", ""); - /** - * Locale which represents the Chinese language. - */ - public static final Locale CHINESE = new Locale("zh", ""); - /** - * Locale which represents the Chinese language as used in China. - */ - public static final Locale SIMPLIFIED_CHINESE = new Locale("zh", "CN"); - /** - * Locale which represents the Chinese language as used in Taiwan. - * Same as TAIWAN Locale. - */ - public static final Locale TRADITIONAL_CHINESE = new Locale("zh", "TW"); - /** - * Locale which represents France. - */ - public static final Locale FRANCE = new Locale("fr", "FR"); - /** - * Locale which represents Germany. - */ - public static final Locale GERMANY = new Locale("de", "DE"); - /** - * Locale which represents Italy. - */ - public static final Locale ITALY = new Locale("it", "IT"); - /** - * Locale which represents Japan. - */ - public static final Locale JAPAN = new Locale("ja", "JP"); - /** - * Locale which represents Korea. - */ - public static final Locale KOREA = new Locale("ko", "KR"); - /** - * Locale which represents China. - * Same as SIMPLIFIED_CHINESE Locale. - */ - public static final Locale CHINA = SIMPLIFIED_CHINESE; - /** - * Locale which represents the People's Republic of China. - * Same as CHINA Locale. - */ - public static final Locale PRC = CHINA; - /** - * Locale which represents Taiwan. - * Same as TRADITIONAL_CHINESE Locale. - */ - public static final Locale TAIWAN = TRADITIONAL_CHINESE; - /** - * Locale which represents the United Kingdom. - */ - public static final Locale UK = new Locale("en", "GB"); - /** - * Locale which represents the United States. - */ - public static final Locale US = new Locale("en", "US"); - /** - * Locale which represents the English speaking portion of Canada. - */ - public static final Locale CANADA = new Locale("en", "CA"); - /** - * Locale which represents the French speaking portion of Canada. - */ - public static final Locale CANADA_FRENCH = new Locale("fr", "CA"); - - /** - * Constructs a new locale using an ISO 639 A2 language code, - * an ISO 3166 A2 country code, and an uppercase variant string. - */ - public Locale(String language, String country, String variant) { - this.language = language.toLowerCase(); - - String old639 = new639.getProperty(this.language); - if (old639 != null) - language = old639; - - this.country = country.toUpperCase(); - this.variant = variant.toUpperCase(); - } - - /** - * Constructs a new locale using an ISO 639 A2 language code and - * an ISO 3166 A2 country code. - */ - public Locale(String language, String country) { - this(language, country, ""); - } - - /** - * Returns the default locale. - * - * @return default locale - */ - public static Locale getDefault() { - return defaultL; - } - - /** - * Sets the default locale. - * Generally called once at the start of a program. - * - * @param newLoc the new default locale - */ - public static void setDefault(Locale newLoc) { - defaultL = newLoc; - } - - /** - * Clones this locale. - * - * @return a deep copy of this locale - */ - public Object clone() { - Object o = null; - try { - o = super.clone(); - } catch (CloneNotSupportedException e) { } - return o; - } - - /** - * Compares a locale to this locale. - * - * @param o Locale to compare to this - * - * @return true if o is a Locale and has the same language, country, - * and variant portions as this locale, else false - */ - public boolean equals(Object o) { - if (!(o instanceof Locale)) return false; - Locale ol = (Locale) o; - return (language.equals(ol.language) && - country.equals(ol.country) && - variant.equals(ol.variant)); - } - - /** - * Gets the country code for this locale. - * - * @return country code portion of this locale, or an empty String if - * none exists - */ - public String getCountry() { - return country; - } - - /** - * Gets the language code for this locale. - * - * @return language code portion of this locale, or an empty String if - * none exists - */ - public String getLanguage() { - return language; - } - - /** - * Gets the variant string portion of this locale. - * - * @return variant code portion of this locale, or an empty String if - * none exists - */ - public String getVariant() { - return variant; - } - - /** - * Gets the country name suitable for display to the user, formatted - * for a specified locale. - * - * @param inLocale locale to use for formatting - * - * @return name of the country formatted for inLocale, or - * if inLocale does not have formatting information for the country, - * the country formatted for English, or if the English locale - * does not have information for formatting this country, then - * the country code is returned, or the empty string if this locale - * has no country code. - */ - public String getDisplayCountry(Locale inLocale) { - ResourceBundle ISO3166 = ResourceBundle.getBundle("/gnu/java/locale/iso3166", - inLocale); - try { - return ISO3166.getString(country); - } catch (MissingResourceException e) { - return country; + + /** + * Gets the language name suitable for display to the user, formatted + * for a specified locale. + * @param locale locale to use for formatting + * @return the language name of this locale localized to the + * given locale. If the localized is not found, the ISO code + * is returned. + */ + public String getDisplayLanguage(Locale locale) { + try { + ResourceBundle bundle + = ResourceBundle.getBundle("gnu.java.locale.iso639", locale); + return bundle.getString(language); + } catch (MissingResourceException ex) { + return language; + } } - } - - /** - * Gets the country name suitable for display to the user, formatted - * for the default locale. - * - * @return name of the country formatted for the default locale, or - * if the default locale does not have formatting information for the - * country, the country formatted for English, or if the English locale - * does not have information for formatting this country, then - * the country code is returned, or the empty string if this locale - * has no country code. - */ - public String getDisplayCountry() { - return getDisplayCountry(defaultL); - } - - /** - * Gets the language name suitable for display to the user, formatted - * for a specified locale. - * - * @param inLocale locale to use for formatting - * - * @return name of the language formatted for inLocale, or - * if inLocale does not have formatting information for the language, - * the language formatted for English, or if the English locale - * does not have information for formatting this language, then - * the language code is returned, or the empty string if this locale - * has no language code. - */ - public String getDisplayLanguage(Locale inLocale) { - ResourceBundle ISO639 = ResourceBundle.getBundle( - "/gnu/java/locale/iso639", inLocale); - try { - return ISO639.getString(language); - } catch (MissingResourceException e) { - return language; + + /** + * Returns the country name of this locale localized to the + * default locale. If the localized is not found, the ISO code + * is returned. This has the same effect as + * <pre> + * getDisplayCountry(Locale.getDefault()); + * </pre> + */ + public String getDisplayCountry() { + return getDisplayCountry(getDefault()); + } + + /** + * Gets the country name suitable for display to the user, formatted + * for a specified locale. + * + * @param locale locale to use for formatting + * @return the country name of this locale localized to the given + * locale. If the localized is not found, the ISO country code is + * returned. */ + public String getDisplayCountry(Locale locale) { + try { + ResourceBundle bundle = + ResourceBundle.getBundle("gnu.java.locale.iso3166", locale); + return bundle.getString(country); + } catch (MissingResourceException ex) { + return country; + } } - } - - /** - * Gets the language name suitable for display to the user, formatted - * for the default locale. - * - * @return name of the language formatted for the default locale, or - * if the default locale does not have formatting information for the - * language, the language formatted for English, or if the English locale - * does not have information for formatting this language, then - * the language code is returned, or the empty string if this locale - * has no language code. - */ - public String getDisplayLanguage() { - return getDisplayLanguage(defaultL); - } - - - /** - * Gets the variant names suitable for display to the user, formatted - * for a specified locale. - * - * @param inLocale locale to use for formatting - * - * @return name of the variants formatted for inLocale, or - * if inLocale does not have formatting information for the variants, - * the variants formatted for English, or the empty string if this locale - * has no variant names. - */ - public String getDisplayVariant(Locale inLocale) { - return variant; - } - - /** - * Gets the variant names suitable for display to the user, formatted - * for the default locale. - * - * @return name of the variants formatted for the default locale, or - * if the default locale does not have formatting information for the - * variants, the variants formatted for English, or the empty string - * if this locale has no variant names. - */ - public String getDisplayVariant() { - return getDisplayVariant(defaultL); - } - - /** - * Gets all local components suitable for display to the user, formatted - * for the default locale. For the language component, getDisplayLanguage - * is called. For the country component, getDisplayCountry is called. - * For the variant set component, getDisplayVariant is called. - * <br><br> - * The returned String will be one of the following forms:<br> - * <pre> - * language (country, variant) - * language (country) - * language (variant) - * country (variant) - * language - * country - * variant - * </pre> - * - * @return String version of this locale, suitable for display to the - * user - */ - public String getDisplayName() { - return getDisplayName(defaultL); - } - - /** - * Gets all local components suitable for display to the user, formatted - * for a specified locale. For the language component, - * getDisplayLanguage(Locale) is called. For the country component, - * getDisplayCountry(Locale) is called. For the variant set component, - * getDisplayVariant(Locale) is called. - * <br><br> - * The returned String will be one of the following forms:<br> - * <pre> - * language (country, variant) - * language (country) - * language (variant) - * country (variant) - * language - * country - * variant - * </pre> - * - * @param inLocale locale to use for formatting - * - * @return String version of this locale, suitable for display to the - * user - */ - public String getDisplayName(Locale inLocale) { - String locale[] = new String[3]; - locale[0] = getDisplayLanguage(inLocale); - locale[1] = getDisplayCountry(inLocale); - locale[2] = getDisplayVariant(inLocale); - - // determine how many elements are empty - int numEmpty = 0; - for (int i = 0; i < 3; i++) - if (locale[i].length() == 0) - numEmpty++; - - switch (numEmpty) { - case 3: - return ""; - case 2: - for (int i = 0; i < 3; i++) - if (locale[i].length() != 0) - return locale[i]; - case 1: - StringBuffer sb = new StringBuffer(); - boolean first = true; - for (int i = 0; i < 3; i++) - if (locale[i].length() != 0) { - sb.append(locale[i]); - if (first) { - sb.append(" ("); - first = false; - } else { - sb.append(")"); - break; - } - } - return sb.toString(); - case 0: - return locale[0] + " (" + locale[1] + ", " + locale[2] + ")"; + + /** + * Returns the variant name of this locale localized to the + * default locale. If the localized is not found, the variant code + * itself is returned. This has the same effect as + * <pre> + * getDisplayVariant(Locale.getDefault()); + * </pre> + */ + public String getDisplayVariant() { + return getDisplayVariant(getDefault()); } - return ""; - } - - /** - * Gets the local components, formatted for display to a programmer. - * - * @return ISO 639 A2 code + "_" + ISO 3166 A2 code + "_" + variant - */ - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append(language); - if (country.length() != 0) { - if (sb.length() > 0) - sb.append('_'); - sb.append(country); + + /** + * Returns the variant name of this locale localized to the + * given locale. If the localized is not found, the variant code + * itself is returned. + */ + public String getDisplayVariant(Locale locale) { + /*XXX - load a bundle? */ + return variant; } - if (variant.length() != 0) { - if (sb.length() > 0) - sb.append('_'); - sb.append(variant); + + /** + * Gets all local components suitable for display to the user, formatted + * for the default locale. For the language component, getDisplayLanguage + * is called. For the country component, getDisplayCountry is called. + * For the variant set component, getDisplayVariant is called. + * <br><br> + * The returned String will be one of the following forms:<br> + * <pre> + * language (country, variant) + * language (country) + * language (variant) + * country (variant) + * language + * country + * variant + * </pre> + * @return String version of this locale, suitable for display to the + * user. + */ + public String getDisplayName() { + return getDisplayName(getDefault()); + } + + /** + * Gets all local components suitable for display to the user, formatted + * for a specified locale. For the language component, + * getDisplayLanguage(Locale) is called. For the country component, + * getDisplayCountry(Locale) is called. For the variant set component, + * getDisplayVariant(Locale) is called. + * <br><br> + * The returned String will be one of the following forms:<br> + * <pre> + * language (country, variant) + * language (country) + * language (variant) + * country (variant) + * language + * country + * variant + * </pre> + * + * @param locale locale to use for formatting + * + * @return String version of this locale, suitable for display to the + * user. + */ + public String getDisplayName(Locale locale) { + StringBuffer result = new StringBuffer(); + int count = 0; + String[] delimiters = { "", " (", "," }; + if (language.length() != 0) { + result.append(delimiters[count++]); + result.append(getDisplayLanguage(locale)); + } + + if (country.length() != 0) { + result.append(delimiters[count++]); + result.append(getDisplayCountry(locale)); + } + + if (variant.length() != 0) { + result.append(delimiters[count++]); + result.append(getDisplayVariant(locale)); + } + + if (count > 1) + result.append(")"); + return result.toString(); + } + + /** + * Does the same as <code>Object.clone()</code> but does not throw + * an <code>CloneNotSupportedException</code>. Why anyone would + * use this method is a secret to me, since this class is + * immutable. + */ + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException ex) { + return null; + } + } + + /** + * Return the hash code for this locale. The hashcode is the logical + * xor of the hash codes of the language, the country and the variant. + * The hash code is precomputed, since <code>Locale</code>s are often + * used in hash tables. + */ + public int hashCode() { + return hashcode; + } + + /** + * Compares two locales. + * @param obj the other locale. + * @return true, if obj is a Locale with the same language, country, and + * variant code as this locale, otherwise false. + */ + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!(obj instanceof Locale)) + return false; + Locale l = (Locale) obj; + return language.equals(l.language) + && country.equals(l.country) + && variant.equals(l.variant); + } + + /** + * @serialdata According to jdk1.2 the hashcode should always be + * written as -1; + */ + private void writeObject(java.io.ObjectOutputStream output) + throws java.io.IOException { + hashcode = -1; + output.defaultWriteObject(); + } + + /** + * @serialdata According to jdk1.2 the hashCode is always invalid + * and must be recomputed. + */ + private void readObject(java.io.ObjectInputStream input) + throws java.io.IOException, ClassNotFoundException { + input.defaultReadObject(); + hashcode = language.hashCode() ^ country.hashCode() + ^ variant.hashCode(); } - return sb.toString(); - } - - /** - * Gets the ISO 639-2/T code for the language of this locale. - * - * @return ISO 639-2/T code, or the empty string if this locale - * does not specify a language - * - * @exception MissingResourceException if the 639-1 language code - * does not have a 639-2/T mapping - */ - public String getISO3Language() throws MissingResourceException { - if (language.length() == 0) return language; - String a3 = ISO639A3.getProperty(language); - if (a3 == null) - throw new - MissingResourceException("No ISO 639-2/T code for " + language, - "/gnu/java/locale/iso639-a3 ", - language); - return a3; - } - - /** - * Gets the ISO 3166 A3 code for the country of this locale. - * - * @return ISO 3166 A3 code, or the empty string if this locale - * does not specify a country - * - * @exception MissingResourceException if the 3166 A2 language code - * does not have a 3166 A3 mapping - */ - public String getISO3Country() throws MissingResourceException { - if (country.length() == 0) return country; - String a3 = ISO3166A3.getProperty(country); - if (a3 == null) - throw new - MissingResourceException("No ISO 3166 A3 code for " + country, - "gnu.java.locale.iso3166-a3", - country); - return a3; - } - - /** - * Calculates the hash code for this locale. - * Hash codes are cached. - * - * @return the hash code - */ - public int hashCode() { - if (hashcode != 0) return hashcode; - hashcode = (language + country + variant).hashCode(); - return hashcode; - } } |