我在这里遵循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.res
和es.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;