gettext () в библиотеке Intl?

Я ищу способ сделать i18n и l10n.

Я использовал gettext раньше, и это было хорошо: я бы просто создал .mo-файлы на разных языках, и все, что нужно было перевести, было бы в этих обозначениях:

 echo __('string to be translated'); 

Я знаю, что теперь есть встроенная в PHP библиотека Intl, и мне сказали, что я должен использовать ее вместо gettext() .

Прочитав все, что есть на Intl на php.net, я вижу, что у него есть некоторые интересные функции, такие как обработка локалей, сравнение строк, форматирование чисел и т. Д.

Я не могу понять, как я буду обрабатывать регулярную строку для перевода строк с помощью библиотеки Intl. Есть идеи?

Вы бы использовали gettext. Intl (как ICU под ним) для l10n, а не для загрузки переводов.

Это совет не очень правдиво. Внутренние функции могут использоваться в сочетании с gettext, а не как замена.

MessageFormatter – это то, что люди имеют в виду, когда они связывают INTL с текстовыми переводами. Примеры показывают это. Но на самом деле это просто sprintf на стероидах. Он вводит числа в существующие строки. (Я даже не знаю, как там поддерживается локальная поддержка, поскольку он просто служит внутренним переключателем.)

Вот как я использовал intl для переводов (проверен на php v. 5.3.10 и 5.4.7):

intl.php

 namespace Example; class Intl { private $resource; public function __construct() { $bundle_location = "./locales"; $user_locale = \Locale::acceptFromHttp( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ); $this->resource = new \ResourceBundle( $user_locale, $bundle_location ); } ... 

display.php

  use Example\Intl; $intl = new Intl(); $r = $intl->resource; echo $r['string_to_be_translated']; ... 

пакеты ресурсов

В каталоге locales меня есть файлы ресурсов:

root.res – корневой язык (английский)

 root { string_to_be_translated {String to be translated } } 

ja.res – Японский

 ja { string_to_be_translated {\u5909\u63DB\u3055\u308C\u308B\u6587\u5B57\u5217 } } 

sp.res – испанский

 sp { string_to_be_translated {Cadena a ser traducido } } 

(и т.д)