X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6957a370ffcab14188b08b90dff306505d2eb2dc..82713003dc446ad0353127abe66a1ecc66f4df67:/src/common/intl.cpp?ds=sidebyside diff --git a/src/common/intl.cpp b/src/common/intl.cpp index c3e563c245..aea952ed77 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: intl.cpp +// Name: src/common/intl.cpp // Purpose: Internationalization and localisation for wxWindows // Author: Vadim Zeitlin // Modified by: @@ -31,27 +31,30 @@ #if wxUSE_INTL // standard headers -#include -#include +#include +#include +#include // wxWindows -#include "wx/defs.h" -#include "wx/string.h" -#include "wx/tokenzr.h" -#include "wx/intl.h" +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/debug.h" + #include "wx/utils.h" + #include "wx/dynarray.h" +#endif // WX_PRECOMP + #include "wx/file.h" -#include "wx/log.h" -#include "wx/debug.h" -#include "wx/utils.h" -#include "wx/dynarray.h" +#include "wx/tokenzr.h" #include "wx/module.h" + #ifdef __WIN32__ -#include "wx/msw/private.h" + #include "wx/msw/private.h" +#elif defined(__UNIX_LIKE__) + #include "wx/fontmap.h" // for CharsetToEncoding() #endif - -#include - // ---------------------------------------------------------------------------- // simple types // ---------------------------------------------------------------------------- @@ -930,6 +933,87 @@ void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix) return wxLANGUAGE_UNKNOWN; } +// ---------------------------------------------------------------------------- +// 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; + +#ifdef __WIN32__ + // FIXME: what is the error return value for GetACP()? + UINT codepage = ::GetACP(); + encname.Printf(_T("cp%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 *alang = nl_langinfo(CODESET); + if (alang) + { + encname = wxConvLibc.cMB2WX(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) + wxChar *lang = wxGetenv(wxT("LC_ALL")); + wxChar *dot = lang ? wxStrchr(lang, wxT('.')) : (wxChar *)NULL; + if (!dot) + { + lang = wxGetenv(wxT("LC_CTYPE")); + if ( lang ) + dot = wxStrchr(lang, wxT('.')); + } + if (!dot) + { + lang = wxGetenv(wxT("LANG")); + if ( lang ) + dot = wxStrchr(lang, wxT('.')); + } + + if ( dot ) + { + encname = dot+1; + } + } +#endif // Win32/Unix + + return encname; +} + +/* static */ +wxFontEncoding wxLocale::GetSystemEncoding() +{ +#ifdef __WIN32__ + UINT codepage = ::GetACP(); + + // wxWindows only knows about CP1250-1257 + if ( codepage >= 1250 && codepage <= 1257 ) + { + return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250); + } +#elif defined(__UNIX_LIKE__) + wxString encname = GetSystemEncodingName(); + if ( !encname.empty() ) + { + return wxTheFontMapper-> + CharsetToEncoding(encname, FALSE /* not interactive */); + } +#endif // Win32/Unix + + return wxFONTENCODING_SYSTEM; +} + /*static*/ void wxLocale::AddLanguage(const wxLanguageInfo& info) { CreateLanguagesDB();