5

我在这里按照 BryanH 的回答中的说明进行操作:gettext() 等效于 Intl library?并尝试使用 php-intl 实现本地化(翻译),但我一直遇到这个人遇到的同样问题:ResourceBundle 返回 NULL 而没有引发任何错误

他提到他使用工具(我不知道如何工作)创建了 dat 文件,而前一个答案中的人似乎只是在使用扩展名为 .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 扩展。

4

1 回答 1

9

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

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

要生成.res文件,您需要使用与 ICU 捆绑genrb的程序。(例如,在 OSX 上安装 ICU 时使用(参见本教程),您可以在(替换为版本号)处找到该工具)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.reses.res,您现在可以在 PHP 中访问它们

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

这将输出

Hallo
Hola

因此,本质上,您可以将这些*.txt文件交给您的翻译人员,并使用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;
于 2013-06-18T09:40:05.597 回答