format_plural
includes/common.inc, строка 1143
- Версии
- 5
format_plural($count, $singular, $plural)
- 6
format_plural($count, $singular, $plural, $args = array(), $langcode = NULL)
Форматирует и переводит строку, содержащую число.
Функция обеспечивает корректное форматирование и перевод строк с числителями. Так как функция вызыват t()
, не передавайте в нее уже переведенные значения.
Например:
$output = format_plural($node->comment_count, '1 comment', '@count comments');
Примеры с дополнительными подстановками:
$output = format_plural($update_count, 'Changed the content type of 1 post from %old-type to %new-type.', 'Changed the content type of @count posts from %old-type to %new-type.', array('%old-type' => $info->old_type, '%new-type' => $info->new_type)));
Параметры
$count
Число для подстановки.
$singular
Строка в единичном числе. Используйте строки, в которых явно выраженно единичное число, дабы упростить дальнейший перевод (напр. используйте '1 new comment'
вместо '1 new'
).
Кроме того, здесь запрещено использовать '@count'
.
$plural
Строка для множественного значения. Используйте '@count'
в месте, где должна подставиться цифра, например
'@count
new comments'
$args
Ассоциативный массив подстановок для перевода. При встрече ключей массива в строке перевода, они заменяются на соответствующие значения.
В зависимости от первого символа в ключе, значения экранируются или приводятся в надлежайший вид:
- !variable: вставляется без изменений;
- @variable: очищается от HTML (
check_plain()
); - %variable: очищает текст и темизируется как "заполнитель" для введенных пользователем данных (
check_plain()
+theme_placeholder()
);
'@count'
в этот массив. Это делается автоматически.
$langcode
Необязательный код языка для перевода на язык отличный от используемого для отображения страницы.
Возвращаемое значение
Переведенная строка.
Связанные темы
Код
<?php
function format_plural($count, $singular, $plural, $args = array(), $langcode = NULL) {
$args['@count'] = $count;
if ($count == 1) {
return t($singular, $args, $langcode);
}
// Get the plural index through the gettext formula.
$index = (function_exists('locale_get_plural')) ? locale_get_plural($count, $langcode) : -1;
// Backwards compatibility.
if ($index < 0) {
return t($plural, $args, $langcode);
}
else {
switch ($index) {
case "0":
return t($singular, $args, $langcode);
case "1":
return t($plural, $args, $langcode);
default:
unset($args['@count']);
$args['@count['. $index .']'] = $count;
return t(strtr($plural, array('@count' => '@count['. $index .']')), $args, $langcode);
}
}
}
?>
Есть один подводный камень функции. Строку в параметре $singular нужно переводить на русский, заменяя еденицу на
@count
. Например: '1 comment' — '@count комментарий'.Если этого не сделать, вы получите неправильный перевод строк с числами, заканчивающимися на еденицу (21, 91, ...).
Пояснение сделано на сервере переводов - Как правильно переводить числительные, но и здесь стоит дополнить предыдущий комментарий.
Для русского языка единственным правильным вариантом перевода является:
1) единственная форма - заменить [1 или One] на (@|%)count
2) вторая форма - использовать (@|%)count
3) третья форма - использовать (@|%)count[2]
Например:
Использовать @count или %count - зависит от можественной формы исходной строки!