教义 2 - i18n 的最佳实践?

Posted

技术标签:

【中文标题】教义 2 - i18n 的最佳实践?【英文标题】:Doctrine 2 - best practices for i18n? 【发布时间】:2011-09-12 20:13:55 【问题描述】:

我正在寻找一些关于如何处理需要具有必须翻译成 n 种语言的字段的表的建议。我已经读过,最好的方法是拥有一个包含所有非特定语言字段的基表和一个包含所有翻译字段的表。

示例:

PRODUCT PRODUCT_TRANSLATIONS +--------------+ +----------+ |编号 | |编号 | +--------------+ +----------+ |类别 ID | |产品编号 | +--------------+ +----------+ |价格 | |语言标识 | +--------------+ +----------+ |姓名 | +------------------------+ |描述 | +------------------------+

因此,我们将拥有包含所有元数据的基表 PRODUCT 和存储所有需要翻译成多种语言的数据的 PRODUCT_TRANSLATIONS 表。 PRODUCT 表与 PRODUCT_TRANSLATIONS 表具有 OneToMany 关系。

处理这种情况的 Doctrine 方法是什么?如果我查询 Products 表,我会将所有翻译加入到该表中。但大多数时候,我只想为给定的产品 ID 提供一个翻译。我可以使用存储库类来编写我自己的 getter 方法来将结果集限制为仅一种语言,但是我将有很多具有需要翻译的字段的表。我敢打赌,这个问题有一个更通用的解决方案。另一个问题是,如果我查询与另一个对象相关的一个对象,我将获得该第二个对象的所有翻译。

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

因此,在国际化方面,我正在寻找任何最佳做法。高度赞赏有关此主题的任何想法。

【问题讨论】:

找到解决方案了吗?我也在寻找同样的东西。 【参考方案1】:

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

我相信您解决此问题的方法主要与您的项目的规模和类型有关。如果你想实现一个简单的CMS,你也可以使用一个数组来保存多语言字段的内容。但是这种方法是有限的。

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

如果您的系统内容从一种语言到另一种语言完全不同,或者您的系统需要一些基于这些多语言字段的繁重查询和报告,那么您提到的方法会很好。

【讨论】:

【参考方案2】:

您提到的可翻译行为扩展确实允许按类翻译实体。查看translatable doc 的“高级示例”部分下的“翻译实体”子标题。

简而言之:使用@Gedmo\TranslationEntity 注释指定要用于存储翻译的特定实体。这样,您可以将负载拆分到多个表中。

【讨论】:

在“翻译实体”下的高级示例中,我可以看到使用了这些字段:“locale”、“objectClass”、“foreign_key”、“field”。我假设使用它会导致每个翻译字段的记录。所以一个翻译的产品会导致翻译表中有多个记录。一条翻译记录是否可以在翻译表中只有一条记录(包含所有翻译的字段)?

以上是关于教义 2 - i18n 的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

项目版本管理的最佳实践:云效飞流Flow篇

后端日志最佳实践

Spring事务使用最佳实践

Spring事务使用最佳实践

Spring事务使用最佳实践

Spring事务使用最佳实践