1

私は Symfony 2.0 でサイトを開発していて、教義の翻訳に行き詰まっています。私はGoogleグループ、Stackoverflowをグーグルで調べてきましたが、適切な答えはありません. そのため、まず第一に、プロジェクトに必要なものだけに出くわすことはありませんでした。まず第一に、doctrine-extensions をインストールしてから 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->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 を使用しているため、カーネル リスナーを登録しませんでした。事前にありがとう、アレックス

4

1 に答える 1

2

ドクトリン拡張バンドルでの Translatable の使用を誤解しています。クエリに適用するヒントは、すべてのフィールドの翻訳を自動的に結合する場合 (つまり、LEFT JOIN を実行する必要がない場合) であるため、元のフィールドではなく、翻訳されたフィールドで順序付けフィルタリングまたは必要なものを使用できます。フィールドを記録します。翻訳可能なドキュメントの「ORM クエリ ヒントの使用」セクションを参照してください。したがって、クエリにヒントを適用することにより、あなたの場合、あなたの国が結果で自動的に翻訳されるだけです。また、\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,'en'ヒントとして提供すると、結果は常に英語に翻訳されます。それがあなたが探している振る舞いだとは本当に思えません。使用する

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

結果をユーザーのロケールに翻訳したい場合。\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALEクエリは最初に使用されたロケールでキャッシュされるため、apc または memcache を使用する場合にのみ使用する必要があります。次に、このヒントを現在のユーザーロケールで使用する必要があり、常に「en」ではありません。繰り返しますが、これはすべてドキュメントにあります。

したがって、翻訳が必要な場合は、自分で取得する必要があります。国名が自動的に翻訳されることを気にしない場合は、ヒントを適用せず、国の翻訳に LEFT JOIN を実行してください (ここでは、会社のテーブルをクエリしているので、国を LEFT JOIN する必要があります)最初)。これらは から入手できます$country->getTranslations()。ヒントを適用すると、LEFT JOIN は暗黙的になりますが、名前は変換されます。

于 2012-09-26T11:03:08.703 に答える