12

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

我以前用过gettext,很好:我只需创建不同语言的 .mo 文件,需要翻译的所有内容都使用这种表示法:

echo __('string to be translated');

我知道现在 PHP 中内置了 Intl 库,并且有人告诉我应该使用它而不是gettext().

在阅读了 php.net上有关 Intl的所有内容后,我发现它具有一些不错的功能,例如语言环境处理、字符串比较、数字格式化等。

我不知道如何使用 Intl 库处理常规字符串到字符串的转换。有任何想法吗?

4

3 回答 3

6

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

MessageFormatter是人们在将 INTL 与文本翻译相关联时所想到的。这些例子表明了这一点。但实际上它只是sprintf类固醇。它将数字注入现有字符串。(我什至不确定语言环境支持在那里有什么用处,因为它只是用作内部开关。)

于 2011-04-13T04:44:03.523 回答
5

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

国际版.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 );
  }

 ...

显示.php

 use Example\Intl;

 $intl = new Intl();
 $r = $intl->resource;

 echo $r['string_to_be_translated'];

 ...

资源包

locales目录中,我有我的资源文件:

root.res - 根语言(英语)

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

(ETC)

于 2012-11-07T22:52:55.907 回答
1

你会使用gettext。Intl(就像它下面的 ICU)用于 l10n,不加载翻译。

于 2011-04-13T04:40:55.277 回答