www.diy567.com累了,去上面休息一下下,QQ空间,美文,非主流,网络日记,搞笑短信,祝福短信,热门短信,有意思啊
快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
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::b将share/codeblocks/locale/目录添加到了其语言包搜索的路径中,然后在这个目录下搜索*.mo,猜测这个应该就是每种不同语言的描述性文件。在c::b代码树中没有直接提供mo文件,但在其i18n目录下提供了可编辑的pot文件,试试用poedit修改后生成mo文件再放到share/codeblocks/locale/目录中,可以看到c::b的初始菜单已经变成了汉字,但是此时在c::b的settings -> 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这样的目录名称和语言描述关联起来。
嘿嘿,觉得别人汉化得不好,自己动手吧!
关于code::blocks的配置文件(2009-5-5)
code::blocks在vs2008下编译的一个问题(2009-5-3)
codeblocks中plugin的实现(2008-9-9)