CodeLite to CodeInsight task 1: Internationalization
在Codelite BBS上可以看到短时间内他们没有支持多语言的计划,所以只能自己动手啦。
第一步想支持中文的话,需要做3件事:
1)将所有需要支持翻译的字符串(包括在菜单、messagebox等等中的)从现有的wxT()替换成_();
2) 在程序初始化时支持读入和解析;
3)提供附加配置项以供用户选择。
下面是一篇网上转载的关于利用wxwidgets实现国际化支持的技术文章以供参考。
以下为转载原文及链接:
前段时间在为multiget做开发时,发现mulitiget采用的国际化模式不同于标准的GNU gettext翻译模式。因此想要将其进行移植,使得multiget支持GNU gettext翻译模式。
通过阅读wxWidgets开发文档,大概得知wxWidgets下的国际化支持实现方法:
1、首先,国际化支持的头文件均在wx/intl.h中,所以必须#include <wx/intl.h>
2、wxWidgets的国际化例程在wxWidgets源代码目录下samples/internat目录下,可以通过阅读相关代码进一步了解国际化的机制。
3、国际化的工作均被封装了wxLocale对象中,因此必须在wxApp对象中声明一个wxLocale对象,一般而言都是作为wxApp对象的私有对象或者受保护对象而存在。
4、窗口对象主窗口,也需要申明一个wxLocale对象,但是这个对象仅仅是wxApp的wxLocale对象的引用而已。一般而言一个应用程序仅仅需要一个wxLocale对象即可。因此需要在创建创窗口之前先把wxLocale对象创建好,然后再创建主窗口的时候将wxLocale对象传递过去。因此一般而言主窗口对象的某一个构造函数就是这样写的:
class MainFrame::wxFrame
{
…
MainFrame(const wxString& title, wxLocale& locale);
…
private:
wxLocale & m_locale;
…
}
MainFrame::MainFrame(const wxString& title, wxLocale& locale)
: wxFrame(NULL, wxID_ANY,title,wxDefaultPosition,wxSize(800,600),wxRESIZE_BORDER | wxDEFAULT_FRAME_STYLE|wxMAXIMIZE|wxFULL_REPAINT_ON_RESIZE),
m_locale(locale)
{
…
}
4、在wxApp对象的初始化过程中需要对wxLocale对象进行初始化,一般而言都是在wxApp的OnInit方法中初始化wxLocale对象。具体初始化过程如下:
m_locale.Init(wxLANGUAGE_DEFAULT,wx_LOCALE_CONV_ENCODING);
wxLocale::AddCatalogLookupPathPrefix(wxT(PACKAGE_LOCALE_DIR));
m_locale.AddCatalog(wxT(GETTEXT_PACKAGE));
第一句话初始化的wxLocale的默认语言环境和编码,如果要采用系统的默认设置,那么只需要设置wxLANGUAGE_DEFAULT,wx_LOCALE_CONV_ENCODING即可。第一个参数也可以指定为具体的语言,每次启动的时候都会将文字翻译到该语言。
第二句话指定了mo翻译数据文件的搜索路径,可以多次调用该函数。
第三句话制定翻译数据文件的名称。
这三句话完成了wxLocale的初始化工作,这样在后面就可以通过GNU常用的翻译宏_()/_T()对文字信息进行翻译了。
比如:
m_frame = new MainFrame (_("My Applications"),m_locale);
在其他的窗口对象中只需要#include <wx/intl.h>之后即可以使用_()/_T()宏进行翻译。
_T
wxChar _T(char ch)
const wxChar * _T(const wxChar ch)
这儿有几点需要注意的:
1、_()/_T()宏实际上是调用了wxGetTranslation函数进行翻译的。
2、在unicode版本的wxWidgets中_()/_T()宏返回的数据是unicode数据格式,是不能直接printf的,需要将unicode数据转换后方才能输出。同样在某些参数为char * 函数中该数据也是不能使用的,必须进行数据转换。可以使用wxMBConv进行数据转换。
3、在数组对象中初始化必须采用以下的方式:
static const wxChar * const weekdays[] = { wxTRANSLATE("Mon"), …, wxTRANSLATE("Sun") }; … // use wxGetTranslation(weekdays[n])
来自:http://blogme.cn/node/10600 wxWidgets下的国际化开发
Related posts:
- CodeLite Plugin Internal(1) – IPlugin interface
- CodeLite Plugin Internal(2)-Load: 插件加载分析
- wxWidget 类型转换(wxString, wxdatatime)
- Debugging With CodeLite - CodeLite调试简介
- CodeLite Initializaion analysis - 初始化流程分析(1)
- CodeLite代码分析之 – Create New Project流程
- CodeLite 编译解析(with Compile log)
- CodeLite IDE介绍
- wxWidgets Programming: Sizer, Frame and Panel














