#include <wx/wx.h>
#include <wx/intl.h>
class MyApp : public wxApp
{
public:
~MyApp();
virtual bool OnInit();
void SelectLanguage(int lang);
private:
wxLocale* locale;
};
DECLARE_APP(MyApp)
- 说明
- 包含一个wxLocale的成员,用于设置语言.
SelectLanguage作为设置语言的接口.
一般情况下wxGetApp返回wxApp对象,使用中经常要强制转换为MyApp.使用DECLARE_APP就可以方便使用wxGetApp直接获取MyApp了.
bool MyApp::OnInit()
{
locale = NULL;
SelectLanguage(wxLANGUAGE_CHINESE_SIMPLIFIED);
wxXmlResource::Get()->InitAllHandlers();
if (!wxXmlResource::Get()->Load(wxT("test1.xrc")))
{
return false;
}
MyFrame* frame = new MyFrame();
SetTopWindow(frame);
frame->Show(true);
return true;
}
- 说明
- 初始化的时候先设置语言为简体中文.在通过wxXmlResource加载xrc文件.
通过xrc可以大量简化界面初始化相关的代码.推荐使用.void MyApp::SelectLanguage(int lang)
{
if (locale != NULL)
delete locale;
locale = new wxLocale(lang);
locale->AddCatalogLookupPathPrefix(wxT("locale"));
locale->AddCatalog(wxT("test1"));
}
- 说明
- 设置语言的时候,先把旧的wxLocale删除,在new一个新的.
设置应用程序目录下的locale目录统一放置翻译好的mo文件.并加载名为test1的mo文件.
#include <wx/frame.h>
class MyFrame : public wxFrame
{
public:
MyFrame();
private:
DECLARE_EVENT_TABLE()
void OnAbout(wxCommandEvent& event);
void OnSelectEnglish(wxCommandEvent& event);
void OnSelectChinese(wxCommandEvent& event);
void ResetMenuBar();
};
#include "myframe.h"
#include "myapp.h"
#include <wx/app.h>
#include <wx/xrc/xmlres.h>
#include <wx/msgdlg.h>
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(XRCID("menu_about"), MyFrame::OnAbout)
EVT_MENU(XRCID("menu_english"), MyFrame::OnSelectEnglish)
EVT_MENU(XRCID("menu_chinese"), MyFrame::OnSelectChinese)
END_EVENT_TABLE()
- 说明
- XRC中有一个MenuBar,有一个Language菜单,下面有一个两个菜单项:"English","Chinese".用于动态设置当前语言.
OnSelectEnglish在选择"English"时执行.OnSelectChinese在选择"Chinese"时执行.
OnAbout显示作者名.MyFrame::MyFrame()
{
wxXmlResource::Get()->LoadFrame(this, NULL, wxT("main_frame"));
ResetMenuBar();
}
- 说明
- 加载xrc中的"main_frame"界面后,重置MenuBar.
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox(_("about"));
}
- 说明
- 显示msgid为"about"的信息.由于是在代码中硬编码的,不在xrc中.需要手工在po文件添加一条信息,或者xrc和cpp文件个产生一个po,合并两个po.
void MyFrame::OnSelectChinese(wxCommandEvent& event)
{
wxGetApp().SelectLanguage(wxLANGUAGE_CHINESE_SIMPLIFIED);
ResetMenuBar();
}
- 说明
- 设置简体中文语言后,重新加载MenuBar.这样界面才能更新.
void MyFrame::OnSelectEnglish(wxCommandEvent& event)
{
wxGetApp().SelectLanguage(wxLANGUAGE_ENGLISH);
ResetMenuBar();
}
- 说明
- 设置英文语言后,重新加载MenuBar.这样界面才能更新.
void MyFrame::ResetMenuBar()
{
wxMenuBar* mainMenu = GetMenuBar();
SetMenuBar(wxXmlResource::Get()->LoadMenuBar(wxT("main_menu")));
if (mainMenu != NULL)
delete mainMenu;
}
- 说明
- 先获取现有的MenuBar,在通过wxXmlResource加载新的MenuBar后删除旧的MenuBar.
参考下面的test1.xrc.程序有设置主窗体的title.但是切换语言后,代码中并没有重新设置title,这样界面将不会自动更新title的:-)
可以看出来,其实动态切换界面的语言,实际就是重新加载每个涉及多语言的界面元素.这个就需要根据每个应用程序调整了.
如果仅仅是程序启动的时候静态加载,所有mo中的翻译信息都可以正常显示.
<?xml version="1.0" encoding="utf-8"?>
<resource>
<object class="wxMenuBar" name="main_menu">
<object class="wxMenu" name="menu_language">
<label>&Language</label>
<object class="wxMenuItem" name="menu_english">
<label>English</label>
</object>
<object class="wxMenuItem" name="menu_chinese">
<label>Chinese</label>
</object>
</object>
<object class="wxMenu" name="menu_help">
<label>&Help</label>
<object class="wxMenuItem" name="menu_about">
<label>&About</label>
</object>
</object>
</object>
<object class="wxFrame" name="main_frame">
<title>Test1</title>
<centered>1</centered>
</object>
</resource>
显示效果
中文
英文
用户428220 2012-10-5 17:17
用户377235 2012-6-16 11:11
用户377235 2012-4-5 23:44
用户377235 2012-2-21 10:29
1111111111111
用户560605 2011-12-30 12:52
用户401907 2011-12-20 10:49
无线风筝 2009-6-2 21:51
用户131114 2008-12-31 18:16
雁塔菜农 2008-7-25 18:44
用户1292686 2008-7-25 16:46