Переводы из БД в ZF2

У меня проблема с созданием пользовательского переводчика из базы данных в ZF2. У меня есть такая БД введите здесь описание изображения

и файлы:

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) Приложение/модуль.php

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

Но перевод не работает, т.к. адаптер БД не находит в загрузчике:

Уловимая фатальная ошибка: аргумент 1, переданный Zend\I18n\Translator\Loader\Database::__construct(), должен быть экземпляром Zend\Db\Adapter\Adapter, не указан

Спасибо за ваши ответы!


person Walllter    schedule 02.04.2014    source источник
comment
У меня есть представление о том, что происходит. Можешь еще раз проверить, работает ли твой DatabaseTranslationLoaderFactory::createService?   -  person Victory    schedule 03.04.2014
comment
Да, dbAdapter возвращает секф, но перевод по-прежнему не работает.   -  person Walllter    schedule 04.04.2014
comment
Как вы настраиваете себя Zend\Db\Adapter\Adapter ?   -  person Victory    schedule 05.04.2014