通过XML实现多语言

时间:2021-07-27 14:21:04
今天拿到一份开源C++代码,是通过读取XML实现界面多语言。
关于XML部分的实现使用的是TinyXml外部类库。

代码中没有注释,有几个方法没看懂是做什么的,求大神帮忙看一下。
首先在构造函数中初始化了一个成员
private:
//.h
        map<string, string>* m_pMap;
WCHAR *m_pValue;
        //.cpp
MutiLanguages::MutiLanguages()
{
this->m_pMap = new map<string, string>();
this->m_pValue = NULL;
}

接下来就是几个看不懂的函数:
1.Get

WCHAR* MutiLanguages::Get(const char* key)
{
if (NULL != this->m_pValue)
{
delete[] this->m_pValue;
}
string value = this->GetValueByKey(key);
int len = value.length();

uint u16len = UTF8toUTF16CharCount((const byte*)value.c_str(), len);
this->m_pValue = new WCHAR[u16len + 1];
memset(this->m_pValue, 0, u16len + 1);
UTF8toUTF16((const byte*)value.c_str(), len, this->m_pValue, u16len);

printf("s%", m_pValue);

return this->m_pValue;
}

在上面代码中调用了GetValueByKey(),是通过key获取键值的,
但是不知道这个键值是做什么的。。。

2.GetValueByKey()

string MutiLanguages::GetValueByKey(const char* key)
{
string strVal;
string strKey(key);

if (this->m_pMap->count(strKey) > 0)
{
strVal = (*(this->m_pMap))[strKey];
strVal = DealWithEscape(strVal);
}
else
{
strVal = string(key);
}

return strVal;
}

这里面又调用了DealWithEscape():


string MutiLanguages::DealWithEscape(string value)
{
int pos = value.find("\\");
if (pos < 0)
{
return value;
}

int len = value.length();
char* pVal = new char[len + 1];
memset(pVal, 0, len + 1);
memcpy(pVal, value.c_str(), len);
*(pVal + len) = '\0';

char* pTmp = new char[len + 1];
memset(pTmp, 0, len + 1);

pos = 0;
for (int i = 0; i < len; i++)
{
if (pVal[i] != '\\')
{
pTmp[pos] = pVal[i];
}
else
{
switch (pVal[i + 1])
{
case 't':
pTmp[pos] = '\t';
i++;  //跳过两个字符,即pVal[i]与pVal[i+1],下同;
break;
case 'r':
pTmp[pos] = '\r';
i++;
break;
case 'n':
pTmp[pos] = '\n';
i++;
break;
case '\\':
pTmp[pos] = '\\';
i++;
break;
default:
pTmp[pos] = pVal[i];//不处理;
break;
}
}
pos++;
}
pTmp[pos] = '\0';

//len = pos-1;
string changedValue(pTmp, pos);
delete[] pVal;
delete[] pTmp;

return changedValue;
}


求大神帮小白梳理一下,这三个函数实现的是什么功能,怎样个流程?
谢谢!

12 个解决方案

#1


中国人写的?感觉代码一般般

#2


引用 1 楼 jiqiang01234 的回复:
中国人写的?感觉代码一般般


应该是中国人写的...
可以帮我简单讲讲那几个方法是做什么的吗?

#3


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#4


引用 3 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。


代码不知道是做什么的,不知道该怎么传值,如何调试。。。

#5


我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)

#6


引用 5 楼 lianshaohua 的回复:
我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)


OK,感谢!我理解理解。

#7


引用 5 楼 lianshaohua 的回复:
我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)


十分感谢,你说的应该差不多。 通过XML实现多语言

#8


多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

#9


请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George

#10


引用 9 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George


不无道理,但新人看了容易走错路

#11


引用 8 楼 lianshaohua 的回复:
多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

我只有开源代码,而没有拿到那个XML文件,是不是只能根据源代码自己还原一个XML文件?还有其他办法吗?

#12


引用 11 楼 UAVGCS 的回复:
Quote: 引用 8 楼 lianshaohua 的回复:

多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

我只有开源代码,而没有拿到那个XML文件,是不是只能根据源代码自己还原一个XML文件?还有其他办法吗?


开源的一般都会有配置文件的,如果没有可以联系一下作者或自己还原吧,开源的我遇到了问题一般都去库的网站,联系支持人员,一般都有邮箱回复的

#1


中国人写的?感觉代码一般般

#2


引用 1 楼 jiqiang01234 的回复:
中国人写的?感觉代码一般般


应该是中国人写的...
可以帮我简单讲讲那几个方法是做什么的吗?

#3


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#4


引用 3 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。


代码不知道是做什么的,不知道该怎么传值,如何调试。。。

#5


我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)

#6


引用 5 楼 lianshaohua 的回复:
我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)


OK,感谢!我理解理解。

#7


引用 5 楼 lianshaohua 的回复:
我猜测:他是把多语言的资源以<key,value>的形式加到到map<key,value>中,通过key找到相应的多语言的值,如:btnok对应着"确定"或英语中的"ok"字符串,(通过DealWithEscape这个函数发现,不是简单的字符串,而是由\\和\分隔的字符串,这种分隔规则可能表明了key的位置,如:某个窗口某个容器上的某个button的标题)


十分感谢,你说的应该差不多。 通过XML实现多语言

#8


多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

#9


请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George

#10


引用 9 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George


不无道理,但新人看了容易走错路

#11


引用 8 楼 lianshaohua 的回复:
多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

我只有开源代码,而没有拿到那个XML文件,是不是只能根据源代码自己还原一个XML文件?还有其他办法吗?

#12


引用 11 楼 UAVGCS 的回复:
Quote: 引用 8 楼 lianshaohua 的回复:

多语言一般都这么做的,如果具体看他在干什么,就调试一下或加些关键日志来分析分析,源码面前应该没什么秘密,并且这代码质量太一般般了

我只有开源代码,而没有拿到那个XML文件,是不是只能根据源代码自己还原一个XML文件?还有其他办法吗?


开源的一般都会有配置文件的,如果没有可以联系一下作者或自己还原吧,开源的我遇到了问题一般都去库的网站,联系支持人员,一般都有邮箱回复的