TYPO3 8.7 множественные аргументы в локальных переводах - PullRequest
1 голос
/ 20 марта 2019

Я недавно обнаружил, что аргументы для перевода можно передавать либо в жидкости

<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» иметь отношение к индексу аргументов? Если да, то почему он начинается с 1, если я передаю аргумент с ключом 0?

Я понял, что можно передать несколько аргументов, передав массив, но я не знаю, как правильно разместить заполнители в соответствующих местах.

Я хочу сделать следующее:

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 Ответ

3 голосов
/ 20 марта 2019

В строке формата (%1$s) вы видите то, что называется замена аргумента (подробное понимание см. В примерах 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";

Обратите внимание, что замена аргументов имеет смысл тогда и только тогда, когда вы можете гарантировать, что порядок аргументов в вашем массиве всегда будет одинаковым. Кроме того, если вы не можете контролировать порядок аргументов (но можете гарантировать, что он будет таким же), вам, скорее всего, придется его использовать.

Как заметил Бернд Уилк πφ , обмен аргументами очень полезен при работе с локализацией, как, например, в вашем случае.

Разные языки имеют разные языковые типологии, то есть где, например, субъект, глагол и объект помещаются в предложение или даже как написана дата.

Стандартный английский формат даты, например, 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 (по совпадению, аргументы уже в правильном порядке, но во избежание путаницы и оставайтесь последовательными, вы должны использовать позиционное форматирование, как и в других языках).

Когда вы можете управлять порядком аргументов, обычно проще использовать непозиционную строку форматирования, но, как объяснено выше, это не очень хорошо работает для локализации, если вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...