【问题标题】:TYPO3 8.7 multiple arguments in locallang translationsTYPO3 8.7 locallang 翻译中的多个参数
【发布时间】:2019-08-11 00:26:52
【问题描述】:

我最近发现可以将参数传递给流式翻译

<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$s? 数字“1”是否与参数的索引有任何关系?如果是的话,如果我用key 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>

有人可以向我解释这是如何工作的吗?提前感谢:-)

【问题讨论】:

    标签: typo3 typo3-8.x typo3-extensions typo3-8.7.x


    【解决方案1】:

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

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

    你有字符串

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

    和数组

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

    您的格式化结果将是“玛丽有一只小羊羔”。但是如果参数的顺序不同会发生什么,如下所示:

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

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

    因此,要获得上述无序参数的正确输出,您需要格式字符串为:

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

    请注意,当且仅当您可以保证数组中参数的顺序始终相同时,参数交换才有意义。此外,如果您无法控制参数的顺序(但可以保证它是相同的),您很可能也需要使用它。

    正如Bernd Wilke πφ 所指出的,在处理本地化(例如您的情况)时,参数交换非常有用。

    不同的语言有不同的语言类型,也就是说,例如,主语、动词和宾语放在句子中,甚至日期的书写方式。

    标准的英文日期格式是,例如,month-day-year。在德国,它的格式为day.month.year,而日本的格式为year-month-date。现在,当您从任何地方获取参数数组时,按此顺序包含年、月和日的值

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

    您不会使用参数交换来以正确的顺序放置元素。

    在英语中,您的格式字符串将是 %2$s-%3$s-%1$s,对于德语是 %3$.%2$.%1$,对于日语是 %1$s-%2$s-%3$s 甚至是 %s-%s-%s(巧合的是,参数的顺序已经正确,但为了避免混淆和保持一致,您应该使用与其他语言一样的位置格式)。

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

    【讨论】:

    • 哇哦!如果我知道这是 php,我会相应地搜索......你知道的越多 ;-) 非常感谢你的详细和简单的解释。
    • 注意:特别是如果您有翻译,参数的顺序可能是错误的,因为参数的使用顺序可能与原始语言(TYPO3 的英语)不同。因此,虽然您可以在英语中使用 %s %s %s,但在一种翻译中可能是 %3$s %1$s %2$s,在另一种语言中可能是 %2$s %1$s %3$s
    • @BerndWilkerπφ 多么不安全的参数交换的一个很好的例子,甚至与实际问题相关!您介意我编辑答案以包含此详细信息吗?当然,要归功于你。
    • @TheKvist:继续。您可以使用日期格式作为示例:英文为month-day-year,日文为year-month-day,德文为day.month.year
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多