Sergey |
|
---|---|
почему я остановился на том варианте с предопределенными окончаниями? функция допускает, не только складывать слово, но просто выводить соответствующее числу слово.
Да очень просто. Правила,то правила, но зоопарк в окончаниях привносят исключения. 0 файлов, 1 файл, 3 файла.. $L['File_s'] = "Файл,ов,,а,ов"; нет файлов, 1 файл, 3 файла.. $L['File_s'] = ",нет файлов,файл,файла,файлов"; 0 пальто == нет польт (?), 1 пальто, 2 пальто... $L['File_s'] = ",нет польт,пальто,пальто,пальто"; проще в отдельных случая не самими окончаниями манипулировать, а вариантами слова Это касаемо и других языков. И соответственно легко осуществляется языковая локализация - вставляй свое правило фрагмент $ew=explode(",",$word); подготовит набор удобных вариантов. www.cotonti.mobi
|
Trustmaster |
|
---|---|
Неплохой анализ проблемы проведен. Но надо это как-то бы изящнее оформить. А то класс со единственным статическим методом - это никуда не годится.
May the Source be with you!
|
Ratibor |
|
---|---|
# Trustmaster : Неплохой анализ проблемы проведен. Но надо это как-то бы изящнее оформить. А то класс со единственным статическим методом - это никуда не годится.В предыдущем посте я привел class Plural, остается его немного допилить и объеденить с поправленной function declension, то все будет прекрасно. И получится что в зависимости от вписанного в config.php языка, будет использоваться конкретное правило. Правила для ланг файлов останутся прежние: кому нужны склонения, вписывают из в array, кому не нужны, оставляют единственное значение. Не задавай глупых вопросов, не услышишь вранья.
|
|
This post was edited by Ratibor (2009-02-09 17:10, 15 years ago) |
dervan |
|
---|---|
# Trustmaster : А то класс со единственным статическим методом - это никуда не годится. Раз прозвучала эта тема, вопрос: а как в Cotonti планируется оформлять библиотеки и разделять пространство имён? Один из способов как раз такой: класс, члены которого являются статическими (const, static), т.е. класс здесь - это не ООП, а просто контейнер. Либо делать без классов - обычные константы, глобальные переменные и функцищи с префиксами в именах. |
Trustmaster |
|
---|---|
В PHP нет namespace? Ай-ай-ай
Нет, статические классы использовать не будем. У нас в основе старый добрый процедурный стиль и префиксы. Классы для компонентов. May the Source be with you!
|
dervan |
|
---|---|
> Классы для компонентов.
Понятно. Ай-ай-ай - это про что? :) |
Ratibor |
|
---|---|
Что не правильно тут:
function declension($digit,$expr,$onlyword=false) {
function getPlural($plural, $locale) {
switch($locale) {
case 'bo':
case 'dz':
case 'id':
case 'ja':
case 'jv':
case 'ka':
case 'km':
case 'kn':
case 'ko':
case 'ms':
case 'th':
case 'tr':
case 'vi':
return 0;
break;
case 'af':
case 'az':
case 'bn':
case 'bg':
case 'ca':
case 'da':
case 'de':
case 'el':
case 'en':
case 'eo':
case 'es':
case 'et':
case 'eu':
case 'fa':
case 'fi':
case 'fo':
case 'fur':
case 'fy':
case 'gl':
case 'gu':
case 'ha':
case 'he':
case 'hu':
case 'is':
case 'it':
case 'ku':
case 'lb':
case 'ml':
case 'mn':
case 'mr':
case 'nah':
case 'nb':
case 'ne':
case 'nl':
case 'nn':
case 'no':
case 'om':
case 'or':
case 'pa':
case 'pap':
case 'ps':
case 'pt':
case 'so':
case 'sq':
case 'sv':
case 'sw':
case 'ta':
case 'te':
case 'tk':
case 'ur':
case 'zh':
case 'zu':
return ($plural == 1) ? 1 : 0;
case 'am':
case 'bh':
case 'fil':
case 'fr':
case 'gun':
case 'hi':
case 'ln':
case 'mg':
case 'nso':
case 'xbr':
case 'ti':
case 'wa':
return (($plural == 0) || ($plural == 1)) ? 1 : 0;
case 'be':
case 'bs':
case 'hr':
case 'ru':
case 'sr':
case 'uk':
return (($plural % 10 == 1) && ($plural % 100 != 11)) ? 1 : (($plural % 10 >= 2) && ($plural % 10 <= 4) && (($plural % 100 < 10) || ($plural % 100 >= 20))) ? 2 : 0;
case 'cs':
case 'sk':
return ($plural == 1) ? 1 : (($plural >= 2) && ($plural <= 4)) ? 2 : 0;
case 'ga':
return ($plural == 1) ? 1 : ($plural == 2) ? 2 : 0;
case 'lt':
return (($plural % 10 == 1) && ($plural % 100 != 11)) ? 1 : (($plural % 10 >= 2) && (($plural % 100 < 10) || ($plural % 100 >= 20))) ? 2 : 0;
case 'sl':
return ($plural % 100 == 1) ? 1 : ($plural % 100 == 2) ? 2 : (($plural % 100 == 3) || ($plural % 100 == 4)) ? 3 : 0;
case 'mk':
return ($plural % 10 == 1) ? 1 : 0;
case 'mt':
return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 1) && ($plural % 100 < 11))) ? 2 : (($plural % 100 > 10) && ($plural % 100 < 20)) ? 3 : 0;
case 'lv':
return ($plural == 0) ? 1 : (($plural % 10 == 1) && ($plural % 100 != 11)) ? 2 : 0;
case 'pl':
return ($plural == 1) ? 1 : (($plural % 10 >= 2) && ($plural % 10 <= 4) && (($plural % 100 < 10) || ($plural % 100 > 29))) ? 2 : 0;
case 'cy':
return ($plural == 1) ? 1 : ($plural == 2) ? 2 : (($plural == 8) || ($plural == 11)) ? 3 : 0;
case 'ro':
return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 0) && ($plural % 100 < 20))) ? 2 : 0;
case 'ar':
return ($plural == 0) ? 1 : ($plural == 1) ? 2 : ($plural == 2) ? 3 : (($plural >= 3) && ($plural <= 10)) ? 4 : (($plural >= 11) && ($plural <= 99)) ? 5 : 0;
default:
return null;
}
}
if(is_array($expr))
{
$i=preg_replace('/[^0-9]+/s','',$digit)%100; //intval не всегда корректно работает
if($onlyword) $digit='';
$locale= 'ru';
$plural= getPlural ($i, $locale);
switch ($plural) {
case 0:
$res=$digit.' '.$expr[0];
break;
case 1:
$res=$digit.' '.$expr[1];
break;
case 2:
$res=$digit.' '.$expr[2];
break;
case 3:
$res=$digit.' '.$expr[3];
break;
case 4:
$res=$digit.' '.$expr[4];
break;
default: $res=$digit.' '.$expr[5];
}
}
else
{
$res = $digit.' '.$expr;
}
return trim($res);
} Не задавай глупых вопросов, не услышишь вранья.
|
McDuck |
|
---|---|
|
Ratibor |
|
---|---|
McDuck
Спасибо, но в данном случае это не важно. Важно найти ошибки в самом коде, а не в название стран, т.к. все равно там жестко ru прописано. Не задавай глупых вопросов, не услышишь вранья.
|
dervan |
|
---|---|
Ratibor, а зачем getPlural() по default'у возвращает NULL, который потом идёт аргументом в switch ($plural)?
И ещё - про встроенные функцищи. При 2-м вызове declension() будет ошибка: Fatal error: Cannot redeclare getPlural() |
Sergey |
|
---|---|
Мой вариант просто работает уже несколько лет. Единственное, что требует, добавить ввода самой цифры в вывод, но можно и так.
www.cotonti.mobi
|
Ratibor |
|
---|---|
Sergey
Твой вариант работает абсолютно для всех языков ? То что ты написал на предыдущей странице, только для русского и английского = в морг. dervan Те замечания что ты описал, сейас тоже не важны, выжно то что при $locale= 'ru'; на выходе getPlural() не могу получить 1, 0 и 2 без проблемм, а вот 1 не получается. Не задавай глупых вопросов, не услышишь вранья.
|
|
This post was edited by Ratibor (2009-02-09 22:25, 15 years ago) |
Sergey |
|
---|---|
Ratibor
Зато правильно. У вас там делится на 100 до остатка, а в русском фокусы зоопарка от 0 до 2 десятков и моя функция понимает множественные исключения. В котонти и так мало локализаций - можно и добавить, я например турецкого не знаю, тот кто знает тот и добавит, для остальной сотни просто ничего не делается т.е. и не портится. Кстати о морге: Пожарник докладывает пострадавшему главврачу: В результате наших действий, пожар потушен, из 7 пациентов 5 откачаны и живы. Врач, а вы знаете, что горел морг? www.cotonti.mobi
|
Ratibor |
|
---|---|
# Sergey : У вас там делится на 100 до остатка, а в русском фокусы зоопарка от 0 до 2 десятков и моя функция понимает множественные исключения.Назови хотябы одно исключение с которм мой вариант не справится ? # Sergey : 0 пальто == нет польт (?), 1 пальто, 2 пальто...Учи русский, слово пальто не склоняется. нет польт - такого выражения в русском языке впринципе нет Не задавай глупых вопросов, не услышишь вранья.
|
dervan |
|
---|---|
Ratibor, для русского языка получается так:
return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));
Слушай, а может не вгонять всё в одну строку? Так хоть и короче, но зато несколько нечитабельно - IMHO конечно. Можно же сделать аналогично тому, как у тебя было здесь. |