Thread: Win32 & NLS
Hi! Working the NLS stuff on win32. Considering I know very little about this part (don't use it myself, never coded around in it), perhaps someone else can shed some light? PostgreSQL responds correctly to whatever the LC_MESSAGES environment variable is set to upon startup of postgresql - I get my error messages in swedish, english, german or whatever depending on that. However, postgresql.conf does not load with the error message: FATAL: invalid value for parameter "lc_messages": "EN" This goes for whatever I set lc_messages to, including all the combinations that work when set in the environment variable. If I comment it out completely from the config file, things appear to work with the locale picked up from the environment. (The error msg of course only shows up when NLS is enabled in configure) Some quick tracking-down of this shows that the code on line 80-82 of pg_locale.c: save = setlocale(category, NULL); if (!save) return NULL; /* won't happen, we hope */ *does* return NULL... Now, I really don't know anything about the setlocale() integration, but from the MSDN documentation (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/ html/_crt_setlocale.2c_._wsetlocale.asp) doesn't even list LC_MESSAGES as a valid identifier. My bet is that's why it returns NULL on LC_MESSAGES. Also, some googling lead me to this: http://www.haible.de/bruno/gettext-FAQ.html#windows_woe32 Which appears to suggest that we should change the locale using putenv() etc, and not using setlocale() at all... Because setlocale() does not support LC_MESSAGES, probably. Attached is a patch with adds a environment variable based version of locale_messages_assign(). It's not a pretty solution, but I think it's probably necessary. Comments? (There is also a patch for initdb required to work on win32 when compiled with NLS enabled, but this is the start...) //Magnus
Attachment
Magnus Hagander wrote: > Which appears to suggest that we should change the locale using > putenv() etc, and not using setlocale() at all... Because setlocale() > does not support LC_MESSAGES, probably. This cannot possibly work. putenv() doesn't change any locale. The environment variables only serve as a default when you call setlocale() without an actual locale value. But to enable any locale, you always need to call setlocale() somehow, somewhere. -- Peter Eisentraut http://developer.postgresql.org/~petere/
>> Which appears to suggest that we should change the locale using >> putenv() etc, and not using setlocale() at all... Because setlocale() >> does not support LC_MESSAGES, probably. > >This cannot possibly work. putenv() doesn't change any locale. The >environment variables only serve as a default when you call >setlocale() >without an actual locale value. But to enable any locale, you always >need to call setlocale() somehow, somewhere. That was my first thought, too. But it *does* appear to work. With this patch, I can change lc_messages from environment-before-startup, from postgresql.conf or using "set lc_messages='foo'". The only main thing I see as being wrong is that it cannot check if the specified messages were incorrect. If I literally set it to "foo", I get english without getting any error/warning. Clearly they don't just serve as defaults on win32. That's the only conclusion I can draw from the fact that this works, and from the questions in the FAQ referenced. See also for example http://lists.gnu.org/archive/html/bug-gnu-utils/2004-02/msg00091.html //Magnus
"Magnus Hagander" <mha@sollentuna.net> writes: > However, postgresql.conf does not load with the error message: > FATAL: invalid value for parameter "lc_messages": "EN" That's because "en" isn't a legal locale spec. "en_US", for instance, would be valid. (At least on most platforms ... maybe Windoze is out in left field?) regards, tom lane
"Magnus Hagander" <mha@sollentuna.net> writes: > Attached is a patch with adds a environment variable based version of > locale_messages_assign(). It's not a pretty solution, but I think it's > probably necessary. Applied with minor cleanup. I'm still concerned about the order-of-operations issue, but some desultory experimentation on Linux (Fedora Core 3) did not find any cases where setlocale(LC_MESSAGES) would fail because of a contradictory LC_CTYPE setting, so maybe that theory is all wet. Still it seems there is *something* fishy going on, given the number of reports we've seen. regards, tom lane