эквивалент gettext () в библиотеке Intl? - PullRequest
12 голосов
/ 13 апреля 2011

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

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

echo __('string to be translated');

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

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

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

Ответы [ 3 ]

6 голосов
/ 13 апреля 2011

Этот совет не был очень правдивым.Функции intl можно использовать совместно для получения текста, а не в качестве замены.

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

5 голосов
/ 08 ноября 2012

Вот как я использовал 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 { 
  string_to_be_translated {\u5909\u63DB\u3055\u308C\u308B\u6587\u5B57\u5217 }
}

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

sp { 
  string_to_be_translated {Cadena a ser traducido }
}
* * 1 022 (и т.д.)
1 голос
/ 13 апреля 2011

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

...