在 Gedmo Doctrine Extensions 的 Translatable 行为中,有关于“个人翻译”的说明。有人可以澄清什么是个人翻译吗?
1 回答
tl;博士
当您想通过对所有翻译使用单个表来处理翻译实体(自己使用它自己的表)而不是默认行为时,将使用个人翻译。
通过使用默认行为,您将获得一个名为的表ext_translations
,其中包含所有翻译数据。我将根据DoctrineExtensions
.
假设我们创建了一个Article
具有 2 个可翻译字段的实体 -title
和content
. 这意味着我们应该有以下表结构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
。可以在此处找到他们有关此主题的文档的链接。
好吧,希望这可以为您澄清一点。如果您对此有更多疑问,请告诉我。