PHP 5.3中的MessageFormatter类有什么用?

时间:2010-03-02 20:41:15

标签: php

PHP +5.3和6有几个新的i18n课程。其中一个是MessageFormatter类,这似乎是一个不完整的想法。我希望我只是忽略了一些东西。

给出的示例似乎表明,如果您已经知道您正在使用的语言,那么此类将正确格式化您的数字。

<?php
echo msgfmt_format_message("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree", array(4560, 123, 4560/123));
echo msgfmt_format_message("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", array(4560, 123, 4560/123));
?>

呈现:

4,560 monkeys on 123 trees make 37.073 monkeys per tree
4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum

现在,如果您已经知道了语言(这就是为什么必须编写它),那么为什么不在需要正确数字的地方使用number_format()函数呢?为什么你需要一个完整的课程呢?

除了格式化数字之外的其他操作的示例确实会有所帮助。

3 个答案:

答案 0 :(得分:3)

number_format只允许一个格式化......好吧,数字 - 而且它只会将它们格式化为纯数字。

另一方面,MessageFormater类的功能不止于此:

  • 它允许您格式化数字,是的;但不仅是“纯数字”,还有(例如)金钱
    • 数字和格式单位的格式都不同,具体取决于区域设置。
    • 例如,在法国,您使用1234,25 €;而在美国,你会使用(请原谅我,如果我错了)类似$1,234.25
  • 它允许您格式化的不仅仅是数字:
    • 您还可以设置日期格式,例如
    • 包括日/月的名称
  • 它不仅仅是形成一些数据:它允许您指定完整的字符串,在其中使用占位符 - 指示那些应该代表哪种数据。
    • 当您尝试翻译/本地化应用程序时,最后一点很重要:格式更改,是;但数据的位置也可能会发生变化,具体取决于语言。


当你开发一个应用程序,让其他人为你做翻译时,这很好:

  • 您对应用程序进行编码,以便从文件中加载其翻译字符串,具体取决于语言
    • 你说,对于每个字符串,你将以哪种顺序传递数据
  • 然后,其他人将你的(例如英文)翻译文件翻译成另一种语言
    • 使用与您相同的占位符,用于动态数据
    • 如果需要,可以按不同顺序放置
  • 然后,当您的应用程序执行时:
    • 您加载了正确的翻译文件
    • 您注入数据
    • 并且没有人必须关心格式化数字/日期/ ...以及字符串中数据的顺序;这很棒; - )


另请注意,MessageFormater提供了一些额外的功能,例如MessageFormatter::parseMessage方法,它们恰恰相反。

我从来没有真正使用过那个 - 但是在某些情况下它可能会有用,我打赌。


最后,你这样说:

  

给出的例子似乎表明了这一点   如果你已经知道你的语言   正在使用

是的,MessageFormater希望您知道您的应用目前正在呈现哪种语言。

事实上,MessageFormater类的作用是......格式化消息 - 仅此而已。
但是你有其他一些类,可以让你检测你应该使用哪种语言; - )

例如,您可能需要查看Locale课程,Locale::acceptFromHttp可能会特别感兴趣(引用)

  

尝试找到可以满足的语言环境   请求的语言列表   HTTP“Accept-Language”标题

基本上,这应该可以帮助您检测用户正在使用的浏览器“接受”的语言 - 这很可能会指示当前用户最有可能理解的语言/语言环境。

例如,考虑到我的浏览器正在为Accept-languag e HTTP标头发送此信息:

fr,en;q=0.7,en-us;q=0.3

Locale::acceptFromHttp表示我更喜欢'fr'语言环境 - 我更喜欢^^

答案 1 :(得分:3)

我认为你混淆了MessageFormatter does

  

MessageFormatter是一个具体的类,它使用户能够生成连接的,与语言无关的消息。此类中提供的方法用于构建最终用户看到的所有消息。

这与number_format完全不同,preg_replace_callback只会格式化数千个数字。

进一步引述(强调我的):

  

MessageFormatter获取一组对象,对它们进行格式化,然后将格式化的字符串插入到适当位置的模式中。选择格式可与MessageFormatter结合使用,以处理复数,匹配数字,并从项目数组中选择。通常,消息格式将来自资源,参数将在运行时动态设置。

如果您需要将其与原生函数进行比较,那么它更像是可以使用number_formatdate_format和花哨的替代品(如

)的区域设置感知DevZone about Internationalization in PHP 5.3
"{0} resulted in {1,choice,0#no errors|1#single error|1<{1, number} errors}"

还应该强调的是,MessageFormatter只是一个完成功能丰富的I10n框架的子包。

请参阅{{3}}上的这篇文章。

答案 2 :(得分:0)

尝试阅读ICU网站上的description of the format - 正如PHP一样,他们的文档没有理由,没有组织,完全不完整的例子,但这并不意味着图书馆没用