gedmo翻译setHint在gedmo-doctrine-extensions中不起作用

时间:2012-08-29 13:16:38

标签: symfony doctrine-orm translation

我正在开发Symfony 2.0上的网站,并坚持使用学说翻译。我一直在谷歌搜索谷歌组,Stackoverflow,但没有合适的答案。首先,我不会遇到我需要的所有项目。首先,我已经安装了学说扩展,然后安装了Stof。在WAMMP上,sluggable开始没有任何问题(但在Linux上我必须复制并且config_dev.yml被打破)。但我无法决定如何进行可翻译的工作。所以我在Google http://gediminasm.org/article/translatable-behavior-extension-for-doctrine-2找到了 创建了实体和翻译实体。

以下是代码:

<?php

namespace AV\TradeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * AV\TradeBundle\Entity\Countries
 *
 * @ORM\Table(name="countries")
 * @ORM\Entity
 * @Gedmo\TranslationEntity(class="AV\TradeBundle\Entity\CountryTranslation")
 */
class Countries implements Translatable
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

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

/**
 * @Gedmo\Locale
 * Used locale to override Translation listener`s locale
 * this is not a mapped field of entity metadata, just a simple property
 */
private $locale;

/**
* @ORM\OneToMany(
* targetEntity="CountryTranslation",
* mappedBy="object",
* cascade={"persist", "remove"}
* )
*/
private $translations;


public function __construct()
{
    $this->translations = new ArrayCollection();
}
/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set country
 *
 * @param string $country
 */
public function setCountry($country)
{
    $this->country = $country;
}

/**
 * Get country
 *
 * @return string 
 */
public function getCountry()
{
    return $this->country;
}

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

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

public function addTranslation(CountryTranslation $t)
{
    if (!$this->translations->contains($t)) {
        $this->translations[] = $t;
        $t->setObject($this);
    }
}

public function __toString() {
    return $this->getCountry();
}

}

这里继续向博客上提到的这样的翻译实体

<?php
namespace AV\TradeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation;

/**
* @ORM\Entity
* @ORM\Table(name="country_translations",
* uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
* "locale", "object_id", "field"
* })}
* )
*/
class CountryTranslation extends AbstractPersonalTranslation
{
/**
* Convinient constructor
*
* @param string $locale
* @param string $field
* @param string $value
*/
public function __construct($locale, $field, $value)
{
    $this->setLocale($locale);
    $this->setField($field);
    $this->setContent($value);
}

/**
* @ORM\ManyToOne(targetEntity="Countries", inversedBy="translations")
* @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $object;
}

?>

最后但不是最后一个     $ em = $ this-&gt; getDoctrine() - &gt; getEntityManager();

    $query = $em->createQuery(
            " SELECT c FROM AVTradeBundle:Companies c " .
            " ORDER BY c.title ASC "
            )->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,'en');

我看不到翻译只有项目的默认语言(国家/地区的LEFT JOIN公司)。也许我应该将Symfony的版本升级到2.1但是我的2.0版本中有很多软件包已经冻结。

请看我的问题。在symfony的论坛上,根本没有答案。

顺便说一下,我没有注册任何内核监听器,因为我使用了Stof。 谢谢,先生,亚历克斯

1 个答案:

答案 0 :(得分:2)

你误解了在教条扩展包中使用Translatable。您应用于查询的提示是您希望所有字段的翻译自动加入(因此您不必进行LEFT JOIN),因此您可以使用排序过滤或任何您想要的翻译字段而不是原始字段记录字段。请参阅translatable documentation的“使用ORM查询提示”部分。因此,通过将提示应用于查询,在您的情况下,它所做的只是您的国家/地区将自动翻译成您的结果。此外,您提供\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,'en'作为提示,这意味着您的结果将始终以英语翻译。我真的怀疑这是你正在寻找的行为。使用

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

如果您希望将结果翻译成用户的语言环境。您只需在使用apc或memcache时使用\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,因为查询将使用第一个使用的语言环境进行缓存。然后,您需要将此提示与当前用户区域设置一起使用,而不是始终为“en”。同样,这都在documentation

因此,如果您需要翻译,则需要自己获取。如果您不关心您所在国家/地区的名称是否被自动翻译,请不要应用提示并对您所在国家/地区的翻译进行LEFT JOIN(这里我看到您正在查询公司表格,因此您必须离开加入该国家/地区)第一)。这些将通过$country->getTranslations()提供。如果您应用提示,则LEFT JOIN是隐式的,但名称将被翻译。