* @category Horde * @copyright 2010-2017 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Translation * @since 2.2.0 */ abstract class Horde_Translation_Autodetect extends Horde_Translation { /** * The absolute PEAR path to the translations for the default gettext handler. * * This value is automatically set by PEAR Replace Tasks. * * @var string */ protected static $_pearDirectory; /** * Auto detects the locale directory location. * * @param string $handlerClass The name of a class implementing the * Horde_Translation_Handler interface. */ public static function loadHandler($handlerClass) { if (!static::$_domain) { throw new Horde_Translation_Exception('The domain property must be set by the class that extends Horde_Translation_Autodetect.'); } $directory = static::_searchLocaleDirectory(); if (!$directory) { throw new Horde_Translation_Exception(sprintf('Could not found find any locale directory for %s domain.', static::$_domain)); } static::$_directory = $directory; parent::loadHandler($handlerClass); } /** * Search for the locale directory for different installations methods (eg: PEAR, Composer). * * @var boolean|string The directory if found, or false when no valid directory is found */ protected static function _searchLocaleDirectory() { if (static::$_pearDirectory !== '@data_dir@') { $directory = static::$_pearDirectory . '/' . static::$_domain . '/locale'; if (file_exists($directory)) { return $directory; } } $directories = static::_getSearchDirectories(); foreach ($directories as $directory) { if (file_exists($directory)) { return $directory; } } return false; } /** * Get potential locations for the locale directory. * * @var array List of directories */ protected static function _getSearchDirectories() { $className = get_called_class(); $class = new ReflectionClass($className); $basedir = dirname($class->getFilename()); $depth = substr_count($className, '\\') ?: substr_count($className, '_'); return array( /* Composer */ $basedir . str_repeat('/..', $depth) . '/data/locale', /* Source */ $basedir . str_repeat('/..', $depth + 1) . '/locale' ); } }