Intl库中的等效函数是什么?

12
我正在寻找一种实现国际化和本地化的方法。
我以前使用过gettext,效果不错:我只需创建不同语言的.mo文件,需要翻译的内容都以这种格式表示:
echo __('string to be translated');

我知道现在PHP中有一个内置的Intl库,有人告诉我应该使用它而不是gettext()。
在阅读了php.net上关于Intl的所有内容后,我发现它有一些很好的功能,比如区域设置处理、字符串比较、数字格式化等等。
我无法弄清楚的是,如何使用Intl库处理常规的字符串翻译。有什么想法吗?
3个回答

6
那个建议并不太准确。intl函数可以与gettext一起使用,而不是替代它。
当人们将INTL与文本翻译相关联时,MessageFormatter就是他们所想到的。示例也是这样表明的。但实际上,它只是一个强化版的sprintf函数。它将数字注入现有的字符串中。(我甚至不确定语言环境支持在那里有任何用处,因为它只是作为内部开关使用。)

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 { 
  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 - Spanish

sp { 
  string_to_be_translated {Cadena a ser traducido }
}

(etc)


1
你可以使用gettext。Intl(在其下面的ICU)用于本地化,而不是加载翻译。

4
请参阅我在 https://dev59.com/R13Ua4cB1Zd3GeqP8gRq 上的回答 - 我不同意这个说法。你可以选择使用gettext,但是ICU下面是用来加载翻译资源的。(Steven R. Loomis, ICU项目) - Steven R. Loomis
我对你是如何得出结论很感兴趣。或者我可能误解了。 - Steven R. Loomis
我可能没有意识到"ResourceBundle"是用于字符串的,因为在我的编程经验中,"resource"有更广泛的含义。 - Ignacio Vazquez-Abrams
谢谢,这是个好观点。我对“我们”的定义(从 java.util.ResourceBundle 开始)太熟悉了,我会尽力确保文档更清晰明了。 - Steven R. Loomis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接