home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 February / VPR9802A.ISO / APP_DEMO / VC / MAIN.BIN / LocaleData.java < prev    next >
Text File  |  1997-10-27  |  11KB  |  306 lines

  1. /*
  2.  * @(#)LocaleData.java    1.12 97/02/24
  3.  *
  4.  * (C) Copyright Taligent, Inc. 1996 - All Rights Reserved
  5.  * (C) Copyright IBM Corp. 1996 - All Rights Reserved
  6.  *
  7.  * Portions copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved.
  8.  *
  9.  *   The original version of this source code and documentation is copyrighted
  10.  * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These
  11.  * materials are provided under terms of a License Agreement between Taligent
  12.  * and Sun. This technology is protected by multiple US and International
  13.  * patents. This notice and attribution to Taligent may not be removed.
  14.  *   Taligent is a registered trademark of Taligent, Inc.
  15.  *
  16.  * Permission to use, copy, modify, and distribute this software
  17.  * and its documentation for NON-COMMERCIAL purposes and without
  18.  * fee is hereby granted provided that this copyright notice
  19.  * appears in all copies. Please refer to the file "copyright.html"
  20.  * for further important copyright and licensing information.
  21.  *
  22.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  23.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  24.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  25.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  26.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  27.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  28.  *
  29.  */
  30.  
  31. package java.text.resources;
  32.  
  33. import java.util.Locale;
  34. import java.util.ResourceBundle;
  35. import java.util.Hashtable;
  36. import java.util.Enumeration;
  37.  
  38. /**
  39.  * An internal data warehouse for information (locale elements) needed to
  40.  * implement locale dependent formatting for the standard set of locales
  41.  * The current implementation utilizes a class LocaleElements which is
  42.  * created from plain text source file(s) by a small compiler (LocaleTool)
  43.  *
  44.  * Example of use:
  45.  * <pre>
  46.  *  Locale desiredLocale = new Locale("DA","DK","");
  47.  *  ResourceBundle resource = ResourceBundle.load("java.util.LocaleElements",
  48.  *                                    desiredLocale);
  49.  *  // Pass one of the following:
  50.  *  "LocaleString",      // locale id based on iso codes
  51.  *  "LocaleID",          // Windows id
  52.  *  "ShortLanguage",     // iso-3 abbrev lang name
  53.  *  "ShortCountry",      // iso-3 abbrev country name
  54.  *  "Languages",         // language names
  55.  *  "Countries",         // country names
  56.  *  "MonthNames",        // ARRAY january
  57.  *  "MonthAbbreviations",   // ARRAY abb january
  58.  *  "DayNames",          // ARRAY Monday
  59.  *  "DayAbbreviations",  // ARRAY abb Monday
  60.  *  "AmPmMarkers",       // ARRAY am marker
  61.  *  "Eras",              // era strings
  62.  *  "NumberPatterns",    // ARRAY decimal pattern
  63.  *  "CurrencyElements",  // ARRAY local currency symbol
  64.  *  "DateTimePatterns",  // ARRAY full time pattern
  65.  *  "DateTimeElements",  // ARRAY first day of week
  66.  *  "CollationElements", // collation order
  67.  *
  68.  *  String myString string = resource.getString(LocaleString);
  69.  *  // or
  70.  *  String[] myStrings strings = resource.getStringArray(LocaleString);
  71.  * </pre>
  72.  * @author Asmus Freytag
  73.  * @author Mark Davis
  74.  * @version 1.12 02/24/97
  75.  */
  76.  
  77. public class LocaleData extends ResourceBundle {
  78.  
  79.     // each subclass MUST call Init() in its constructor.
  80.     public Object handleGetObject(String key)
  81.     {
  82.         return localeKeys.get(key);
  83.     }
  84.  
  85.     // use to get the list of locales that have this data
  86.     public static Locale[] getAvailableLocales(String key)
  87.     {
  88.         return localeList;  // hard-coded for now
  89.     }
  90.  
  91.     /**
  92.      * Implementation of ResourceBundle.getKeys.
  93.      */
  94.     public Enumeration getKeys() {
  95.         return localeKeys.keys();
  96.     }
  97.  
  98.     // given string data that matches the keys, sets up the hash
  99.     // table for quick access.
  100.     protected void init(String[] data) {
  101.         if (data.length != keys.length) {
  102.             System.out.println("Data length (" + data.length +
  103.                                ") != key length (" + keys.length + ")");
  104.             throw new ArrayIndexOutOfBoundsException();
  105.         }
  106.         // set ups a hashtable for the locale keys
  107.         localeKeys = new Hashtable();
  108.  
  109.         int oldIndex = 0;
  110.         int i;
  111.         for(i = 1; i < data.length; i++ )
  112.         {
  113.             if (!keys[i].equals(keys[oldIndex])) {
  114.                 storeStrings(data,oldIndex, i-1);
  115.                 oldIndex = i;
  116.             }
  117.         }
  118.         storeStrings(data,oldIndex, i-1);
  119.     }
  120.  
  121.     // ========== privates ==========
  122.  
  123.     private Hashtable localeKeys;
  124.  
  125.     /*
  126.      * Splits the string into pieces that it returns in an array.
  127.      * @param source string to split
  128.      * @separator char to use to split. NOTE: two separators in a row,
  129.      * or one at the end or start, will produce a null string; e.g.
  130.      * ";a;b;" -> {"", "a", "b", ""}
  131.      */
  132.     private static String[] split(String source, char separator) {
  133.         String[] temp = new String[200]; // TODO remove limited length
  134.         int oldOffset = 0;
  135.         int i;
  136.         for (i = 0; oldOffset < source.length(); ++i) {
  137.             int newOffset = source.indexOf(separator, oldOffset);
  138.             if (newOffset == -1)
  139.                 newOffset = source.length();
  140.             temp[i] = source.substring(oldOffset, newOffset);
  141.             oldOffset = newOffset + 1;
  142.         }
  143.         String[] result = new String[i];
  144.         System.arraycopy(temp,0,result,0,i);
  145.         return result;
  146.     }
  147.     // stores either a single string, or an array (in case of multiple keys)
  148.     private void storeStrings(String[] data, int start, int end) {
  149.         if (keys[start].equals("Eras")
  150.             || keys[start].equals("Languages")
  151.             || keys[start].equals("Countries")) {
  152.             String[] strings = split(data[start], ';');
  153.             // workaround for bug
  154.             for (int i = 0; i < strings.length; ++i)
  155.                 strings[i] = strings[i].trim();
  156.             // break up "_'
  157.             if (keys[start].equals("Eras"))
  158.                 localeKeys.put(keys[start], strings);
  159.             else {
  160.                 String[][] pairedStrings = new String[strings.length][2];
  161.                 for (int i = 0; i < strings.length; ++i)
  162.                     pairedStrings[i] = split(strings[i],'_');
  163.                 localeKeys.put(keys[start], pairedStrings);
  164.             }
  165.         } else if (start == end) { // store single string
  166.             localeKeys.put(keys[start], data[start]);
  167.         } else {
  168.             String[] temp = new String[end - start + 1];
  169.             System.arraycopy(data, start, temp, 0, end - start + 1);
  170.             localeKeys.put(keys[start], temp);
  171.         }
  172.     }
  173.  
  174.     private static String keys[] = {
  175.         "LocaleString",/*locale id based on iso codes*/
  176.         "LocaleID",/*Windows id*/
  177.         "ShortLanguage",/*iso-3 abbrev lang name*/
  178.         "ShortCountry",/*iso-3 abbrev country name*/
  179.         "Languages",/*language names*/
  180.         "Countries",/*country names*/
  181.         "MonthNames",/*january*/
  182.         "MonthNames",/*february*/
  183.         "MonthNames",/*march*/
  184.         "MonthNames",/*april*/
  185.         "MonthNames",/*may*/
  186.         "MonthNames",/*june*/
  187.         "MonthNames",/*july*/
  188.         "MonthNames",/*august*/
  189.         "MonthNames",/*september*/
  190.         "MonthNames",/*october*/
  191.         "MonthNames",/*november*/
  192.         "MonthNames",/*december*/
  193.         "MonthNames",/*month 13 if applicable*/
  194.         "MonthAbbreviations",/*abb january*/
  195.         "MonthAbbreviations",/*abb february*/
  196.         "MonthAbbreviations",/*abb march*/
  197.         "MonthAbbreviations",/*abb april*/
  198.         "MonthAbbreviations",/*abb may*/
  199.         "MonthAbbreviations",/*abb june*/
  200.         "MonthAbbreviations",/*abb july*/
  201.         "MonthAbbreviations",/*abb august*/
  202.         "MonthAbbreviations",/*abb september*/
  203.         "MonthAbbreviations",/*abb october*/
  204.         "MonthAbbreviations",/*abb november*/
  205.         "MonthAbbreviations",/*abb december*/
  206.         "MonthAbbreviations",/*abb month 13 if applicable*/
  207.         "DayNames",/*Monday*/
  208.         "DayNames",/*Tuesday*/
  209.         "DayNames",/*Wednesday*/
  210.         "DayNames",/*Thursday*/
  211.         "DayNames",/*Friday*/
  212.         "DayNames",/*Saturday*/
  213.         "DayNames",/*Sunday*/
  214.         "DayAbbreviations",/*abb Monday*/
  215.         "DayAbbreviations",/*abb Tuesday*/
  216.         "DayAbbreviations",/*abb Wednesday*/
  217.         "DayAbbreviations",/*abb Thursday*/
  218.         "DayAbbreviations",/*abb Friday*/
  219.         "DayAbbreviations",/*abb Saturday*/
  220.         "DayAbbreviations",/*abb Sunday*/
  221.         "AmPmMarkers",/*am marker*/
  222.         "AmPmMarkers",/*pm marker*/
  223.         "Eras",/*era strings*/
  224.         "NumberPatterns",/*decimal pattern*/
  225.         "NumberPatterns",/*currency pattern*/
  226.         "NumberPatterns",/*percent pattern*/
  227.         "NumberElements",/*decimal separator*/
  228.         "NumberElements",/*group (thousands) separator*/
  229.         "NumberElements",/*list separator*/
  230.         "NumberElements",/*percent sign*/
  231.         "NumberElements",/*native 0 digit*/
  232.         "NumberElements",/*pattern digit*/
  233.         "NumberElements",/*minus sign*/
  234.         "NumberElements",/*exponential*/
  235.         "CurrencyElements",/*local currency symbol*/
  236.         "CurrencyElements",/*intl currency symbol*/
  237.         "CurrencyElements",/*monetary decimal separator*/
  238.         "DateTimePatterns",/*full time pattern*/
  239.         "DateTimePatterns",/*long time pattern*/
  240.         "DateTimePatterns",/*medium time pattern*/
  241.         "DateTimePatterns",/*short time pattern*/
  242.         "DateTimePatterns",/*full date pattern*/
  243.         "DateTimePatterns",/*long date pattern*/
  244.         "DateTimePatterns",/*medium date pattern*/
  245.         "DateTimePatterns",/*short date pattern*/
  246.         "DateTimePatterns",/*date-time pattern*/
  247.         "DateTimeElements",/*first day of week*/
  248.         "DateTimeElements",/*min days in first week*/
  249.         "CollationElements",/*collation order*/
  250.     };
  251.  
  252.     // for now, we hard-code the enumeration
  253.     private static Locale[] localeList = {
  254.     new Locale("ar", "", ""),
  255.     new Locale("be", "", ""),
  256.     new Locale("bg", "", ""),
  257.     new Locale("ca", "", ""),
  258.     new Locale("cs", "", ""),
  259.     new Locale("da", "", ""),
  260.     new Locale("de", "", ""),
  261.     new Locale("de", "AT", ""),
  262.     new Locale("de", "CH", ""),
  263.     new Locale("el", "", ""),
  264.     new Locale("en", "CA", ""),
  265.     new Locale("en", "GB", ""),
  266.     new Locale("en", "IE", ""),
  267.     new Locale("en", "US", ""),
  268.     new Locale("es", "", ""),
  269.     new Locale("et", "", ""),
  270.     new Locale("fi", "", ""),
  271.     new Locale("fr", "", ""),
  272.     new Locale("fr", "BE", ""),
  273.     new Locale("fr", "CA", ""),
  274.     new Locale("fr", "CH", ""),
  275.     new Locale("hr", "", ""),
  276.     new Locale("hu", "", ""),
  277.     new Locale("is", "", ""),
  278.     new Locale("it", "", ""),
  279.     new Locale("it", "CH", ""),
  280.     new Locale("iw", "", ""),
  281.     new Locale("ja", "", ""),
  282.     new Locale("ko", "", ""),
  283.     new Locale("lt", "", ""),
  284.     new Locale("lv", "", ""),
  285.     new Locale("mk", "", ""),
  286.     new Locale("nl", "", ""),
  287.     new Locale("nl", "BE", ""),
  288.     new Locale("no", "", ""),
  289.     new Locale("no", "NO", "NY"),
  290.     new Locale("pl", "", ""),
  291.     new Locale("pt", "", ""),
  292.     new Locale("ro", "", ""),
  293.     new Locale("ru", "", ""),
  294.     new Locale("sh", "", ""),
  295.     new Locale("sk", "", ""),
  296.     new Locale("sl", "", ""),
  297.     new Locale("sq", "", ""),
  298.     new Locale("sr", "", ""),
  299.     new Locale("sv", "", ""),
  300.     new Locale("tr", "", ""),
  301.     new Locale("uk", "", ""),
  302.     new Locale("zh", "", ""),
  303.     new Locale("zh", "TW", "")
  304.     };
  305. }
  306.