3

在 Gedmo Doctrine Extensions 的 Translatable 行为中,有关于“个人翻译”的说明。有人可以澄清什么是个人翻译吗?

4

1 回答 1

3

tl;博士

当您想通过对所有翻译使用单个表来处理翻译实体(自己使用它自己的表)而不是默认行为时,将使用个人翻译。


通过使用默认行为,您将获得一个名为的表ext_translations,其中包含所有翻译数据。我将根据DoctrineExtensions.

假设我们创建了一个Article具有 2 个可翻译字段的实体 -titlecontent. 这意味着我们应该有以下表结构articles

+----+-------+---------+
| id | title | content |
+----+-------+---------+

现在,默认情况下,en_us每次创建新实体时 TranslatableListener 都会设置语言环境,因此只填充articles表:

$article = new Article();
$article->setTitle('Title english');
$article->setContent('Content english');

会导致以下情况:

+----+---------------+-----------------+
| id |     title     |     content     |
+----+---------------+-----------------+
|  1 | Title english | Content english |
+----+---------------+-----------------+

到目前为止,只能articles使用新记录进行更新,但是当您想要翻译具有不同语言环境的字段时,我们的公共表ext_translations也会更新。

该表具有以下结构:

+----+--------+---------------+---------+-------------+------------+
| id | locale | object_class  |  field  | foreign_key |  content   |
+----+--------+---------------+---------+-------------+------------+

那么,当我们用一些新的翻译更新我们的记录时会发生什么:

$article->setTitle('My title');
$article->setContent('My content');
$article->setTranslatableLocale('de_de');

当我们持久化更新后的实体时,我们会得到以下结构ext_translations

+----+--------+---------------+---------+-------------+------------+
| id | locale | object_class  |  field  | foreign_key |  content   |
+----+--------+---------------+---------+-------------+------------+
|  1 | de_de  | Bundle\Entity | title   |           1 | My title   |
|  2 | de_de  | Bundle\Entity | content |           1 | My content |
+----+--------+---------------+---------+-------------+------------+

现在您知道默认行为是如何工作的了。它将您的所有翻译(不仅仅是单个实体,所有翻译)存储在一个表中。

但是,当您使用个人翻译时,您可以将您的(例如,为了我们的示例)Article翻译存储到它自己的单独表格中,article_translations.

如果您熟悉由DoctrineExtensions提供KnpLabs,那么您已经看到了 代表什么PersonalTranslations。可以在此处找到他们有关此主题的文档的链接。

好吧,希望这可以为您澄清一点。如果您对此有更多疑问,请告诉我。

于 2015-07-15T07:43:31.140 回答