Откуда PHP NumberFormatter берет форматы локали? - PullRequest
0 голосов
/ 06 сентября 2018

Откуда NumberFormatter PHP берет форматы локали? Больше интересует среда Linux, если это что-то меняет.

Он скомпилирован или используется какой-то системный ресурс? Как я могу просмотреть форматы для каждой поддерживаемой локали? (locale -c -k LC_MONETARY, похоже, не содержит информации о шаблоне.)

Если в формате есть ошибка, где я могу сообщить об этом или предложить исправление? (Например, языковой стандарт lv_LV содержит ошибку в отношении тысяч разделителей.)

Почему выходной сигнал для HHVM отличается - https://3v4l.org/ms1ZN?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

PHP использует библиотеку ICU (см. Функцию unum_formatDoubleCurrency в ext / intl / formatter / formatter_format.c ).

Библиотека ICU, в свою очередь, использует хранилище общих языковых данных (CLDR) (см. http://userguide.icu -project.org / icudata ).

Формат в примере (формат валюты для lv_LV locale) можно увидеть в инструменте опроса CLDR - http://st.unicode.org/cldr-apps/v#/lv/Number_Formatting_Patterns/

Если произошла ошибка, о ней можно сообщить в http://unicode.org/cldr/trac/newticket или отредактировать в Survey Tool с помощью учетной записи, полученной в этой контактной форме: http://www.unicode.org/reporting.html

Но в текущем случае ошибки не было.

Формат PHP не соответствует данным CLDR, вероятно, из-за версии libicu (и его версии CLDR), которая установлена ​​на конкретном компьютере / сервере, или из-за используемого файла данных (icudatl.dat, см. http://userguide.icu -project.org / icudata ). На данный момент (2018-09) последняя версия libicu / data - 62 (см. http://site.icu -project.org / home ), а последняя версия CLDR - 34 (см. http://cldr.unicode.org/).

Если установлен icu-devtools, при запуске icuinfo будет отображаться, какие версии libicu и CLDR используются. В моем случае: <param name="version">55.1</param>[..]<param name="cldr.version">27.0.1</param>

Есть две альтернативы для формата валюты в lv_LV, HHVM, по какой-то причине, использует другую.

0 голосов
/ 06 сентября 2018

Непросто ответить, если это не задокументировано в официальных документах. Однако давайте взглянем на реализацию NumberFormatter PHP: https://github.com/php/php-src/tree/8939c4d96b8382abe84f35e69f4f6ebd6f0f749d/ext/intl/formatter

Если вы хорошо владеете Си, вы можете найти правильное место, которое я не нашел сразу (если один из нас действительно заменит эту часть ответа).

Однако, насколько я понимаю код, правильные форматы извлекаются из пакета intl (= пакет интернационализации, http://php.net/manual/de/book.intl.php). NumberFormatter, который сам является его частью.

Если вы обнаружили реальную ошибку, вы можете предложить исправление на официальном сайте отчетов об ошибках PHP относительно пакета intl (https://bugs.php.net/).

...