Я ищу способ сделать 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):
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 ); } ...
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 } }
(и т.д)