Pluralize в PHP

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

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

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

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

теперь проблема возрастает в списке запахов, у некоторых есть один (запах) другой, у которого много (запахов), помещающих s или нет, является болью..... help!

спасибо

Ответ 1

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

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

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

Ответ 2

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

/**
 * 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 предназначен для: -)

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

Ответ 3

Возможно, вы захотите посмотреть расширение 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"

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 7

Пользовательское, прозрачное и бесплатное решение. Не уверен в скорости.

/**
 * 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 страниц

Ответ 8

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