27 #include <glib/gi18n.h> 28 #include "gnucash-locale-platform.h" 31 rectify_utf(
const char* envvar,
const char* locale,
32 const char* dot,
const char* rest)
36 new_locale = g_strdup_printf (
"%s.UTF-%s@%s",
37 locale, dot + 3, rest);
39 new_locale = g_strdup_printf (
"%s.UTF-%s", locale, dot + 3);
41 _putenv_s (envvar, new_locale);
46 rectify_iso(
const char* envvar,
const char* locale,
47 const char* dot,
const char* rest)
50 char *eefn = strstr (dot,
"8859");
55 char* isonum = (*(eefn + 4) ==
'-') ? eefn + 5 : eefn + 4;
62 new_locale = g_strdup_printf (
"%s.ISO-8859-%s@%s", locale, isonum, rest);
64 new_locale = g_strdup_printf (
"%s.ISO-8859-%s", locale, isonum);
66 _putenv_s (envvar, new_locale);
71 rectify_environment_charset(
const char* envvar)
73 if (!(envvar && *envvar))
75 if (strcmp (envvar,
"LANG") && strncmp (envvar,
"LC_", 3))
78 char* varval = getenv (envvar);
79 char* locale = strtok_r (varval,
".", &saveptr);
80 char* dot = strtok_r (NULL,
"@", &saveptr);
85 char* rest = strtok_r (NULL,
"@", &saveptr);
87 if ((strncasecmp (dot,
"utf", 3) == 0 || strncasecmp (dot,
"ucs", 3) == 0) &&
89 return rectify_utf (envvar, locale, dot, rest);
91 if (strncasecmp (dot,
"iso", 3) == 0 && strlen (dot) >= 8 &&
92 dot[3] !=
'-' && dot[8] !=
'-')
93 return rectify_iso (envvar, locale, dot, rest);
104 set_platform_locale(
void)
106 WCHAR lpLocaleName[LOCALE_NAME_MAX_LENGTH];
115 rectify_environment_charset (
"LANG");
116 rectify_environment_charset (
"LC_ALL");
117 rectify_environment_charset (
"LC_MESSAGES");
118 rectify_environment_charset (
"LC_CTYPE");
120 if (((locale = getenv (
"LC_ALL")) != NULL && locale[0] !=
'\0') ||
121 ((locale = getenv (
"LC_MESSAGES")) != NULL && locale[0] !=
'\0') ||
122 ((locale = getenv (
"LANG")) != NULL && locale[0] !=
'\0'))
124 gunichar2* wlocale = NULL;
126 len = strchr(locale,
'.') - locale;
128 wlocale = g_utf8_to_utf16 (locale, len, NULL, NULL, NULL);
129 if (IsValidLocaleName(wlocale))
131 LCID lcid = LocaleNameToLCID(wlocale, LOCALE_ALLOW_NEUTRAL_NAMES);
132 SetThreadLocale(lcid);
134 setlocale (LC_ALL, locale);
136 return g_strdup (locale);
141 if (GetUserDefaultLocaleName(lpLocaleName, LOCALE_NAME_MAX_LENGTH))
143 locale = g_utf16_to_utf8((gunichar2*)lpLocaleName,
144 LOCALE_NAME_MAX_LENGTH,
147 setlocale (LC_ALL, locale);
150 return g_strdup(
"C");