Я ищу функцию, которая задает строку, которая переключается на единственное / множественное число. На самом деле мне не нужен английский, но мне нужны некоторые другие европейские языки.
Есть ли какая-нибудь функция, которая может сделать трюки? (с учетом строки для преобразования и языка?)
благодаря
Для этого типа операции нет встроенной функции PHP. Однако есть некоторые инструменты, которые вы можете использовать для достижения своей цели.
Существует неофициальный API словаря Google, который содержит информацию о множественных числах. Подробнее об этом методе можно прочитать здесь . Вам нужно проанализировать объект JSON, чтобы найти соответствующие элементы, и этот метод имеет тенденцию быть немного медленным.
Другой метод, который приходит на ум, – использовать aspell или одного из его родственников. Я не уверен, насколько точны словари для языков, отличных от английского, но я использовал aspell для расширения слов в их различных формах.
Я знаю, что это не самый полезный ответ, но, надеюсь, он дает вам общее направление поиска.
Вот моя удобная функция:
function plural( $amount, $singular = '', $plural = 's' ) { if ( $amount === 1 ) { return $singular; } return $plural; }
По умолчанию он просто добавляет 's' после строки. Например:
echo $posts . ' post' . plural( $posts );
Это будет «0 сообщений», «1 сообщение», «2 сообщения», «3 сообщения» и т. Д. Но вы также можете:
echo $replies . ' repl' . plural( $replies, 'y', 'ies' );
Что будет отвечать «0 ответов», «1 ответ», «2 ответа», «3 ответа» и т. Д. Или, альтернативно:
echo $replies . ' ' . plural( $replies, 'reply', 'replies' );
И это работает и на некоторых других языках. Например, на испанском языке я делаю:
echo $comentarios . ' comentario' . plural( $comentarios );
Который будет эхом «0 коментарио», «1 comentario», «2 комментария», «3 комментария» и т. Д. Или если добавление «s» не так, то:
echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' );
Что будет означать «0 canciones», «1 canción», «2 canciones», «3 canciones» и т. Д.
Это непросто: каждый язык имеет свои собственные правила для формирования множественных чисел существительных. По-английски, как правило, вы помещаете «-s» в конец слова, если оно не заканчивается на «-x», «-s», «-z», «-sh», «-ch», в котором Если вы добавите «-es». Но тогда есть «мышь» => «мышь», «овец» => «овец» и т. Д.
Первое, что нужно сделать, это выяснить, что такое правило (ы) для формирования множественного числа из сингулярного существительного на языке (языках), с которым вы хотите работать. Но это не все решение. Другой проблемой является распознавание существительных. Если вам дано существительное и нужно преобразовать его из единственного числа в множественное число, это не слишком сложно, но если вам дана часть свободного текста, и вам нужно найти сингулярные существительные и преобразовать их во множественное число, это намного сложнее. Вы можете получить списки существительных, но, конечно, некоторые слова могут быть существительными и глаголами («охота», «рыба», «перерыв» и т. Д.), Поэтому вам нужно проанализировать текст для определения существительных.
Это большая проблема. Там, вероятно, есть система искусственного интеллекта, которая будет делать то, что вам нужно, но я не думаю, что все будет бесплатно.
Только английское решение
Вот класс PHP, который работал безупречно для меня до сих пор: http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/
Здесь это как Gist в случае, если сайт уходит: https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b
Это небольшой класс, который можно легко и быстро преобразовать на другие языки.
Вот быстрая функция, которую я обычно использую для менее сложных сценариев:
public static function getPluralPrase($phrase,$value){ $plural=''; if($value>1){ for($i=0;$i<strlen($phrase);$i++){ if($i==strlen($phrase)-1){ $plural.=($phrase[$i]=='y')? 'ies':(($phrase[$i]=='s'|| $phrase[$i]=='x' || $phrase[$i]=='z' || $phrase[$i]=='ch' || $phrase[$i]=='sh')? $phrase[$i].'es' :$phrase[$i].'s'); }else{ $plural.=$phrase[$i]; } } return $plural; } return $phrase; }
Хотя для более сложного решения вы можете пойти с @T. Решение Брайана Джонса
Мне нравится ответ Джеймса Константино. Простой и эффективный, и вы обязательно освоите каждый случай на любом языке. Хотя нужно написать больше кода (в два раза чаще используется общая часть слова).
Мне также нравится, конечно, решение TBrianJones, но оно работает только с английским (я могу легко улучшить его для своих обычных европейских языков, на немецком, французском, испанском, итальянском и португальском языках). Спасибо за это. Если вы знаете частоту слов, которые будут использоваться, вы можете оптимизировать ее, реорганизовывая линии.
Также предложение Фелипе хорошее, и кстати, плебисцитан.
Но в каждом решении я нашел то, что считаю ошибкой: каждый из вас использует единственную форму только для значения 1, а также для множественного числа для каждого другого случая. Это, очевидно, неверно для отрицательных значений, но также – по крайней мере, на французском языке – для значений, строго ниже 2.
Итак, вот мое предложение, взяв код Джеймса в качестве базы, оптимизированный:
function singleOrPlural($amount, $singular, $plural) { return (abs($amount)>=2 ? $amount.' '.$plural : $amount.' '.$singular ); }
Так что код вроде
echo "We bought ".singleOrPlural(1.5, "pound", "pounds") ." of apples and ".singleOrPlural(2, "pound", "pounds")." of bread.";
дам
We bought 1.5 pound of apples and 2 pounds of bread.
что правильно.
Для нулевого значения я не могу понять причину множественного числа, так как не существует ни одного объекта, но, возможно, с этим используются аборигены.
HTH, M.
У меня многоязычное решение.
function howmany($number,$singular,$plural) { if($number==1) return $number.' '.$singular; else return $number.' '.$plural; }
Вызвать функцию следующим образом:
echo howmany($variablenumber,upcase('kaibigan'),upcase('ng kaibigan'));
Надеюсь это поможет!
Вы можете попробовать следующее,
if ( !function_exists('pluralize') ) { function pluralize( $amount, $singular, $plural, $show=false ) { $OP = $show ? $amount.' ' : ''; $OP .= ( $amount == 1 ) ? $singular : $plural; return $OP; } }