added wxLocale::IsAvailable() (extended patch 1547191)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-09-10 23:28:20 +00:00
parent 6ea0cc70f7
commit cec5ffc46d
5 changed files with 87 additions and 7 deletions

View File

@@ -58,6 +58,7 @@ All:
- Added wxDir::FindFirst() (Francesco Montorsi)
- Added wxPlatformInfo class (Francesco Montorsi)
- Added wxLocale::IsAvailable() (Creighton)
All (GUI):

View File

@@ -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}}

View File

@@ -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;

View File

@@ -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

View File

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