28 #include <glib/gi18n.h> 29 #include "gnucash-locale-platform.h" 32 rectify_utf(
const char* envvar,
const char* locale,
33 const char* dot,
const char* rest)
37 new_locale = g_strdup_printf (
"%s.UTF-%s@%s",
38 locale, dot + 3, rest);
40 new_locale = g_strdup_printf (
"%s.UTF-%s", locale, dot + 3);
42 _putenv_s (envvar, new_locale);
47 rectify_iso(
const char* envvar,
const char* locale,
48 const char* dot,
const char* rest)
51 char *eefn = strstr (dot,
"8859");
56 char* isonum = (*(eefn + 4) ==
'-') ? eefn + 5 : eefn + 4;
63 new_locale = g_strdup_printf (
"%s.ISO-8859-%s@%s", locale, isonum, rest);
65 new_locale = g_strdup_printf (
"%s.ISO-8859-%s", locale, isonum);
67 _putenv_s (envvar, new_locale);
72 rectify_environment_charset(
const char* envvar)
74 if (!(envvar && *envvar))
76 if (strcmp (envvar,
"LANG") && strncmp (envvar,
"LC_", 3))
79 char* varval = getenv (envvar);
80 char* locale = strtok_r (varval,
".", &saveptr);
81 char* dot = strtok_r (NULL,
"@", &saveptr);
86 char* rest = strtok_r (NULL,
"@", &saveptr);
88 if ((strncasecmp (dot,
"utf", 3) == 0 || strncasecmp (dot,
"ucs", 3) == 0) &&
90 return rectify_utf (envvar, locale, dot, rest);
92 if (strncasecmp (dot,
"iso", 3) == 0 && strlen (dot) >= 8 &&
93 dot[3] !=
'-' && dot[8] !=
'-')
94 return rectify_iso (envvar, locale, dot, rest);
105 set_platform_locale(
void)
107 WCHAR lpLocaleName[LOCALE_NAME_MAX_LENGTH];
116 rectify_environment_charset (
"LANG");
117 rectify_environment_charset (
"LC_ALL");
118 rectify_environment_charset (
"LC_MESSAGES");
119 rectify_environment_charset (
"LC_CTYPE");
121 if (((locale = getenv (
"LC_ALL")) != NULL && locale[0] !=
'\0') ||
122 ((locale = getenv (
"LC_MESSAGES")) != NULL && locale[0] !=
'\0') ||
123 ((locale = getenv (
"LANG")) != NULL && locale[0] !=
'\0'))
125 gunichar2* wlocale = NULL;
127 len = strchr(locale,
'.') - locale;
129 wlocale = g_utf8_to_utf16 (locale, len, NULL, NULL, NULL);
130 if (IsValidLocaleName(wlocale))
132 LCID lcid = LocaleNameToLCID(wlocale, LOCALE_ALLOW_NEUTRAL_NAMES);
133 SetThreadLocale(lcid);
135 setlocale (LC_ALL, locale);
137 return g_strdup (locale);
142 if (GetUserDefaultLocaleName(lpLocaleName, LOCALE_NAME_MAX_LENGTH))
144 locale = g_utf16_to_utf8((gunichar2*)lpLocaleName,
145 LOCALE_NAME_MAX_LENGTH,
148 setlocale (LC_ALL, locale);
151 return g_strdup(
"C");
155 set_platform_ctype_to_acp (
void)
159 _wsetlocale (LC_CTYPE, L
"C");