From: Vadim Zeitlin Date: Sun, 10 Sep 2006 23:28:20 +0000 (+0000) Subject: added wxLocale::IsAvailable() (extended patch 1547191) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/cec5ffc46da1cf66cb3e61567006a8c0f4b84f81 added wxLocale::IsAvailable() (extended patch 1547191) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index c108d27e8e..d73fca8361 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -58,6 +58,7 @@ All: - Added wxDir::FindFirst() (Francesco Montorsi) - Added wxPlatformInfo class (Francesco Montorsi) +- Added wxLocale::IsAvailable() (Creighton) All (GUI): diff --git a/docs/latex/wx/locale.tex b/docs/latex/wx/locale.tex index a8d51c9378..66197b87e8 100644 --- a/docs/latex/wx/locale.tex +++ b/docs/latex/wx/locale.tex @@ -418,6 +418,24 @@ translate the messages using the message catalogs for this locale. Returns true on success or false if the given locale couldn't be set. +\membersection{wxLocale::IsAvailable}\label{wxlocaleisavailable} + +\func{static bool}{IsAvailable}{\param{int }{lang}} + +Check whether the operating system and/or C run time environment supports +this locale. For example in Windows 2000 and Windows XP, support for many +locales is not installed by default. Returns \true if the locale is +supported. + +The argument \arg{lang} is the wxLanguage identifier. To obtain this for a +given a two letter ISO language code, use +\helpref{FindLanguageInfo}{wxlocalefindlanguageinfo} to obtain its +wxLanguageInfo structure. See \helpref{AddLanguage}{wxlocaleaddlanguage} for +the wxLanguageInfo description. + +\newsince{2.7.1}. Currently only implemented under Windows. + + \membersection{wxLocale::IsLoaded}\label{wxlocaleisloaded} \constfunc{bool}{IsLoaded}{\param{const char* }{domain}} diff --git a/include/wx/intl.h b/include/wx/intl.h index e7dcff8a91..471d9ad9ba 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -466,6 +466,9 @@ public: bool AddCatalog(const wxChar *szDomain, wxLanguage msgIdLanguage, const wxChar *msgIdCharset); + // check if the given locale is provided by OS and C run time + static bool IsAvailable(int lang); + // check if the given catalog is loaded bool IsLoaded(const wxChar *szDomain) const; diff --git a/samples/internat/internat.cpp b/samples/internat/internat.cpp index 4bde4cdea4..7f7b8b9cb2 100644 --- a/samples/internat/internat.cpp +++ b/samples/internat/internat.cpp @@ -57,8 +57,10 @@ public: MyFrame(wxLocale& m_locale); public: - void OnQuit(wxCommandEvent& event); + void OnTestLocaleAvail(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); + void OnQuit(wxCommandEvent& event); + void OnPlay(wxCommandEvent& event); void OnOpen(wxCommandEvent& event); void OnTest1(wxCommandEvent& event); @@ -77,8 +79,8 @@ public: // ID for the menu commands enum { - INTERNAT_TEXT = wxID_HIGHEST + 1, - INTERNAT_TEST, + INTERNAT_TEST = wxID_HIGHEST + 1, + INTERNAT_PLAY, INTERNAT_TEST_1, INTERNAT_TEST_2, INTERNAT_TEST_3 @@ -140,9 +142,11 @@ wxCOMPILE_TIME_ASSERT( WXSIZEOF(langNames) == WXSIZEOF(langIds), // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(wxID_EXIT, MyFrame::OnQuit) + EVT_MENU(INTERNAT_TEST, MyFrame::OnTestLocaleAvail) EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) - EVT_MENU(INTERNAT_TEST, MyFrame::OnPlay) + EVT_MENU(wxID_EXIT, MyFrame::OnQuit) + + EVT_MENU(INTERNAT_PLAY, MyFrame::OnPlay) EVT_MENU(wxID_OPEN, MyFrame::OnOpen) EVT_MENU(INTERNAT_TEST_1, MyFrame::OnTest1) EVT_MENU(INTERNAT_TEST_2, MyFrame::OnTest2) @@ -221,13 +225,15 @@ bool MyApp::OnInit() // Make a menubar wxMenu *file_menu = new wxMenu; + file_menu->Append(INTERNAT_TEST, _("&Test locale availability...\tCtrl-T")); + file_menu->AppendSeparator(); file_menu->Append(wxID_ABOUT, _("&About...")); file_menu->AppendSeparator(); file_menu->Append(wxID_EXIT, _("E&xit")); wxMenu *test_menu = new wxMenu; test_menu->Append(wxID_OPEN, _("&Open bogus file")); - test_menu->Append(INTERNAT_TEST, _("&Play a game")); + test_menu->Append(INTERNAT_PLAY, _("&Play a game")); test_menu->AppendSeparator(); test_menu->Append(INTERNAT_TEST_1, _("&1 _() (gettext)")); test_menu->Append(INTERNAT_TEST_2, _("&2 _N() (ngettext)")); @@ -339,7 +345,34 @@ void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) wxMessageBox(str, _("Result"), wxOK | wxICON_INFORMATION); } -void MyFrame::OnOpen(wxCommandEvent&) +void MyFrame::OnTestLocaleAvail(wxCommandEvent& WXUNUSED(event)) +{ + static wxString s_locale; + wxString locale = wxGetTextFromUser + ( + _("Enter the locale to test"), + wxGetTextFromUserPromptStr, + s_locale, + this + ); + if ( locale.empty() ) + return; + + s_locale = locale; + const wxLanguageInfo * const info = wxLocale::FindLanguageInfo(s_locale); + if ( !info ) + { + wxLogError(_("Locale \"%s\" is unknown."), s_locale.c_str()); + return; + } + + if ( wxLocale::IsAvailable(info->Language) ) + wxLogMessage(_("Locale \"%s\" is available."), s_locale.c_str()); + else + wxLogWarning(_("Locale \"%s\" is not available."), s_locale.c_str()); +} + +void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) { // open a bogus file -- the error message should be also translated if // you've got wxstd.mo somewhere in the search path diff --git a/src/common/intl.cpp b/src/common/intl.cpp index ccc1418e29..4915e52efe 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -2711,6 +2711,31 @@ wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const return NULL; } +// check if the given locale is provided by OS and C run time +/* static */ +bool wxLocale::IsAvailable(int lang) +{ + const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang); + wxCHECK_MSG( info, false, _T("invalid language") ); + +#ifdef __WIN32__ + if ( !info->WinLang ) + return false; + + if ( !::IsValidLocale + ( + MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), + SORT_DEFAULT), + LCID_INSTALLED + ) ) + return false; +#else // !__WIN32__ + // TODO: test if setlocale(info->CanonicalName) works under other OS? +#endif // __WIN32__/!__WIN32__ + + return true; +} + // check if the given catalog is loaded bool wxLocale::IsLoaded(const wxChar *szDomain) const {