function _build($lang) { list($code, $zip) = $this->_request("download/$lang.zip"); if ($code !== 200) $this->fail('Language is not available'."\n"); $temp = tempnam('/tmp', 'osticket-cli'); $f = fopen($temp, 'w'); fwrite($f, $zip); fclose($f); $zip = new ZipArchive(); $zip->open($temp); unlink($temp); $lang = str_replace('-','_',$lang); @unlink(I18N_DIR."$lang.phar"); $phar = new Phar(I18N_DIR."$lang.phar"); $phar->startBuffering(); $po_file = false; for ($i=0; $i<$zip->numFiles; $i++) { $info = $zip->statIndex($i); $contents = $zip->getFromIndex($i); if (!$contents) continue; if (strpos($info['name'], '/messages.po') !== false) { $po_file = $contents; // Don't add the PO file as-is to the PHAR file continue; } $phar->addFromString($info['name'], $contents); } // TODO: Add i18n extras (like fonts) // Redactor language pack // $langs = array($lang); if (strpos($lang, '_') !== false) { @list($short) = explode('_', $lang); $langs[] = $short; } foreach ($langs as $l) { list($code, $js) = $this->_http_get( 'http://imperavi.com/webdownload/redactor/lang/?lang=' .strtolower($l)); if ($code == 200 && ($js != 'File not found')) { $phar->addFromString('js/redactor.js', $js); break; } } if ($code != 200) $this->stderr->write($lang . ": Unable to fetch Redactor language file\n"); // JQuery UI Datepicker // http://jquery-ui.googlecode.com/svn/tags/latest/ui/i18n/jquery.ui.datepicker-de.js foreach ($langs as $l) { list($code, $js) = $this->_http_get( 'http://jquery-ui.googlecode.com/svn/tags/latest/ui/i18n/jquery.ui.datepicker-' .str_replace('_','-',$l).'.js'); // If locale-specific version is not available, use the base // language version (de if de_CH is not available) if ($code == 200) break; } if ($code == 200) $phar->addFromString('js/jquery.ui.datepicker.js', $js); else $this->stderr->write(str_replace('_','-',$lang) .": Unable to fetch jQuery UI Datepicker locale file\n"); // True type fonts for PDF printing $langs = (include I18N_DIR . 'langs.php'); $info = $langs[$lang]; if (isset($info['fonts'])) { foreach ($info['fonts'] as $name => $types) { foreach ($types as $code => $fullname) { list($ttf, $url) = $fullname; if (!$url) continue; list($code, $file) = $this->_http_get($url); if ($code == 200) $phar->addFromString('fonts/'.$ttf, $file); else $this->stderr->write( "*** Unable to fetch $url\n"); } } } // Add in the messages.mo.php file if ($po_file) { $pipes = array(); $msgfmt = proc_open('msgfmt -o- -', array(0=>array('pipe','r'), 1=>array('pipe','w')), $pipes); if (is_resource($msgfmt)) { fwrite($pipes[0], $po_file); fclose($pipes[0]); $mo_input = fopen('php://temp', 'r+b'); fwrite($mo_input, stream_get_contents($pipes[1])); rewind($mo_input); require_once INCLUDE_DIR . 'class.translation.php'; $mo = Translation::buildHashFile($mo_input, false, true); $phar->addFromString('LC_MESSAGES/messages.mo.php', $mo); fclose($mo_input); } } // Add in translation of javascript strings $phrases = array(); if ($mo && ($js = $this->__getAllJsPhrases())) { $mo = (eval (substr($mo, 5))); # Chop off <?php foreach ($js as $c) { foreach ($c['forms'] as $f) { $phrases[$f] = @$mo[$f] ?: $f; } } $phar->addFromString( 'js/osticket-strings.js', sprintf('(function($){$.oststrings=%s;})(jQuery);', JsonDataEncoder::encode($phrases)) ); } // Include a manifest include_once INCLUDE_DIR . 'class.mailfetch.php'; $po_header = Mail_Parse::splitHeaders($mo['']); $info = array( 'Build-Date' => date(DATE_RFC822), 'Build-Version' => trim(`git describe`), 'Language' => $po_header['Language'], #'Phrases' => #'Translated' => #'Approved' => 'Id' => 'lang:' . $lang, 'Last-Revision' => $po_header['PO-Revision-Date'], 'Version' => (int)(strtotime($po_header['PO-Revision-Date']) / 10000), ); $phar->addFromString( 'MANIFEST.php', sprintf('<?php return %s;', var_export($info, true))); // TODO: Sign files // Use a very small stub $phar->setStub('<?php __HALT_COMPILER();'); $phar->setSignatureAlgorithm(Phar::SHA1); $phar->stopBuffering(); }
return TextDomain::lookup($domain)->getTranslation()->pgettext($context, $msgid); } function _dcpgettext($domain, $context, $msgid, $category) { return TextDomain::lookup($domain)->getTranslation($category)->pgettext($context, $msgid); } function _npgettext($context, $singular, $plural, $n) { return TextDomain::lookup()->getTranslation()->npgettext($context, $singular, $plural, $n); } function _dnpgettext($domain, $context, $singular, $plural, $n) { return TextDomain::lookup($domain)->getTranslation()->npgettext($context, $singular, $plural, $n); } function _dcnpgettext($domain, $context, $singular, $plural, $category, $n) { return TextDomain::lookup($domain)->getTranslation($category)->npgettext($context, $singular, $plural, $n); } do { if (PHP_SAPI != 'cli') { break; } if (empty($_SERVER['argc']) || $_SERVER['argc'] < 2) { break; } if (empty($_SERVER['PHP_SELF']) || FALSE === strpos($_SERVER['PHP_SELF'], basename(__FILE__))) { break; } $file = $argv[1]; Translation::buildHashFile($file); } while (0);