code::blocks汉化

本文介绍了一种不依赖现有中文包的手动汉化code::blocks的方法,通过修改.mo文件并将其放置在特定目录下,成功实现了软件界面的中文显示。

快乐虾

http://blog.youkuaiyun.com/lights_joy/

lights@hb165.com

  

本文适用于

codeblocks-8.02

vs2008

  

欢迎转载,但请保留作者信息

 

关于c::b汉化,网上已经有中文包,但本文不使用它。

code::blocks的资源大部分是以xrc文件形式存在的,然后将这些文件文件打包成一个叫resources.zip文件,放在share/codeblocks目录下,在c::b启动时读取其中的资源并显示。要汉化首先想到的就是直接修改这里的xrc文件,但是在c::b的启动部分的代码里,大量使用了类似于这样的语句:

    int pos = mbar->FindMenu(_("&File"));

    if (pos != wxNOT_FOUND)

    {

………….

也就是说,这些代码将依赖于菜单项上显示的名称,如果直接修改resources.zip里的资源,必然造成c::b启动失败!

仔细看启动部分的代码,发现其调用了一个与本地化相关的函数InitLocale

void CodeBlocksApp::InitLocale()

{

    ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("app"));

 

    wxString path(ConfigManager::GetDataFolder() + _T("/locale"));

 

    if(cfg->ReadBool(_T("/locale/enable"), true) == false)

        return;

 

    wxString lang(cfg->Read(_T("/locale/language")));

 

    wxLocale::AddCatalogLookupPathPrefix(path);

 

 

    const wxLanguageInfo *info;

 

    if(lang)

        info = wxLocale::FindLanguageInfo(lang);

    else

        info = wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT);

 

    if(info == 0) // should never happen, but who knows...

        return;

 

    m_locale.Init(info->Language);

 

    path.Alloc(path.length() + 10);

    path.Append(_T('/'));

    path.Append(info->CanonicalName);

 

    wxDir dir(path);

 

    if (!dir.IsOpened())

        return;

 

    wxString moName;

 

    if(dir.GetFirst(&moName, _T("*.mo"), wxDIR_FILES))

    do

    {

        m_locale.AddCatalog(moName);

    }while(dir.GetNext(&moName));

}

从这段代码可以看出,c::bshare/codeblocks/locale/目录添加到了其语言包搜索的路径中,然后在这个目录下搜索*.mo,猜测这个应该就是每种不同语言的描述性文件。在c::b代码树中没有直接提供mo文件,但在其i18n目录下提供了可编辑的pot文件,试试用poedit修改后生成mo文件再放到share/codeblocks/locale/目录中,可以看到c::b的初始菜单已经变成了汉字,但是此时在c::bsettings -> enviroment -> view下面并不会出现语言的选项。

locale下面建立zh_CN子目录,将刚刚修改的mo文件放到zh_CN子目录下,此时可以看到在settings -> enviroment -> view下面已经出现了一个Simplified Chinese的选项,选择它后重新启动c::b,可以看到菜单已经正常地变为中文了。

为了弄清楚zh_CN子目录和这个选项的关系,在代码里面找“zh_CN”字符串,发现了这样一个函数:

#define LNG(wxlang, canonical, winlang, winsublang, layout, desc) /

    info.Language = wxlang;                               /

    info.CanonicalName = wxT(canonical);                  /

    info.LayoutDirection = layout;                        /

    info.Description = wxT(desc);                         /

    SETWINLANG(info, winlang, winsublang)                 /

    AddLanguage(info);

 

void wxLocale::InitLanguagesDB()

{

   wxLanguageInfo info;

   wxStringTokenizer tkn;

……………………..

   LNG(wxLANGUAGE_CHINESE,                    "zh_TW", LANG_CHINESE   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Chinese")

   LNG(wxLANGUAGE_CHINESE_SIMPLIFIED,         "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_SIMPLIFIED        , wxLayout_LeftToRight, "Chinese (Simplified)")

   LNG(wxLANGUAGE_CHINESE_TRADITIONAL,        "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Traditional)")

   LNG(wxLANGUAGE_CHINESE_HONGKONG,           "zh_HK", LANG_CHINESE   , SUBLANG_CHINESE_HONGKONG          , wxLayout_LeftToRight, "Chinese (Hongkong)")

   LNG(wxLANGUAGE_CHINESE_MACAU,              "zh_MO", LANG_CHINESE   , SUBLANG_CHINESE_MACAU             , wxLayout_LeftToRight, "Chinese (Macau)")

   LNG(wxLANGUAGE_CHINESE_SINGAPORE,          "zh_SG", LANG_CHINESE   , SUBLANG_CHINESE_SINGAPORE         , wxLayout_LeftToRight, "Chinese (Singapore)")

   LNG(wxLANGUAGE_CHINESE_TAIWAN,             "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Taiwan)")

…………………………..

}

#undef LNG

正是通过这样的手段,把zh_CN这样的目录名称和语言描述关联起来。

嘿嘿,觉得别人汉化得不好,自己动手吧!

 

 

 

1       参考资料

关于code::blocks的配置文件(2009-5-5)

code::blocksvs2008下编译的一个问题(2009-5-3)

codeblocksplugin的实现(2008-9-9)

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值