Эквивалент gettext() в библиотеке Intl?
Я ищу способ сделать i18n и l10n.
Я использовал gettext
раньше, и это было хорошо: я просто создавал файлы.mo на разных языках, и все, что нужно было перевести, было бы в этой записи:
echo __('string to be translated');
Я знаю, что в PHP теперь есть библиотека Intl, и мне сказали, что я должен использовать ее вместо gettext()
,
После прочтения всего, что есть о Intl на php.net, я вижу, что у него есть несколько полезных функций, таких как обработка локали, сравнение строк, форматирование чисел и т. Д.
То, что я не могу понять, - это то, как я буду обрабатывать обычный перевод строки в строку, используя библиотеку Intl. Есть идеи?
3 ответа
Вы бы использовали gettext. Intl (как ICU под ним) для l10n, не загружая переводы.
Этот совет не был очень правдивым. Функции intl могут использоваться вместе с 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 }
}
(так далее)