我最近发现人们可以流畅地将参数传递给翻译
<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>
有人可以向我解释这是如何工作的吗?预先感谢:-)
答案 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
(碰巧的是,参数已经在正确的顺序,但是为了避免混淆和保持一致,您应该像其他语言一样使用位置格式。
当您可以控制参数顺序时,通常更容易使用非位置格式字符串,但是如上所述,这对于本地化(如果有的话)不是很好。