Zend 2 Doctrine 2 Gedmo可翻译 [英] Zend 2 Doctrine 2 Gedmo Translatable
问题描述
我正在尝试在Zend Framework 2应用程序中使用Doctrine 2的Gedmo可翻译扩展。
'doctrine'=>数组(
'eventmanager'=>数组(
'orm_default'=>数组(
'subscribers'=>数组(
'Gedmo\Translatable\TranslatableListener '
)
)
),
'driver'=>数组(
'application_entities'=>数组(
'class'=> ;'doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache'=>'array',
'paths'=>数组(__ DIR__。 src / application / Entity')
),
'translatable_metadata_driver'=>数组(
'class'=>'Doctrine\ORM\Mapping\Driver\AnnotationDriver' ,
'cache'=>'array',
'paths'=> array(
'vendor / gedmo / doctrine-extensions / lib / Gedmo / Translatable / Entity',
)
),
'orm_default'=>数组(
'drivers'=>数组(
'Application\Entity'=> 'application_entities',
'Gedmo\Translatable\Entity'=> 'translateable_metadata_driver'
)
)
),
),
示例实体:
<?php
命名空间Application\Entity;
使用Gedmo\Mapping\Annotation作为Gedmo;
使用Doctrine\ORM\Mapping作为ORM;
使用Doctrine\Common\Collections\ArrayCollection;
/ **
* @ ORM\Entity(repositoryClass =Application\Repository\CategoryRepository)
* /
class类别{
/ **
* @ ORM\Id
* @ ORM\GeneratedValue
* @ ORM\Column(type =integer)
* /
private $ id;
/ **
* @ ORM\Column(type =string)
* @ Gedmo\Translatable
* /
private $名称;
/ **
* @ Gedmo\Locale
* /
private $ locale;
}
持续翻译工作正常,我可以使用可翻译库。
我有两个问题:
-
我无法弄清楚以获得订阅实体管理员的可翻译听众。我想在Module类中得到它,以在bootstrap中设置默认语言环境。
-
当我有一个实体对象时,我无法获得可翻译列的翻译,只有标准值。据我所知,我应该将一个值转换为默认语言环境,并且应该能够通过在使用语言环境注释的Entity中设置一个变量来覆盖默认语言环境,但似乎不起作用。 >
任何帮助将不胜感激!
public function onBootstrap(MvcEvent $ event)
{
$ serviceManager = $ event-> getApplication() - > getServiceManager();
$ this-> prepareGedmoTranslatable($ serviceManager);
}
/ **
* Gedmo\TranslatableListener的初始配置
*设置默认语言环境并将其注册为服务
*
*读者可以问为什么?
*如果您自己尝试使用TranslatableListener,您将会明白我的意思。)
*
* @param ContainerInterface $ services
* /
public function prepareGedmoTranslatable(ContainerInterface $ services )
{
/ **
* @var EventManager $ ormEventManager
* /
$ ormEventManager = $ services-> get('doctrine.eventmanager.orm_default' );
//假设postLoad事件有TranslatableListener作为监听器
//如果在doctrine配置中启用TranslatableListener,则
// Doctrine\ORM\Events :: postLoad
$ listeners = $ ormEventManager-> getListeners(Events :: postLoad);
$ translatableListener = null;
//搜索TranslatableListener导致Gedmo喜欢hardcore东西;)
foreach($ listeners as $ listener){
if($ listener instanceof TranslatableListener){
$ translatableListener = $ listener;
break;
}
}
if($ translatableListener instanceof TranslatableListener){
$ translatableListener-> setDefaultLocale(
//假设translator config提供默认语言环境
//例如在config
$ services-> get('config')['translator'] ['locale']
)中设置的区域设置;
//让翻译回到默认语言环境
$ translatableListener-> getTranslationFallback(true);
//行下面添加Listener作为一个服务,所以你可以访问
// $ services-> get(TranslatableListener :: class)
//你想要的地方
$ services-> setAllowOverride(true);
$ services-> setService(TranslatableListener :: class,$ translatableListener);
$ services-> setAllowOverride(false);
}
}
很高兴为您服务!
I am trying to use the Gedmo translatable extension for Doctrine 2 in a Zend Framework 2 application.
I have it setup like this:
'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'
)
)
),
),
Sample Entity:
<?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;
}
Persisting translations works fine and I can get them using the translatable repository.
I have two problems:
I cannot figure out how to get the translatable listener subscribed to the entitymanager. I would like to get it in the Module class to set the default locale on bootstrap.
When I have an entity object I cannot get the translations of translatable columns, only the standard values. As far as I can figure out, I should get a value translated to the default locale, and should be able to override the default locale by setting a variable in the Entity annotated with Locale, but it does not seem to work.
Any help would be greatly appreciated!
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);
}
}
Glad to help you!
这篇关于Zend 2 Doctrine 2 Gedmo可翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!