Gedmo 学说扩展中的个人翻译是什么?

Dar*_*ein 4 symfony doctrine-extensions

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

Art*_*iel 5

太长了;博士

当您想要处理翻译实体(使用您自己的表)而不是默认行为时,可以使用个人翻译,方法是使用单个表来处理所有翻译。


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

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

+----+-------+---------+
| id | title | content |
+----+-------+---------+
Run Code Online (Sandbox Code Playgroud)

现在,默认情况下,TranslatableListeneren_us在每次创建新实体时都会设置区域设置,从而仅填充articles表:

$article = new Article();
$article->setTitle('Title english');
$article->setContent('Content english');
Run Code Online (Sandbox Code Playgroud)

会导致以下情况:

+----+---------------+-----------------+
| id |     title     |     content     |
+----+---------------+-----------------+
|  1 | Title english | Content english |
+----+---------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

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

该表具有以下结构:

+----+--------+---------------+---------+-------------+------------+
| id | locale | object_class  |  field  | foreign_key |  content   |
+----+--------+---------------+---------+-------------+------------+
Run Code Online (Sandbox Code Playgroud)

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

$article->setTitle('My title');
$article->setContent('My content');
$article->setTranslatableLocale('de_de');
Run Code Online (Sandbox Code Playgroud)

当我们持久化更新的实体时,我们会得到以下结构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 |
+----+--------+---------------+---------+-------------+------------+
Run Code Online (Sandbox Code Playgroud)

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

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

如果您熟悉DoctrineExtensionsprovided by KnpLabs,那么您已经了解了provided by 的含义PersonalTranslations可以在此处找到有关此主题的文档链接。

希望这能为您澄清一些事情。如果您对此还有更多疑问,请告诉我。

  • 嘿,这不太正确。您不需要使用“个人翻译”来实现此行为。当您想要以翻译数组集合的形式实际控制实体翻译中的持久性行为时,应使用个人翻译。现在,您可以使用 onetomany 映射将集合映射到相应的实体翻译类,并且您现在可以控制级联等内容。如果您只想拥有单独的表,您可以通过为每个实体创建一个实体翻译类来实现这一点,如下所述在文档中 (4认同)