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; }