首页 > 代码库 > 多语言文本资源的访问(Windows:ini)
多语言文本资源的访问(Windows:ini)
目标
本文要讨论对于开发多语言界面程序所需要解决的一个问题,即文本资源组织及访问的方法。
本文主要以Windows平台下讨论具现并提供处理代码。
Windows方案
Windows下界面开发,除DirectUI等第三方开发平台外,那么就是基于MFC/WTL、Windows API,我们将议题聚集在VC++开发中。
关于VC++中如何管理文本资源,要么使用VC环境下自带的资源编译模式,要么另想其他方式处理。
采用编译资源方式
即直接利用VC环境提供的字符资源形式操作,此法简单易操作。
即是将字符串当成资源编译在二进制文件中,提供一致资源API来访问,以标识符访问相应字符串。
可编辑文本文件的方式
我们希望文本资源脱离编译环境,则独立保存为程序外文件,由非程序员可编辑修改。
即是如此考虑,必先确证操作方法及组织规则。既要便于程序开发时编码应用,又要利于独立扩展修改(比如说新增语言资源,则效法仿生即可)。
对于这样的要求,那在程序开发中我当然希望是以某种标识来访问资源,按这种惯常习性不需要原程序员多持另念。另外又需要使文本存储有一定的依据及规则来组织。
因此,我们当可以考虑以行定位,按段组织的方式。这种文件巧又Windows本身就支持,ini文件。
文本资源管理ini实现
编译环境此就不赘述了,VS2008环境下,控制台工程即可。下面贴上代码
class LangModule
class LangModule{ enum buffSize {maxSize = 0x7FFF}; TCHAR buffer[maxSize+1]; CString iniPath;public: LangModule(LPCTSTR Path) { iniSwitch(Path); } void iniSwitch(LPCTSTR Path) { iniPath = Path; memset(buffer, 0, sizeof(buffer)); } LPCTSTR readySection(LPCTSTR lpAppName/*section name*/) { DWORD c = ::GetPrivateProfileSection(lpAppName, buffer, maxSize, iniPath); return (c) ? buffer : NULL; } DWORD StringSplit(LPCTSTR sStr, LPCTSTR array[], DWORD count) { DWORD n = 0; int len = 0; for (; n < count && (len = _tcslen(sStr)) > 0; n++, sStr++) { array[n] = sStr; sStr += len; } return n; }};
main
static LPCTSTR testIni = _T("E:\\CodeLab\\devExperiment\\Debug\\test.ini");int main(void){ enum {Tx0, Tx1, Tx2, Tx3, Tx4, Tx5, Tx6, Tx7, TxCount}; LPCTSTR array[TxCount] = {NULL}; LangModule t(testIni); printf("\n[test]\n"); DWORD count = t.StringSplit( t.readySection(_T("test")), array, _countof(array)); printf("Tx0: %s\n", array[Tx0]); printf("Tx3: %s\n", array[Tx3]); printf("Tx5: %s\n", array[Tx5]); printf("\nlist String[%d]:\n", count); for (DWORD i = 0; i < count; i++) printf(" >%s\n", array[i]); ////////////////////////////////////////////////////////////////////////// // test2 printf("\n[test2]\n"); count = t.StringSplit(t.readySection(_T("test2")), array, _countof(array)); printf("Tx0: %s\n", array[Tx0]); printf("Tx3: %s\n", array[Tx3]); printf("Tx5: %s\n", array[Tx5]); printf("\nlist String[%d]:\n", count); for (DWORD i = 0; i < count; i++) printf(" >%s\n", array[i]); return 0;}
#INI
[test]apitest2中文测试一下stringiniextend[test2];Dear同志同学朋友hi,allhello
调试输出
多语言文本资源的访问(Windows:ini)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。