Множественное число в русском языке для PHP

«Процитировано 3 раз». «Тры раз — нэ пидораз». «Этот надпис рэжет глаз».

Специально для тех, кто оформляет интерфейсы, не повторяйте оплошности ValeZ. Образовать множественное число очень просто. Вот для этого кусок кода на PHP:

code:
function ru_lang_plural ($num, $str0, $str1, $str2)
{
 if ($num == 0 || ($num > 4 && $num < 21)) {
  return $str0;   // 0 цитат, 5 цитат
 } else {
  if ($num > 10) $n = $num % 10;
   else $n = $num;
  
  if ($n == 1) return $str1;      // 1 цитата
  if ($n > 1 && $n < 5) return $str2;     // 2 цитаты
 };
}

Если строки хранятся в отдельном файле или в БД (а они должны храниться отдельно в любом серьёзном проекте), можно работать с ними например так:

code:
$lang = array (
  'str1' => 'В вашей корзине {%0, товар}, благослави вас Господь!',
  'str2' => 'У нас есть {%0; отличная причина} чтобы выпить!'
);

$plurals = array (
 // ноль, одно, два
  'товар' => array ('товаров', 'товар', 'товара'),
  'отличная причина' => array ('отличных причин', 'отличная причина', 'отличные причины')
);

function ru_lang_plural ($num, $plurals)
{
 if ($num == 0 || ($num > 4 && $num < 21)) {
  return $plurals[0];   // 0 цитат, 5 цитат
 } else {
  if ($num > 10) $n = $num % 10;
   else $n = $num;
 
  if ($n == 1) return $plurals[1];      // 1 цитата
  if ($n > 1 && $n < 5) return $plurals[2];     // 2 цитаты
 };
}

function parse_lang_str ($strName, $vars = array ())
{
  global $lang;
 
  // всякие проверки, разделы и т. п. опущены для краткости
  $str = $lang[$strName];
  if ($vars) {
   foreach ($vars as $N => $value) {
    $GLOBALS['_value'] = $value;
    $str = preg_replace_callback
         (
          "/\{%($N)[,;](.+?)\}/",
          create_function(
                 '$matches',
                 'global $plurals, $_value;
                  return $_value . '&nbsp;' . ru_lang_plural($_value, $plurals[trim($matches[2])]);'
            ),
          $str
         );
   };
  };
 
  return $str;
}

for ($n = 0; $n < 12; ++$n) {
 echo $n . "<Br>";
 echo parse_lang_str ('str1', array (0=> $n)) . '<Br>';
 echo parse_lang_str ('str2', array (0=> $n)) . '<Br>';
 echo "<br>";
};


Код упрощённый, но вполне рабочий.

Да пребудет с нами русский язык.

++ интересно, зачем здесь в текстовом редакторе стиль «code», если он всё равно на это чихает в итоговой публикации?

Comments are closed.