Как да създам 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"

..подобно на човека от първия отговор. Също така, целта е да има лесно редактируеми файлове, така че да мога да ги дам на преводачи за корекции, актуализации и т.н. Осъзнавам, че мога лесно да направя това с персонализирано решение чрез прост текстов файл, който се анализира и записва в memcache при първа заявка, където след това се запазва и се обслужва от, без да се налага да чета отново .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. (например при инсталиране на 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