2010-03-02 32 views
3

隨着PHP +5.3和6來了幾個新的國際班。其中之一是MessageFormatter類,這似乎是一個不完整的想法。我希望我只是俯視一些東西。什麼是PHP 5.3中的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 

現在,如果你已經知道的langauge(這就是爲什麼你必須寫它),那麼你爲什麼不只是使用number_format()功能,你需要正確的號碼?爲什麼你需要整個班級呢?

做格式化數字之外的事情的一個例子真的會有所幫助。

回答

3

我想你在混淆什麼MessageFormatter does

MessageFormatter是一個具體的類,使用戶能夠產生con連貫的,語言中立的信息。此類中提供的方法用於構建最終用戶看到的所有消息。

這與number_format完全不同,它只用一組數字格式化數字。

引用進一步(重點煤礦):

MessageFormatter採用一組對象,將它們格式化,然後插入格式化的字符串到在適當的地方的圖案。選擇格式可以與MessageFormatter結合使用,以處理複數,匹配數字,並從項目數組中進行選擇。通常,消息格式將來自資源,參數將在運行時動態設置。

如果你需要一個本地函數來比較這一點,那麼它更像是一個語言環境感知preg_replace_callback可以使用number_formatdate_format和花哨的替代品像

"{0} resulted in {1,choice,0#no errors|1#single error|1<{1, number} errors}" 

還應當強調的是,MessageFormatter只是完成一個功能豐富的I10n框架的一個子包。

請參閱DevZone about Internationalization in PHP 5.3上的這篇文章。

+0

gettext喜歡字符串/複數排序,使得這個類值得。在PHP中,gettext仍然是非常麻煩和尷尬的,我仍然只使用基於PHP的語言文件,並且能夠使用這個類來選擇複數形式真的有幫助。 – Xeoncross 2010-03-02 21:37:23

+0

@Xeoncross使用什麼適合。這只是一個你可以選擇和使用的軟件包,比如數學vs bc_math或GD與imagemagick。 – Gordon 2010-03-02 22:04:01

+0

你的答案可能不如Pascal的 - 但這種複數化的例子就是我所期待的,DevZone的文章也非常有用。謝謝! – Xeoncross 2010-03-03 16:03:19

2

number_format只允許格式化...數字 - 它只會將它們格式化爲純數字。

在另一方面,MessageFormater類確實比這個更多:

  • 它允許你格式化數字,是的;但不僅作爲「純數字」,還作爲(例如)貨幣
    • 而且數字格式和幣種單位都不同,具體取決於區域設置。
    • 例如,在法國,您可以使用1234,25 €;而在美國,你會使用(原諒我,如果我錯了)$1,234.25
  • 它可以讓你比只有數字格式的:
    • 您還可以格式化日期,例如
    • 包括一天的名稱/月
  • 它並不僅僅是在格式化某些數據塊:它允許你指定滿弦,在您使用的佔位符 - 指示哪些這些應該代表的數據。
    • 當您嘗試翻譯/本地化應用程序時,最後一點很重要:格式更改,是;但數據的位置也可以改變,這取決於語言。


這是偉大的,當你正在深化發展的應用程序,讓別人做翻譯你:

  • 你所以它從文件中裝載它的翻譯字符串編寫你的應用程序,取決於語言
    • 而且你說,對於每個字符串,按順序傳遞數據
  • 然後,別人把你的(英語,例如)翻譯文件,並將其翻譯成另一種語言
    • 使用相同的佔位符,像你一樣,對動態數據
    • 將它們放置在一個不同的順序,如果需要的話
  • 然後,當執行應用程序:
    • 您加載正確的TRA隱藏文件,
    • 您注入數據
    • 沒有人必須關心格式化數字/日期/ ...也不關心字符串中數據的順序;這是偉大的;-)


還要注意的是MessageFormater提供一些其它附加功能,如MessageFormatter::parseMessage方法,即不完全相反。

雖然我從來沒有真正使用過那個,但是 - 在某些情況下,它可能證明是有用的,我敢打賭。


最後,你這樣說:

給出的例子似乎表明 如果你已經知道的語言,您 使用

是,MessageFormater希望你知道哪些您的應用程序當前正在呈現的語言。

事實上,MessageFormater類的作用是......格式化消息 - 僅此而已。
但你有一些其他類,允許您檢測,你應該使用哪種語言;-)

例如,您可能想看看Locale類 - 的Locale::acceptFromHttp可能特別感興趣您(報價)

試圖尋找區域,能滿足 由 的HTTP請求的語言列表 「的Accept-Language」 頭

基本上,這應該可以幫助您檢測瀏覽器被用戶「接受」使用哪種語言 - 這很可能會指示當前用戶最可能理解哪種語言/語言環境。

例如,考慮到我的瀏覽器是爲Accept-languagéHTTP頭髮送此:

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

Locale::acceptFromHttp將表明,我更喜歡'fr'區域 - 這一點我比較喜歡^^

+0

美國錢是對的:) – Matchu 2010-03-02 21:35:00

0

嘗試閱讀來自ICU網站的description of the format - 與往常一樣,他們的文檔沒有任何理由,沒有組織和完全不完整的示例,但這並不意味着該庫是無用的。