// International helper functions void SetGlobalLocale( void ) { #ifndef __WXMSW__ if(g_iLocaleDepth == 0) { g_ODlocale = new wxString(wxSetlocale(LC_NUMERIC, NULL)); #if wxCHECK_VERSION(3,0,0) wxSetlocale(LC_NUMERIC, ""); #else setlocale(LC_NUMERIC, ""); #endif } g_iLocaleDepth++; #endif }
/* static */ bool wxLocale::IsAvailable(int lang) { const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang); wxCHECK_MSG( info, false, wxS("invalid language") ); #if defined(__WIN32__) if ( !info->WinLang ) return false; if ( !::IsValidLocale(info->GetLCID(), LCID_INSTALLED) ) return false; #elif defined(__UNIX__) // Test if setting the locale works, then set it back. char * const oldLocale = wxStrdupA(setlocale(LC_ALL, NULL)); // Some platforms don't like xx_YY form and require xx only so test for // it too. const bool available = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName) || wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName)); // restore the original locale wxSetlocale(LC_ALL, oldLocale); free(oldLocale); if ( !available ) return false; #endif return true; }
void wxAppConsoleBase::SetCLocale() { // We want to use the user locale by default in GUI applications in order // to show the numbers, dates &c in the familiar format -- and also accept // this format on input (especially important for decimal comma/dot). wxSetlocale(LC_ALL, ""); }
bool gridmapSimulApp::OnInit() { // Starting in wxWidgets 2.9.0, we must reset numerics locale to "C", // if we want numbers to use "." in all countries. The App::OnInit() is a // perfect place to undo // the default wxWidgets settings. (JL @ Sep-2009) wxSetlocale(LC_NUMERIC, wxString(wxT("C"))); /* // Process cmd line arguments (for the case of opening a file): if (argc>1) global_fileToOpen = wxString(wxApp::argv[1]).mb_str(); */ //(*AppInitialize bool wxsOK = true; wxInitAllImageHandlers(); if (wxsOK) { gridmapSimulFrame* Frame = new gridmapSimulFrame(0); Frame->Show(); SetTopWindow(Frame); } //*) return wxsOK; }
bool wxLocale::DoInit(const wxString& name, const wxString& shortName, const wxString& locale) { wxASSERT_MSG( !m_initialized, wxS("you can't call wxLocale::Init more than once") ); m_initialized = true; m_strLocale = name; m_strShort = shortName; m_language = wxLANGUAGE_UNKNOWN; // change current locale (default: same as long name) wxString szLocale(locale); if ( szLocale.empty() ) { // the argument to setlocale() szLocale = shortName; wxCHECK_MSG( !szLocale.empty(), false, wxS("no locale to set in wxLocale::Init()") ); } const char *oldLocale = wxSetlocale(LC_ALL, szLocale); if ( oldLocale ) m_pszOldLocale = wxStrdup(oldLocale); else m_pszOldLocale = NULL; if ( m_pszOldLocale == NULL ) { wxLogError(_("locale '%s' cannot be set."), szLocale); } // the short name will be used to look for catalog files as well, // so we need something here if ( m_strShort.empty() ) { // FIXME I don't know how these 2 letter abbreviations are formed, // this wild guess is surely wrong if ( !szLocale.empty() ) { m_strShort += (wxChar)wxTolower(szLocale[0]); if ( szLocale.length() > 1 ) m_strShort += (wxChar)wxTolower(szLocale[1]); } } return true; }
static const char *wxSetlocaleTryUTF8(int c, const wxString& lc) { const char *l = NULL; // NB: We prefer to set UTF-8 locale if it's possible and only fall back to // non-UTF-8 locale if it fails if ( !lc.empty() ) { wxString buf(lc); wxString buf2; buf2 = buf + wxS(".UTF-8"); l = wxSetlocale(c, buf2); if ( !l ) { buf2 = buf + wxS(".utf-8"); l = wxSetlocale(c, buf2); } if ( !l ) { buf2 = buf + wxS(".UTF8"); l = wxSetlocale(c, buf2); } if ( !l ) { buf2 = buf + wxS(".utf8"); l = wxSetlocale(c, buf2); } } // if we can't set UTF-8 locale, try non-UTF-8 one: if ( !l ) l = wxSetlocale(c, lc); return l; }
void ResetGlobalLocale( void ) { #ifndef __WXMSW__ g_iLocaleDepth--; if(g_iLocaleDepth < 0) g_iLocaleDepth = 0; if(g_iLocaleDepth == 0 && g_ODlocale) { #if wxCHECK_VERSION(3,0,0) wxSetlocale(LC_NUMERIC, g_ODlocale->ToAscii()); #else setlocale(LC_NUMERIC, g_ODlocale->ToAscii()); #endif delete g_ODlocale; g_ODlocale = NULL; } #endif }
bool LocaleManager::SetLanguage(int languageWxWidgetsId_) { languageWxWidgetsId = languageWxWidgetsId_; if ( locale ) delete locale; locale = new wxLocale; locale->Init(languageWxWidgetsId); wxLogNull noLog; wxLocale::AddCatalogLookupPathPrefix(wxT(".")); wxLocale::AddCatalogLookupPathPrefix(wxT("..")); wxLocale::AddCatalogLookupPathPrefix(_T("locale")); locale->AddCatalog(_T("wxstd")); //wxWidgets specific translations locale->AddCatalog(_T("GD")); //Application translations wxSetlocale(LC_NUMERIC, "C"); // This sets the decimal point to be '.', whatever the language defined. return true; }
// clean up wxLocale::~wxLocale() { // Restore old translations object. // See DoCommonInit() for explanation of why this is needed for backward // compatibility. if ( wxTranslations::Get() == &m_translations ) { if ( m_pOldLocale ) wxTranslations::SetNonOwned(&m_pOldLocale->m_translations); else wxTranslations::Set(NULL); } // restore old locale pointer wxSetLocale(m_pOldLocale); wxSetlocale(LC_ALL, m_pszOldLocale); free(const_cast<char *>(m_pszOldLocale)); }
bool holonomic_navigator_demoApp::OnInit() { // Starting in wxWidgets 2.9.0, we must reset numerics locale to "C", // if we want numbers to use "." in all countries. The App::OnInit() is a perfect place to undo // the default wxWidgets settings. (JL @ Sep-2009) wxSetlocale(LC_NUMERIC,wxString(wxT("C"))); //(*AppInitialize bool wxsOK = true; wxInitAllImageHandlers(); if ( wxsOK ) { holonomic_navigator_demoFrame* Frame = new holonomic_navigator_demoFrame(0); Frame->Show(); SetTopWindow(Frame); } //*) return wxsOK; }
bool camera_calib_guiApp::OnInit() { // Starting in wxWidgets 2.9.0, we must reset numerics locale to "C", // if we want numbers to use "." in all countries. The App::OnInit() is a perfect place to undo // the default wxWidgets settings. (JL @ Sep-2009) wxSetlocale(LC_NUMERIC,wxString(wxT("C"))); //(*AppInitialize bool wxsOK = true; wxInitAllImageHandlers(); if ( wxsOK ) { camera_calib_guiDialog Dlg(0); SetTopWindow(&Dlg); Dlg.ShowModal(); wxsOK = false; } //*) return wxsOK; }
bool navlog_viewer_GUI_designApp::OnInit() { // Starting in wxWidgets 2.9.0, we must reset numerics locale to "C", // if we want numbers to use "." in all countries. The App::OnInit() is a perfect place to undo // the default wxWidgets settings. (JL @ Sep-2009) wxSetlocale(LC_NUMERIC,wxString(wxT("C"))); static const wxCmdLineEntryDesc cmdLineDesc[] = { #ifdef MRPT_OS_LINUX {wxCMD_LINE_OPTION, wxT_2("l"), wxT_2("load"), wxT_2("load a library"), wxCMD_LINE_VAL_STRING, 0}, #endif {wxCMD_LINE_PARAM, nullptr, nullptr, wxT_2("Input File"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL}, {wxCMD_LINE_NONE, nullptr, nullptr, nullptr, wxCMD_LINE_VAL_NONE, 0} }; wxCmdLineParser parser(cmdLineDesc, argc, argv); parser.Parse(true); #ifdef MRPT_OS_LINUX wxString libraryPath; if(parser.Found(wxT_2("l"), &libraryPath)) dlopen(libraryPath.mb_str(), RTLD_LAZY); #endif if(parser.GetParamCount() == 1) global_fileToOpen = parser.GetParam().mb_str(); //(*AppInitialize bool wxsOK = true; wxInitAllImageHandlers(); if ( wxsOK ) { navlog_viewer_GUI_designDialog* Frame = new navlog_viewer_GUI_designDialog (NULL); Frame->Show(); SetTopWindow(Frame); wxsOK = true; } //*) return wxsOK; }
void VsnprintfTestCase::setUp() { // this call is required to avoid check failures when running on machines // with a locale where the decimal point is not '.' wxSetlocale(LC_ALL, "C"); }
bool PhdApp::OnInit() { if (!wxApp::OnInit()) { return false; } m_instanceChecker = new wxSingleInstanceChecker(wxString::Format("%s.%ld", GetAppName(), m_instanceNumber)); if (m_instanceChecker->IsAnotherRunning()) { wxLogError(wxString::Format(_("PHD2 instance %ld is already running. Use the " "-i INSTANCE_NUM command-line option to start a different instance."), m_instanceNumber)); delete m_instanceChecker; // OnExit() won't be called if we return false m_instanceChecker = 0; return false; } #ifndef DEBUG #if (wxMAJOR_VERSION > 2 || wxMINOR_VERSION > 8) wxDisableAsserts(); #endif #endif SetVendorName(_T("StarkLabs")); // use SetAppName() to ensure the local data directory is found even if the name of the executable is changed #ifdef __APPLE__ SetAppName(_T("PHD2")); #else SetAppName(_T("phd2")); #endif pConfig = new PhdConfig(_T("PHDGuidingV2"), m_instanceNumber); Debug.Init("debug", true); Debug.AddLine(wxString::Format("PHD2 version %s begins execution with:", FULLVER)); Debug.AddLine(wxString::Format(" %s", wxVERSION_STRING)); float dummy; Debug.AddLine(wxString::Format(" cfitsio %.2lf", ffvers(&dummy))); #if defined(CV_VERSION) Debug.AddLine(wxString::Format(" opencv %s", CV_VERSION)); #endif #if defined(__WINDOWS__) HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); Debug.AddLine("CoInitializeEx returns %x", hr); #endif DisableOSXAppNap(); if (m_resetConfig) { pConfig->DeleteAll(); } wxString ldir = wxStandardPaths::Get().GetResourcesDir() + PATHSEPSTR "locale"; if (!wxDirExists(ldir)) { // for development environments ldir = _T("locale"); } bool ex = wxDirExists(ldir); Debug.AddLine(wxString::Format("Using Locale Dir %s exists=%d", ldir, ex)); wxLocale::AddCatalogLookupPathPrefix(ldir); m_localeDir = ldir; m_locale.Init(pConfig->Global.GetInt("/wxLanguage", wxLANGUAGE_DEFAULT)); if (!m_locale.AddCatalog(PHD_MESSAGES_CATALOG)) { Debug.AddLine("locale.AddCatalog failed"); } wxSetlocale(LC_NUMERIC, "C"); Debug.RemoveOldFiles(); GuideLog.RemoveOldFiles(); pConfig->InitializeProfile(); PhdController::OnAppInit(); wxImage::AddHandler(new wxJPEGHandler); wxImage::AddHandler(new wxPNGHandler); pFrame = new MyFrame(m_instanceNumber, &m_locale); pFrame->Show(true); if (pConfig->IsNewInstance() || (pConfig->NumProfiles() == 1 && pFrame->pGearDialog->IsEmptyProfile())) { pFrame->pGearDialog->ShowProfileWizard(); // First-light version of profile wizard } return true; }
void wxAppTraitsBase::SetLocale() { wxSetlocale(LC_ALL, ""); wxUpdateLocaleIsUtf8(); }
bool wxLocale::Init(int language, int flags) { #if WXWIN_COMPATIBILITY_2_8 wxASSERT_MSG( !(flags & wxLOCALE_CONV_ENCODING), wxS("wxLOCALE_CONV_ENCODING is no longer supported, add charset to your catalogs") ); #endif bool ret = true; int lang = language; if (lang == wxLANGUAGE_DEFAULT) { // auto detect the language lang = GetSystemLanguage(); } // We failed to detect system language, so we will use English: if (lang == wxLANGUAGE_UNKNOWN) { return false; } const wxLanguageInfo *info = GetLanguageInfo(lang); // Unknown language: if (info == NULL) { wxLogError(wxS("Unknown language %i."), lang); return false; } wxString name = info->Description; wxString canonical = info->CanonicalName; wxString locale; // Set the locale: #if defined(__OS2__) const char *retloc = wxSetlocale(LC_ALL , wxEmptyString); #elif defined(__UNIX__) && !defined(__WXMAC__) if (language != wxLANGUAGE_DEFAULT) locale = info->CanonicalName; const char *retloc = wxSetlocaleTryUTF8(LC_ALL, locale); const wxString langOnly = ExtractLang(locale); if ( !retloc ) { // Some C libraries don't like xx_YY form and require xx only retloc = wxSetlocaleTryUTF8(LC_ALL, langOnly); } #if wxUSE_FONTMAP // some systems (e.g. FreeBSD and HP-UX) don't have xx_YY aliases but // require the full xx_YY.encoding form, so try using UTF-8 because this is // the only thing we can do generically // // TODO: add encodings applicable to each language to the lang DB and try // them all in turn here if ( !retloc ) { const wxChar **names = wxFontMapperBase::GetAllEncodingNames(wxFONTENCODING_UTF8); while ( *names ) { retloc = wxSetlocale(LC_ALL, locale + wxS('.') + *names++); if ( retloc ) break; } } #endif // wxUSE_FONTMAP if ( !retloc ) { // Some C libraries (namely glibc) still use old ISO 639, // so will translate the abbrev for them wxString localeAlt; if ( langOnly == wxS("he") ) localeAlt = wxS("iw") + ExtractNotLang(locale); else if ( langOnly == wxS("id") ) localeAlt = wxS("in") + ExtractNotLang(locale); else if ( langOnly == wxS("yi") ) localeAlt = wxS("ji") + ExtractNotLang(locale); else if ( langOnly == wxS("nb") ) localeAlt = wxS("no_NO"); else if ( langOnly == wxS("nn") ) localeAlt = wxS("no_NY"); if ( !localeAlt.empty() ) { retloc = wxSetlocaleTryUTF8(LC_ALL, localeAlt); if ( !retloc ) retloc = wxSetlocaleTryUTF8(LC_ALL, ExtractLang(localeAlt)); } } if ( !retloc ) ret = false; #ifdef __AIX__ // at least in AIX 5.2 libc is buggy and the string returned from // setlocale(LC_ALL) can't be passed back to it because it returns 6 // strings (one for each locale category), i.e. for C locale we get back // "C C C C C C" // // this contradicts IBM own docs but this is not of much help, so just work // around it in the crudest possible manner char* p = const_cast<char*>(wxStrchr(retloc, ' ')); if ( p ) *p = '\0'; #endif // __AIX__ #elif defined(__WIN32__) const char *retloc = "C"; if ( language != wxLANGUAGE_DEFAULT ) { if ( info->WinLang == 0 ) { wxLogWarning(wxS("Locale '%s' not supported by OS."), name.c_str()); // retloc already set to "C" } else // language supported by Windows { // Windows CE doesn't have SetThreadLocale() and there doesn't seem // to be any equivalent #ifndef __WXWINCE__ const wxUint32 lcid = info->GetLCID(); // change locale used by Windows functions ::SetThreadLocale(lcid); #endif // and also call setlocale() to change locale used by the CRT locale = info->GetLocaleName(); if ( locale.empty() ) { ret = false; } else // have a valid locale { retloc = wxSetlocale(LC_ALL, locale); } } } else // language == wxLANGUAGE_DEFAULT { retloc = wxSetlocale(LC_ALL, wxEmptyString); } #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__)) // VC++ setlocale() (also used by Mingw) can't set locale to languages that // can only be written using Unicode, therefore wxSetlocale() call fails // for such languages but we don't want to report it as an error -- so that // at least message catalogs can be used. if ( !retloc ) { if ( wxGetANSICodePageForLocale(LOCALE_USER_DEFAULT).empty() ) { // we set the locale to a Unicode-only language, don't treat the // inability of CRT to use it as an error retloc = "C"; } } #endif // CRT not handling Unicode-only languages if ( !retloc ) ret = false; #elif defined(__WXMAC__) if (lang == wxLANGUAGE_DEFAULT) locale = wxEmptyString; else locale = info->CanonicalName; const char *retloc = wxSetlocale(LC_ALL, locale); if ( !retloc ) { // Some C libraries don't like xx_YY form and require xx only retloc = wxSetlocale(LC_ALL, ExtractLang(locale)); } #else wxUnusedVar(flags); return false; #define WX_NO_LOCALE_SUPPORT #endif #ifndef WX_NO_LOCALE_SUPPORT 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 ( !DoInit(name, canonical, retloc) ) { ret = false; } if (IsOk()) // setlocale() succeeded m_language = lang; // NB: don't use 'lang' here, 'language' wxTranslations *t = wxTranslations::Get(); if ( t ) { t->SetLanguage(static_cast<wxLanguage>(language)); if ( flags & wxLOCALE_LOAD_DEFAULT ) t->AddStdCatalog(); } return ret; #endif // !WX_NO_LOCALE_SUPPORT }
wxString wxLocale::GetSysName() const { return wxSetlocale(LC_ALL, NULL); }