Re: Fix for 8.3 MSVC locale (Was [HACKERS] NLS on MSVC strikes back!)
От | Bruce Momjian |
---|---|
Тема | Re: Fix for 8.3 MSVC locale (Was [HACKERS] NLS on MSVC strikes back!) |
Дата | |
Msg-id | 200803230013.m2N0DGI05560@momjian.us обсуждение исходный текст |
Ответ на | Fix for 8.3 MSVC locale (Was [HACKERS] NLS on MSVC strikes back!) ("Gevik Babakhani" <pgdev@xs4all.nl>) |
Список | pgsql-patches |
Added to Win32 TODO: o Fix MSVC NLS support, like for to_char() http://archives.postgresql.org/pgsql-hackers/2008-02/msg00485.php http://archives.postgresql.org/pgsql-patches/2008-02/msg00038.php --------------------------------------------------------------------------- Gevik Babakhani wrote: > Hereby a patch that fixes NLS support on PG 8.3 compiled with MSVC. > > There problem: > > NLS support does not work on PG 8.3 compiled with MSVC. > I encountered this bug when I was trying to show localized months and days > using TO_CHAR. > > The main reason for this problem is because Gettext on Windows does not > respond to LC_MESSAGES environment variable. Changing this variable should > trigger Gettext to load a different messages catalog which unfortunately > does not work on Windows. Gettext uses the locale of the current thread in > execution to determine which message catalog should be loaded. > > This is all discussed in: > http://archives.postgresql.org/pgsql-hackers/2008-02/msg00485.php > > How it is fixed: > > Changing the LC_MESSAGES is done in pg_locale.c::pg_perm_setlocale(int > category, const char *locale). > In order to force Gettext to load a messages catalog we have to call > WIN32API::SetThreadLocale(unsigned long locale_id) > > (You probably see it coming) > Our input parameter for locale in pg_perm_setlocale is a string and there is > no unified way in Windows to translate a locale string to a locale_id for > SetThreadLocale to use. Therefore we will use a static table of values to > anticipate the locale name: > > pg_win32_locale_database::{0x041b,{"sk","sk-SK","sk_SK","Slovak_Slovakia"}} > > Given any of "sk","sk-SK","sk_SK".... the 0x041b is returned for > SetThreadLocale as input parameter. > > (We are not quite done yet) > Gettext, internally uses a hack to force itself to reload. This hidden > feature is also explained in GetText docs. By incrementing a Gettext > internal variable (_nl_msg_cat_cntr) we force Gettext to reload on the next > LC_MESSAGES->MSGID query. > > Tests: > > - Tested on Win XP MSVC (VC++ 8.0) > - Just a routine "make check" test on my Linux box > - MINGW is not tested. (I do not have the installation) > > Fix notes: > > - Gettext behaves oddly when the env. variable LANGUAGE is set before > starting PG > - The locale names in the static table are case sensitive. 'nl_NL' != > 'NL_NL' > - At this moment I only have included locale names we actually support in PG > installation. > - Where are the JP locale .po and .mo files? These are not in sources! > - Even though there are 20+ locales in PG installation, does not mean those > are complete. Try TMMonth,TMDay on "nl_NL". You will get English names :) > (My fault, hee hee, I haven't completed nl.po translations yet.) > > TODO: > > - Provide/complete the day and month names for all supported locales. > - Create docs for supported locale names on Windows. (Values of the static > table) > > Regards, > Gevik Babakhani > ------------------------------------------------ > PostgreSQL NL http://www.postgresql.nl > TrueSoftware BV http://www.truesoftware.nl > ------------------------------------------------ > [ Attachment, skipping... ] [ Attachment, skipping... ] > > ---------------------------(end of broadcast)--------------------------- > TIP 5: don't forget to increase your free space map settings -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://postgres.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
В списке pgsql-patches по дате отправления: