CodeLite to CodeInsight task 1: Internationalization

simulation在Codelite BBS上可以看到短时间内他们没有支持多语言的计划,所以只能自己动手啦。

第一步想支持中文的话,需要做3件事:

1)将所有需要支持翻译的字符串(包括在菜单、messagebox等等中的)从现有的wxT()替换成_();

2) 在程序初始化时支持读入和解析;

3)提供附加配置项以供用户选择。

下面是一篇网上转载的关于利用实现国际化支持的技术文章以供参考。

以下为转载原文及链接:

前段时间在为multiget做开发时,发现mulitiget采用的国际化模式不同于标准的GNU gettext翻译模式。因此想要将其进行移植,使得multiget支持GNU gettext翻译模式。

通过阅读开发文档,大概得知下的国际化支持实现方法:

1、首先,国际化支持的头文件均在wx/intl.h中,所以必须#include <wx/intl.h>

2、的国际化例程在源代码目录下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版本的中_()/_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 下的国际化开发

Share and Enjoy:
  • Print this article!
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Live
  • MySpace
  • RSS
  • Slashdot
  • Technorati
  • TwitThis

Related posts:

  1. CodeLite Plugin Internal(1) – IPlugin interface
  2. CodeLite Plugin Internal(2)-Load: 插件加载分析
  3. wxWidget 类型转换(wxString, wxdatatime)
  4. Debugging With CodeLite - CodeLite调试简介
  5. CodeLite Initializaion analysis - 初始化流程分析(1)
  6. CodeLite代码分析之 – Create New Project流程
  7. CodeLite 编译解析(with Compile log)
  8. CodeLite IDE介绍
  9. wxWidgets Programming: Sizer, Frame and Panel

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Contact us

Admin: Bryan Wu