Zend 2 Doctrine 2 Gedmo Translatable

时间:2014-03-20 18:01:16

标签: doctrine-orm zend-framework2 translation

我正在尝试在Zend Framework 2应用程序中使用Doctrine 2的Gedmo可翻译扩展。

我设置如下:

'doctrine' => array(
    'eventmanager' => array(
        'orm_default' => array(
            'subscribers' => array(
                'Gedmo\Translatable\TranslatableListener'
            )
        )
    ),
    'driver' => array(
        'application_entities' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/Application/Entity')
        ),
        'translatable_metadata_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(
                'vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity',
            )
        ),
        'orm_default' => array(
            'drivers' => array(
                'Application\Entity' => 'application_entities',
                'Gedmo\Translatable\Entity' => 'translatable_metadata_driver'
            )
        )
    ),
),

示例实体:

<?php

namespace Application\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity (repositoryClass="Application\Repository\CategoryRepository") 
 */
class Category {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @Gedmo\Translatable
     */
    private $name;

    /**
     * @Gedmo\Locale
     */
     private $locale;

}

持久的翻译工作正常,我可以使用可翻译的存储库获取它们。

我有两个问题:

  1. 我无法弄清楚如何让可翻译的监听器订阅了entitymanager。我想在Module类中获取它以在bootstrap上设置默认语言环境。

  2. 当我有一个实体对象时,我无法获得可翻译列的翻译,只能获得标准值。据我所知,我应该将一个值转换为默认语言环境,并且应该能够通过在Locale中使用Locale注释设置变量来覆盖默认语言环境,但它似乎不起作用。

  3. 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

public function onBootstrap(MvcEvent $event)
{
    $serviceManager = $event->getApplication()->getServiceManager();

    $this->prepareGedmoTranslatable($serviceManager);
}

/**
 * Does initial config of Gedmo\TranslatableListener
 * sets default locale and registers it as service
 *
 * Reader you can ask why?
 * You will understand me if you try to use TranslatableListener yourself ;)
 *
 * @param ContainerInterface $services
 */
public function prepareGedmoTranslatable(ContainerInterface $services)
{
    /**
     * @var EventManager $ormEventManager
     */
    $ormEventManager      = $services->get('doctrine.eventmanager.orm_default');
    // assume that postLoad event has TranslatableListener as listener
    // it will be if TranslatableListener enabled in doctrine config
    // Doctrine\ORM\Events::postLoad
    $listeners            = $ormEventManager->getListeners(Events::postLoad);
    $translatableListener = null;

    // search for TranslatableListener cause Gedmo loves hardcore stuff ;)
    foreach ($listeners as $listener) {
        if ($listener instanceof TranslatableListener) {
            $translatableListener = $listener;
            break;
        }
    }

    if ($translatableListener instanceof TranslatableListener) {
        $translatableListener->setDefaultLocale(
            // assume that translator config provides default locale
            // e.g locale that have been set in config
            $services->get('config')['translator']['locale']
        );

        // let translations to fallback to default locale
        $translatableListener->getTranslationFallback(true);

        // lines below adds Listener as a service so you can access it by
        // $services->get(TranslatableListener::class)
        // everywhere you want
        $services->setAllowOverride(true);
        $services->setService(TranslatableListener::class, $translatableListener);
        $services->setAllowOverride(false);
    }
}

很高兴为您提供帮助!