[PATCH] kernel32: Respect the LANG environment variable on Mac OS.

Gert van den Berg wine-devel at mohag.net
Mon Nov 30 16:06:36 CST 2009


On Mon, Nov 30, 2009 at 22:01, Ken Thomases <ken at codeweavers.com> wrote:
> On Nov 30, 2009, at 4:35 AM, <Joerg-Cyril.Hoehle at t-systems.com> <Joerg-Cyril.Hoehle at t-systems.com> wrote:
>> What's the relationship between LC_xyz and LANG? The official answer for
>> programs using glibc is: "the library will
>> test the environment variables LC_ALL, LC_CTYPE, and LANG in that order"
>> But is glibc actually used on MacOS??
>
POSIX specs:
http://www.opengroup.org/onlinepubs/007908799/xbd/envvar.html#tag_002_002

Short version: Order of checking:
LC_ALL
LC_whatever
LANG

Not sure how Wine's registry integration is implemented... I would
think that the most compatible (with the host *nix environment) way
would be:
Check saved locale variable values, if none was changed from last run,
use current registry settings. If any was changed in a way that would
affect behavior, rerun relevant parts below logic. (e.g. do not rerun
if LC_ALL stayed the same, since that override EVERYTHING). If
variable affecting locale code was not changed, change only the
relevant settings.

If LC_ALL is defined, set locale code from that, else set it from LANG
default to Windows default locale. Fill in defaults for locale.

If LC_ALL was not used above, go through LC_whatever and overwrite
settings in registry according to that. This leaves settings at
defaults (preferably Windows defaults) for language if only $LANG is
set. It uses the Unix settings if they are set, for consistency with
the host OS and allow the settings to be changed as for Unix apps.
Saving the values and comparing it, also allows the user to change the
settings, and not loose it each time Wine starts.

On my OS X 10.6, (Set to English, South African currency / numbers
(Which is actually correctly uses a decimal comma, unlike Ubuntu /
Windows)) LC_ALL is blank, LANG is blank LC_CTYPE is UTF-8 (affecting
toupper, etc according to POSIX page), all others are "C". Following
above logic, this would result in US English settings everywhere. (Not
sure if Apple might be modifying the behavior of localized output
functions to match settings, even if C is set, need to test). (
http://images.apple.com/macosx/technology/docs/L416017A_UNIX_TB_FF.pdf
might help if OS X specific overwrites are needed.

IMHO, it should try replicating the OS X preferences (setting each
registry setting according to (potentially custom) settings in OS X
after setting locale code according to language and country), with a
way to overwrite. (LC_ALL would by my preferred method, since it has
the highest precedence in POSIX). This should then result in the
following locale logic: Saved Wine settings (if nothing changed) >
LC_ALL > OS specific > LC_* > LANG > C. As far as I can tell, this
should result in a configuration that mimics the host OS, unless
specifically overwritten.

Some settings might not be easy to map to the Wine version, and if no
setting Wine setting exist, a warning should be printed (e.g. if
Windows uses locale code rather than a separate setting for something
POSIX has a separate variable, a warning should be printed if the
POSIX settings would result in different behavior than configurable
from Windows) In addition, if any settings exist in Wine that can not
by set by LC_whatever, it should be easy to edit the Wine value from
Winecfg / Wine control panel. (If an OS specific method allows it to
be overwritten, it may be left out on those OSes)

Gert



More information about the wine-devel mailing list