一个简易的软件多语言实现方案
软件工作完成后,自然希望用户的范围不受语言限制,因此软件的多语言支持就基本是一个必须考虑的事情。
微软整的那个MUI,本质上类似于多语言资源文件,限制较多,实现也繁琐。
通过ini,加载不同的语言INI,通常所见软件的多语言实现并不难。
设计思路:
1.头文件中实现两个API:MultiLang_GetUiidString与MultiLang_GetBlockString
第一个通过资源ID,得到多语言翻译后的内容,第二个通过分区块名、关键字名字,得到多语言翻译后的内容
2.两个API在任何一个第一次调用时,会做初始化。初始化动作:
1)获取程序当前路径
2)判断当前路径下Lang.ini是否存在
3)如果存在,读取其中的Default块下,关键字Lang的内容(此Key用于手工指定使用某个语言INI)
4)如果Lang.ini不存在或Lang关键字指定的ini文件不存在,则通过函数GetLocaleInfoA获取当前用户的缺省语言缩写
5)组合Lang_语言缩写.ini,尝试当前程序路径下打开,打开成功则加载。
3.接口实现就简单了
#ifndef _MULTI_LANG_H_#define _MULTI_LANG_H_#ifdef __cplusplusextern "C"{#endif /*****************************************************************************
* @brief : 通过界面ID获取相应的多语言翻译
* @author : xiaomw
* @date : 2019/8/20
* @inparam : ui_id 界面ID
* @inparam : strDefaultString 缺省内容
* @return :
*****************************************************************************/ const char* MultiLang_GetUiidString(unsigned int ui_id, const char*strDefaultString);/*****************************************************************************
* @brief : 通过标识获取相应的多语言翻译
* @author : xiaomw
* @date : 2019/8/20
* @inparam : strBlock 标识
* @inparam : strDefaultString 缺省内容,同时,也是标识块下的唯一内容
* @return :
*****************************************************************************/ const char* MultiLang_GetBlockString(const char* strBlock, const char*strDefaultString);/*定义两个宏,供使用*/#ifdef UNICODE#define MULTILANG_BY_UI_ID(ui_id, strDefault) (to_wstring(std::string(MultiLang_GetUiidString(ui_id, strDefault))).c_str()) #define MULTILANG_BY_BLOCK(strBlock, strDefault) (to_wstring(std::string(MultiLang_GetBlockString(strBlock, strDefault))).c_str()) #else #define MULTILANG_BY_ID(ui_id, strDef) (MultiLang_GetUidString(ui_id, strDef))) #define MULTILANG_BY_BLOCK(strBlock, strDef) ((MultiLang_GetBlockString(strBlock, strDef)) #endif#ifdef __cplusplus
};#endif #endif //_MULTI_LANG_H_
/*****************************************************************************
* @brief : 通过界面ID获取相应的多语言翻译
* @author : xiaomw
* @date : 2019/8/20
* @inparam : ui_id 界面ID
* @inparam : strDefaultString 缺省内容
* @return :
*****************************************************************************/ const char* MultiLang_GetUiidString(unsigned int ui_id, const char*strDefaultString)
{
CSimpleIniA* lang_ini =_get_lang_ini();return lang_ini->GetValue("DefaultUI", std::to_string(ui_id).c_str(), strDefaultString);
}/*****************************************************************************
* @brief : 通过标识获取相应的多语言翻译
* @author : xiaomw
* @date : 2019/8/20
* @inparam : strBlock 标识
* @inparam : strDefaultString 缺省内容,同时,也是标识块下的唯一内容
* @return :
*****************************************************************************/ const char* MultiLang_GetBlockString(const char* strBlock, const char*strDefaultString)
{
CSimpleIniA* lang_ini =_get_lang_ini();return lang_ini->GetValue(strBlock, strDefaultString, strDefaultString);
}
CSimpleIniA是一个开源的INI文件访问类,GITHUB上可以搜索到