+// ----------------------------------------------------------------------------
+// encoding stuff
+// ----------------------------------------------------------------------------
+
+// this is a bit strange as under Windows we get the encoding name using its
+// numeric value and under Unix we do it the other way round, but this just
+// reflects the way different systems provide he encoding info
+
+/* static */
+wxString wxLocale::GetSystemEncodingName()
+{
+ wxString encname;
+
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+ // FIXME: what is the error return value for GetACP()?
+ UINT codepage = ::GetACP();
+ encname.Printf(_T("windows-%u"), codepage);
+#elif defined(__UNIX_LIKE__)
+
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
+ // GNU libc provides current character set this way (this conforms
+ // to Unix98)
+ char *oldLocale = strdup(setlocale(LC_CTYPE, NULL));
+ setlocale(LC_CTYPE, "");
+ char *alang = nl_langinfo(CODESET);
+ setlocale(LC_CTYPE, oldLocale);
+ free(oldLocale);
+
+ if ( alang )
+ {
+ // 7 bit ASCII encoding has several alternative names which we should
+ // recognize to avoid warnings about unrecognized encoding on each
+ // program startup
+
+ // nl_langinfo() under Solaris returns 646 by default which stands for
+ // ISO-646, i.e. 7 bit ASCII
+ //
+ // and recent glibc call it ANSI_X3.4-1968...
+ if ( strcmp(alang, "646") == 0 ||
+ strcmp(alang, "ANSI_X3.4-1968") == 0 )
+ {
+ encname = _T("US-ASCII");
+ }
+ else
+ {
+ encname = wxString::FromAscii( alang );
+ }
+ }
+ else
+#endif // HAVE_LANGINFO_H
+ {
+ // if we can't get at the character set directly, try to see if it's in
+ // the environment variables (in most cases this won't work, but I was
+ // out of ideas)
+ char *lang = getenv( "LC_ALL");
+ char *dot = lang ? strchr(lang, '.') : (char *)NULL;
+ if (!dot)
+ {
+ lang = getenv( "LC_CTYPE" );
+ if ( lang )
+ dot = strchr(lang, '.' );
+ }
+ if (!dot)
+ {
+ lang = getenv( "LANG");
+ if ( lang )
+ dot = strchr(lang, '.');
+ }
+
+ if ( dot )
+ {
+ encname = wxString::FromAscii( dot+1 );
+ }
+ }
+#endif // Win32/Unix
+
+ return encname;
+}
+
+/* static */
+wxFontEncoding wxLocale::GetSystemEncoding()
+{
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+ UINT codepage = ::GetACP();
+
+ // wxWindows only knows about CP1250-1257, 932, 936, 949, 950
+ if ( codepage >= 1250 && codepage <= 1257 )
+ {
+ return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250);
+ }
+
+ if ( codepage == 932 )
+ {
+ return wxFONTENCODING_CP932;
+ }
+
+ if ( codepage == 936 )
+ {
+ return wxFONTENCODING_CP936;
+ }
+
+ if ( codepage == 949 )
+ {
+ return wxFONTENCODING_CP949;
+ }
+
+ if ( codepage == 950 )
+ {
+ return wxFONTENCODING_CP950;
+ }
+#elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP
+ wxString encname = GetSystemEncodingName();
+ if ( !encname.empty() )
+ {
+ wxFontEncoding enc = wxFontMapper::Get()->
+ CharsetToEncoding(encname, FALSE /* not interactive */);
+
+ // on some modern Linux systems (RedHat 8) the default system locale
+ // is UTF8 -- but it isn't supported by wxGTK in ANSI build at all so
+ // don't even try to use it in this case
+#if !wxUSE_UNICODE
+ if ( enc == wxFONTENCODING_UTF8 )
+ {
+ // the most similar supported encoding...
+ enc = wxFONTENCODING_ISO8859_1;
+ }
+#endif // !wxUSE_UNICODE
+
+ // this should probably be considered as a bug in CharsetToEncoding():
+ // it shouldn't return wxFONTENCODING_DEFAULT at all - but it does it
+ // for US-ASCII charset
+ //
+ // we, OTOH, definitely shouldn't return it as it doesn't make sense at
+ // all (which encoding is it?)
+ if ( enc != wxFONTENCODING_DEFAULT )
+ {
+ return enc;
+ }
+ //else: return wxFONTENCODING_SYSTEM below
+ }
+#endif // Win32/Unix
+
+ return wxFONTENCODING_SYSTEM;
+}
+
+/* static */
+void wxLocale::AddLanguage(const wxLanguageInfo& info)