плюрализировать в PHP - PullRequest
       57

плюрализировать в PHP

12 голосов
/ 08 октября 2009

У меня много информации для отображения из базы данных. Некоторые французские, другие английские. Некоторые из них уникальны, некоторые - список ...

Вопрос: как вы управляете всеми этими различными опциями в PHP

IF ELSE ВЫКЛЮЧАТЕЛЬ ARRAY (со всем текстом)

другой метод ...

теперь проблема возникает в списке запахов, у некоторых есть один (запах), у другого есть много (запахов), ставить s или нет - это боль ..... помогите!

спасибо

Ответы [ 8 ]

30 голосов
/ 04 июня 2013

Вы можете попробовать эту функцию, которую я написал:

/**
 * Pluralizes a word if quantity is not one.
 *
 * @param int $quantity Number of items
 * @param string $singular Singular form of word
 * @param string $plural Plural form of word; function will attempt to deduce plural form from singular if not provided
 * @return string Pluralized word if quantity is not one, otherwise singular
 */
public static function pluralize($quantity, $singular, $plural=null) {
    if($quantity==1 || !strlen($singular)) return $singular;
    if($plural!==null) return $plural;

    $last_letter = strtolower($singular[strlen($singular)-1]);
    switch($last_letter) {
        case 'y':
            return substr($singular,0,-1).'ies';
        case 's':
            return $singular.'es';
        default:
            return $singular.'s';
    }
}

Использование:

pluralize(4, 'cat'); // cats
pluralize(3, 'kitty'); // kitties
pluralize(2, 'octopus', 'octopii'); // octopii
pluralize(1, 'mouse', 'mice'); // mouse

Очевидно, что существует множество исключительных слов, которые эта функция не будет правильно использовать во множественном числе, но для этого используется аргумент $plural: -)

Взгляните на Википедию , чтобы увидеть, насколько сложным является множественное число!

24 голосов
/ 08 октября 2009

Возможно, вы захотите посмотреть расширение gettext . Точнее говоря, похоже, что ngettext() будет делать то, что вы хотите: оно правильно множит слова, если у вас есть число для подсчета.

print ngettext('odor', 'odors', 1); // prints "odor"
print ngettext('odor', 'odors', 4); // prints "odors"
print ngettext('%d cat', '%d cats', 4); // prints "4 cats"

Вы также можете сделать так, чтобы он правильно обрабатывал переведенные формы множественного числа, что является его главной целью, хотя для этого требуется много дополнительной работы.

7 голосов
/ 08 октября 2009

Лучший способ IMO - иметь массив всех ваших правил множественного числа для каждого языка, т.е. array('man'=>'men', 'woman'=>'women'); и написать функцию множественного числа () для каждого единственного слова.

Вы можете взглянуть на инфлектор CakePHP для вдохновения.

https://github.com/cakephp/cakephp/blob/master/src/Utility/Inflector.php

5 голосов
/ 14 июля 2015

Наслаждайтесь: https://github.com/ICanBoogie/Inflector

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

3 голосов
/ 11 октября 2009

Если вы собираетесь пойти по пути написания своей собственной функции множественного числа, вам может пригодиться это алгоритмическое описание множественного числа:

http://www.csse.monash.edu.au/~damian/papers/HTML/Plurals.html

Или гораздо более простой подход, вероятно, заключался бы в использовании одной из готовых функций множественного доступа, доступных в Интернете:

http://www.eval.ca/2007/03/03/php-pluralize-method/

1 голос
/ 20 сентября 2013

Эта ссылка содержит наиболее полезную функцию, которую я смог найти http://www.kavoir.com/2011/04/php-class-converting-plural-to-singular-or-vice-versa-in-english.html

0 голосов
/ 25 мая 2019

Symfony теперь предлагает компонент Inflector, преобразующий английские слова между их формами единственного и множественного числа. https://symfony.com/doc/master/components/inflector.html

0 голосов
/ 18 июля 2017

Индивидуальное, прозрачное и не требующее расширения решение. Не уверен насчет скорости.

/**
 * Custom plural
 */
function splur($n,$t1,$t2,$t3) {
    settype($n,'string');
    $e1=substr($n,-2);
    if($e1>10 && $e1<20) { return $n.' '.$t3; } // "Teen" forms
    $e2=substr($n,-1);
    switch($e2) {
        case '1': return $n.' '.$t1; break;
        case '2': 
        case '3':
        case '4': return $n.' '.$t2; break;
        default:  return $n.' '.$t3; break;
    }
}

Использование на украинском / русском:

splur(5,'сторінка','сторінки','сторінок') // 5 сторінок
splur(4,'сторінка','сторінки','сторінок') // 4 сторінки
splur(1,'сторінка','сторінки','сторінок') // 1 сторінка
splur(12,'сторінка','сторінки','сторінок') // 12 сторінок

splur(5,'страница','страницы','страниц') // 5 страниц
splur(4,'страница','страницы','страниц') // 4 страницы
splur(1,'страница','страницы','страниц') // 1 страница
splur(12,'страница','страницы','страниц') // 12 страниц
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...