原创 wxWidgets国际化语言支持-例子

2009-8-26 15:07 4351 7 8 分类: MCU/ 嵌入式
August 15

wxWidgets国际化语言支持-例子














myapp.h



#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了.




myapp.cpp



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文件.




myframe.h



#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();
};




myframe.cpp



#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


参考下面的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>&amp;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>&amp;Help</label>
<object class="wxMenuItem" name="menu_about">
<label>&amp;About</label>
</object>
</object>
</object>
<object class="wxFrame" name="main_frame">
<title>Test1</title>
<centered>1</centered>
</object>
</resource>

显示效果

  • 中文

    chinese_sample_bmp

  • 英文

    english_sample_bmp



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户428220 2012-10-5 17:17

老提示找不到Mesa.dll文件。

用户377235 2012-6-16 11:11

dcc

用户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

晕,8M多?stm32boot只有11K。。。试试先

雁塔菜农 2008-7-25 18:44

哈哈~~~终于逼出来了~~~~

用户1292686 2008-7-25 16:46

看官下载同时别忘支持下俺的小网站,给帮忙点击几下哈: http://www.hotpage.net.cn/
相关推荐阅读
用户71670 2010-01-20 16:38
GUN make 语法
译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix(当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的...
用户71670 2009-12-29 10:24
latch与dff区别
6 标签: 无标签 ...
用户71670 2009-12-08 15:09
wxWidgets编译多种库(转载)
这几天研究了一下如何在Debian Lenny下编译wxWidgets,实现多个库共存。有点入门,写出来与感兴趣的朋友一起研究。这里编译的是wxGTK 2.8.7版本,解压后,进入解压的目录,建立4个...
用户71670 2009-10-29 09:10
字符串转化为数字
6.1.2  字符串转化为数字面试例题3:使用库函数将字符串转换为数字。考点:C库函数中字符串转换为数字的使用。出现频率:★★★★解析与上节数字转换为字符串类似,C/C++语言提供了几个标准库函数,可...
用户71670 2009-09-27 16:23
ucf文件约束法
1.约束文件的概念 FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关...
用户71670 2009-09-06 10:12
#pragma使用详解
在所有的预处理指令中,#Pragma>指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条