Intl库中的gettext()等效?

时间:2011-04-13 04:28:41

标签: php gettext intl

我正在寻找一种方法来做i18n和l10n。

我之前使用过gettext并且很好:我只是用不同的语言创建.mo文件,所有需要翻译的文件都是这样的符号:

echo __('string to be translated');

我知道现在已经在PHP中内置了Intl库,并且我被告知我应该使用它而不是gettext()

在php.net上阅读everything there is about Intl之后,我发现它有一些很好的功能,如语言环境处理,字符串比较,数字格式化等。

我无法弄清楚我是如何使用Intl库处理常规字符串到字符串的转换。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

那个建议不是很真实。 intl函数可以与gettext结合使用,而不是替换。

MessageFormatter是人们在将INTL与文本翻译联系起来时的想法。这些例子表明如此。但实际上它只是类固醇的sprintf。它将数字注入现有字符串。 (我甚至不确定语言环境支持是如何在那里使用的,因为它只是用作内部开关。)

答案 1 :(得分:5)

以下是我使用intl进行翻译的方法(在php v.5.3.10和5.4.7上测试):

intl.php

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 );
  }

 ...

Display.php的

 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,而不是加载翻译。