private static function load()
 {
     if (!($map = Cache::get(self::CACHE_KEY . '_map'))) {
         $path = Environment::pathComponentsResource('i18n', 'resource', 'i18n', 'script', 'hans.json');
         $map = json_decode(Io_File::valueOf($path)->getContent(), true);
         Cache::set(self::CACHE_KEY . '_map', $map);
     }
     self::$m_unicode =& $map['unicode'];
     self::$m_transformLatn =& $map['transform']['latin'];
 }
 /**
  * @param string $name_
  * @param string $media_
  *
  * @return boolean
  */
 public function style($name_, $media_ = 'all')
 {
     if (0 === strpos($name_, '/')) {
         return false;
     }
     $chunks = explode('/', $name_);
     $ns = array_shift($chunks);
     $path = Environment::pathComponentsResource($ns, 'resource', 'css', implode('/', $chunks) . '.css');
     $uri = Environment::uriComponentsResource($ns . '/css/' . implode('/', $chunks) . '.css');
     $options = [];
     $options['href'] = $uri;
     $options['media'] = $media_;
     $this->styles[$path] = $options;
     return true;
 }
 private function importScript($script_)
 {
     $target = Environment::pathComponentsResource('i18n', 'resource', 'i18n', 'script', "{$script_}.json");
     $ranges = array_chunk(self::$m_unicodeRanges[$script_], 2);
     $range = [];
     foreach ($ranges as $r) {
         $range = array_merge($range, range(reset($r), end($r)));
     }
     $range = array_flip($range);
     $mapScript = [];
     $mapScriptUnicode =& $mapScript['unicode'];
     $mapScriptTransformations =& $mapScript['transform'];
     foreach (self::$m_scripts[$script_] as $transformation) {
         $mapScriptTransformations[$transformation] = [];
         $mapScriptTransformationsCurrent =& $mapScriptTransformations[$transformation];
         $source = self::$m_sources[$script_][$transformation];
         $source = Environment::pathComponentsResource('i18n', 'resource', 'cldr', $source);
         // TODO Implement Io_File_Xml
         $xml = new \SimpleXMLElement(Io_File::valueOf($source)->getContent());
         /* @var $node \SimpleXMLElement */
         foreach ($xml->xpath('//supplementalData/transforms/transform/tRule') as $node) {
             $string = (string) $node;
             $chars = '';
             $trans = '';
             if (91 === ord($string[0])) {
                 $chars = mb_substr($string, 1, mb_strpos($string, chr(93)) - 1);
                 $ldim = mb_strrpos($string, chr(226));
                 $trans = mb_substr($string, $ldim + 1, mb_strrpos($string, chr(59)) - $ldim - 1);
             }
             $len = mb_strlen($chars);
             for ($i = 0; $i < $len; $i++) {
                 $char = mb_substr($chars, $i, 1);
                 $dec = Character::unicodeDecimal($char);
                 if (isset($range[$dec])) {
                     $mapScriptUnicode[$dec] = "    \"{$dec}\": \"{$char}\"";
                     $mapScriptTransformationsCurrent[$dec] = "      \"{$dec}\": \"{$trans}\"";
                 }
             }
         }
         $string = implode(",\n", $mapScriptUnicode);
     }
     $transform = [];
     foreach ($mapScript['transform'] as $script => $transformations) {
         $transform[] = sprintf('    "%1$s":%3$s    {%3$s%2$s%3$s    }%3$s', $script, implode(",\n", $transformations), Io::LINE_SEPARATOR_DEFAULT);
     }
     $file = new Io_File($target, Io_File::CREATE | Io_File::WRITE | Io_File::TRUNCATE);
     if (false === $file->exists()) {
         $file->create();
     }
     $file->open();
     // XXX json_encode converts to unicode - which we dont want here - yet maybe implement an alternative Object_Marshaller_Json or Io_File_Json...
     $file->writeLine('{');
     $file->writeLine('  "unicode":');
     $file->writeLine('  {');
     $file->writeLine(implode(",\n", $mapScript['unicode']));
     $file->writeLine('  },');
     $file->writeLine('  "transform":');
     $file->writeLine('  {');
     $file->write(implode(",\n", $transform));
     $file->writeLine('  }');
     $file->writeLine('}');
     $file->close();
 }
 public function get()
 {
     $locale = $this->request->getParams()->get('locale');
     $source = Environment::pathComponentsResource('i18n', 'resource', 'cldr', 'common', 'main', "{$locale}.xml");
     // FIXME "Upgrade" to JSON.
     $target = Environment::pathComponentsResource('i18n', 'resource', 'i18n', 'common', "{$locale}.xml");
     $document = new \DOMDocument('1.0', 'utf-8');
     $document->standalone = true;
     $document->formatOutput = true;
     $document->preserveWhiteSpace = true;
     $xml = new \SimpleXMLElement(file_get_contents($source));
     $values = [];
     foreach ($xml->localeDisplayNames->languages->language as $node) {
         if (2 === strlen($code = (string) $node['type'])) {
             $values[(string) $node['type']] = (string) $node;
         }
     }
     asort($values);
     $this->append($document, 'common/language', $values);
     $values = [];
     foreach ($xml->localeDisplayNames->territories->territory as $node) {
         if (2 === strlen($code = (string) $node['type'])) {
             $values[$code] = (string) $node;
         }
     }
     asort($values);
     $this->append($document, 'common/country', $values);
     $values = [];
     foreach ($xml->localeDisplayNames->scripts->script as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     asort($values);
     $this->append($document, 'common/script', $values);
     $values = [];
     foreach ($xml->numbers->currencies->currency as $node) {
         $values[(string) $node['type']] = (string) $node->displayName[0];
     }
     asort($values);
     $this->append($document, 'common/currency', $values);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/months/monthContext[@type="format"]/monthWidth[@type="abbreviated"]/month') as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     $this->append($document, 'common/date/month/long', $values, self::$m_months);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/months/monthContext[@type="format"]/monthWidth[@type="wide"]/month') as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     $this->append($document, 'common/date/month/short', $values, self::$m_months);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/days/dayContext[@type="format"]/dayWidth[@type="short"]/day') as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     $this->append($document, 'common/date/day/short', $values, self::$m_days);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/days/dayContext[@type="format"]/dayWidth[@type="abbreviated"]/day') as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     $this->append($document, 'common/date/day/abbreviated', $values, self::$m_days);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/days/dayContext[@type="format"]/dayWidth[@type="wide"]/day') as $node) {
         $values[(string) $node['type']] = (string) $node;
     }
     $this->append($document, 'common/date/day/long', $values, self::$m_days);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/dateFormats/*') as $node) {
         $values[(string) $node['type']] = str_replace(array('EEEE', 'dd', 'MMMM', 'MMM', 'MM', 'M', 'yyyy', 'yy', 'y'), array('l', 'd', 'F', 'M', 'm', 'm', 'Y', 'y', 'Y'), (string) $node->dateFormat->pattern);
     }
     $this->append($document, 'common/date/pattern', $values);
     $values = [];
     foreach ($xml->xpath('//dates/calendars/calendar[@type="gregorian"]/timeFormats/*') as $node) {
         $values[(string) $node['type']] = str_replace(array('HH', 'mm', 'ss', 'zzzz', 'z'), array('H', 'i', 's', 'O', 'T'), (string) $node->timeFormat->pattern);
     }
     $this->append($document, 'common/time/pattern', $values);
     file_put_contents($target, $document->saveXML());
 }
 /**
  * @return \Components\I18n_Location
  */
 protected function initialized()
 {
     if (null === $this->m_data) {
         if (false === ($this->m_data = Cache::get("i18n/location/{$this->m_name}"))) {
             if (null === self::$m_pathResource) {
                 self::$m_pathResource = Io::path(Environment::pathComponentsResource('i18n', 'resource', 'i18n', 'location'));
             }
             $file = null;
             $sub = [];
             $chunks = explode('_', strtolower($this->m_name));
             while (count($chunks)) {
                 $file = self::$m_pathResource->getFile(implode('/', $chunks) . '.json');
                 if ($file->exists()) {
                     break;
                 }
                 array_unshift($sub, array_pop($chunks));
             }
             if (false === $file->exists()) {
                 Cache::set("i18n/location/{$this->m_name}", []);
                 return $this;
             }
             $json = $file->getContent();
             $this->m_data = json_decode($json, true);
             if (0 < count($sub)) {
                 while ($next = array_shift($sub)) {
                     $this->m_data =& $this->m_data['children'][$next];
                 }
             }
             Cache::set("i18n/location/{$this->m_name}", $this->m_data);
         }
     }
     return $this;
 }