ZF2中DB的翻译

时间:2014-04-02 22:36:46

标签: php zend-framework zend-framework2 translation zend-framework-modules

我在ZF2中从数据库创建自定义转换器时遇到问题。我有一个这样的数据库enter image description here

和文件:

1)应用程序/ module.config.php

'service_manager' => array(
    'abstract_factories' => array(),
    'factories' => array(
        'translator' => function($sm){
                $translator = new \Zend\I18n\Translator\DatabaseTranslationLoaderFactory();
                return $translator->createService($sm);
            },
    ),
),

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'Zend\I18n\Translator\Loader\Database',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),

2)Zend / I18n / Translator / Loader / Database.php

<?php

namespace Zend\I18n\Translator\Loader;

use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
use Zend\I18n\Translator\Plural\Rule as PluralRule;
use Zend\I18n\Translator\TextDomain;


class Database implements RemoteLoaderInterface {

protected $dbAdapter;


public function __construct(Adapter $dbAdapter)
{
    $this->dbAdapter = $dbAdapter;
}


public function load($locale, $textDomain)
{
    $sql = new Sql($this->dbAdapter);
    $select = $sql->select('ic_var')->columns(array('value'))
                  ->where(array('language' => $locale, 'name' => $textDomain));

    $messages = $this->dbAdapter->query(
        $sql->getSqlStringForSqlObject($select),
        Adapter::QUERY_MODE_EXECUTE
    );

    $textDomain = new TextDomain();

    foreach ($messages as $message) {
        if (isset($textDomain[$message['name']])) {
            if (!is_array($textDomain[$message['name']])) {
                $textDomain[$message['name']] = array(
                    $message['plural_index'] => $textDomain[$message['name']]
                );
            }
            $textDomain[$message['name']][$message['plural_index']] = $message['value'];
        } else {
            $textDomain[$message['name']] = $message['value'];
        }
    }
    return $textDomain;
}
}

3)Zend / I18n / Translator / DatabaseTranslationLoaderFactory.php

<?php

namespace Zend\I18n\Translator;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\I18n\Translator\Loader\Database;

class DatabaseTranslationLoaderFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new Database($serviceLocator->get('Zend\Db\Adapter\Adapter'));
    }
}

4)Application / Module.php

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->addTranslationFile(
        'DatabaseTranslationLoader',
        'text-domain',
        'text-domain'
    );
}

但是翻译不起作用,因为db adapter在loader中找不到:

  

捕获致命错误:传递给Zend \ I18n \ Arlator \ Loader \ Database :: __ construct()的参数1必须是Zend \ Db \ Adapter \ Adapter的实例,没有给出

感谢您的回答!

0 个答案:

没有答案