home *** CD-ROM | disk | FTP | other *** search
/ Computer Active 2010 August / CA08.iso / Multimedija / shufflr.air / ShufflrClient.swf / scripts / mx / resources / LocaleSorter.as < prev    next >
Encoding:
Text File  |  2010-06-23  |  17.4 KB  |  742 lines

  1. package mx.resources
  2. {
  3.    import mx.core.mx_internal;
  4.    
  5.    use namespace mx_internal;
  6.    
  7.    public class LocaleSorter
  8.    {
  9.       mx_internal static const VERSION:String = "3.5.0.12683";
  10.       
  11.       public function LocaleSorter()
  12.       {
  13.          super();
  14.       }
  15.       
  16.       private static function normalizeLocale(param1:String) : String
  17.       {
  18.          return param1.toLowerCase().replace(/-/g,"_");
  19.       }
  20.       
  21.       public static function sortLocalesByPreference(param1:Array, param2:Array, param3:String = null, param4:Boolean = false) : Array
  22.       {
  23.          var result:Array = null;
  24.          var hasLocale:Object = null;
  25.          var i:int = 0;
  26.          var j:int = 0;
  27.          var k:int = 0;
  28.          var l:int = 0;
  29.          var locale:String = null;
  30.          var plocale:LocaleID = null;
  31.          var appLocales:Array = param1;
  32.          var systemPreferences:Array = param2;
  33.          var ultimateFallbackLocale:String = param3;
  34.          var addAll:Boolean = param4;
  35.          var promote:Function = function(param1:String):void
  36.          {
  37.             if(typeof hasLocale[param1] != "undefined")
  38.             {
  39.                result.push(appLocales[hasLocale[param1]]);
  40.                delete hasLocale[param1];
  41.             }
  42.          };
  43.          result = [];
  44.          hasLocale = {};
  45.          var locales:Array = trimAndNormalize(appLocales);
  46.          var preferenceLocales:Array = trimAndNormalize(systemPreferences);
  47.          addUltimateFallbackLocale(preferenceLocales,ultimateFallbackLocale);
  48.          j = 0;
  49.          while(j < locales.length)
  50.          {
  51.             hasLocale[locales[j]] = j;
  52.             j++;
  53.          }
  54.          i = 0;
  55.          l = int(preferenceLocales.length);
  56.          while(i < l)
  57.          {
  58.             plocale = LocaleID.fromString(preferenceLocales[i]);
  59.             promote(preferenceLocales[i]);
  60.             promote(plocale.toString());
  61.             while(plocale.transformToParent())
  62.             {
  63.                promote(plocale.toString());
  64.             }
  65.             plocale = LocaleID.fromString(preferenceLocales[i]);
  66.             j = 0;
  67.             while(j < l)
  68.             {
  69.                locale = preferenceLocales[j];
  70.                if(plocale.isSiblingOf(LocaleID.fromString(locale)))
  71.                {
  72.                   promote(locale);
  73.                }
  74.                j++;
  75.             }
  76.             j = 0;
  77.             k = int(locales.length);
  78.             while(j < k)
  79.             {
  80.                locale = locales[j];
  81.                if(plocale.isSiblingOf(LocaleID.fromString(locale)))
  82.                {
  83.                   promote(locale);
  84.                }
  85.                j++;
  86.             }
  87.             i++;
  88.          }
  89.          if(addAll)
  90.          {
  91.             j = 0;
  92.             k = int(locales.length);
  93.             while(j < k)
  94.             {
  95.                promote(locales[j]);
  96.                j++;
  97.             }
  98.          }
  99.          return result;
  100.       }
  101.       
  102.       private static function addUltimateFallbackLocale(param1:Array, param2:String) : void
  103.       {
  104.          var _loc3_:String = null;
  105.          if(param2 != null && param2 != "")
  106.          {
  107.             _loc3_ = normalizeLocale(param2);
  108.             if(param1.indexOf(_loc3_) == -1)
  109.             {
  110.                param1.push(_loc3_);
  111.             }
  112.          }
  113.       }
  114.       
  115.       private static function trimAndNormalize(param1:Array) : Array
  116.       {
  117.          var _loc2_:Array = [];
  118.          var _loc3_:int = 0;
  119.          while(_loc3_ < param1.length)
  120.          {
  121.             _loc2_.push(normalizeLocale(param1[_loc3_]));
  122.             _loc3_++;
  123.          }
  124.          return _loc2_;
  125.       }
  126.    }
  127. }
  128.  
  129. class LocaleID
  130. {
  131.    public static const STATE_PRIMARY_LANGUAGE:int = 0;
  132.    
  133.    public static const STATE_EXTENDED_LANGUAGES:int = 1;
  134.    
  135.    public static const STATE_SCRIPT:int = 2;
  136.    
  137.    public static const STATE_REGION:int = 3;
  138.    
  139.    public static const STATE_VARIANTS:int = 4;
  140.    
  141.    public static const STATE_EXTENSIONS:int = 5;
  142.    
  143.    public static const STATE_PRIVATES:int = 6;
  144.    
  145.    private var privateLangs:Boolean = false;
  146.    
  147.    private var script:String = "";
  148.    
  149.    private var variants:Array = [];
  150.    
  151.    private var privates:Array = [];
  152.    
  153.    private var extensions:Object = {};
  154.    
  155.    private var lang:String = "";
  156.    
  157.    private var region:String = "";
  158.    
  159.    private var extended_langs:Array = [];
  160.    
  161.    public function LocaleID()
  162.    {
  163.       super();
  164.    }
  165.    
  166.    private static function appendElements(param1:Array, param2:Array) : void
  167.    {
  168.       var _loc3_:uint = 0;
  169.       var _loc4_:uint = param2.length;
  170.       while(_loc3_ < _loc4_)
  171.       {
  172.          param1.push(param2[_loc3_]);
  173.          _loc3_++;
  174.       }
  175.    }
  176.    
  177.    public static function fromString(param1:String) : LocaleID
  178.    {
  179.       var _loc5_:Array = null;
  180.       var _loc8_:String = null;
  181.       var _loc9_:int = 0;
  182.       var _loc10_:String = null;
  183.       var _loc2_:LocaleID = new LocaleID();
  184.       var _loc3_:int = int(STATE_PRIMARY_LANGUAGE);
  185.       var _loc4_:Array = param1.replace(/-/g,"_").split("_");
  186.       var _loc6_:int = 0;
  187.       var _loc7_:int = int(_loc4_.length);
  188.       while(_loc6_ < _loc7_)
  189.       {
  190.          _loc8_ = _loc4_[_loc6_].toLowerCase();
  191.          if(_loc3_ == STATE_PRIMARY_LANGUAGE)
  192.          {
  193.             if(_loc8_ == "x")
  194.             {
  195.                _loc2_.privateLangs = true;
  196.             }
  197.             else if(_loc8_ == "i")
  198.             {
  199.                _loc2_.lang += "i-";
  200.             }
  201.             else
  202.             {
  203.                _loc2_.lang += _loc8_;
  204.                _loc3_ = int(STATE_EXTENDED_LANGUAGES);
  205.             }
  206.          }
  207.          else
  208.          {
  209.             _loc9_ = _loc8_.length;
  210.             if(_loc9_ != 0)
  211.             {
  212.                _loc10_ = _loc8_.charAt(0).toLowerCase();
  213.                if(_loc3_ <= STATE_EXTENDED_LANGUAGES && _loc9_ == 3)
  214.                {
  215.                   _loc2_.extended_langs.push(_loc8_);
  216.                   if(_loc2_.extended_langs.length == 3)
  217.                   {
  218.                      _loc3_ = int(STATE_SCRIPT);
  219.                   }
  220.                }
  221.                else if(_loc3_ <= STATE_SCRIPT && _loc9_ == 4)
  222.                {
  223.                   _loc2_.script = _loc8_;
  224.                   _loc3_ = int(STATE_REGION);
  225.                }
  226.                else if(_loc3_ <= STATE_REGION && (_loc9_ == 2 || _loc9_ == 3))
  227.                {
  228.                   _loc2_.region = _loc8_;
  229.                   _loc3_ = int(STATE_VARIANTS);
  230.                }
  231.                else if(_loc3_ <= STATE_VARIANTS && (_loc10_ >= "a" && _loc10_ <= "z" && _loc9_ >= 5 || _loc10_ >= "0" && _loc10_ <= "9" && _loc9_ >= 4))
  232.                {
  233.                   _loc2_.variants.push(_loc8_);
  234.                   _loc3_ = int(STATE_VARIANTS);
  235.                }
  236.                else if(_loc3_ < STATE_PRIVATES && _loc9_ == 1)
  237.                {
  238.                   if(_loc8_ == "x")
  239.                   {
  240.                      _loc3_ = int(STATE_PRIVATES);
  241.                      _loc5_ = _loc2_.privates;
  242.                   }
  243.                   else
  244.                   {
  245.                      _loc3_ = int(STATE_EXTENSIONS);
  246.                      _loc5_ = _loc2_.extensions[_loc8_] || [];
  247.                      _loc2_.extensions[_loc8_] = _loc5_;
  248.                   }
  249.                }
  250.                else if(_loc3_ >= STATE_EXTENSIONS)
  251.                {
  252.                   _loc5_.push(_loc8_);
  253.                }
  254.             }
  255.          }
  256.          _loc6_++;
  257.       }
  258.       _loc2_.canonicalize();
  259.       return _loc2_;
  260.    }
  261.    
  262.    public function equals(param1:LocaleID) : Boolean
  263.    {
  264.       return toString() == param1.toString();
  265.    }
  266.    
  267.    public function canonicalize() : void
  268.    {
  269.       var _loc1_:String = null;
  270.       for(_loc1_ in extensions)
  271.       {
  272.          if(extensions.hasOwnProperty(_loc1_))
  273.          {
  274.             if(extensions[_loc1_].length == 0)
  275.             {
  276.                delete extensions[_loc1_];
  277.             }
  278.             else
  279.             {
  280.                extensions[_loc1_] = extensions[_loc1_].sort();
  281.             }
  282.          }
  283.       }
  284.       extended_langs = extended_langs.sort();
  285.       variants = variants.sort();
  286.       privates = privates.sort();
  287.       if(script == "")
  288.       {
  289.          script = LocaleRegistry.getScriptByLang(lang);
  290.       }
  291.       if(script == "" && region != "")
  292.       {
  293.          script = LocaleRegistry.getScriptByLangAndRegion(lang,region);
  294.       }
  295.       if(region == "" && script != "")
  296.       {
  297.          region = LocaleRegistry.getDefaultRegionForLangAndScript(lang,script);
  298.       }
  299.    }
  300.    
  301.    public function toString() : String
  302.    {
  303.       var _loc2_:String = null;
  304.       var _loc1_:Array = [lang];
  305.       appendElements(_loc1_,extended_langs);
  306.       if(script != "")
  307.       {
  308.          _loc1_.push(script);
  309.       }
  310.       if(region != "")
  311.       {
  312.          _loc1_.push(region);
  313.       }
  314.       appendElements(_loc1_,variants);
  315.       for(_loc2_ in extensions)
  316.       {
  317.          if(extensions.hasOwnProperty(_loc2_))
  318.          {
  319.             _loc1_.push(_loc2_);
  320.             appendElements(_loc1_,extensions[_loc2_]);
  321.          }
  322.       }
  323.       if(privates.length > 0)
  324.       {
  325.          _loc1_.push("x");
  326.          appendElements(_loc1_,privates);
  327.       }
  328.       return _loc1_.join("_");
  329.    }
  330.    
  331.    public function isSiblingOf(param1:LocaleID) : Boolean
  332.    {
  333.       return lang == param1.lang && script == param1.script;
  334.    }
  335.    
  336.    public function transformToParent() : Boolean
  337.    {
  338.       var _loc2_:String = null;
  339.       var _loc3_:Array = null;
  340.       var _loc4_:String = null;
  341.       if(privates.length > 0)
  342.       {
  343.          privates.splice(privates.length - 1,1);
  344.          return true;
  345.       }
  346.       var _loc1_:String = null;
  347.       for(_loc2_ in extensions)
  348.       {
  349.          if(extensions.hasOwnProperty(_loc2_))
  350.          {
  351.             _loc1_ = _loc2_;
  352.          }
  353.       }
  354.       if(_loc1_)
  355.       {
  356.          _loc3_ = extensions[_loc1_];
  357.          if(_loc3_.length == 1)
  358.          {
  359.             delete extensions[_loc1_];
  360.             return true;
  361.          }
  362.          _loc3_.splice(_loc3_.length - 1,1);
  363.          return true;
  364.       }
  365.       if(variants.length > 0)
  366.       {
  367.          variants.splice(variants.length - 1,1);
  368.          return true;
  369.       }
  370.       if(script != "")
  371.       {
  372.          if(LocaleRegistry.getScriptByLang(lang) != "")
  373.          {
  374.             script = "";
  375.             return true;
  376.          }
  377.          if(region == "")
  378.          {
  379.             _loc4_ = LocaleRegistry.getDefaultRegionForLangAndScript(lang,script);
  380.             if(_loc4_ != "")
  381.             {
  382.                region = _loc4_;
  383.                script = "";
  384.                return true;
  385.             }
  386.          }
  387.       }
  388.       if(region != "")
  389.       {
  390.          if(!(script == "" && LocaleRegistry.getScriptByLang(lang) == ""))
  391.          {
  392.             region = "";
  393.             return true;
  394.          }
  395.       }
  396.       if(extended_langs.length > 0)
  397.       {
  398.          extended_langs.splice(extended_langs.length - 1,1);
  399.          return true;
  400.       }
  401.       return false;
  402.    }
  403. }
  404.  
  405. class LocaleRegistry
  406. {
  407.    private static const SCRIPTS:Array = ["","latn","ethi","arab","beng","cyrl","thaa","tibt","grek","gujr","hebr","deva","armn","jpan","geor","khmr","knda","kore","laoo","mlym","mymr","orya","guru","sinh","taml","telu","thai","nkoo","blis","hans","hant","mong","syrc"];
  408.    
  409.    private static const SCRIPT_BY_ID:Object = {
  410.       "latn":1,
  411.       "ethi":2,
  412.       "arab":3,
  413.       "beng":4,
  414.       "cyrl":5,
  415.       "thaa":6,
  416.       "tibt":7,
  417.       "grek":8,
  418.       "gujr":9,
  419.       "hebr":10,
  420.       "deva":11,
  421.       "armn":12,
  422.       "jpan":13,
  423.       "geor":14,
  424.       "khmr":15,
  425.       "knda":16,
  426.       "kore":17,
  427.       "laoo":18,
  428.       "mlym":19,
  429.       "mymr":20,
  430.       "orya":21,
  431.       "guru":22,
  432.       "sinh":23,
  433.       "taml":24,
  434.       "telu":25,
  435.       "thai":26,
  436.       "nkoo":27,
  437.       "blis":28,
  438.       "hans":29,
  439.       "hant":30,
  440.       "mong":31,
  441.       "syrc":32
  442.    };
  443.    
  444.    private static const DEFAULT_REGION_BY_LANG_AND_SCRIPT:Object = {
  445.       "bg":{5:"bg"},
  446.       "ca":{1:"es"},
  447.       "zh":{
  448.          30:"tw",
  449.          29:"cn"
  450.       },
  451.       "cs":{1:"cz"},
  452.       "da":{1:"dk"},
  453.       "de":{1:"de"},
  454.       "el":{8:"gr"},
  455.       "en":{1:"us"},
  456.       "es":{1:"es"},
  457.       "fi":{1:"fi"},
  458.       "fr":{1:"fr"},
  459.       "he":{10:"il"},
  460.       "hu":{1:"hu"},
  461.       "is":{1:"is"},
  462.       "it":{1:"it"},
  463.       "ja":{13:"jp"},
  464.       "ko":{17:"kr"},
  465.       "nl":{1:"nl"},
  466.       "nb":{1:"no"},
  467.       "pl":{1:"pl"},
  468.       "pt":{1:"br"},
  469.       "ro":{1:"ro"},
  470.       "ru":{5:"ru"},
  471.       "hr":{1:"hr"},
  472.       "sk":{1:"sk"},
  473.       "sq":{1:"al"},
  474.       "sv":{1:"se"},
  475.       "th":{26:"th"},
  476.       "tr":{1:"tr"},
  477.       "ur":{3:"pk"},
  478.       "id":{1:"id"},
  479.       "uk":{5:"ua"},
  480.       "be":{5:"by"},
  481.       "sl":{1:"si"},
  482.       "et":{1:"ee"},
  483.       "lv":{1:"lv"},
  484.       "lt":{1:"lt"},
  485.       "fa":{3:"ir"},
  486.       "vi":{1:"vn"},
  487.       "hy":{12:"am"},
  488.       "az":{
  489.          1:"az",
  490.          5:"az"
  491.       },
  492.       "eu":{1:"es"},
  493.       "mk":{5:"mk"},
  494.       "af":{1:"za"},
  495.       "ka":{14:"ge"},
  496.       "fo":{1:"fo"},
  497.       "hi":{11:"in"},
  498.       "ms":{1:"my"},
  499.       "kk":{5:"kz"},
  500.       "ky":{5:"kg"},
  501.       "sw":{1:"ke"},
  502.       "uz":{
  503.          1:"uz",
  504.          5:"uz"
  505.       },
  506.       "tt":{5:"ru"},
  507.       "pa":{22:"in"},
  508.       "gu":{9:"in"},
  509.       "ta":{24:"in"},
  510.       "te":{25:"in"},
  511.       "kn":{16:"in"},
  512.       "mr":{11:"in"},
  513.       "sa":{11:"in"},
  514.       "mn":{5:"mn"},
  515.       "gl":{1:"es"},
  516.       "kok":{11:"in"},
  517.       "syr":{32:"sy"},
  518.       "dv":{6:"mv"},
  519.       "nn":{1:"no"},
  520.       "sr":{
  521.          1:"cs",
  522.          5:"cs"
  523.       },
  524.       "cy":{1:"gb"},
  525.       "mi":{1:"nz"},
  526.       "mt":{1:"mt"},
  527.       "quz":{1:"bo"},
  528.       "tn":{1:"za"},
  529.       "xh":{1:"za"},
  530.       "zu":{1:"za"},
  531.       "nso":{1:"za"},
  532.       "se":{1:"no"},
  533.       "smj":{1:"no"},
  534.       "sma":{1:"no"},
  535.       "sms":{1:"fi"},
  536.       "smn":{1:"fi"},
  537.       "bs":{1:"ba"}
  538.    };
  539.    
  540.    private static const SCRIPT_ID_BY_LANG:Object = {
  541.       "ab":5,
  542.       "af":1,
  543.       "am":2,
  544.       "ar":3,
  545.       "as":4,
  546.       "ay":1,
  547.       "be":5,
  548.       "bg":5,
  549.       "bn":4,
  550.       "bs":1,
  551.       "ca":1,
  552.       "ch":1,
  553.       "cs":1,
  554.       "cy":1,
  555.       "da":1,
  556.       "de":1,
  557.       "dv":6,
  558.       "dz":7,
  559.       "el":8,
  560.       "en":1,
  561.       "eo":1,
  562.       "es":1,
  563.       "et":1,
  564.       "eu":1,
  565.       "fa":3,
  566.       "fi":1,
  567.       "fj":1,
  568.       "fo":1,
  569.       "fr":1,
  570.       "frr":1,
  571.       "fy":1,
  572.       "ga":1,
  573.       "gl":1,
  574.       "gn":1,
  575.       "gu":9,
  576.       "gv":1,
  577.       "he":10,
  578.       "hi":11,
  579.       "hr":1,
  580.       "ht":1,
  581.       "hu":1,
  582.       "hy":12,
  583.       "id":1,
  584.       "in":1,
  585.       "is":1,
  586.       "it":1,
  587.       "iw":10,
  588.       "ja":13,
  589.       "ka":14,
  590.       "kk":5,
  591.       "kl":1,
  592.       "km":15,
  593.       "kn":16,
  594.       "ko":17,
  595.       "la":1,
  596.       "lb":1,
  597.       "ln":1,
  598.       "lo":18,
  599.       "lt":1,
  600.       "lv":1,
  601.       "mg":1,
  602.       "mh":1,
  603.       "mk":5,
  604.       "ml":19,
  605.       "mo":1,
  606.       "mr":11,
  607.       "ms":1,
  608.       "mt":1,
  609.       "my":20,
  610.       "na":1,
  611.       "nb":1,
  612.       "nd":1,
  613.       "ne":11,
  614.       "nl":1,
  615.       "nn":1,
  616.       "no":1,
  617.       "nr":1,
  618.       "ny":1,
  619.       "om":1,
  620.       "or":21,
  621.       "pa":22,
  622.       "pl":1,
  623.       "ps":3,
  624.       "pt":1,
  625.       "qu":1,
  626.       "rn":1,
  627.       "ro":1,
  628.       "ru":5,
  629.       "rw":1,
  630.       "sg":1,
  631.       "si":23,
  632.       "sk":1,
  633.       "sl":1,
  634.       "sm":1,
  635.       "so":1,
  636.       "sq":1,
  637.       "ss":1,
  638.       "st":1,
  639.       "sv":1,
  640.       "sw":1,
  641.       "ta":24,
  642.       "te":25,
  643.       "th":26,
  644.       "ti":2,
  645.       "tl":1,
  646.       "tn":1,
  647.       "to":1,
  648.       "tr":1,
  649.       "ts":1,
  650.       "uk":5,
  651.       "ur":3,
  652.       "ve":1,
  653.       "vi":1,
  654.       "wo":1,
  655.       "xh":1,
  656.       "yi":10,
  657.       "zu":1,
  658.       "cpe":1,
  659.       "dsb":1,
  660.       "frs":1,
  661.       "gsw":1,
  662.       "hsb":1,
  663.       "kok":11,
  664.       "mai":11,
  665.       "men":1,
  666.       "nds":1,
  667.       "niu":1,
  668.       "nqo":27,
  669.       "nso":1,
  670.       "son":1,
  671.       "tem":1,
  672.       "tkl":1,
  673.       "tmh":1,
  674.       "tpi":1,
  675.       "tvl":1,
  676.       "zbl":28
  677.    };
  678.    
  679.    private static const SCRIPT_ID_BY_LANG_AND_REGION:Object = {
  680.       "zh":{
  681.          "cn":29,
  682.          "sg":29,
  683.          "tw":30,
  684.          "hk":30,
  685.          "mo":30
  686.       },
  687.       "mn":{
  688.          "cn":31,
  689.          "sg":5
  690.       },
  691.       "pa":{
  692.          "pk":3,
  693.          "in":22
  694.       },
  695.       "ha":{
  696.          "gh":1,
  697.          "ne":1
  698.       }
  699.    };
  700.    
  701.    public function LocaleRegistry()
  702.    {
  703.       super();
  704.    }
  705.    
  706.    public static function getScriptByLangAndRegion(param1:String, param2:String) : String
  707.    {
  708.       var _loc3_:Object = SCRIPT_ID_BY_LANG_AND_REGION[param1];
  709.       if(_loc3_ == null)
  710.       {
  711.          return "";
  712.       }
  713.       var _loc4_:Object = _loc3_[param2];
  714.       if(_loc4_ == null)
  715.       {
  716.          return "";
  717.       }
  718.       return SCRIPTS[int(_loc4_)].toLowerCase();
  719.    }
  720.    
  721.    public static function getScriptByLang(param1:String) : String
  722.    {
  723.       var _loc2_:Object = SCRIPT_ID_BY_LANG[param1];
  724.       if(_loc2_ == null)
  725.       {
  726.          return "";
  727.       }
  728.       return SCRIPTS[int(_loc2_)].toLowerCase();
  729.    }
  730.    
  731.    public static function getDefaultRegionForLangAndScript(param1:String, param2:String) : String
  732.    {
  733.       var _loc3_:Object = DEFAULT_REGION_BY_LANG_AND_SCRIPT[param1];
  734.       var _loc4_:Object = SCRIPT_BY_ID[param2];
  735.       if(_loc3_ == null || _loc4_ == null)
  736.       {
  737.          return "";
  738.       }
  739.       return _loc3_[int(_loc4_)] || "";
  740.    }
  741. }
  742.