Как мне создать файлы ресурсов ICU для использования в PHP?
Я следую инструкциям из ответа Брайана H здесь: gettext () эквивалент в библиотеке Intl? и пытается реализовать локализацию (перевод) с php-intl, но я продолжаю получать ту же проблему, что этот человек имел: ResourceBundle возвращает NULL без каких-либо ошибок, возникающих
Он упоминает, что создал файлы dat с помощью инструмента (который я не могу понять, как работать), в то время как человек в предыдущем ответе просто, кажется, использует файлы txt с расширением.res.
Как правильно реализовать локализацию с помощью php-intl и ResourceBundle, и что я делаю не так?
Цель состоит в том, чтобы иметь различные файлы данных на разных языках, чтобы я мог сделать что-то похожее на
$t = new Translator();
$t->setResource(new \ResourceBundle('es', 'locales_folder/'));
$t->echo("somestring"); // "el stringo"
.. очень похоже на человека в первом ответе. Кроме того, цель состоит в том, чтобы иметь легко редактируемые файлы, чтобы я мог предоставить их переводчикам для исправлений, обновлений и так далее. Я понимаю, что могу легко сделать это с помощью специального решения через простой текстовый файл, который анализируется и сохраняется в memcache по первому запросу, где он затем сохраняется и обрабатывается без необходимости перечитывать файлы.dat, но я бы предпочел выберите предложенный маршрут здесь.
Редактировать: просто чтобы получить это - я успешно реализовал то же самое с gettext, и это было очень просто - за исключением одной ошибки, которая сохраняется в системах Linux ( http://www.php.net/manual/en/book.gettext.php) - но я бы хотел полагаться на более современное и всеобъемлющее расширение int, если это возможно.
1 ответ
Я могу предоставить решение вашего вопроса о том, как создавать и использовать .res
файлы для intl
Расширение PHP, однако я не имею опыта работы со скоростью и использования в производственных системах, вы должны будете убедиться сами, может ли это заменить gettext
,
На мой взгляд большое преимущество gettext
дополнительные инструменты, такие как xgettext
который может извлекать строки для перевода. Тем не менее, использование ресурсов может быть более полезным в вашем случае использования.
Для генерации .res
файл, который вам нужен для использования программы genrb
который в комплекте с ICU. (например, при установке ICU на OSX с использованием brew install icu4c
( см. этот урок) вы можете найти инструмент на /usr/local/Cellar/icu4c/*/bin/genrb
(заменить *
с номером версии))
Далее вы готовите файл для каждой локали. Давайте сделаем это для двух языков в этом примере, немецкого и испанского.
$ cat de.txt
de {
hello { "Hallo" }
}
$ cat es.txt
es {
hello { "Hola" }
}
$ genrb *.txt
genrb number of files: 2
Теперь у вас есть 2 дополнительных файла de.res
а также es.res
, который вы теперь можете получить в PHP
<?php
foreach (array("de", "es") as $locale) {
$r = ResourceBundle::create($locale, __DIR__);
echo $r["hello"], "\n";
}
который будет выводить
Hallo
Hola
Таким образом, по сути, вы можете передать эти *.txt
файлы для ваших переводчиков и подготовить их для PHP с помощью genrb
,
Наконец, небольшой пример для класса, который вы пытались написать:
<?php
class Translator {
private $resourceBundle = null;
public function __construct(\ResourceBundle $r) {
$this->resourceBundle = $r;
}
public function __get($string) {
return $this->resourceBundle[$string];
}
}
$t = new Translator(new \ResourceBundle('es', __DIR__));
echo $t->hello;