Symfony2实现数据库翻译的最佳方式

时间:2015-05-13 11:51:43

标签: php symfony doctrine-orm translation

我正在为symfony重构一个多语言网站。

该网站有大量语言内容存储在数据库(产品说明,产品名称......)和语言表中。看起来很像这样: 表产品: -ID -价钱 -股票 -...

表product_language: -id_product -id_language -名称 -description

表格语言: -ID -名称 -code

所以我想以最好的方式将其迁移到symfony和doctrine,我一直在研究可翻译的扩展,但我不知道它是否适合这里(我不确定它是否可能将语言表添加到其中)

谢谢!

2 个答案:

答案 0 :(得分:4)

我使用KNP Translatable behavior构建了一个多语言电子商务平台,它非常棒。

它绝对符合您的需求。这是我的“产品”实体的一个简单示例,以及它如何影响您的数据库。

//AcmeBundle/Entity/Product.php
use Knp\DoctrineBehaviors\Model as ORMBehaviors;

/**
 * @ORM\Table(name="product")
 */
class Product
{
    use ORMBehaviors\Translatable\Translatable;

    /**
     * @var integer
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

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

    // other properties

然后,将所有可翻译属性放入名为ProductTranslation

的新实体中
//AcmeBundle/Entity/ProductTranslation.php
use Knp\DoctrineBehaviors\Model as ORMBehaviors;

/**
 * @ORM\Table(name="product_translation")
 * @ORM\Entity
 */
class ProductTranslation
{
    use ORMBehaviors\Translatable\Translation,
        ORMBehaviors\Sluggable\Sluggable;

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

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

这将为您提供两个表

第一个包含所有产品信息(在此示例中为SKU)。对于每个使用1-N关系的翻译实例,第二个将有一行。

完成后,您可以使用:

$product->translate('en')->getName();
$product->translate('fr')->getName();

甚至更好

$product->getName();

将使用当前用户区域设置输出良好的翻译。

答案 1 :(得分:0)

您可以使用VM5's Entity Translations bundle。 它非常简单轻巧。它还使用原生Doctrine ORM关联进行翻译。