У меня проблема с созданием настраиваемого переводчика из базы данных в 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 / Переводчик / 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 / Переводчик / База данныхTranslationLoaderFactory.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) Приложение / Module.php
public function onBootstrap(MvcEvent $e) { $translator = $e->getApplication()->getServiceManager()->get('translator'); $translator->addTranslationFile( 'DatabaseTranslationLoader', 'text-domain', 'text-domain' ); }
Но перевод не работает, потому что адаптер db не находит в загрузчике:
Допустимая фатальная ошибка: аргумент 1 передан Zend \ I18n \ Translator \ Loader \ Database :: __ construct () должен быть экземпляром Zend \ Db \ Adapter \ Adapter, не указан
Спасибо за ваши ответы!