Как создать файлы ресурсов ICU для использования в PHP?

Я следую инструкциям из ответа BryanH здесь: эквивалент 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"

... очень похоже на человека в первом ответе. Кроме того, цель состоит в том, чтобы иметь легко редактируемые файлы, чтобы я мог передавать их переводчикам для исправлений, обновлений и так далее. Я понимаю, что могу легко сделать это с помощью специального решения с помощью простого текстового файла, который анализируется и сохраняется в кэш памяти при первом запросе, где он затем сохраняется и обслуживается без необходимости перечитывать файлы .dat, но я бы предпочел выберите предложенный маршрут здесь.

Изменить: просто чтобы получить это там - я успешно реализовал то же самое с gettext, и это было очень легко - за исключением одной ошибки, которая сохраняется в системах Linux (http://www.php.net/manual/en/book.gettext.php#91187) - но я бы хотел по возможности полагайтесь на более современное и всеобъемлющее расширение intl.


person Swader    schedule 14.06.2013    source источник


Ответы (1)


Я могу предложить решение вашего вопроса о том, как создавать и использовать .res файлы для intl расширения PHP, однако у меня нет опыта работы со скоростью и использованием в производственных системах, вы должны сами убедиться, может ли это быть заменой gettext .

На мой взгляд, большим преимуществом gettext являются дополнительные инструменты, такие как xgettext, которые могут извлекать строки для перевода. Тем не менее, использование ресурсов может быть более полезным в вашем случае использования.

Для создания файла .res вам необходимо использовать программу genrb, которая является в комплекте с отделением интенсивной терапии. (например, при установке 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;
person akirk    schedule 18.06.2013
comment
Спасибо, подойдет. Поскольку это должно быть потокобезопасным, я считаю, что это решение, которое я искал. Теперь мне просто нужно написать свой собственный экстрактор строк, и это должно сработать. - person Swader; 19.06.2013
comment
Было бы очень полезно, если бы вы могли поделиться своим опытом с ним, а также с вашим экстрактором строк (может быть, вы даже могли бы открыть его исходный код?). Заранее спасибо! - person akirk; 19.06.2013
comment
Поскольку poedit может автоматически извлекать gettext, я решил, что могу просто дать ему другой шаблон для поиска вроде $ t - ›_ ($ string), который затем создаст файлы .mo и .po для этих строк. Все, что мне нужно было сделать, это написать инструмент, который конвертирует их в формат RES, что звучит довольно просто. Я напишу сообщение в блоге обо всем этом испытании и свяжу его здесь. - person Swader; 19.06.2013
comment
@Swader ICU имеет инструменты для преобразования в формат XLIFF и обратно. Мог бы также пройти через это. Я также рассматривал возможность преобразования в po, mo, .properties, .rc и т. Д. - person Steven R. Loomis; 22.06.2013
comment
Ага, это то, что я буду делать - преобразование из файлов po в res кажется самым простым, поскольку poedit так чудесно извлекает все из проекта. - person Swader; 22.06.2013