Как мне создать файлы ресурсов 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;
Другие вопросы по тегам