2

在过去的 2 个小时里,我一直在翻译我的蛞蝓,但没有取得多大成功。首先,让我们看一下我的实体:

/**
 * 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 只有法语。我从文档中尝试了该解决方案......但没有 TranslationListener(该文件不存在)。文档中只有一个注释对我来说意义不大:

注意:这些翻译不会作为你对象的普通字段处理,如果你翻译一个slug附加翻译将不知道如何生成slug,所以在创建它时应该处理作为附加翻译的值。

我必须承认,我觉得自己陷入了死胡同。有人可以分享一些关于这件事的知识!

4

1 回答 1

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();after$em->persist($entity);来更新翻译表。

编辑:

请注意,DoctrineBehaviours Bundle还支持更好的方式Sluggable像他们的文档中显示的那样使用它。

于 2014-04-02T18:18:18.340 回答