From cec5ffc46da1cf66cb3e61567006a8c0f4b84f81 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 10 Sep 2006 23:28:20 +0000
Subject: [PATCH] added wxLocale::IsAvailable() (extended patch 1547191)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt              |  1 +
 docs/latex/wx/locale.tex      | 18 ++++++++++++++
 include/wx/intl.h             |  3 +++
 samples/internat/internat.cpp | 47 +++++++++++++++++++++++++++++------
 src/common/intl.cpp           | 25 +++++++++++++++++++
 5 files changed, 87 insertions(+), 7 deletions(-)

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
 {
-- 
2.47.2