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