#include "wx/apptrait.h"
#include "wx/stdpaths.h"
#include "wx/hashset.h"
+#include "wx/filesys.h"
#if defined(__WXMAC__)
- #include "wx/mac/private.h" // includes mac headers
+ #include "wx/mac/private.h" // includes mac headers
+#endif
+
+#if defined(__DARWIN__)
+ #include "wx/mac/corefoundation/cfref.h"
+ #include <CoreFoundation/CFLocale.h>
+ #include "wx/mac/corefoundation/cfstring.h"
#endif
// ----------------------------------------------------------------------------
static const size_t LEN_SUBLANG = 2;
static const size_t LEN_FULL = LEN_LANG + 1 + LEN_SUBLANG; // 1 for '_'
-#define TRACE_I18N _T("i18n")
+#define TRACE_I18N wxS("i18n")
// ----------------------------------------------------------------------------
// global functions
ofsHashTable; // +18: offset of hash table start
};
- // all data is stored here, NULL if no data loaded
- size_t8 *m_pData;
-
- // amount of memory pointed to by m_pData.
- size_t32 m_nSize;
+ // all data is stored here
+ wxMemoryBuffer m_data;
// data description
size_t32 m_numStrings; // number of strings in this domain
: ui;
}
+ // just return the pointer to the start of the data as "char *" to
+ // facilitate doing pointer arithmetic with it
+ char *StringData() const
+ {
+ return wx_static_cast(char *, m_data.GetData());
+ }
+
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
{
const wxMsgTableEntry * const ent = pTable + n;
// this check could fail for a corrupt message catalog
size_t32 ofsString = Swap(ent->ofsString);
- if ( ofsString + Swap(ent->nLen) > m_nSize)
+ if ( ofsString + Swap(ent->nLen) > m_data.GetDataLen())
{
return NULL;
}
- return (const char *)(m_pData + ofsString);
+ return StringData() + ofsString;
}
bool m_bSwapped; // wrong endianness?
wxMsgCatalogFile::wxMsgCatalogFile()
{
- m_pData = NULL;
- m_nSize = 0;
}
wxMsgCatalogFile::~wxMsgCatalogFile()
{
- delete [] m_pData;
}
// return the directories to search for message catalogs under the given
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;
+ const wxString pathPrefix = wxFileName(prefix, lang).GetFullPath();
+
+ 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;
}
#ifdef __UNIX__
// LC_PATH is a standard env var containing the search path for the .mo
// files
- const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH"));
+ const char *pszLcPath = wxGetenv("LC_PATH");
if ( pszLcPath )
{
const wxString lcp = GetMsgCatalogSubdirs(pszLcPath, lang);
wxString wxp = wxGetInstallPrefix();
if ( !wxp.empty() )
{
- wxp = GetMsgCatalogSubdirs(wxp + _T("/share/locale"), lang);
+ wxp = GetMsgCatalogSubdirs(wxp + wxS("/share/locale"), lang);
if ( paths.Index(wxp) == wxNOT_FOUND )
paths.Add(wxp);
}
if ( encSys != wxFONTENCODING_SYSTEM )
{
wxString fullname(szDirPrefix);
- fullname << _T('.') << wxFontMapperBase::GetEncodingName(encSys);
+ fullname << wxS('.') << wxFontMapperBase::GetEncodingName(encSys);
searchPath << GetFullSearchPath(fullname) << wxPATH_SEP;
}
#endif // wxUSE_FONTMAP
searchPath += GetFullSearchPath(szDirPrefix);
- size_t sublocaleIndex = szDirPrefix.find(wxT('_'));
+ size_t sublocaleIndex = szDirPrefix.find(wxS('_'));
if ( sublocaleIndex != wxString::npos )
{
// also add just base locale name: for things like "fr_BE" (belgium
NoTransErr noTransErr;
wxLogVerbose(_("looking for catalog '%s' in path '%s'."),
szName, searchPath.c_str());
- wxLogTrace(TRACE_I18N, _T("Looking for \"%s.mo\" in \"%s\""),
+ wxLogTrace(TRACE_I18N, wxS("Looking for \"%s.mo\" in \"%s\""),
szName, searchPath.c_str());
wxFileName fn(szName);
- fn.SetExt(_T("mo"));
+ fn.SetExt(wxS("mo"));
+
wxString strFullName;
- if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) ) {
+#if wxUSE_FILESYSTEM
+ wxFileSystem fileSys;
+ if ( !fileSys.FindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+#else // !wxUSE_FILESYSTEM
+ if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+#endif // wxUSE_FILESYSTEM/!wxUSE_FILESYSTEM
+ {
wxLogVerbose(_("catalog file for domain '%s' not found."), szName);
- wxLogTrace(TRACE_I18N, _T("Catalog \"%s.mo\" not found"), szName);
+ wxLogTrace(TRACE_I18N, wxS("Catalog \"%s.mo\" not found"), szName);
return false;
}
- // open file
+ // open file and read its data
wxLogVerbose(_("using catalog '%s' from '%s'."), szName, strFullName.c_str());
- wxLogTrace(TRACE_I18N, _T("Using catalog \"%s\"."), strFullName.c_str());
+ wxLogTrace(TRACE_I18N, wxS("Using catalog \"%s\"."), strFullName.c_str());
+
+#if wxUSE_FILESYSTEM
+ wxFSFile * const fileMsg = fileSys.OpenFile(strFullName);
+ if ( !fileMsg )
+ return false;
+
+ wxInputStream *fileStream = fileMsg->GetStream();
+ m_data.SetDataLen(0);
+ static const size_t chunkSize = 4096;
+ while ( !fileStream->Eof() ) {
+ fileStream->Read(m_data.GetAppendBuf(chunkSize), chunkSize);
+ m_data.UngetAppendBuf(fileStream->LastRead());
+ }
+
+ delete fileMsg;
+#else // !wxUSE_FILESYSTEM
wxFile fileMsg(strFullName);
if ( !fileMsg.IsOpened() )
return false;
return false;
size_t nSize = wx_truncate_cast(size_t, lenFile);
- wxASSERT_MSG( nSize == lenFile + size_t(0), _T("message catalog bigger than 4GB?") );
+ wxASSERT_MSG( nSize == lenFile + size_t(0), wxS("message catalog bigger than 4GB?") );
// read the whole file in memory
- m_pData = new size_t8[nSize];
- if ( fileMsg.Read(m_pData, nSize) != lenFile ) {
- wxDELETEA(m_pData);
+ if ( fileMsg.Read(m_data.GetWriteBuf(nSize), nSize) != lenFile )
return false;
- }
+#endif // wxUSE_FILESYSTEM/!wxUSE_FILESYSTEM
+
// examine header
- bool bValid = nSize + (size_t)0 > sizeof(wxMsgCatalogHeader);
+ bool bValid = m_data.GetDataLen() > sizeof(wxMsgCatalogHeader);
- wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData;
+ const wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_data.GetData();
if ( bValid ) {
// we'll have to swap all the integers if it's true
m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
// it's either too short or has incorrect magic number
wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
- wxDELETEA(m_pData);
return false;
}
// initialize
m_numStrings = Swap(pHeader->numStrings);
- m_pOrigTable = (wxMsgTableEntry *)(m_pData +
+ m_pOrigTable = (wxMsgTableEntry *)(StringData() +
Swap(pHeader->ofsOrigTable));
- m_pTransTable = (wxMsgTableEntry *)(m_pData +
+ m_pTransTable = (wxMsgTableEntry *)(StringData() +
Swap(pHeader->ofsTransTable));
- m_nSize = (size_t32)nSize;
// now parse catalog's header and try to extract catalog charset and
// plural forms formula from it:
{
// Extract the charset:
wxString header = wxString::FromAscii(StringAtOfs(m_pTransTable, 0));
- int begin = header.Find(wxT("Content-Type: text/plain; charset="));
+ int begin = header.Find(wxS("Content-Type: text/plain; charset="));
if (begin != wxNOT_FOUND)
{
begin += 34; //strlen("Content-Type: text/plain; charset=")
if (end != size_t(-1))
{
m_charset.assign(header, begin, end - begin);
- if (m_charset == wxT("CHARSET"))
+ if (m_charset == wxS("CHARSET"))
{
// "CHARSET" is not valid charset, but lazy translator
m_charset.Clear();
// else: incorrectly filled Content-Type header
// Extract plural forms:
- begin = header.Find(wxT("Plural-Forms:"));
+ begin = header.Find(wxS("Plural-Forms:"));
if (begin != wxNOT_FOUND)
{
begin += 13;
#elif wxUSE_FONTMAP
wxASSERT_MSG( msgIdCharset.empty(),
- _T("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") );
+ wxS("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") );
wxEncodingConverter converter;
if ( convertEncoding )
bool bConvertEncoding)
{
wxASSERT_MSG( !m_initialized,
- _T("you can't call wxLocale::Init more than once") );
+ wxS("you can't call wxLocale::Init more than once") );
m_initialized = true;
m_strLocale = name;
szLocale = shortName;
wxCHECK_MSG( !szLocale.empty(), false,
- _T("no locale to set in wxLocale::Init()") );
+ wxS("no locale to set in wxLocale::Init()") );
}
#ifdef __WXWINCE__
bool bOk = true;
if ( bLoadDefault )
{
- bOk = AddCatalog(wxT("wxstd"));
+ bOk = AddCatalog(wxS("wxstd"));
// there may be a catalog with toolkit specific overrides, it is not
// an error if this does not exist
wxString port(wxPlatformInfo::Get().GetPortIdName());
if ( !port.empty() )
{
- AddCatalog(port.BeforeFirst(wxT('/')).MakeLower());
+ AddCatalog(port.BeforeFirst(wxS('/')).MakeLower());
}
}
}
{
wxString buf(lc);
wxString buf2;
- buf2 = buf + wxT(".UTF-8");
+ buf2 = buf + wxS(".UTF-8");
l = wxSetlocale(c, buf2);
if ( !l )
{
- buf2 = buf + wxT(".utf-8");
+ buf2 = buf + wxS(".utf-8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
- buf2 = buf + wxT(".UTF8");
+ buf2 = buf + wxS(".UTF8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
- buf2 = buf + wxT(".utf8");
+ buf2 = buf + wxS(".utf8");
l = wxSetlocale(c, buf2);
}
}
bool wxLocale::Init(int language, int flags)
{
+ bool ret = true;
+
int lang = language;
if (lang == wxLANGUAGE_DEFAULT)
{
// Unknown language:
if (info == NULL)
{
- wxLogError(wxT("Unknown language %i."), lang);
+ wxLogError(wxS("Unknown language %i."), lang);
return false;
}
wxFontMapperBase::GetAllEncodingNames(wxFONTENCODING_UTF8);
while ( *names )
{
- retloc = wxSetlocale(LC_ALL, locale + _T('.') + *names++);
+ retloc = wxSetlocale(LC_ALL, locale + wxS('.') + *names++);
if ( retloc )
break;
}
// Some C libraries (namely glibc) still use old ISO 639,
// so will translate the abbrev for them
wxString localeAlt;
- if ( langOnly == wxT("he") )
- localeAlt = wxT("iw") + locale.Mid(3);
- else if ( langOnly == wxT("id") )
- localeAlt = wxT("in") + locale.Mid(3);
- else if ( langOnly == wxT("yi") )
- localeAlt = wxT("ji") + locale.Mid(3);
- else if ( langOnly == wxT("nb") )
- localeAlt = wxT("no_NO");
- else if ( langOnly == wxT("nn") )
- localeAlt = wxT("no_NY");
+ if ( langOnly == wxS("he") )
+ localeAlt = wxS("iw") + locale.Mid(3);
+ else if ( langOnly == wxS("id") )
+ localeAlt = wxS("in") + locale.Mid(3);
+ else if ( langOnly == wxS("yi") )
+ localeAlt = wxS("ji") + locale.Mid(3);
+ else if ( langOnly == wxS("nb") )
+ localeAlt = wxS("no_NO");
+ else if ( langOnly == wxS("nn") )
+ localeAlt = wxS("no_NY");
if ( !localeAlt.empty() )
{
}
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
{
if (info->WinLang == 0)
{
- wxLogWarning(wxT("Locale '%s' not supported by OS."), name.c_str());
+ wxLogWarning(wxS("Locale '%s' not supported by OS."), name.c_str());
// retloc already set to "C"
}
else
// because SetThreadLocale does not modify change the
// interpretation of setlocale(LC_ALL, "") call:
wxChar buffer[256];
- buffer[0] = wxT('\0');
+ buffer[0] = wxS('\0');
GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
locale << buffer;
if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
- locale << wxT("_") << buffer;
+ locale << wxS("_") << buffer;
if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buffer, 256) > 0)
{
codepage = wxAtoi(buffer);
if (codepage != 0)
- locale << wxT(".") << buffer;
+ locale << wxS(".") << buffer;
}
if (locale.empty())
{
- wxLogLastError(wxT("SetThreadLocale"));
- wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
- return false;
+ wxLogLastError(wxS("SetThreadLocale"));
+ ret = false;
}
else
{
wxChar buffer[16];
if (GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 &&
- wxStrcmp(buffer, wxT("0")) == 0)
+ wxStrcmp(buffer, wxS("0")) == 0)
{
retloc = "C";
}
}
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;
size_t i = 0,
count = ms_languagesDB->GetCount();
-#if defined(__UNIX__) && !defined(__WXMAC__)
+#if defined(__UNIX__)
// first get the string identifying the language from the environment
wxString langFull;
- if (!wxGetEnv(wxT("LC_ALL"), &langFull) &&
- !wxGetEnv(wxT("LC_MESSAGES"), &langFull) &&
- !wxGetEnv(wxT("LANG"), &langFull))
+#ifdef __WXMAC__
+ wxCFRef<CFLocaleRef> userLocaleRef(CFLocaleCopyCurrent());
+
+ // because the locale identifier (kCFLocaleIdentifier) is formatted a little bit differently, eg
+ // az_Cyrl_AZ@calendar=buddhist;currency=JPY we just recreate the base info as expected by wx here
+
+ wxCFStringRef str(wxCFRetain((CFStringRef)CFLocaleGetValue(userLocaleRef, kCFLocaleLanguageCode)));
+ langFull = str.AsString()+"_";
+ str.reset(wxCFRetain((CFStringRef)CFLocaleGetValue(userLocaleRef, kCFLocaleCountryCode)));
+ langFull += str.AsString();
+#else
+ if (!wxGetEnv(wxS("LC_ALL"), &langFull) &&
+ !wxGetEnv(wxS("LC_MESSAGES"), &langFull) &&
+ !wxGetEnv(wxS("LANG"), &langFull))
{
// no language specified, treat it as English
return wxLANGUAGE_ENGLISH_US;
}
- if ( langFull == _T("C") || langFull == _T("POSIX") )
+ if ( langFull == wxS("C") || langFull == wxS("POSIX") )
{
// default C locale is English too
return wxLANGUAGE_ENGLISH_US;
}
+#endif
// the language string has the following form
//
//
// we don't use the modifiers neither but we probably should translate
// "euro" into iso885915
- size_t posEndLang = langFull.find_first_of(_T("@."));
+ size_t posEndLang = langFull.find_first_of(wxS("@."));
if ( posEndLang != wxString::npos )
{
langFull.Truncate(posEndLang);
// do we have just the language (or sublang too)?
bool justLang = langFull.length() == LEN_LANG;
if ( justLang ||
- (langFull.length() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) )
+ (langFull.length() == LEN_FULL && langFull[LEN_LANG] == wxS('_')) )
{
// 0. Make sure the lang is according to latest ISO 639
// (this is necessary because glibc uses iw and in instead
wxString langOrig = ExtractLang(langFull);
wxString lang;
- if ( langOrig == wxT("iw"))
- lang = _T("he");
- else if (langOrig == wxT("in"))
- lang = wxT("id");
- else if (langOrig == wxT("ji"))
- lang = wxT("yi");
- else if (langOrig == wxT("no_NO"))
- lang = wxT("nb_NO");
- else if (langOrig == wxT("no_NY"))
- lang = wxT("nn_NO");
- else if (langOrig == wxT("no"))
- lang = wxT("nb_NO");
+ if ( langOrig == wxS("iw"))
+ lang = wxS("he");
+ else if (langOrig == wxS("in"))
+ lang = wxS("id");
+ else if (langOrig == wxS("ji"))
+ lang = wxS("yi");
+ else if (langOrig == wxS("no_NO"))
+ lang = wxS("nb_NO");
+ else if (langOrig == wxS("no_NY"))
+ lang = wxS("nn_NO");
+ else if (langOrig == wxS("no"))
+ lang = wxS("nb_NO");
else
lang = langOrig;
}
}
}
-#elif defined(__WXMAC__)
- const wxChar * lc = NULL ;
- long lang = GetScriptVariable( smSystemScript, smScriptLang) ;
- switch( GetScriptManagerVariable( smRegionCode ) ) {
- case verUS :
- lc = wxT("en_US") ;
- break ;
- case verFrance :
- lc = wxT("fr_FR") ;
- break ;
- case verBritain :
- lc = wxT("en_GB") ;
- break ;
- case verGermany :
- lc = wxT("de_DE") ;
- break ;
- case verItaly :
- lc = wxT("it_IT") ;
- break ;
- case verNetherlands :
- lc = wxT("nl_NL") ;
- break ;
- case verFlemish :
- lc = wxT("nl_BE") ;
- break ;
- case verSweden :
- lc = wxT("sv_SE" );
- break ;
- case verSpain :
- lc = wxT("es_ES" );
- break ;
- case verDenmark :
- lc = wxT("da_DK") ;
- break ;
- case verPortugal :
- lc = wxT("pt_PT") ;
- break ;
- case verFrCanada:
- lc = wxT("fr_CA") ;
- break ;
- case verNorway:
- lc = wxT("nb_NO") ;
- break ;
- case verIsrael:
- lc = wxT("iw_IL") ;
- break ;
- case verJapan:
- lc = wxT("ja_JP") ;
- break ;
- case verAustralia:
- lc = wxT("en_AU") ;
- break ;
- case verArabic:
- lc = wxT("ar") ;
- break ;
- case verFinland:
- lc = wxT("fi_FI") ;
- break ;
- case verFrSwiss:
- lc = wxT("fr_CH") ;
- break ;
- case verGrSwiss:
- lc = wxT("de_CH") ;
- break ;
- case verGreece:
- lc = wxT("el_GR") ;
- break ;
- case verIceland:
- lc = wxT("is_IS") ;
- break ;
- case verMalta:
- lc = wxT("mt_MT") ;
- break ;
- case verCyprus:
- // _CY is not part of wx, so we have to translate according to the system language
- if ( lang == langGreek ) {
- lc = wxT("el_GR") ;
- }
- else if ( lang == langTurkish ) {
- lc = wxT("tr_TR") ;
- }
- break ;
- case verTurkey:
- lc = wxT("tr_TR") ;
- break ;
- case verYugoCroatian:
- lc = wxT("hr_HR") ;
- break ;
- case verIndiaHindi:
- lc = wxT("hi_IN") ;
- break ;
- case verPakistanUrdu:
- lc = wxT("ur_PK") ;
- break ;
- case verTurkishModified:
- lc = wxT("tr_TR") ;
- break ;
- case verItalianSwiss:
- lc = wxT("it_CH") ;
- break ;
- case verInternational:
- lc = wxT("en") ;
- break ;
- case verRomania:
- lc = wxT("ro_RO") ;
- break ;
- case verGreecePoly:
- lc = wxT("el_GR") ;
- break ;
- case verLithuania:
- lc = wxT("lt_LT") ;
- break ;
- case verPoland:
- lc = wxT("pl_PL") ;
- break ;
- case verMagyar :
- case verHungary:
- lc = wxT("hu_HU") ;
- break ;
- case verEstonia:
- lc = wxT("et_EE") ;
- break ;
- case verLatvia:
- lc = wxT("lv_LV") ;
- break ;
- case verSami:
- // not known
- break ;
- case verFaroeIsl:
- lc = wxT("fo_FO") ;
- break ;
- case verIran:
- lc = wxT("fa_IR") ;
- break ;
- case verRussia:
- lc = wxT("ru_RU") ;
- break ;
- case verIreland:
- lc = wxT("ga_IE") ;
- break ;
- case verKorea:
- lc = wxT("ko_KR") ;
- break ;
- case verChina:
- lc = wxT("zh_CN") ;
- break ;
- case verTaiwan:
- lc = wxT("zh_TW") ;
- break ;
- case verThailand:
- lc = wxT("th_TH") ;
- break ;
- case verCzech:
- lc = wxT("cs_CZ") ;
- break ;
- case verSlovak:
- lc = wxT("sk_SK") ;
- break ;
- case verBengali:
- lc = wxT("bn") ;
- break ;
- case verByeloRussian:
- lc = wxT("be_BY") ;
- break ;
- case verUkraine:
- lc = wxT("uk_UA") ;
- break ;
- case verGreeceAlt:
- lc = wxT("el_GR") ;
- break ;
- case verSerbian:
- lc = wxT("sr_YU") ;
- break ;
- case verSlovenian:
- lc = wxT("sl_SI") ;
- break ;
- case verMacedonian:
- lc = wxT("mk_MK") ;
- break ;
- case verCroatia:
- lc = wxT("hr_HR") ;
- break ;
- case verBrazil:
- lc = wxT("pt_BR ") ;
- break ;
- case verBulgaria:
- lc = wxT("bg_BG") ;
- break ;
- case verCatalonia:
- lc = wxT("ca_ES") ;
- break ;
- case verScottishGaelic:
- lc = wxT("gd") ;
- break ;
- case verManxGaelic:
- lc = wxT("gv") ;
- break ;
- case verBreton:
- lc = wxT("br") ;
- break ;
- case verNunavut:
- lc = wxT("iu_CA") ;
- break ;
- case verWelsh:
- lc = wxT("cy") ;
- break ;
- case verIrishGaelicScript:
- lc = wxT("ga_IE") ;
- break ;
- case verEngCanada:
- lc = wxT("en_CA") ;
- break ;
- case verBhutan:
- lc = wxT("dz_BT") ;
- break ;
- case verArmenian:
- lc = wxT("hy_AM") ;
- break ;
- case verGeorgian:
- lc = wxT("ka_GE") ;
- break ;
- case verSpLatinAmerica:
- lc = wxT("es_AR") ;
- break ;
- case verTonga:
- lc = wxT("to_TO" );
- break ;
- case verFrenchUniversal:
- lc = wxT("fr_FR") ;
- break ;
- case verAustria:
- lc = wxT("de_AT") ;
- break ;
- case verGujarati:
- lc = wxT("gu_IN") ;
- break ;
- case verPunjabi:
- lc = wxT("pa") ;
- break ;
- case verIndiaUrdu:
- lc = wxT("ur_IN") ;
- break ;
- case verVietnam:
- lc = wxT("vi_VN") ;
- break ;
- case verFrBelgium:
- lc = wxT("fr_BE") ;
- break ;
- case verUzbek:
- lc = wxT("uz_UZ") ;
- break ;
- case verSingapore:
- lc = wxT("zh_SG") ;
- break ;
- case verNynorsk:
- lc = wxT("nn_NO") ;
- break ;
- case verAfrikaans:
- lc = wxT("af_ZA") ;
- break ;
- case verEsperanto:
- lc = wxT("eo") ;
- break ;
- case verMarathi:
- lc = wxT("mr_IN") ;
- break ;
- case verTibetan:
- lc = wxT("bo") ;
- break ;
- case verNepal:
- lc = wxT("ne_NP") ;
- break ;
- case verGreenland:
- lc = wxT("kl_GL") ;
- break ;
- default :
- break ;
- }
- for ( i = 0; i < count; i++ )
- {
- if ( ms_languagesDB->Item(i).CanonicalName == lc )
- {
- break;
- }
- }
-
#elif defined(__WIN32__)
LCID lcid = GetUserDefaultLCID();
if ( lcid != 0 )
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
// FIXME: what is the error return value for GetACP()?
UINT codepage = ::GetACP();
- encname.Printf(_T("windows-%u"), codepage);
+ encname.Printf(wxS("windows-%u"), codepage);
#elif defined(__WXMAC__)
// default is just empty string, this resolves to the default system
// encoding later
}
#elif defined(__WXMAC__)
TextEncoding encoding = 0 ;
-#if TARGET_CARBON
encoding = CFStringGetSystemEncoding() ;
-#else
- UpgradeScriptInfoToTextEncoding ( smSystemScript , kTextLanguageDontCare , kTextRegionDontCare , NULL , &encoding ) ;
-#endif
return wxMacGetFontEncFromSystemEnc( encoding ) ;
#elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP
const wxString encname = GetSystemEncodingName();
break;
}
- if ( wxStricmp(locale, info->CanonicalName.BeforeFirst(_T('_'))) == 0 )
+ if ( wxStricmp(locale, info->CanonicalName.BeforeFirst(wxS('_'))) == 0 )
{
// a match -- but maybe we'll find an exact one later, so continue
// looking
NoTransErr noTransErr;
wxLogTrace(TRACE_I18N,
- _T("string \"%s\"[%ld] not found in %slocale '%s'."),
+ wxS("string \"%s\"[%ld] not found in %slocale '%s'."),
origString, (long)n,
- domain.empty()
- ? (const wxChar*)wxString::Format(_T("domain '%s' "), domain).c_str()
- : _T(""),
+ wxString::Format(wxS("domain '%s' "), domain).c_str(),
m_strLocale.c_str());
}
#endif // __WXDEBUG__
// Every header is separated by \n
- size_t endLine = trans->find(wxT('\n'), found);
+ size_t endLine = trans->find(wxS('\n'), found);
size_t len = (endLine == wxString::npos) ?
wxString::npos : (endLine - found);
bool wxLocale::IsAvailable(int lang)
{
const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang);
- wxCHECK_MSG( info, false, _T("invalid language") );
+ wxCHECK_MSG( info, false, wxS("invalid language") );
#if defined(__WIN32__)
if ( !info->WinLang )
// accessors for locale-dependent data
// ----------------------------------------------------------------------------
-#ifdef __WXMSW__
+#if defined(__WXMSW__)
/* static */
wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
wxString str;
wxChar buffer[256];
size_t count;
- buffer[0] = wxT('\0');
+ buffer[0] = wxS('\0');
switch (index)
{
case wxLOCALE_DECIMAL_POINT:
count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 256);
if (!count)
- str << wxT(".");
+ str << wxS(".");
else
str << buffer;
break;
case wxSYS_LIST_SEPARATOR:
count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, buffer, 256);
if (!count)
- str << wxT(",");
+ str << wxS(",");
else
str << buffer;
break;
case wxSYS_LEADING_ZERO: // 0 means no leading zero, 1 means leading zero
count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILZERO, buffer, 256);
if (!count)
- str << wxT("0");
+ str << wxS("0");
else
str << buffer;
break;
#endif
default:
- wxFAIL_MSG(wxT("Unknown System String !"));
+ wxFAIL_MSG(wxS("Unknown System String !"));
}
return str;
}
-#else // !__WXMSW__
+#elif defined(__DARWIN__)
+
+/* static */
+wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
+{
+ wxCFRef<CFLocaleRef> userLocaleRef(CFLocaleCopyCurrent());
+ CFTypeRef cfstr;
+ switch ( index )
+ {
+ case wxLOCALE_THOUSANDS_SEP:
+ cfstr = CFLocaleGetValue(userLocaleRef, kCFLocaleGroupingSeparator);
+ break;
+
+ case wxLOCALE_DECIMAL_POINT:
+ cfstr = CFLocaleGetValue(userLocaleRef, kCFLocaleDecimalSeparator);
+ break;
+
+ default:
+ wxFAIL_MSG( "Unknown locale info" );
+ }
+
+ wxCFStringRef
+ str(CFStringCreateCopy(NULL, static_cast<CFStringRef>(cfstr)));
+ return str.AsString();
+}
+
+#else // !__WXMSW__ && !__DARWIN__
/* static */
wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat)
}
}
-#endif // __WXMSW__/!__WXMSW__
+#endif // platform
// ----------------------------------------------------------------------------
// global functions and variables
#define LNG(wxlang, canonical, winlang, winsublang, layout, desc) \
info.Language = wxlang; \
- info.CanonicalName = wxT(canonical); \
+ info.CanonicalName = wxS(canonical); \
info.LayoutDirection = layout; \
- info.Description = wxT(desc); \
+ info.Description = wxS(desc); \
SETWINLANG(info, winlang, winsublang) \
AddLanguage(info);