0

我正在创建一个 symfony2 项目,我得到了一个有两个可以翻译的字段的类。对于表单,我将 bundle a2lix 用于 symfony2 2.2 版

该部分工作正常,实体和对应的 entityTranslator 已填充到数据库中。但问题是当我尝试显示实体内容时,这些字段总是显示为默认语言环境而不是实际语言环境。

我的实体:

 /**
 * Product
 *
 * @ORM\Table(name="ecm_product")
 * @ORM\Entity(repositoryClass="Entity\Repository\ProductRepository")
 * @Gedmo\TranslationEntity(class="Entity\Translation\ProductTranslation")
 */
 class Product{

    /**
    * @var string
    *
    * @ORM\Column(name="name", type="string", length=255)
    * @Gedmo\Translatable
    */
    protected $name;

    /**
    * @var string
    *
    * @ORM\Column(name="slug", type="string", length=255, nullable=true)
    */
    protected $slug;

   /**
    * @var string
    *
    * @ORM\Column(name="description", type="text", nullable=true)
    * @Gedmo\Translatable
    */
    protected $description;


    /**
     * @ORM\OneToMany(
     *     targetEntity="Entity\Translation\ProductTranslation",
     *  mappedBy="object",
     *  cascade={"persist", "remove"}
     * )
     * @Assert\Valid(deep = true)
     */
     private $translations;


    public function getTranslations() {
       return $this->translations;
    }

    public function setTranslations($translations) {
       foreach ($translations as $translation) {
          $translation->setObject($this);
       }

      $this->translations = $translations;
      return $this;
    }

    /**
   * Remove translation
   *
   * @param Entity\Translation\ProductTranslation $translation
   */
   public function removeTranslation(Entity\Translation\ProductTranslation $translation)
   {
      if ($this->translations->contains($translation)) {
          $this->translations->removeElement($translation);
      }
   }


   /**
    * Add translation
    *
    * @param Entity\Translation\ProductTranslation $translation
    * @return PrivacyPolicy
    */
    public function addTranslation(Entity\Translation\ProductTranslation $translation)
    {
       if (!$this->translations->contains($translation)) {
          $this->translations[] = $translation;
          $translation->setObject($this);
       }

       return $this;
   }


}

我的实体翻译:

/**
 * Entity\Translation\ProductTranslation.php

 * @ORM\Entity
 * @ORM\Table(name="ecm_product_translations",
 *   uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
 *     "locale", "object_id", "field"
 *   })}
 * )
 */
class ProductTranslation extends AbstractPersonalTranslation
{
    /**
     * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $object;

    public function getObject() {
        return $this->object;
    }

    public function setObject($object) {
        $this->object = $object;
    }
}

在我的存储库中,我总是添加这一行:

$qb->getQuery()->setHint(
                    \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
                    'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
            );

但是我的实体没有被翻译:s

4

2 回答 2

0

当您请求页面时,仔细检查 $request->getLocale() 是否返回正确的语言环境。您的代码似乎是正确的,但如果没有产品实体中的所有代码(例如缺少的属性 $translations),就很难说。

您可以尝试将以下代码添加到您的 Product 实体中,看看是否有帮助:

use Gedmo\Translatable\Translatable;


class Product implements Translatable {

    protected $locale;

   /** 
     * @ORM\OneToMany(
     *     targetEntity="Entity\Translation\ProductTranslation", 
     *     mappedBy="object", 
     * )
     */
    protected $translations;

    public function __construct()
    {
        $this->translations = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ....


    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }


}
于 2013-11-14T15:54:04.897 回答
0

我发现了错误,您还需要在配置中定义一个侦听器,我有它,但仅适用于其中一个实体管理器(我有 2 个),这就是它没有翻译的原因。这是任何可能需要的人的代码:

services:
    gedmo.listener.translatable:
        class: Gedmo\Translatable\TranslatableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
            - { name: doctrine.event_subscriber, connection: client }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]
            - [ setDefaultLocale, [ %locale% ] ]
            - [ setTranslationFallback, [ true ] ]
            - [ setPersistDefaultLocaleTranslation, [false] ]
于 2013-11-14T16:49:12.030 回答