我正在尝试在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;
}
持久的翻译工作正常,我可以使用可翻译的存储库获取它们。
我有两个问题:
我无法弄清楚如何让可翻译的监听器订阅了entitymanager。我想在Module类中获取它以在bootstrap上设置默认语言环境。
当我有一个实体对象时,我无法获得可翻译列的翻译,只能获得标准值。据我所知,我应该将一个值转换为默认语言环境,并且应该能够通过在Locale中使用Locale注释设置变量来覆盖默认语言环境,但它似乎不起作用。
非常感谢任何帮助!
答案 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);
}
}
很高兴为您提供帮助!