| Sergeich |
|
|---|---|
|
Вы уже 4 страницу такой фигнёй занимаетесь :). И чем дальше в лес, тем...
|
| Ratibor |
|
|---|---|
|
В общем вот что получилось:
/**
* Makes correct plural forms of words
*
* @global string $lang Current language
* @param int $digit Numeric value
* @param string $expr Word or expression
* @param bool $onlyword Return only words, without numbers
* @param bool $canfrac - Numeric value can be Decimal Fraction
* @return string
*/
function sed_declension($digit, $expr, $onlyword = false, $canfrac = false)
{
if (!is_array($expr))
{
return trim(($onlyword ? '' : "$digit ") . $expr);
}
global $lang;
if ($canfrac)
{
$is_frac = floor($digit) != $digit;
$i = $digit;
}
else
{
$i = preg_replace('#\D+#', '', $digit);
}
$plural = sed_get_plural($i, $lang, $is_frac);
$cnt = count($expr);
return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
}
/**
* Used in sed_declension to get rules for concrete languages
*
* @param int $plural Numeric value
* @param string $lang Target language code
* @return int
*/
function sed_get_plural($plural, $lang, $is_frac = false)
{
switch ($lang)
{
case 'en':
case 'de':
case 'nl':
case 'se':
return ($plural == 1) ? 1 : 0;
case 'fr':
case 'uk':
return ($plural > 1) ? 0 : 1;
case 'ru':
case 'ua':
if ($is_frac)
{
return 1;
}
$plural %= 100;
return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));
default:
return 0;
}
}Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-15 17:16, 16 years ago)
|
| dervan |
|
|---|---|
|
Мелкие улучшизмы.
Сюда
else
{
$i = preg_replace('#\D+#', '', $digit);
}
else
{
$is_frac = false;
$i = preg_replace('#\D+#', '', $digit);
}
А сюда
case 'en':
case 'de':
case 'nl':
case 'se':
return ($plural == 1) ? 1 : 0;
case 'en':
case 'de':
case 'nl':
case 'se':
case 'us':
return ($plural == 1) ? 1 : 0;
И добавить в шапку к sed_get_plural(): * @param int $plural Numeric value * @param string $lang Target language code * @param bool $is_frac true if numeric value is fraction, otherwise false * @return int |
| Kort |
|
|---|---|
Хорошо. Один только проблемный момент может быть из-за удаления языковых строк: эти строки могут использоваться не только в ядре и не только для множественного числа, но и сами по себе, так что лучше их оставить. Или даже для declensions использовать отдельные строки, вроде $L['Days_auto'].Так и получилось :) Сейчас в main.lang вместо $L['Day'] = 'День'; $L['Days'] = 'Дни';стоит $L['Days'] = array('день','дня','дней');
а вот$L['Member'] = 'Участник'; $L['Members'] = 'Участники';по понятной причине так и осталось. Days вроде как нигде не используется (хотя никто никого и не спрашивал), а вот members -- сплошь и рядом. Получается как-то нелогично. При этом в скине уже невозможно реализовать ни {PHP.L.Day}
, ни{PHP.L.Days}
Глобально использовать склоняемые формы всех локализуемых имен существительных, мне кажется, пока не получится. Идея хорошая, но копать глубоко надоть...SED.by - создание сайтов, разработка плагинов и тем для Котонти
|
| Spuner |
|
|---|---|
|
хм.. попытался сделать окончания для поиска. но в итоге он заданные окончания и не трогает.
выдает к примеру: Найдено 17 Array вот то что в search.php: // Making the output array
$t->assign(array(
"PLUGIN_FORUM_FOUND" => $L['plu_found']." ".($items == $cfg['plugin']['search']['maxitems_ext'] ? $L['plu_moreres'].' ' : '').sed_declension($items,$L['plu_match'])
));$L['plu_match'] = array('совпадение','совпадения','совпадений');поправьте меня пожалуйста. |
| Boss |
|
|---|---|
|
Так чем дело то кончилось? Функцию так и не доработали и не встроили в котонти? А в чем сложности то?
|
| Spuner |
|
|---|---|
|
в обновлении ее прикрепили для whosonline, там она работает.
|
| Boss |
|
|---|---|
|
Точно. В транк не догадался заглянуть.
Там она действительно уже встроена. Да и причем не только в названный плагин, а вообще в системный файл. В форуме отрабатываются тоже численные. Молодцы! |