[PATCH] kernel32: Respect the LANG environment variable on Mac OS.
Charles Davis
cdavis at mymail.mines.edu
Wed Dec 9 13:58:58 CST 2009
Ken Thomases wrote:
> On Dec 3, 2009, at 11:27 AM, Ken Thomases wrote:
>
>> I propose the following (in pseudocode):
>>
>> mac_formats_locale = CFLocaleGetIdentifier( CFLocaleCopyCurrent() );
>> mac_language = CFArrayGetValueAtIndex(
>> CFBundleCopyLocalizationsForPreferences(
>> CFLocaleCopyAvailableLocaleIdentifiers(), NULL ), 0 );
>> for cat in ( LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME,
>> LC_PAPER, LC_MEASUREMENT, LC_TELEPHONE )
>> setenv( cat, mac_formats_locale, 0 );
>> setenv( "LC_MESSAGES", mac_language, 0 );
>
> I have encountered a problem with my proposal.
>
> The above pseudo-code for determining mac_language is quite likely to
> produce a string like "en" or "zh_Hans" -- that is, a locale specifier
> with no country code. Setting LC_MESSAGES to a locale string without a
> country code will cause the C library to consider it invalid. (That's
> not a requirement explicitly imposed by the C library, but a consequence
> of what's in /usr/share/locale. For example, the command "locale -a"
> does not list any locales without country codes.) When that happens, it
> considers all LC_* variables invalid and defaults to the "C" locale.
>
> The code that Wine currently uses avoids this problem because it doesn't
> go through the C library. Basically, after all of the
> LANG/setlocale/setup_unix_locales stuff has been done, it overwrites the
> value in lcid_LC_MESSAGES (a Wine variable).
>
> So, I'm making a new proposal: the Mac formats region will be used to
> set LANG unconditionally. (Passing 1 for the third argument to setenv()
> rather than 0.) The current code for overwriting lcid_LC_MESSAGES will
> be tweaked. Instead of looking at whether lcid_LC_MESSAGES has been set
> to something other than lcid_LC_CTYPE, it will look at whether LC_ALL or
> LC_MESSAGES were set in the environment. If they were, it leaves
> lcid_LC_MESSAGES alone. If they were not, it overwrites it using the
> existing method.
>
> This retains the precedence order we desire:
>
> LC_ALL
> LC_*
> Mac OS X settings
> LANG
>
> because:
>
> * LANG is just replaced with the Mac OS X region
> * If LC_ALL or the LC_* variables are set, they take precedence over
> LANG in the C library (setlocale)
> * If LC_ALL or LC_MESSAGES are set, we don't overwrite lcid_LC_MESSAGES
> after the C library has done its thing
>
> Does that sound sensible?
>
> -Ken
>
>
>
LGTM
Chip
More information about the wine-devel
mailing list