TYPO3 8.7 locallang 翻译中的多个参数
TYPO3 8.7 multiple arguments in locallang translations
我最近发现可以在 fluid
中将参数传递给翻译
<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$s
) 中看到的就是所谓的 argument swapping(请参阅示例 1-4 以获得透彻的理解)。
如果占位符的顺序与参数的顺序不同,您将使用它。一个例子:
你有字符串
$str = "%s had a %s %s";
和数组
$args = [
'Mary',
'little',
'lamb',
];
您的格式化结果将是 "Mary had a little lamb"。但是如果参数的顺序不同,会发生什么,像这样:
$args = [
'lamb',
'Mary',
'little',
];
那么你会得到"lamb had a Mary little"。通过使用参数交换(我知道这个名称令人困惑),您可以告诉格式化程序在何处查找给定参数。这些占位符是按位置配置的,而不是按索引配置的,因此它们从 1 开始,而不是从 0 开始。
因此,要获得上述无序参数的正确输出,您需要格式字符串为:
$str = "%2$s had a %3$s %1$s";
请注意,当且仅当您可以保证数组中参数的顺序始终相同时,参数交换才有意义。此外,如果您无法控制参数的顺序(但可以保证它们相同),您很可能也需要使用它。
正如 所指出的,参数交换在处理本地化时非常有帮助,例如在您的情况下。
不同的语言有不同的语言类型,例如主语、动词和宾语放在句子中,甚至是日期的书写方式。
例如,标准的英文日期格式是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
(巧合的是,参数已经按照正确的顺序,但为了避免混淆并保持一致,您应该使用与其他语言一样的位置格式)。
当您可以控制参数顺序时,使用非位置格式字符串通常会更容易,但如上所述,这对于本地化来说效果不佳,如果有的话。
我最近发现可以在 fluid
中将参数传递给翻译<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$s
) 中看到的就是所谓的 argument swapping(请参阅示例 1-4 以获得透彻的理解)。
如果占位符的顺序与参数的顺序不同,您将使用它。一个例子:
你有字符串
$str = "%s had a %s %s";
和数组
$args = [
'Mary',
'little',
'lamb',
];
您的格式化结果将是 "Mary had a little lamb"。但是如果参数的顺序不同,会发生什么,像这样:
$args = [
'lamb',
'Mary',
'little',
];
那么你会得到"lamb had a Mary little"。通过使用参数交换(我知道这个名称令人困惑),您可以告诉格式化程序在何处查找给定参数。这些占位符是按位置配置的,而不是按索引配置的,因此它们从 1 开始,而不是从 0 开始。
因此,要获得上述无序参数的正确输出,您需要格式字符串为:
$str = "%2$s had a %3$s %1$s";
请注意,当且仅当您可以保证数组中参数的顺序始终相同时,参数交换才有意义。此外,如果您无法控制参数的顺序(但可以保证它们相同),您很可能也需要使用它。
正如
不同的语言有不同的语言类型,例如主语、动词和宾语放在句子中,甚至是日期的书写方式。
例如,标准的英文日期格式是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
(巧合的是,参数已经按照正确的顺序,但为了避免混淆并保持一致,您应该使用与其他语言一样的位置格式)。
当您可以控制参数顺序时,使用非位置格式字符串通常会更容易,但如上所述,这对于本地化来说效果不佳,如果有的话。