我正在 Symfony 2.0 上开发网站,并被教义翻译卡住了。我一直在谷歌搜索,Stackoverflow,但没有合适的答案。所以首先,我不会遇到我所有的项目只需要的东西。首先,我安装了理论扩展,然后是 Stof。在 WAMMP 上,sluggable 毫无问题地开始工作(但在 Linux 上我不得不复制并且 config_dev.yml 被破坏了)。但我找不到如何制作可翻译作品的决定。于是我在谷歌上找到了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->getDoctrine()->getEntityManager();
$query = $em->createQuery(
" SELECT c FROM AVTradeBundle:Companies c " .
" ORDER BY c.title ASC "
)->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,'en');
我只看到项目的默认语言没有翻译(在国家/地区左加入公司)。也许我应该将 Symfony 的版本升级到 2.1,但是我的 2.0 冻结了很多包。
请看我的问题。在 symfony 的论坛上根本没有答案。
顺便说一句,我没有注册任何内核侦听器,因为我使用了 Stof。谢谢,事先,亚历克斯