1

I'm running PHP on windows vista. So, I'm trying to get to know how locale functions work. I started with

setlocale(LC_ALL, $locale) and localeconv()

At first it worked with CLDR locale IDs(I think.., Just started learning PHP locales) like "en_US", "en_UK", etc, resulting as demonstrated in the PHP documentation examples. But now setlocale() and localeconv() only works with $locale values like "English_United Kingdom.1252" and "English_United States.1252" which I believe is windows based locale IDs.

So when I do:

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

I get these results:

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

How do I make my scripts respond to CLDR locale IDs?

2 Answers 2

1

setlocale() returns false in your case. Manual:

Returns the new current locale, or FALSE if the locale functionality is not implemented on your platform

Try to use one of: "usa", "america", "united states", "united-states", or "us"

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

Sign up to request clarification or add additional context in comments.

2 Comments

So does this mean the function setlocale() actually resides on the operating system and that PHP merely calls it? Meaning that it's arguments must be as defined/installed on windows?
I think so. Try to use locale name from link provided above, this should work on windows.
0

The setlocale, localeconv, and related functions do not work with Unicode CLDR locale identifiers or data. Instead, they vary per operating system, with POSIX locale identifiers and data on *nix systems and Microsoft locale strings and data on Windows.

# 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'

If you’d actually like to use Unicode CLDR locale identifiers and data for a unified experience regardless of your operating system, use the International extension instead. It’s available with PHP 5.3 and is a wrapper around the ICU (International Components for Unicode) library, which provides standardized CLDR locale data.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.