/////////////////////////////////////////////////////////////////////////////
-// Name: intl.cpp
+// Name: src/common/intl.cpp
// Purpose: Internationalization and localisation for wxWindows
// Author: Vadim Zeitlin
// Modified by:
#if wxUSE_INTL
// standard headers
-#include <locale.h>
-#include <ctype.h>
+#include <locale.h>
+#include <ctype.h>
+#include <stdlib.h>
+#ifdef HAVE_LANGINFO_H
+ #include <langinfo.h>
+#endif
// 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"
+#include "wx/fontmap.h"
+#include "wx/encconv.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 <stdlib.h>
-
// ----------------------------------------------------------------------------
// simple types
// ----------------------------------------------------------------------------
{
// Asserting a sizeof directly causes some compilers to
// issue a "using constant in a conditional expression" warning
- size_t intsize = sizeof(int);
-
- wxASSERT_MSG( intsize == 4,
+ wxASSERT_MSG( wxAssertIsEqual(sizeof(int), 4),
"size_t32 is incorrectly defined!" );
}
} intsizechecker;
return NULL;
}
-
-#if wxUSE_GUI
-#include "wx/fontmap.h"
-#include "wx/encconv.h"
-#endif
-
void wxMsgCatalog::ConvertEncoding()
{
-#if wxUSE_GUI
- wxFontEncoding enc;
-
// first, find encoding header:
const char *hdr = StringAtOfs(m_pOrigTable, 0);
if ( hdr == NULL || hdr[0] != 0 ) {
- // not supported by this catalog, does not have non-fuzzy header
+ // not supported by this catalog, does not have correct header
return;
}
- /*
- we support catalogs with header (msgid "") that is _not_ marked as "#,
- fuzzy" (otherwise the string would not be included into compiled
- catalog)
- */
wxString header(StringAtOfs(m_pTransTable, 0));
wxString charset;
int pos = header.Find(wxT("Content-Type: text/plain; charset="));
while (header[n] != wxT('\n'))
charset << header[n++];
- enc = wxTheFontMapper->CharsetToEncoding(charset, FALSE);
+#if wxUSE_FONTMAP
+ wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(charset, FALSE);
if ( enc == wxFONTENCODING_SYSTEM )
return; // unknown encoding
- wxFontEncoding targetEnc = wxFONTENCODING_SYSTEM;
-#ifdef __UNIX__
- wxString langFull;
- if (wxGetEnv(wxT("LC_ALL"), &langFull) ||
- wxGetEnv(wxT("LC_CTYPE"), &langFull) ||
- wxGetEnv(wxT("LANG"), &langFull))
- {
- wxString lcharset = langFull.AfterFirst(wxT('.')).BeforeFirst(wxT('@'));
- if (!lcharset.IsEmpty())
- targetEnc = wxTheFontMapper->CharsetToEncoding(lcharset, FALSE);
- }
-#endif
-
+ wxFontEncoding targetEnc = wxLocale::GetSystemEncoding();
if (targetEnc == wxFONTENCODING_SYSTEM)
{
wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc);
for (size_t i = 0; i < m_numStrings; i++)
converter.Convert((char*)StringAtOfs(m_pTransTable, i));
-#endif // wxUSE_GUI
+#endif // wxUSE_FONTMAP
}
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("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)
+ {
+ 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__) && wxUSE_FONTMAP
+ 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();