Symfony 4翻译组件由ID无效

时间:2018-02-24 16:02:15

标签: php symfony internationalization translation symfony4

当我调用函数$translator->trans($key)时,doc指出第一个参数是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>

我当然可以继续使用第二个选项,但似乎错了。我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

你的第二个选择是正确的。翻译密钥使用source,而不是id-attribute。

XLIFF规范要求id:

  

必需的id属性用于唯一标识所有内容和相同内容中的元素。   [...]   id属性在许多元素中用作对给定元素的原始对应代码数据或格式的引用。 id元素的值由创建XLIFF文档的工具确定。

当使用像YAML这样的其他格式时,你将没有这个属性,因此如果Symfony将它用作翻译密钥则没有多大意义。

编辑:作为旁注,如果您使用Symfony命令将翻译转储为xliff文件,它将使用源字符串的md5-hash而不是翻译密钥填充val r = for {map_key <- List("WRONG_KEY", "a", "b", "c") | } yield x get map_key r: List[Option[List[Int]]] = List(None, Some(List(1, 2, 3)), Some(List(4, 5, 6)), Some(List(7, 8, 9))) val r = (for {map_key <- List("WRONG_KEY", "a", "b", "c") | } yield x get map_key).flatten r: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) - 属性。

答案 1 :(得分:1)

选项2的公平警告可能会使翻译编辑工具变得棘手。因为当你去翻译它时,来源将显示id而不是要翻译的单词。

我使用的另一种选择是选项1,但不是将id放在id字段中,而是将其设置为resname =“”。 Symfony将使用此resname,翻译文件会更有意义,因为大多数程序的人都希望源代码是您想要的。

如果您已经有一个没有resnames的大型xlif文件,我会在第一个项目中添加一个resname,然后在表格视图中使用“Easy XML Editor”将所有id复制到resname列,需要一分钟左右的时间。< / p>

我的两分钱。

马特

答案 2 :(得分:0)

@progonkpa 不幸的是你的榜样错了。 如果您想在翻译文件中拥有更多的翻译单位,则即使您不使用它,也必须编写一个id。如果您将id属性设置为空,并且有一个以上的跨单位(在99.99%的情况下),则会收到错误消息。

原因在于“ dbrumann”的答案

下面是另一个示例,该示例在同一个翻译文件中包含两个或多个翻译:

<trans-unit id="home" resname="home">...</trans-uni>

<trans-unit id="startseite" resname="startseite">...</trans-unit>

顺便说一句,我注意到有时翻译不起作用时,请清除缓存,然后重试...

php bin/console cache:clear