Ответ 1
Вы используете gettext. Intl (как ICU под ним) для l10n, а не для загрузки переводов.
Я ищу способ сделать 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 }
}
(и т.д.)