%PDF- %PDF-
Direktori : /home/lightco1/www/lightingrepublic.com.au/components/com_default/ |
Current File : /home/lightco1/www/lightingrepublic.com.au/components/com_default/translator.php |
<?php /** * @version $Id$ * @package Koowa_Translator * @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved. * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> * @link http://www.nooku.org */ /** * Translator Class * * @author Ercan Ozkaya <ercan@timble.net> * @package Koowa_Translator */ class ComDefaultTranslator extends KTranslator implements KServiceInstantiatable { /** * A reference to Joomla translator * @var object */ protected $_translation_helper; /** * A prefix attached to every generated key * @var string */ protected $_prefix; /** * Catalogue to map common Joomla keys * @var KTranslatorCatalogueInterface */ protected $_alias_catalogue; /** * Default catalogue that generates the keys * @var KTranslatorCatalogueInterface */ protected $_catalogue; /** * Fallback locale to always load the language files from * @var string */ protected $_fallback_locale; /** * Maps identifier types to words * @var array */ protected static $_type_map = array( 'com' => 'component', 'mod' => 'module', 'plg' => 'plugin' ); /** * An array of signatures from loaded language files * @var array */ protected static $_loaded_files = array(); /** * @param KConfig $config */ public function __construct(KConfig $config) { parent::__construct($config); if ($config->fallback_locale) { $this->_fallback_locale = $config->fallback_locale; } $this->setTranslationHelper($config->translation_helper); $this->setPrefix($config->prefix); $this->setDefaultCatalogue($this->createCatalogue($config->catalogue)); $this->setAliasCatalogue($this->createCatalogue($config->alias_catalogue)); } /** * @param KConfig $config */ protected function _initialize(KConfig $config) { $config->append(array( 'prefix' => 'KLS_', 'catalogue' => null, 'alias_catalogue' => 'aliases', 'fallback_locale' => 'en-GB', 'locale' => JFactory::getConfig()->get('language'), 'translation_helper' => JFactory::getLanguage() )); parent::_initialize($config); } /** * Translates a string and handles parameter replacements * * @param string $string String to translate * @param array $parameters An array of parameters * * @return string Translated string */ public function translate($string, array $parameters = array()) { $result = strtolower($string); if (empty($result)) { $result = ''; } elseif (isset($this->_alias_catalogue[$result])) { $result = $this->_translation_helper->_($this->_alias_catalogue[$result]); } else { if (substr($string, 0, strlen($this->_prefix)) === $this->_prefix) { $key = $string; } else { $key = $this->getKey($string); } $result = $this->_translation_helper->_($this->_translation_helper->hasKey($key) ? $key : $string); } // Joomla uses _QQ_ instead of " in language files // and 1.5 does not handle the conversion itself if (version_compare(JVERSION, '1.6', '<')) { $result = str_replace('"_QQ_"', '"', $result); } return parent::translate($result, $parameters); } /** * Translates a string based on the number parameter passed * * @param array $strings Strings to choose from * @param integer $number The umber of items * @param array $parameters An array of parameters * * @throws InvalidArgumentException * @return string Translated string */ public function choose(array $strings, $number, array $parameters = array()) { if (count($strings) < 2) { throw new InvalidArgumentException('Choose method requires at least 2 strings to choose from'); } $choice = KTranslatorPluralizationrules::get($number, $this->_locale); if ($choice === 0) { return $this->translate($strings[0], $parameters); } $key = $this->getKey($strings[1]); $found = null; while ($choice > 0) { $looking_for = $key.($choice === 1 ? '' : '_'.$choice); if ($this->_translation_helper->hasKey($looking_for)) { $found = $looking_for; break; } $choice--; } return $this->translate($found ? $found : $strings[1], $parameters); } /** * Gets a key from the catalogue and prefixes it * * @param string $string Language key * * @return string Translated string */ public function getKey($string) { $key = $this->_catalogue[$string]; if ($this->_prefix) { $key = $this->_prefix.$key; } return $key; } /** * Load the extension language files. * * First looking at extension folder and then the global language folder * @param string $extension Extension. Leave blank to get from the identifier. * @param string $base Base application. Leave blank to get from Joomla. * * @throws KTranslatorException * * @return boolean True if loading succeeds */ public function loadLanguageFiles($extension = null, $base = null) { if ($extension === null) { $identifier = $this->getIdentifier(); $type = $identifier->type; $extension = $type.'_'.$identifier->package; $app = $identifier->application === 'admin' ? 'administrator' : $identifier->application; } else { $type = substr($extension, 0, 3); $app = null; } if ($base === null) { if ($app && defined('JPATH_'.strtoupper($app))) { $base = constant('JPATH_'.strtoupper($app)); } else { $base = JPATH_BASE; } } if (isset(self::$_type_map[$type])) { $type = self::$_type_map[$type]; } else { throw new KTranslatorException(sprintf('Invalid extension type: %s', $type)); } $ext_base = sprintf('%s/%ss/%s', $base, $type, $extension); $results = array(); $results[] = $this->_loadLanguageFile($extension, $this->_fallback_locale, array($ext_base, $base)); if ($this->getLocale() !== $this->_fallback_locale) { $results[] = $this->_loadLanguageFile($extension, $this->getLocale(), array($ext_base, $base)); } return in_array(true, $results); } /** * Loads a Joomla language file * * @param string $extension * @param string $locale Locale name * @param array $base Base path list * * @return bool */ protected function _loadLanguageFile($extension, $locale, array $base) { $result = false; foreach ($base as $path) { $signature = md5($extension.$path.$locale); $result = $this->_translation_helper->load($extension, $path, $locale, true, false); // var_dump($extension, $locale, $path, $result); if ($result) { if (!in_array($signature, self::$_loaded_files)) { self::$_loaded_files[] = $signature; } break; } } return $result; } /** * Creates and returns a catalogue from the passed identifier * * @param string|null $identifier Full identifier or just the name part * * @return KTranslatorCatalogue */ public function createCatalogue($identifier = null) { if (strpos($identifier, '.') === false) { $old = clone $this->getIdentifier(); if ($identifier) { $old->path = array('translator', 'catalogue'); $old->name = $identifier; } else { $old->path = array('translator'); $old->name = 'catalogue'; } $identifier = $old; } return $this->getService($identifier); } /** * Return the alias catalogue * * @return KTranslatorCatalogueInterface */ public function getAliasCatalogue() { return $this->_alias_catalogue; } /** * Set the alias catalogue * * @param $catalogue * * @return $this */ public function setAliasCatalogue(KTranslatorCatalogueInterface $catalogue) { $this->_alias_catalogue = $catalogue; return $this; } /** * Return the default catalogue * * @return KTranslatorCatalogueInterface */ public function getDefaultCatalogue() { return $this->_catalogue; } /** * Set the default catalogue * * @param KTranslatorCatalogueInterface $catalogue * * @return $this */ public function setDefaultCatalogue(KTranslatorCatalogueInterface $catalogue) { $this->_catalogue = $catalogue; return $this; } /** * Return translation helper * * @return object */ public function getTranslationHelper() { return $this->_translation_helper; } /** * Set the translation helper * * @param object $translator * * @return $this * @throws KTranslatorException */ public function setTranslationHelper($translator) { if (is_object($translator)) { $this->_translation_helper = $translator; } else { throw new KTranslatorException('Invalid translator'); } return $this; } /** * Return the language key prefix * * @return string */ public function getPrefix() { return $this->_prefix; } /** * Set the language key prefix * * @param string $prefix * * @return $this */ public function setPrefix($prefix) { $this->_prefix = $prefix; return $this; } /** * Returns a translator object for a specific identifier * * @param KServiceIdentifier|string $identifier * @param KConfig|array $config * * @throws KTranslatorException * @return KTranslator */ public function getTranslator($identifier, $config = array()) { if (is_string($identifier)) { $translator = new KServiceIdentifier($identifier); } elseif ($identifier instanceof KServiceIdentifierInterface) { $translator = clone $identifier; } else { throw new KTranslatorException('Invalid identifier'); } // If you omit the path in modules KServiceLocatorModule assumes it's a view. Hence: if ($translator->type === 'mod') { $translator->path = array('translator'); $translator->name = ''; } else { $translator->path = array(); $translator->name = 'translator'; } return $this->getService($translator, $config); } /** * Force creation of a singleton * * @param KConfigInterface $config optional KConfig object with configuration options * @param KServiceInterface $container * * @return KTranslator */ public static function getInstance(KConfigInterface $config, KServiceInterface $container) { if (!$container->has($config->service_identifier)) { $classname = $config->service_identifier->classname; $instance = new $classname($config); $container->set($config->service_identifier, $instance); } return $container->get($config->service_identifier); } }