Эквивалент 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 }
}

(так далее)

Другие вопросы по тегам