如何使用PHP Locale函数

时间:2014-02-14 07:49:02

标签: php locale setlocale

我正在PHP上运行windows vista。所以,我试图了解语言环境功能的工作原理。我从

开始

setlocale(LC_ALL, $locale)localeconv()

最初它使用了CLDR语言环境ID(我认为..,刚刚开始学习PHP语言环境),如“en_US”,“en_UK”等,结果如PHP文档示例中所示。但现在setlocale()localeconv()仅适用于$locale"English_United Kingdom.1252"之类的值"English_United States.1252"var_dump(setlocale(LC_ALL, "en_US")); var_dump(localeconv()); ,我认为这些值是基于Windows的区域设置ID。

所以当我这样做时:

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

我得到了这些结果:

{{1}}

如何让我的脚本响应CLDR区域设置ID?

2 个答案:

答案 0 :(得分:1)

setlocale()在您的情况下返回false。手册:

  

返回新的当前语言环境,如果是语言环境功能,则返回FALSE   未在您的平台上实施

尝试使用以下其中一种:“美国”,“美国”,“美国”,“美国”或“我们”

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

答案 1 :(得分:0)

setlocalelocaleconv和相关函数不适用于Unicode CLDR区域设置标识符或数据。相反,它们因操作系统的不同而不同,POSIX区域设置标识符和* nix系统上的数据以及Windows上的Microsoft区域设置字符串和数据。

# 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(International Components for Unicode)库的包装器,它提供标准化的CLDR语言环境数据。

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