2010-03-02 2 views
3

С PHP +5.3 и 6 появляется пара новых классов i18n. Одним из них является класс MessageFormatter, который, кажется, является неполной идеей. Я надеюсь, что я просто что-то пропустил.Что такое класс MessageFormatter в PHP 5.3?

Приведенный пример показывает, что если вы УЖЕ ЗНАЕТЕ ЯЗЫК, ВЫ ИСПОЛЬЗУЕТЕ ИСПОЛЬЗОВАНИЕ, то этот класс будет правильно форматировать номера.

<?php 
echo msgfmt_format_message("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree", array(4560, 123, 4560/123)); 
echo msgfmt_format_message("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", array(4560, 123, 4560/123)); 
?> 

Что делает:

4,560 monkeys on 123 trees make 37.073 monkeys per tree 
4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum 

Теперь, если вы уже знаете LANGAUGE (именно поэтому вы должны написать его), то почему бы вам не просто использовать функцию number_format(), где вам нужно правильные номера ? Зачем вам нужен целый класс?

Примером чего-то, кроме чисел форматирования, действительно помогло бы.

ответ

3

Я думаю, вы путаете то, что такое MessageFormatter does:

MessageFormatter - это конкретный класс, который позволяет пользователям создавать con связанных, нейтральных по отношению к языку сообщений. Методы, предоставленные в этом классе, используются для создания всех сообщений, которые видят конечные пользователи.

Это очень отличается от number_format, который только форматирует число сгруппированных тысяч.

Цитирование далее (курсив мой):

MessageFormatter принимает набор объектов, форматирует их, а затем вставляет отформатированные строки в шаблон в соответствующих местах. Форматы выбора могут использоваться в сочетании с MessageFormatter до множеством дескрипторов, номерами совпадений и выбором из массива элементов. Как правило, формат сообщения будет поступать из ресурсов, и аргументы будут динамически заданы во время выполнения.

Если вам нужно сравнить это с собственной функции, то это больше похоже на локали знают preg_replace_callback, которые могут использовать number_format, date_format и фантазии замены как

"{0} resulted in {1,choice,0#no errors|1#single error|1<{1, number} errors}" 

Следует также подчеркнуть, что MessageFormatter это всего лишь один подпакет, дополняющий довольно функциональную инфраструктуру I10n.

См. Эту статью на DevZone about Internationalization in PHP 5.3.

+0

Этот gettext, как строка/множественная сортировка вызывающе делает этот класс его достоинством.gettext по-прежнему так глючит и неудобен в PHP, что я все еще просто использую языковые файлы на основе PHP, и возможность использовать этот класс для выбора множественных форм действительно поможет. – Xeoncross

+0

@Xeoncross Используйте то, что подходит. Это еще один пакет, который вы * можете * выбирать и использовать, например, математику против bc_math или GD против imagemagick. – Gordon

+0

Ваш ответ может быть не таким хорошим, как Pascal, но этот пример плюрализации - это то, что я искал, и статья DevZone также была очень полезна. Благодаря! – Xeoncross

2

number_format только позволяет форматировать ... ну, цифры - и это будет только отформатировать их как чистое число.

С другой стороны, MessageFormater класс делает больше, чем это:

  • Это позволяет форматировать числа, да; но не только как «чистые числа», но и как (например) деньги
    • И как формат номера, так и единица измерения, отличаются в зависимости от языкового стандарта.
    • Например, во Франции вы бы использовали 1234,25 €; в то время как в США, вы бы использовать (простите меня, если я ошибаюсь) что-то вроде $1,234.25
  • Это позволяет форматировать больше, чем только цифры:
    • Вы можете также форматировать даты, например
    • включая название дней/месяц
  • И это делает больше, чем просто форматирование некоторого куска данных: она позволяет указать полные строки, в которых вы используете заполнители - указание того, какие которые должны представлять данные.
    • Этот последний момент важен, когда вы пытаетесь перевести/локализовать приложение: форматирует изменения, да; но позиции данных также могут изменяться в зависимости от языка.


Это здорово, когда вы developping приложения, имея кого-то еще делать переводы для Вас:

  • Вы закодировать приложение таким образом, он загружает свои строки перевода из файла, что зависит от языка
    • И вы говорите, что для каждой строки, в каком порядке вы передадите данные
  • Тогда кто-то принимает ваш (английский, например) файл перевода, и перевести его на другой язык
    • Используя те же заполнители, как вы делали, для динамических данных
    • Размещение их в другой порядок, при необходимости
  • Затем, когда приложение выполняется:
    • Вы загружаете правильный пла nslation,
    • Вы вводите данные
    • И никто не должен заботиться о формировании чисел/дат/... или о порядке данных в строках; который является большим ;-)


Также отметим, что MessageFormater провайдеры некоторые additionnal особенности, как MessageFormatter::parseMessage метод, который делает прямо противоположное.

Я никогда не использовал этот вариант, хотя, хотя это может оказаться полезным в некоторых ситуациях, я уверен.


Наконец, вы говорите, это:

Приведенный пример, кажется, показывают, что если вы уже знаете язык, который вы используете

Да, MessageFormater ожидает, что вы знаете, какие язык, на котором ваше приложение в настоящее время работает.

На самом деле, роль класса MessageFormater состоит в том, чтобы ... форматировать сообщения - ничего более.
Но у вас есть какие-то другие классы, которые позволяют определить, какой язык следует использовать ;-)

Например, вы можете захотеть взглянуть на Locale класс - Locale::acceptFromHttp может особенно заинтересовать вас (цитирую):

пытается найти локали, которые могут удовлетворить список языков, который был затребован НТТР "Accept-Language" заголовок

В принципе, это должно помочь вам определить, какой язык используется браузером вашим пользователем, - который, скорее всего, укажет, какой язык/язык, который, по-видимому, сейчас может понять текущий пользователь.

Например, учитывая мой браузер посылает это для Accept-languag электронной HTTP заголовка:

fr,en;q=0.7,en-us;q=0.3 

Locale::acceptFromHttp бы указать, что я предпочитаю 'fr' локаль - который я предпочитаю ^^

+0

U.S. money is right :) – Matchu

0

Попробуйте прочитать description of the format на веб-сайте ICU, откуда он появился, как обычно, для PHP, в их документации нет никаких оснований, нет организации и совершенно неполных примеров, но это не значит, что библиотека бесполезна.

Смежные вопросы