注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

MFC到wxWidgets移植笔记(13)——多语言实现  

2008-05-23 11:09:46|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

多语言实现是大部分软件需要考虑的问题,解决的办法也很多,也没有什么规范性的做法。比较有名的算是微软的支持多语言的资源文件文件了,虽然用起来很方便,但同样存在着编辑困难,编译后无法修改的问题。在我这个软件里,使用了最最简单的做法,用一个xml文件存储字符串,通过简单英文(也可以是数字)标记词汇。然后在代码中用一个语言类来管理。

以下是这个xml文件(只列出一部分):






 
 

然后是类实现。在类的构造函数中,打开xml文件,读出所有的数据,并存到一个map中:

LanguageRes::LanguageRes()
{
    wxStandardPaths stdPath;
    wxFileName fn(stdPath.GetExecutablePath());
    wxString szFile = fn.GetPath();
    szFile += wxFILE_SEP_PATH;
    szFile += wxT("chs.lng");

    wxXmlDocument doc;
    doc.Load(szFile);
    wxXmlNode *root = doc.GetRoot();
    ASSERT(root->GetName() == wxT("language_package"));
    wxString code = root->GetPropVal(wxT("code"), wxEmptyString);
    ASSERT(code == wxT("chinese"));
    wxXmlNode *child = root->GetChildren();
    while (child)
    {
        if (child->GetName() == wxT("node"))
        {
            wxString field = child->GetPropVal(wxT("field"), wxEmptyString);
            wxString content = child->GetPropVal(wxT("content"), wxEmptyString);
            m_map.insert(LANGUAAGE_MAP::value_type(field, content));
        }
        child = child->GetNext();
    }
}
然后用了singleton模式,返回一个唯一的全局变量:

LanguageRes* LanguageRes::res = NULL;

LanguageRes* LanguageRes::GetLanguageRes()
{
    if (res == NULL)
    {
        res = new LanguageRes;
    }
    return res;
}

注:最近面试时我会问一个问题,如果是个多线程程序,如何确保singleton的线程安全性。让人失望的是,让大家说线程的同步有几种方式时,基本上都能答上来,但灵活应用到具体的问题上时却答不上来了,sign

  评论这张
 
阅读(34)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017