2014-02-14 34 views
1

我在windows vista上運行PHP。所以,我試圖瞭解locale函數的工作原理。我開始與如何使用PHP語言環境功能

setlocale(LC_ALL, $locale)localeconv()

起初,它與CLDR區域ID的工作(我想..,剛開始學習PHP語言環境),如「en_US」表示,「en_UK」等,造成如示PHP文檔示例。但現在setlocale()localeconv()只適用於值,如"English_United Kingdom.1252""English_United States.1252",我相信這是基於Windows的區域設置ID。

所以,當我做的:

var_dump(setlocale(LC_ALL, "en_US")); 
var_dump(localeconv()); 

我得到這些結果:

boolean false 

array (size=18) 
    'decimal_point' => string '.' (length=1) 
    'thousands_sep' => string '' (length=0) 
    'int_curr_symbol' => string '' (length=0) 
    'currency_symbol' => string '' (length=0) 
    'mon_decimal_point' => string '' (length=0) 
    'mon_thousands_sep' => string '' (length=0) 
    'positive_sign' => string '' (length=0) 
    'negative_sign' => string '' (length=0) 
    'int_frac_digits' => int 127 
    'frac_digits' => int 127 
    'p_cs_precedes' => int 127 
    'p_sep_by_space' => int 127 
    'n_cs_precedes' => int 127 
    'n_sep_by_space' => int 127 
    'p_sign_posn' => int 127 
    'n_sign_posn' => int 127 
    'grouping' => 
    array (size=0) 
     empty 
    'mon_grouping' => 
    array (size=0) 
     empty 

如何讓我的腳本響應CLDR區域ID?

回答

1

setlocale()在您的情況下返回false。手冊:

返回當前新的語言環境,或FALSE如果區域功能 是不是你的平臺

嘗試使用一個上實現:「美國」,「美國」,「美國」, 「團結態」,或 「我們」

http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.90%29.aspx

+0

那麼這是否意味着函數'setlocale()'實際上駐留在操作系統上並且'PHP'只是調用它?這意味着它的參數必須在'windows'上定義/安裝? –

+0

我這麼認爲。嘗試從上面提供的鏈接使用語言環境名稱,這應該在Windows上工作。 –

0

setlocalelocaleconv,以及相關的功能不支持Unicode CLDR區域設置標識符或數據的工作。相反,它們根據操作系統而有所不同,POSIX語言環境標識符以及Windows上的* nix系統和Mi​​crosoft語言環境字符串和數據上的數據。

# works only on Linux after running `locale-gen de_DE.UTF-8` 
# but Windows requires an entirely different locale identifier 
setlocale(LC_ALL, 'de_DE.UTF-8'); 
$locale = localeconv(); 
echo number_format(
    1234.5, 
    1, # fraction digits 
    $locale['decimal_point'], 
    $locale['thousands_sep'] 
); # '1.234,5' 

如果你確實喜歡使用Unicode CLDR區域標識符和數據提供統一的體驗,無論您的操作系統,使用International extension代替。它在PHP 5.3中可用,並且是ICU(Unicode的國際組件)庫的包裝器,它提供標準化的CLDR區域設置數據。

$fmt = new NumberFormatter('de-DE', NumberFormatter::DECIMAL); # or 'de_DE' 
echo $fmt->format(1234.5); # '1.234,5'