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();

翻訳されるのはタイトルだけですが、スラッグはフランス語のみです。私はドキュメントからその解決策を試しました...しかし、TranslationListenerはありません(ファイルが存在しません)。ドキュメントには、私にとってあまり意味のないメモが 1 つだけあります。

注: これらの翻訳は、オブジェクトの通常のフィールドとして処理されません。スラッグを翻訳する場合、追加の翻訳はスラッグの生成方法がわからないため、作成時に追加の翻訳としての値を処理する必要があります。

私は行き詰まりを感じていることを認めなければなりません。誰かがその問題についての知識を共有してくれませんか!

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 に答える