Как перевести строку, содержащую несколько множественных чисел?

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

$summary = sprintf(_('%1$s folders and %2$s files, %3$s %4$s in total'), $total_folders, $total_files, $total_size, $unit);

Возможные состояния (0-случаи намеренно пропущены):

  • 1 папка и 1 файл, всего 100 килобайт
  • 1 папка и 2 файла, всего 200 килобайт
  • 2 папки и 1 файл, всего 100 килобайт
  • 2 папки и 2 файла, всего 200 килобайт

Я думаю ngettext() будет подходящей заменой для _()Но совмещать это с моим примером становится все труднее.

0

Решение

Плюрализация — основная проблема с переводами. Вот пример реализации, которая может вам помочь: http://symfony.com/doc/current/components/translation/usage.html#pluralization

Возможно, вам стоит подумать о том, чтобы взять компонент перевода, который они сделали для Symfony.

0

Другие решения

У меня есть решение. Но, может быть, вы не знаете — многие языки имеют три формы множественного числа.

function plural($n, $f1, $f3, $f5)
{
return $n%10==1&&$n%100!=11?$f1:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$f3:$f5);
}
// for english
echo plural($x, 'monkey', 'monkeys', 'monkeys');
0

По вопросам рекламы [email protected]