Расширение PHP PECL, дающее искаженные результаты для шведских порядковых чисел - PullRequest
3 голосов
/ 22 октября 2010

Я использую модуль PECL intl для локализации дат и чисел в проекте PHP.На всех других языках, которые я использую (40), локализация порядковых номеров работает нормально.На шведском языке, однако, я получаю странный вывод.Кажется, это константы шаблона, используемые для генерации ординалов.

$fnf = new NumberFormatter('sv_FI', NumberFormatter::ORDINAL);
echo $fnf->format(1);

и

$snf = new NumberFormatter('sv_SE', NumberFormatter::ORDINAL);
echo $snf->format(1);

Оба возвращают 1:e%digits-ordinal-neutre:0: 1:a против чего-то вроде 1st или 1er.

Мое единственное предположение, кроме ошибки, заключается в том, что мне не хватает какого-то дополнительного аргумента, такого как пол связанного глагола.

1 Ответ

1 голос
/ 01 января 2012

Если вы выводите правила форматирования чисел на основе правил $fnf->getPattern():

%digits-ordinal-masculine:
    0: =#,##0==%%dord-mascabbrev=;
    -x: −>%digits-ordinal-masculine>;
%%dord-mascabbrev:
    0: :e%digits-ordinal-neutre:0: =%digits-ordinal-feminine=;
%digits-ordinal-reale:
    0: =%digits-ordinal-feminine=;
%digits-ordinal-feminine:
    0: =#,##0==%%dord-femabbrev=;
    -x: −>%digits-ordinal-feminine>;
%%dord-femabbrev:
    0: :e;
    1: :a;
    2: :a;
    3: :e;
    20: >%%dord-femabbrev>;
    100: >%%dord-femabbrev>;
%digits-ordinal:
    0: =%digits-ordinal-masculine=;

Вы можете видеть, что закрытый набор правил dord-mascabbrev имеет только одно правило, дающее это значение:

:e%digits-ordinal-neutre:0: 1:a

Что вы получите после 1, как вы описали в своем вопросе.

Это не ошибка в PECL INTL, но основное правило неверно отформатировано, что является частью библиотек ICU ( это правило там ). Примерно три года назад правила форматирования чисел sv были исправлены для пропущенных точек с запятой, похоже, что одна строка проскальзывает.

Эти правила взяты в ICU из CLDR (Common Locale Data Repository) в Консорциуме Unicode. Я открыл отчет об ошибке там , потому что, если это не исправлено в CLDR, а затем помещено в ICU, оно не может работать с расширением PHP INTL.

Альтернативой может быть ручное исправление библиотек ICU (версия 4.8), а затем сборка пакета PECL для ваших исправленных библиотек.

...