Я хочу перевести скрипт, который перечисляет содержимое папки. Там отображается сводная информация о включенных файлах, папках и общем размере. До сих пор я перевел все строки, используя gettext
, но я застрял здесь и ищу элегантный способ решить перевод строки, которая может быть содержат несколько множественных чисел. Наверное, нет необходимости упоминать, но, поскольку каждый язык отличается, я хочу избежать объединения строк.
$summary = sprintf(_('%1$s folders and %2$s files, %3$s %4$s in total'), $total_folders, $total_files, $total_size, $unit);
Возможные состояния (0-случаи намеренно пропущены):
Я думаю ngettext()
будет подходящей заменой для _()
Но совмещать это с моим примером становится все труднее.
Плюрализация — основная проблема с переводами. Вот пример реализации, которая может вам помочь: http://symfony.com/doc/current/components/translation/usage.html#pluralization
Возможно, вам стоит подумать о том, чтобы взять компонент перевода, который они сделали для Symfony.
У меня есть решение. Но, может быть, вы не знаете — многие языки имеют три формы множественного числа.
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');