2017-06-07 12 views
1

私は最近ZF3で作業を始めました。私はプロジェクトの国際化に取り組んでいます。Zend Framework 3翻訳者DBから

私はそれを動作させることに成功しましたが、私は翻訳者に.moファイルから読み込ませる代わりにデータベースから翻訳を取得させたいと思います。このようにして、ユーザーはアプリケーションの管理部分で編集することができます。

私は

// module's module.config.php: 
'translator' => [ 
    'locale' => 'en_US', 
    'remote_translation' => [ 
     [ 
      'type' => Service\Database::class 
     ] 
    ] 
] 

とデータベースサービスを持っているview_helper

// module's module.config.php:  
'view_helpers' => [ 
    'invokables' => [ 
     'translate' => \Zend\I18n\View\Helper\Translate::class 
    ] 
] 

、代わりの

// module's module.config.php: 
'translator' => [ 
    'locale' => 'en_US', 
    'translation_file_patterns' => [ 
     [ 
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
     ], 
    ], 
] 

としてそれを登録し、Zendの\ MVC \国際化モジュールをインストールしていますドキュメントで必要に応じてRemoteLoaderInterfaceを実装していますが、現在はハードコードされた配列後で実際のクエリに置き換えられます。私のレイアウトで

//Database.php 
namespace Core\Service; 

use Zend\I18n\Translator\Loader\RemoteLoaderInterface; 

class Database implements RemoteLoaderInterface { 

    private $entityManager; 

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

    public function load($locale, $textDomain) 
    { 
     $array = []; 
     $array['and'] = 'i'; 
     return $array; 
    } 
} 

私が欲しかっただけで何である "私" で

// layout.phtml 
$this->translate("and") // prints "i" 

結果を、印刷します。

私の問題は、doctrineエンティティマネージャをデータベースサービスに渡す方法です。私はこのような状況で工場を使用する必要があります知っていると私は

//DatabaseFactory.php 
namespace Core\Service\Factory; 

use Core\Service\Database; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class DatabaseFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $entityManager = $container->get('doctrine.entitymanager.orm_default'); 

     // Instantiate the service and inject dependencies 
     return new Database($entityManager); 
    } 

} 

準備1を持っているが、それはRemoteLoaderInterfaceを実装するクラスが必要ですので、私は単にモジュール構成でそれを渡すことはできません。

// module's module.config.php: 
'remote_translation' => [ 
    [ 
     'type' => Service\Factory\DatabaseFactory::class // does not work 
    ] 
] 

解決方法や欠点がありますか?どんな助けもありがとう。アドバイスありがとう!

答えて

0

あなたはサービスマネージャでクラスとそのファクトリを登録するのを忘れたように見えます:

// module's module.config.php 
'translator' => [ 
    'loaderpluginmanager' => [ 
     'factories' => [ 
      Core\Service\Database::class => Service\Factory\DatabaseFactory::class, 
     ], 
    ], 
    'locale' => 'en_US', 
    'remote_translation' => [ 
     [ 
      'type' => Core\Service\Database::class 
     ] 
    ] 
] 
+0

違いはありません:(TranslatorはDatabaseFactoryのかわりに直接Databaseクラスにアクセスしています) – Dragan

+0

@Draganプラグインマネージャを使用するように答えを更新しました。知っている。 – xtreamwayz

0

これは少しトリッキーです。レンダリングが行われる前に翻訳ローダーファクトリをセットアップする必要があります。

module\Application\src\Module.php

public function init (ModuleManager $manager) 
{ 
    $eventManager = $manager->getEventManager(); 
    $sharedEventManager = $eventManager->getSharedManager(); 

    $sharedEventManager->attach(__NAMESPACE__, 'dispatch', 
     [$this, 'onDispatch'], 100); 
} 

public function onDispatch (MvcEvent $event) 
{ 
    $translator = $event->getApplication()->getServiceManager()->get (\Zend\I18n\Translator\TranslatorInterface::class); 
    $translator->getPluginManager()->setFactory(\Application\Translator\Database::class, \Application\Translator\DatabaseFactory::class); 

私は翻訳者のためのサービスロケータを設定するための他の方法を知りません。

関連する問題