Symfony 4 翻译组件按 id 翻译不工作
Symfony 4 translations component translate by id not working
当我调用函数 $translator->trans($key)
时,文档指出第一个参数是 ID。在我看来,id 应该与 .xlf 文件中的 id 属性相关。实际上,它与.xlf 文件的源元素有关。
控制器内部的方法调用:
$translator->trans('KUNGFU.CODER')
messages.en.xlf (EN) 不适用于上面的方法调用:
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="nl" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="KUNGFU.CODER">
<source>De code fu is sterk bij deze</source> // dutch source message
<target>The code fu is strong inside this one</target>
</trans-unit>
</body>
</file>
</xliff>
messages.en.xlf (EN) 与上面的方法调用一起工作:
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="nl" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="KUNGFU.CODER">
<source>KUNGFU.CODER</source> // id
<target>The code fu is strong inside this one</target>
</trans-unit>
</body>
</file>
</xliff>
我当然可以继续使用第二个选项,但它似乎是错误的。我在这里错过了什么?
你的第二个选择是对的。翻译键使用来源,而不是 id-attribute.
XLIFF 规范要求 ID:
The required id attribute is used to uniquely identify the within all and elements within the same .
[...]
The id attribute is used in many elements as a reference to the original corresponding code data or format for the given element. The value of the id element is determined by the tool creating the XLIFF document.
当使用 YAML 等其他格式时,您将没有此属性,因此如果 Symfony 将其用作翻译密钥,则意义不大。
edit:作为旁注,如果您使用 Symfony 命令将翻译转储为 xliff 文件,它将使用源字符串的 md5 散列而不是翻译密钥填充 id
属性。
使用选项 2 的公平警告可能会使翻译编辑器的使用变得棘手。因为当你去翻译它的时候,源代码会显示 id 而不是要翻译的单词。
我使用的替代方法是选项 1,但不是将 id 放在 id 字段中,而是将其作为 resname=""。 Symfony 将使用此重命名,翻译文件将更有意义,因为人们希望源代码是您想要的单词的大多数程序。
如果您已经有一个没有重命名的大型 xlif 文件,我会在第一项中添加一个重命名,然后在 table 视图中使用 "Easy XML Editor" 将所有 ID 复制到重命名列,需要一分钟左右做。
我的两分钱。
马特
@progonkpa
不幸的是你的例子是错误的。
如果你想在翻译文件中有更多的翻译单元,即使你不使用它也必须写一个 id。如果您让 id 属性 为空,并且您有多个 trans-unit(99.99% 的情况),那么您将得到一个错误。
原因在"dbrumann"
的回答中
这是另一个在同一个翻译文件中有两个或更多翻译的例子:
<trans-unit id="home" resname="home">...</trans-uni>
<trans-unit id="startseite" resname="startseite">...</trans-unit>
顺便说一下,我注意到有时如果翻译不起作用,只需清除缓存并重试...
php bin/console cache:clear
当我调用函数 $translator->trans($key)
时,文档指出第一个参数是 ID。在我看来,id 应该与 .xlf 文件中的 id 属性相关。实际上,它与.xlf 文件的源元素有关。
控制器内部的方法调用:
$translator->trans('KUNGFU.CODER')
messages.en.xlf (EN) 不适用于上面的方法调用:
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="nl" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="KUNGFU.CODER">
<source>De code fu is sterk bij deze</source> // dutch source message
<target>The code fu is strong inside this one</target>
</trans-unit>
</body>
</file>
</xliff>
messages.en.xlf (EN) 与上面的方法调用一起工作:
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="nl" datatype="plaintext" original="file.ext">
<body>
<trans-unit id="KUNGFU.CODER">
<source>KUNGFU.CODER</source> // id
<target>The code fu is strong inside this one</target>
</trans-unit>
</body>
</file>
</xliff>
我当然可以继续使用第二个选项,但它似乎是错误的。我在这里错过了什么?
你的第二个选择是对的。翻译键使用来源,而不是 id-attribute.
XLIFF 规范要求 ID:
The required id attribute is used to uniquely identify the within all and elements within the same . [...] The id attribute is used in many elements as a reference to the original corresponding code data or format for the given element. The value of the id element is determined by the tool creating the XLIFF document.
当使用 YAML 等其他格式时,您将没有此属性,因此如果 Symfony 将其用作翻译密钥,则意义不大。
edit:作为旁注,如果您使用 Symfony 命令将翻译转储为 xliff 文件,它将使用源字符串的 md5 散列而不是翻译密钥填充 id
属性。
使用选项 2 的公平警告可能会使翻译编辑器的使用变得棘手。因为当你去翻译它的时候,源代码会显示 id 而不是要翻译的单词。
我使用的替代方法是选项 1,但不是将 id 放在 id 字段中,而是将其作为 resname=""。 Symfony 将使用此重命名,翻译文件将更有意义,因为人们希望源代码是您想要的单词的大多数程序。
如果您已经有一个没有重命名的大型 xlif 文件,我会在第一项中添加一个重命名,然后在 table 视图中使用 "Easy XML Editor" 将所有 ID 复制到重命名列,需要一分钟左右做。
我的两分钱。
马特
@progonkpa 不幸的是你的例子是错误的。 如果你想在翻译文件中有更多的翻译单元,即使你不使用它也必须写一个 id。如果您让 id 属性 为空,并且您有多个 trans-unit(99.99% 的情况),那么您将得到一个错误。
原因在"dbrumann"
的回答中这是另一个在同一个翻译文件中有两个或更多翻译的例子:
<trans-unit id="home" resname="home">...</trans-uni>
<trans-unit id="startseite" resname="startseite">...</trans-unit>
顺便说一下,我注意到有时如果翻译不起作用,只需清除缓存并重试...
php bin/console cache:clear