Symfony2 实现数据库翻译的最佳方式
Symfony2 Best way to implement database translations
我正在将一个多语言网站重构为 symfony。
该站点在数据库中存储了大量语言信息(产品描述、产品名称...)和一种语言 table。它看起来很像这些:
Table 产品:
-ID
-价格
-股票
-...
Tableproduct_language:
-id_product
-id_language
-姓名
-描述
Table 语言:
-ID
-姓名
-代码
所以我正在考虑将其迁移到 symfony 和 doctrine 的最佳方式,我一直在研究 translatable 扩展,但我不知道它是否适合这里(我'我不确定是否可以将语言 table 添加到其中)
谢谢!
我使用 KNP Translatable behavior 构建了一个多语言电子商务平台,它非常棒。
它肯定能满足您的需求。这是我的 "Product" 实体及其如何影响您的数据库的简单示例。
//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();
将使用当前用户区域设置输出好的翻译。
您可以使用 VM5's Entity Translations bundle。
它非常简单和轻巧。并且它还使用本地 Doctrine ORM 关联进行翻译。
我正在将一个多语言网站重构为 symfony。
该站点在数据库中存储了大量语言信息(产品描述、产品名称...)和一种语言 table。它看起来很像这些: Table 产品: -ID -价格 -股票 -...
Tableproduct_language: -id_product -id_language -姓名 -描述
Table 语言: -ID -姓名 -代码
所以我正在考虑将其迁移到 symfony 和 doctrine 的最佳方式,我一直在研究 translatable 扩展,但我不知道它是否适合这里(我'我不确定是否可以将语言 table 添加到其中)
谢谢!
我使用 KNP Translatable behavior 构建了一个多语言电子商务平台,它非常棒。
它肯定能满足您的需求。这是我的 "Product" 实体及其如何影响您的数据库的简单示例。
//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();
将使用当前用户区域设置输出好的翻译。
您可以使用 VM5's Entity Translations bundle。 它非常简单和轻巧。并且它还使用本地 Doctrine ORM 关联进行翻译。