如何创建用于PHP的ICU资源文件


How do I create ICU resource files for use in PHP?

我在这里遵循BryanH的回答指示:gettext()在Intl库中等效?并试图实现本地化(翻译)与php-intl,但我一直得到相同的问题这个人有:ResourceBundle返回NULL没有任何错误被提出

他提到他用一个工具创建了数据文件(我不知道如何工作),而前一个答案中的人似乎只是使用带有。res扩展名的txt文件。

我如何正确实现本地化与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扩展,如果可能的话。

关于如何为intl PHP扩展创建和使用.res文件的问题,我可以提供一个解决方案,但是我没有在生产系统中使用速度和使用的经验,您将不得不自己看看这是否可以替代gettext

在我看来,gettext的一个很大的好处是额外的工具,如xgettext,它可以提取要翻译的字符串。不过,在您的用例中,使用资源可能更有用。

要生成.res文件,您需要使用与ICU捆绑在一起的genrb程序。(例如,当使用brew install icu4c在OSX上安装ICU时(参见本教程),您可以在/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

你现在有两个额外的文件de.reses.res,你现在可以在PHP访问

<?php
foreach (array("de", "es") as $locale) {
    $r = ResourceBundle::create($locale, __DIR__);
    echo $r["hello"], "'n";
}

将输出

Hallo
Hola

因此,本质上,您可以将这些*.txt文件交给您的翻译人员,并使用genrb为PHP准备它们。

最后,为您试图编写的类提供一个小示例:

<?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;