TYPO3 8.7 locallang翻译中的多个参数

时间:2019-03-20 10:30:07

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

我最近发现人们可以流畅地将参数传递给翻译

<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”是否与参数的索引有关系?如果是,如果我将键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>

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

1 个答案:

答案 0 :(得分:3)

在格式字符串(%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。现在,当您从任何地方获取参数数组时,都将依次包含年,月和日的值

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

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

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

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