Doctrine 2 - 国际化最佳实践?

7
我正在寻找关于如何处理需要将字段翻译成n种语言的表的建议。我已经阅读过最好的方法是拥有一个基础表,其中包含所有不特定于语言的字段,以及一个包含所有翻译字段的表。
例如:
PRODUCT PRODUCT_TRANSLATIONS +--------------+ +----------------------+ | id | | id | +--------------+ +----------------------+ | category_id | | product_id | +--------------+ +----------------------+ | price | | language_id | +--------------+ | name | +----------------------+ | description | +----------------------+
因此,我们将拥有一个名为PRODUCT的基础表,其中包含所有元数据,以及一个名为PRODUCT_TRANSLATIONS的表,其中存储需要翻译成多种语言的所有数据。PRODUCT表与PRODUCT_TRANSLATIONS表具有OneToMany关系。
在Doctrine中,如何处理这种情况?如果我查询Products表,我会得到所有加入到该表中的翻译。但是大多数情况下,我只想获得给定产品ID的一个翻译。我可以使用存储库类编写自己的getter方法来将结果集限制为仅一个语言,但我将有很多需要翻译字段的表。我相信有更通用的解决方案。另一个问题是,如果我查询与另一个对象相关联的一个对象,我将获得该第二个对象的所有翻译。
顺便说一句:我知道Gediminas的可翻译行为扩展,但我不喜欢所有翻译都存储在一个表中的事实。
因此,我正在寻找有关国际化的任何最佳实践。对此主题的任何想法都将不胜感激。

找到解决方案了吗?我也在寻找同样的东西。 - user1039489
2个回答

1

顺便说一下:我知道Gediminas的可翻译行为扩展,但我不喜欢所有翻译都存储在一个表中的事实。

我认为你解决这个问题的方法主要与项目的大小和类型有关。如果您想实现简单的CMS,您也可以使用数组来保存多语言字段的内容。然而,这种方法是有限制的。

/**
 * @var array
 *
 * @ORM\Column(name="title", type="array", nullable=true)
 */
private $title;

如果您的系统内容在不同语言之间完全不同,或者您的系统需要基于这些多语言字段进行一些繁重的查询和报告,那么您提到的方法是不错的。

0
您提到的可翻译行为扩展确实允许针对每个类别进行翻译实体。请查看translatable doc中高级示例部分下的“翻译实体”子标题。
简单来说,使用@Gedmo\TranslationEntity注释来指定特定实体用于存储翻译。这样,您就可以将负载拆分到多个表中。

2
在“翻译实体”下的高级示例中,我可以看到使用了这些字段:{"locale", "objectClass", "foreign_key", "field"}。我认为使用这将导致每个翻译字段生成一条记录。因此,一个翻译产品将在翻译表中生成多个记录。是否可能为一个翻译记录在翻译表中只有一条记录(包含所有翻译字段)? - murze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接