Что может сделать движок перевода, так это использовать число для переключения между разными падежами (для единственного / множественного числа). Взгляните на transChoice
для symfony 3.4 (до 4.1.x очевидно). Начиная с symfony 4.2, формат сообщения ICU (следуйте также ссылкам) может использоваться для обработки множественного числа.
Однако (условное) построение строки на самом деле не является задачей для механизма перевода вообще (хотя для простых случаев transChoice или формат сообщений ICU могут работать нормально). Таким образом, вы, вероятно, в итоге соберете строки из кусочков.
Сборка строки в php
// fetch translations for the itemss
$items = [];
foreach($parameters as $key => $count) {
if($count <= 0) {
continue;
}
$items[] = $translator->transChoice($key, $count);
}
// handle 2+ items differently from 1 item
if(count($items) > 1) {
// get last item
$last = array_pop($items);
// comma-separate all other items, add last item with "and"
$itemstring = implode(', ', $items)
. $translator->trans('included_and')
. $last;
} else {
$itemstring = $items[0] ?? ''; // if no items or something like
// $translator->trans('included_none')
}
return $translator->trans('included', ['%items%' => $itemstring]);
и в файле перевода (engli sh):
'included' => 'Included: %items%.',
'included_and' => ' and ',
'breakfast' => '%count% breakfast|%count% breakfasts', // etc. for all other stuff
Обратите внимание, что transChoice
должен автоматически установить для заполнителя %count%
значение, указанное в качестве второго параметра, transChoice
.
альтернативные подходы
Вы можете легко разбить переводимые строки на breakfast_singular
и breakfast_plural
, если вы хотите избежать использования transChoice
, вам придется заменить
transChoice($key, $count)
с
trans($key.($count > 1 ? '_plural' : '_singular'), ['%count%' => $count])
Вы также можете расширить строку included
до included_single
и included_multiple
, где последняя переводится как 'Included: %items% and %last%'
, с соответствующими параметрами и условиями.
В конечном счете, генерация строк или, более конкретно, генерация языка на самом деле не является задачей простого движка перевода.