adapter.php

来自「Bug tracker, and reporter.」· PHP 代码 · 共 497 行 · 第 1/2 页

PHP
497
字号
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Translate * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @version    $Id: Date.php 2498 2006-12-23 22:13:38Z thomas $ * @license    http://framework.zend.com/license/new-bsd     New BSD License *//** Zend_Locale */require_once 'Zend/Locale.php';/** * @category   Zend * @package    Zend_Translate * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */abstract class Zend_Translate_Adapter {    private          $_automatic = true;    protected static $_cache     = null;    // Scan options    const LOCALE_DIRECTORY = 1;    const LOCALE_FILENAME  = 2;    /**     * Array with all options, each adapter can have own additional options     *     * @var array     */    protected $_options = array(        'clear'  => false, // clear previous loaded translation data        'scan'   => null,  // where to find the locale        'locale' => 'auto' // actual set locale/language     );    /**     * Translation table     *     * @var array     */    protected $_translate = array();    /**     * Generates the adapter     *     * @param  string|array        $data      Translation data for this adapter     * @param  string|Zend_Locale  $locale    OPTIONAL Locale/Language to set, identical with Locale identifiers     *                                        see Zend_Locale for more information     * @param  string|array        $options   Options for the adaptor     * @throws Zend_Translate_Exception     */    public function __construct($data, $locale = null, array $options = array())    {        if (isset(self::$_cache)) {            $id = 'Zend_Translate_' . $this->toString();            if ($result = self::$_cache->load($id)) {                $this->_translate = unserialize($result);                return true;            }        }        $this->addTranslation($data, $locale, $options);        $this->_automatic = true;    }    /**     * Add translation data     *     * It may be a new language or additional data for existing language     * If $clear parameter is true, then translation data for specified     * language is replaced and added otherwise     *     * @param  array|string          $data    Translation data     * @param  string|Zend_Locale    $locale  Locale/Language to add data for, identical with locale identifier,     *                                        see Zend_Locale for more information     * @param  array                 $options OPTIONAL Option for this Adapter     * @throws Zend_Translate_Exception     * @return Zend_Translate_Adapter     */    public function addTranslation($data, $locale = null, array $options = array())    {        if ($locale === null) {            $locale = new Zend_Locale();        }        if ($locale instanceof Zend_Locale) {            $locale = $locale->toString();        }        $originate = $locale;        $this->setOptions($options);        if (is_string($data) and is_dir($data)) {            foreach (new RecursiveIteratorIterator(                     new RecursiveDirectoryIterator($data, RecursiveDirectoryIterator::KEY_AS_PATHNAME),                      RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {                if ($info->isDir()) {                    $directory = $info->getPath();                    // pathname as locale                    if (($this->_options['scan'] === self::LOCALE_DIRECTORY) and (Zend_Locale::isLocale((string) $info))) {                        $locale = (string) $info;                    }                } else if ($info->isFile()) {                    // filename as locale                    if ($this->_options['scan'] === self::LOCALE_FILENAME) {                        $filename = explode('.', (string) $info);                        array_pop($filename);                        $filename = implode('.', $filename);                        if (Zend_Locale::isLocale($filename)) {                            $locale = (string) $filename;                        } else {                            $found = false;                            $parts = explode('.', $filename);                            foreach($parts as $token) {                                $parts = array_merge(explode('_', $token), $parts);                            }                            foreach($parts as $token) {                                $parts = array_merge(explode('-', $token), $parts);                            }                            $parts = array_unique($parts);                            foreach($parts as $token) {                                if (Zend_Locale::isLocale($token)) {                                    $locale = $token;                                }                            }                        }                    }                    try {                        $this->_addTranslationData((string) $info->getPathname(), $locale, $this->_options);                        if ((array_key_exists($locale, $this->_translate)) and (count($this->_translate[$locale]) > 0)) {                            $this->setLocale($locale);                        }                    } catch (Zend_Translate_Exception $e) {                        // ignore failed sources while scanning                    }                }            }        } else {            $this->_addTranslationData($data, $locale, $this->_options);            if ((array_key_exists($locale, $this->_translate)) and (count($this->_translate[$locale]) > 0)) {                $this->setLocale($locale);            }        }        if ((array_key_exists($originate, $this->_translate)) and (count($this->_translate[$originate]) > 0)) {            $this->setLocale($originate);        }        return $this;    }    /**     * Sets new adapter options     *     * @param  array  $options  Adapter options     * @throws Zend_Translate_Exception     * @return Zend_Translate_Adapter     */    public function setOptions(array $options = array())    {        foreach ($options as $key => $option) {            if ($key == "locale") {                $this->setLocale($option);            } else {                $this->_options[strtolower($key)] = $option;            }        }        return $this;    }    /**     * Returns the adapters name and it's options     *     * @param  string|null  $optionKey  String returns this option     *                                  null returns all options     * @return integer|string|array     */    public function getOptions($optionKey = null)    {        if ($optionKey === null) {            return $this->_options;        }        if (array_key_exists(strtolower($optionKey), $this->_options)) {            return $this->_options[strtolower($optionKey)];        }        return null;    }    /**     * Gets locale     *     * @return Zend_Locale|string|null     */    public function getLocale()    {        return $this->_options['locale'];    }    /**     * Sets locale     *     * @param  string|Zend_Locale  $locale  Locale to set     * @throws Zend_Translate_Exception     * @return Zend_Translate_Adapter     */    public function setLocale($locale)    {        if ($locale instanceof Zend_Locale) {            $locale = $locale->toString();        } else if (!$locale = Zend_Locale::isLocale($locale)) {            require_once 'Zend/Translate/Exception.php';            throw new Zend_Translate_Exception("The given Language ({$locale}) does not exist");        }        if (!array_key_exists($locale, $this->_translate) and empty($this->_translate[$locale])) {            $temp = explode('_', $locale);            if (!array_key_exists($temp[0], $this->_translate)) {                require_once 'Zend/Translate/Exception.php';                throw new Zend_Translate_Exception("Language ({$locale}) has to be added before it can be used.");            }            $locale = $temp[0];        }        $this->_options['locale'] = $locale;        if ($locale == "auto") {            $this->_automatic = true;        } else {            $this->_automatic = false;        }        return $this;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?