我正在寻找一种方法来做i18n和l10n。
我之前使用过gettext
并且很好:我只是用不同的语言创建.mo文件,所有需要翻译的文件都是这样的符号:
echo __('string to be translated');
我知道现在已经在PHP中内置了Intl库,并且我被告知我应该使用它而不是gettext()
。
在php.net上阅读everything there is about Intl之后,我发现它有一些很好的功能,如语言环境处理,字符串比较,数字格式化等。
我无法弄清楚我是如何使用Intl库处理常规字符串到字符串的转换。有什么想法吗?
答案 0 :(得分:6)
那个建议不是很真实。 intl函数可以与gettext结合使用,而不是替换。
MessageFormatter
是人们在将INTL与文本翻译联系起来时的想法。这些例子表明如此。但实际上它只是类固醇的sprintf
。它将数字注入现有字符串。 (我甚至不确定语言环境支持是如何在那里使用的,因为它只是用作内部开关。)
答案 1 :(得分:5)
以下是我使用intl进行翻译的方法(在php v.5.3.10和5.4.7上测试):
namespace Example;
class Intl {
private $resource;
public function __construct() {
$bundle_location = "./locales";
$user_locale = \Locale::acceptFromHttp( $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
$this->resource = new \ResourceBundle( $user_locale, $bundle_location );
}
...
use Example\Intl;
$intl = new Intl();
$r = $intl->resource;
echo $r['string_to_be_translated'];
...
在locales
目录中,我有我的资源文件:
root.res - root language(英文)
root {
string_to_be_translated {String to be translated }
}
ja.res - 日语
ja {
string_to_be_translated {\u5909\u63DB\u3055\u308C\u308B\u6587\u5B57\u5217 }
}
sp.res - 西班牙语
sp {
string_to_be_translated {Cadena a ser traducido }
}
(等)
答案 2 :(得分:1)
你会使用gettext。 Intl(就像它下面的ICU)是l10n,而不是加载翻译。