ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 16.6 一个小例子 为了演示本章介绍的这些内容,随书光盘上examples/chap16目录中举了一个小例子.它以三种语言显示了一些字符串和图片:英语,法语和德语. 你可以从文件菜单更改当前的语言,这将导致菜单字符串,静态文本控件和使用的图片作出相应的改变.为了演示_()宏和wxT()的区别,状态栏的字符串始 终保持英语不变. ![](img/mht6FD4%281%29.tmp) 这个例子的应用程序类包含一个指向wxLocale类型的指针和一个函数SelectLanguage用来更改当前的语言.主要的声明和实现如下: ``` class MyApp : public wxApp { public: ~MyApp() ; // 初始化应用程序 virtual bool OnInit(); // 根据用户选择的语言重新创建wxLocale变量 void SelectLanguage(int lang); private: wxLocale* m_locale; // 'our' locale }; IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { wxImage::AddHandler( new wxPNGHandler ); m_locale = NULL; SelectLanguage( wxLANGUAGE_DEFAULT ); MyFrame *frame = new MyFrame(_("i18n wxWidgets App")); frame->Show(true); return true; } void MyApp::SelectLanguage(int lang) { delete m_locale; m_locale = new wxLocale( lang ); m_locale->AddCatalog( wxT("i18n") ); } MyApp::~MyApp() { delete m_locale; } ``` 主窗口的两个函数SetupStrings和OnChangeLanguage可能是你最感兴趣的部分,SetupStrings更改相关控件的字符串并且重新创建菜单条,以便演示更改wxLocale以后相关字符串的翻译: ``` void MyFrame::SetupStrings() { m_helloString->SetLabel(_("Welcome to International Sample")); m_todayString->SetLabel( wxString::Format(_("Now is %s") , wxDateTime::Now().Format() .c_str() ) ); m_thousandString->SetLabel( wxString::Format(_("12345 divided by 10 is written as % .1f") , 1234.5 ) ); m_flag->SetBitmap(wxBitmap( _("flag.png") , wxBITMAP_TYPE_PNG )); // 创建菜单条 wxMenu *menuFile = new wxMenu; // About菜单应该位于帮助菜单 wxMenu *helpMenu = new wxMenu; helpMenu->Append(wxID_ABOUT, _("&About...\tF1"), wxT("Show about dialog")); menuFile->Append(wxID_NEW, _("Change language..."), wxT("Select a new language")); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT, _("E&xit\tAlt-X"), wxT("Quit this program")); wxMenuBar *menuBar = new wxMenuBar(); menuBar->Append(menuFile, _("&File")); menuBar->Append(helpMenu, _("&Help")); wxMenuBar* formerMenuBar = GetMenuBar(); SetMenuBar(menuBar); delete formerMenuBar; SetStatusText(_("Welcome to wxWidgets!")); } ``` OnChangeLanguage在用户更改当前语言的时候被调用,它将用户的选择映射到某种语言标识(比如 wxLANGUAGE_GERMAN)上.这个标识被传递给MyApp::SelectLanguage以便设置当前的locale,然后调用 SetupStrings根据设置的locale更改当前的字符串和图片,如下所示: ``` void MyFrame::OnChangeLanguage(wxCommandEvent& event) { wxArrayInt languageCodes; wxArrayString languageNames; languageCodes.Add(wxLANGUAGE_GERMAN); languageNames.Add(_("German")); languageCodes.Add(wxLANGUAGE_FRENCH); languageNames.Add(_("French")); languageCodes.Add(wxLANGUAGE_ENGLISH); languageNames.Add(_("English")); int lang = wxGetSingleChoiceIndex( _("Select language:"), _("Language"), languageNames ); if ( lang != -1 ) { wxGetApp().SelectLanguage(languageCodes[lang]); SetupStrings(); } } ```