// headers
// ----------------------------------------------------------------------------
-#ifdef __EMX__
-// The following define is needed by Innotek's libc to
-// make the definition of struct localeconv available.
-#define __INTERNAL_DEFS
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+#ifdef __EMX__
+// The following define is needed by Innotek's libc to
+// make the definition of struct localeconv available.
+#define __INTERNAL_DEFS
+#endif
+
#if wxUSE_INTL
#ifndef WX_PRECOMP
static
wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang)
{
- wxString searchPath;
- searchPath << prefix << wxFILE_SEP_PATH << lang;
-
- // Under Unix, the message catalogs are supposed to go into LC_MESSAGES
- // subdirectory so look there too. Note that we do it on all platforms
- // and not just Unix, because it doesn't cost much to look into one more
- // directory and doing it this way has two important benefits:
+ // Search first in Unix-standard prefix/lang/LC_MESSAGES, then in
+ // prefix/lang and finally in just prefix.
+ //
+ // Note that we use LC_MESSAGES on all platforms and not just Unix, because
+ // it doesn't cost much to look into one more directory and doing it this
+ // way has two important benefits:
// a) we don't break compatibility with wx-2.6 and older by stopping to
// look in a directory where the catalogs used to be and thus silently
// breaking apps after they are recompiled against the latest wx
// b) it makes it possible to package app's support files in the same
// way on all target platforms
- const wxString searchPathOrig(searchPath);
- searchPath << wxFILE_SEP_PATH << wxT("LC_MESSAGES")
- << wxPATH_SEP << searchPathOrig;
+ wxString pathPrefix;
+ pathPrefix << prefix << wxFILE_SEP_PATH << lang;
+
+ wxString searchPath;
+ searchPath.reserve(4*pathPrefix.length());
+ searchPath << pathPrefix << wxFILE_SEP_PATH << "LC_MESSAGES" << wxPATH_SEP
+ << prefix << wxFILE_SEP_PATH << wxPATH_SEP
+ << pathPrefix;
return searchPath;
}
bool wxLocale::Init(int language, int flags)
{
+ bool ret = true;
+
int lang = language;
if (lang == wxLANGUAGE_DEFAULT)
{
}
if ( !retloc )
- {
- wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str());
- return false;
- }
+ ret = false;
#ifdef __AIX__
// at least in AIX 5.2 libc is buggy and the string returned from
//
// this contradicts IBM own docs but this is not of much help, so just work
// around it in the crudest possible manner
- char *p = wxStrchr(retloc, ' ');
+ char* p = const_cast<char*>(wxStrchr(retloc, ' '));
if ( p )
*p = '\0';
#endif // __AIX__
if (locale.empty())
{
wxLogLastError(wxT("SetThreadLocale"));
- wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
- return false;
+ ret = false;
}
else
{
}
if ( !retloc )
- {
- wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
- return false;
- }
+ ret = false;
#elif defined(__WXMAC__)
if (lang == wxLANGUAGE_DEFAULT)
locale = wxEmptyString;
// Some C libraries don't like xx_YY form and require xx only
retloc = wxSetlocale(LC_ALL, locale.Mid(0,2));
}
- if ( !retloc )
- {
- wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str());
- return false;
- }
#else
wxUnusedVar(flags);
return false;
#endif
#ifndef WX_NO_LOCALE_SUPPORT
- bool ret = Init(name, canonical, retloc,
- (flags & wxLOCALE_LOAD_DEFAULT) != 0,
- (flags & wxLOCALE_CONV_ENCODING) != 0);
+ if ( !ret )
+ {
+ wxLogWarning(_("Cannot set locale to language \"%s\"."), name.c_str());
+
+ // continue nevertheless and try to load at least the translations for
+ // this language
+ }
+
+ if ( !Init(name, canonical, retloc,
+ (flags & wxLOCALE_LOAD_DEFAULT) != 0,
+ (flags & wxLOCALE_CONV_ENCODING) != 0) )
+ {
+ ret = false;
+ }
if (IsOk()) // setlocale() succeeded
m_language = lang;