X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7502ba2975bfd348dc50fef2a978e91f543d6bfe..d1427b705318677afe28b1291867f6930c8823a7:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index eb52e900b9..8943f15518 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -10,7 +10,7 @@ ///////////////////////////////////////////////////////////////////////////// // ============================================================================ -// declarations +// declaration // ============================================================================ // ---------------------------------------------------------------------------- @@ -28,19 +28,17 @@ #pragma hdrstop #endif -// wxWindows -#ifndef WX_PRECOMP - #include "wx/defs.h" - #include "wx/string.h" -#endif //WX_PRECOMP +// standard headers +#include +// wxWindows +#include "wx/defs.h" +#include "wx/string.h" #include "wx/intl.h" #include "wx/file.h" #include "wx/log.h" #include "wx/utils.h" -// standard headers -#include #include // ---------------------------------------------------------------------------- @@ -55,23 +53,23 @@ const uint32 MSGCATALOG_MAGIC_SW = 0xde120495; #define MSGCATALOG_EXTENSION ".mo" // ---------------------------------------------------------------------------- -// global functions (private to this module) +// global functions // ---------------------------------------------------------------------------- // suppress further error messages about missing translations // (if you don't have one catalog file, you wouldn't like to see the // error message for each string in it, so normally it's given only // once) -static void wxSuppressTransErrors(); +void wxSuppressTransErrors(); // restore the logging -static void wxRestoreTransErrors(); +void wxRestoreTransErrors(); // get the current state -static bool wxIsLoggingTransErrors(); +bool wxIsLoggingTransErrors(); -// get the current locale object (@@ may be NULL!) -static wxLocale *wxSetLocale(wxLocale *pLocale); +// get the current locale object (## may be NULL!) +extern wxLocale *wxSetLocale(wxLocale *pLocale); // ---------------------------------------------------------------------------- // wxMsgCatalog corresponds to one disk-file message catalog. @@ -195,12 +193,10 @@ wxMsgCatalog::wxMsgCatalog() wxMsgCatalog::~wxMsgCatalog() { - DELETEA(m_pData); - DELETEA(m_pszName); + wxDELETEA(m_pData); + wxDELETEA(m_pszName); } -// a helper class which suppresses all translation error messages -// from the moment of it's creation until it's destruction class NoTransErr { public: @@ -211,15 +207,15 @@ class NoTransErr // open disk file and read in it's contents bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) { - // search order (assume language 'lang') is - // 1) $LC_PATH/lang/LC_MESSAGES (if LC_PATH set) - // 2) ./lang/LC_MESSAGES - // 3) ./lang + // search order (assume language 'foo') is + // 1) $LC_PATH/foo/LC_MESSAGES (if LC_PATH set) + // 2) ./foo/LC_MESSAGES + // 3) ./foo // 4) . (Added by JACS) // // under UNIX we search also in: - // 5) /usr/share/locale/lang/LC_MESSAGES (Linux) - // 6) /usr/lib/locale/lang/LC_MESSAGES (Solaris) + // 5) /usr/share/locale/foo/LC_MESSAGES (Linux) + // 6) /usr/lib/locale/foo/LC_MESSAGES (Solaris) #define MSG_PATH FILE_SEP_PATH + "LC_MESSAGES" PATH_SEP wxString strPath(""); @@ -229,12 +225,12 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) // NB: '<<' is unneeded between too literal strings: // they are concatenated at compile time - strPath << "./" << wxString(szDirPrefix) + MSG_PATH // (2) - << "./" << szDirPrefix << FILE_SEP_PATH << PATH_SEP // (3) - << "." << PATH_SEP // (4) + strPath += "./" + wxString(szDirPrefix) + MSG_PATH // (2) + + "./" + szDirPrefix + FILE_SEP_PATH + PATH_SEP // (3) + + "." + PATH_SEP #ifdef __UNIX__ - "/usr/share/locale/" << szDirPrefix << MSG_PATH // (5) - "/usr/lib/locale/" << szDirPrefix << MSG_PATH // (6) + "/usr/share/locale/" + szDirPrefix + MSG_PATH // (5) + "/usr/lib/locale/" + szDirPrefix + MSG_PATH // (6) #endif //UNIX ; @@ -247,8 +243,8 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) // (we're using an object because we have several return paths) NoTransErr noTransErr; - wxLogVerbose(_("looking for catalog '%s' in path '%s'..."), - szName, strPath.c_str()); + wxLogVerbose(_("looking for catalog '%s' in path '%s'."), + szName, strPath.c_str()); wxString strFullName; if ( !wxFindFileInPath(&strFullName, strPath, strFile) ) { @@ -257,31 +253,27 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) } // open file - wxLogVerbose(_("catalog '%s' found in '%s'."), szName, strFullName.c_str()); + wxLogVerbose(_("using catalog '%s' from '%s'."), + szName, strFullName.c_str()); - // declare these vars here because we're using goto further down - bool bValid; - off_t nSize; - wxFile fileMsg(strFullName); if ( !fileMsg.IsOpened() ) - goto error; + return FALSE; // get the file size - nSize = fileMsg.Length(); - if ( nSize == ofsInvalid ) - goto error; + off_t nSize = fileMsg.Length(); + if ( nSize == wxInvalidOffset ) + return FALSE; // read the whole file in memory m_pData = new uint8[nSize]; if ( fileMsg.Read(m_pData, nSize) != nSize ) { - DELETEA(m_pData); - m_pData = NULL; - goto error; + wxDELETEA(m_pData); + return FALSE; } // examine header - bValid = (size_t)nSize > sizeof(wxMsgCatalogHeader); + bool bValid = (size_t)nSize > sizeof(wxMsgCatalogHeader); wxMsgCatalogHeader *pHeader; if ( bValid ) { @@ -296,18 +288,18 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) if ( !bValid ) { // it's either too short or has incorrect magic number - wxLogWarning(_("'%s' is not a valid message catalog."), - strFullName.c_str()); + wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str()); - DELETEA(m_pData); - m_pData = NULL; + wxDELETEA(m_pData); return FALSE; } // initialize m_numStrings = Swap(pHeader->numStrings); - m_pOrigTable = (wxMsgTableEntry *)(m_pData + Swap(pHeader->ofsOrigTable)); - m_pTransTable = (wxMsgTableEntry *)(m_pData + Swap(pHeader->ofsTransTable)); + m_pOrigTable = (wxMsgTableEntry *)(m_pData + + Swap(pHeader->ofsOrigTable)); + m_pTransTable = (wxMsgTableEntry *)(m_pData + + Swap(pHeader->ofsTransTable)); m_nHashSize = Swap(pHeader->nHashSize); m_pHashTable = (uint32 *)(m_pData + Swap(pHeader->ofsHashTable)); @@ -317,11 +309,6 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) // everything is fine return TRUE; - -error: - wxLogError(_("error opening message catalog '%s', not loaded."), - strFullName.c_str()); - return FALSE; } // search for a string @@ -374,13 +361,21 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const // wxLocale // ---------------------------------------------------------------------------- -// NB: ctor has (desired) side effect of changing current locale -wxLocale::wxLocale(const char *szName, - const char *szShort, - const char *szLocale, - bool bLoadDefault) - : m_strLocale(szName), m_strShort(szShort) +wxLocale::wxLocale() { + m_pszOldLocale = NULL; + m_pMsgCat = NULL; +} + +// NB: this function has (desired) side effect of changing current locale +bool wxLocale::Init(const char *szName, + const char *szShort, + const char *szLocale, + bool bLoadDefault) +{ + m_strLocale = szName; + m_strShort = szShort; + // change current locale (default: same as long name) if ( szLocale == NULL ) szLocale = szName; @@ -391,7 +386,7 @@ wxLocale::wxLocale(const char *szName, // the short name will be used to look for catalog files as well, // so we need something here if ( m_strShort.IsEmpty() ) { - // @@@@ I don't know how these 2 letter abbreviations are formed, + // #### I don't know how these 2 letter abbreviations are formed, // this wild guess is almost surely wrong m_strShort = wxToLower(szLocale[0]) + wxToLower(szLocale[1]); } @@ -401,8 +396,11 @@ wxLocale::wxLocale(const char *szName, // load the default catalog with wxWindows standard messages m_pMsgCat = NULL; + bool bOk = TRUE; if ( bLoadDefault ) - AddCatalog("wxstd"); + bOk = AddCatalog("wxstd"); + + return bOk; } // clean up @@ -453,12 +451,11 @@ const char *wxLocale::GetString(const char *szOrigString, wxSuppressTransErrors(); if ( szDomain != NULL ) - wxLogWarning(_("string '%s' not found in domain '%s'" - " for locale '%s'."), - szOrigString, szDomain, m_strLocale.c_str()); + wxLogWarning(_("string '%s' not found in domain '%s' for locale '%s'."), + szOrigString, szDomain, m_strLocale.c_str()); else wxLogWarning(_("string '%s' not found in locale '%s'."), - szOrigString, m_strLocale.c_str()); + szOrigString, m_strLocale.c_str()); } return szOrigString; @@ -537,6 +534,11 @@ bool wxIsLoggingTransErrors() // the current locale object wxLocale *g_pLocale = NULL; +wxLocale *wxGetLocale() +{ + return g_pLocale; +} + wxLocale *wxSetLocale(wxLocale *pLocale) { wxLocale *pOld = g_pLocale;