代码之家  ›  专栏  ›  技术社区  ›  Kathara

TYPO3 8.7 locallang翻译中的多个参数

  •  0
  • Kathara  · 技术社区  · 5 年前

    我最近发现,一个人可以把论点传递给翻译

    <f:translate key="something.test" arguments="{0: 'something'}" />
    

    或用PHP

    \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('something.test', $extKey, $arguments);
    

    带参数的翻译如下:

    <trans-unit id="something.test">
        <source>this is the argument: %1$s</source>
    </trans-unit>
    

    数字“1”是否与参数的索引有关?如果是,那么如果我使用键0传递参数,为什么它以1开头?

    我知道通过传递数组可以传递多个参数,但是我不知道如何在相应的位置放置正确的占位符。

    Controller:
    
    $arguments = array('something1', 'something2', 'something3');
    \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('something.test', $extKey, $arguments);
    
    locallang.xlf:
    
    <trans-unit id="something.test">
        <source>Test: [placeholder for something1]  [placeholder for something2] [placeholder for something3]</source>
    </trans-unit>
    

    有人能给我解释一下这是怎么回事吗?事先谢谢:-)

    0 回复  |  直到 5 年前
        1
  •  3
  •   TheKvist    5 年前

    在格式字符串中看到的内容( %1$s )就是所谓的 argument swapping (请参阅示例1-4以获得全面的理解)。

    如果占位符的顺序与参数的顺序不同,则可以使用它。例如:

    你有绳子

    $str = "%s had a %s %s";
    

    以及阵列

    $args = [
      'Mary',
      'little',
      'lamb',
    ];
    

    你的格式化结果是“玛丽有一只小羊羔”。但如果争论的顺序不同,会发生什么呢

    $args = [
      'lamb',
      'Mary',
      'little',
    ];
    

    然后你会得到“兰姆有一个小玛丽”。通过使用参数交换(混淆名称,我知道),您可以告诉格式化程序在哪里查找给定的参数。这些占位符是按位置而不是按索引配置的,因此它们从1开始,而不是从0开始。

    $str = "%2$s had a %3$s %1$s";
    

    请注意,参数交换在且仅在您可以保证数组中参数的顺序始终相同的情况下才有意义。另外,如果您不能控制参数的顺序(但可以保证它是相同的),那么您很可能也需要使用它。

    如所述 Bernd Wilke πφ ,参数交换在处理本地化时非常有用,例如在您的案例中。

    不同的语言有不同的语言类型,也就是说,主语、动词和宾语被放在句子中,甚至日期是怎么写的。

    month-day-year . 在德国,它的格式是 day.month.year year-month-date . 现在,当您从where获取参数数组时,它按以下顺序包含year、month和day的值

    $arguments = [
      "2019",
      "03",
      "20",
    ];
    

    您将无法使用参数交换以正确的顺序放置元素。

    %2$s-%3$s-%1$s ,德语 %3$.%2$.%1$ 对日本人也一样 %1$s-%2$s-%3$s 甚至 %s-%s-%s (巧合的是,参数的顺序已经是正确的,但是为了避免混淆和保持一致,应该像使用其他语言一样使用位置格式)。

    当您可以控制参数顺序时,通常更容易使用非位置格式字符串,但是如上所述,这对于本地化(如果有的话)来说并不很好。