code::blocks汉化


www.diy567.com累了,去上面休息一下下,QQ空间,美文,非主流,网络日记,搞笑短信,祝福短信,热门短信,有意思啊

快乐虾

http://blog.csdn.net/lights_joy/

[email protected]

本文适用于

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)

 

你可能感兴趣的:(C++,c,.net,qq,C#)