我正在Symfony 2.0上开发网站,并被教条翻译所困扰。我一直在谷歌群组Stackoverflow上搜索,但没有合适的答案。所以首先,我不会遇到所有我的项目只需要的东西。首先,我安装了条令扩展,然后安装了Stof。在WAMMP上,slackable开始工作,没有任何问题(但在Linux上,我不得不复制,config_dev.yml被破坏了)。但我无法决定如何制作可翻译的作品。所以我在谷歌上找到了http://gediminasm.org/article/translatable-behavior-extension-for-doctrine-2创建了实体和翻译实体。
代码如下:
<?php
namespace AVTradeBundleEntity;
use DoctrineORMMapping as ORM;
use GedmoMappingAnnotation as Gedmo;
use GedmoTranslatableTranslatable;
use DoctrineCommonCollectionsArrayCollection;
/**
* AVTradeBundleEntityCountries
*
* @ORMTable(name="countries")
* @ORMEntity
* @GedmoTranslationEntity(class="AVTradeBundleEntityCountryTranslation")
*/
class Countries implements Translatable
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $country
* @GedmoTranslatable
* @ORMColumn(name="country", type="string", length=255, nullable=false)
*/
private $country;
/**
* @GedmoLocale
* Used locale to override Translation listener`s locale
* this is not a mapped field of entity metadata, just a simple property
*/
private $locale;
/**
* @ORMOneToMany(
* 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 AVTradeBundleEntity;
use DoctrineORMMapping as ORM;
use GedmoTranslatableEntityMappedSuperclassAbstractPersonalTranslation;
/**
* @ORMEntity
* @ORMTable(name="country_translations",
* uniqueConstraints={@ORMUniqueConstraint(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);
}
/**
* @ORMManyToOne(targetEntity="Countries", inversedBy="translations")
* @ORMJoinColumn(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(
GedmoTranslatableTranslatableListener::HINT_TRANSLATABLE_LOCALE,'en');
我没有看到任何翻译,只有项目的默认语言(LEFT JOIN公司在国家)。也许我应该把Symfony的版本升级到2.1,但我的2.0有很多捆绑包被冻结了。
请看我的问题。在symfony的论坛上,没有任何回复。
顺便说一句,我没有注册任何内核侦听器,因为我使用了Stof。谢谢,在汉兹之前,Alex
您误解了在条令扩展捆绑包中使用可翻译。应用于查询的提示是,当您希望所有字段的翻译自动联接时(这样您就不必执行LEFT join),因此您可以对已翻译的字段而不是原始记录字段使用排序筛选或任何您想要的方法。请参阅可翻译文档的"使用ORM查询提示"一节。因此,在您的情况下,通过将提示应用于查询,您的国家将在结果中自动翻译。此外,您提供GedmoTranslatableTranslatableListener::HINT_TRANSLATABLE_LOCALE,'en'
作为提示,这意味着您的结果将始终被翻译为英语。我真的怀疑你想要的是那种行为。使用
$query->setHint(
DoctrineORMQuery::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\Translatable\Query\TreeWalker\TranslationWalker'
);
如果您希望在用户的区域设置中翻译结果。当您使用apc或memcache时,您只需要使用GedmoTranslatableTranslatableListener::HINT_TRANSLATABLE_LOCALE
,因为查询将使用首次使用的区域设置进行缓存。然后,您需要将此提示与当前用户区域设置一起使用,而不是总是"en"。同样,这些都在文档中。
所以,如果你想要你的翻译,你需要自己取。如果你不在乎你国家的名字被自动翻译,那么不要应用提示,对你国家的翻译做一个LEFT JOIN(在这里我看到你在查询公司表,所以你必须先LEFT JOI这个国家)。这些将通过$country->getTranslations()
提供。如果应用提示,则LEFT JOIN是隐式的,但名称将被翻译。