我过去2个小时一直在翻译我的slug而没有太大的成功。首先,让我们来看看我的实体:
/**
* BlogPost
*
* @ORM\Entity
*/
class BlogPost implements Translatable
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Gedmo\Translatable
* @ORM\Column(name="title", type="string", length=128)
*/
private $title;
/**
* @Gedmo\Slug(fields={"title"})
* @Gedmo\Translatable
* @ORM\Column(length=128)
*/
private $slug;
这很简单。现在,当我这样做时:
$em = $this->getDoctrine()->getManager();
$blogPost = new BlogPost();
$blogPost->setTitle('my title in FRANCAIS');
$blogPost->setTranslatableLocale('fr_ca');
$em->persist($blogPost);
$em->flush();
$blogPost->setTitle('my title in ENGLISH');
$blogPost->setTranslatableLocale('en_us');
$em->persist($blogPost);
$em->flush();
只有我的标题被翻译,但我的slug只有法语。 I tried that solution from the doc ...但是没有TranslationListener(该文件不存在)。文档中只有一个注释对我来说意义不大:
注意:这些翻译不会被处理为对象的普通字段,如果你翻译了一个slug,额外的翻译将不知道如何生成slug,因此在创建时应该处理作为附加翻译的值。
我必须承认我感到自己死路一条。有人可以分享一些有关此事的知识!
答案 0 :(得分:1)
我建议您使用KnpDoctrineBehavious Bundle。翻译实体的任何属性非常简单:
class BlogPost
{
use ORMBehaviors\Translatable\Translation;
// anything that should not be translated
// follows in this class
}
添加翻译实体:
class BlogPostTranslation
{
/**
* @Gedmo\Slug(fields={"title"})
* @ORM\Column(length=128)
*/
private $slug;
// ...
}
现在您可以访问以下任何翻译:
$blogPost->getSlug(); // default language slug
$blogPost->translate('en')->getSlug(); // English slug
$blogPost->translate('fr')->getSlug(); // French slug
请勿忘记在$entity->mergeNewTranslations();
之后致电$em->persist($entity);
更新翻译表。
请注意, DoctrineBehaviours Bundle 也支持更好的Sluggable
方式。像their documentation中显示的那样使用它。