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()函数呢?为什么你需要一个完整的课程呢?
除了格式化数字之外的其他操作的示例确实会有所帮助。
答案 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_format
,date_format
和花哨的替代品(如
"{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一样,他们的文档没有理由,没有组织,完全不完整的例子,但这并不意味着图书馆没用