http://bugs.winehq.org/show_bug.cgi?id=7235
------- Additional Comments From bdonlan@gmail.com 2007-06-03 16:30 ------- Setting the second parameter to NULL returns the C locale. By my reading of the manpage, setlocale() will not respect environment variables at all unless called with an empty string:
If locale is "", each part of the locale that should be modified is set according to the environment variables. The details are implementation dependent. For glibc, first (regardless of category), the environment variable LC_ALL is inspected, next the environment variable with the same name as the category (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONE‐ TARY, LC_NUMERIC, LC_TIME) and finally the environment variable LANG. The first existing environment variable is used. If its value is not a valid locale specification, the locale is unchanged, and setlocale() returns NULL. and If locale is NULL, the current locale is only queried, not modified.
On startup of the main program, the portable "C" locale is selected as default. A program may be made portable to all locales by calling set‐ locale(LC_ALL, "" ) after program initialization, by using the values returned from a localeconv() call for locale-dependent information, by using the multi-byte and wide character functions for text processing if MB_CUR_MAX > 1, and by using strcoll(), wcscoll() or strxfrm(), wcsxfrm() to compare strings.
Therefore, if wine merely calls setlocale(LC_*, NULL), it is incorrect. It must call locale(LC_ALL, "") during initialization.