首页 > 代码库 > 多语言文本资源的访问(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;    }};
View Code

 

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;}
View Code

 

#INI

[test]apitest2中文测试一下stringiniextend[test2];Dear同志同学朋友hi,allhello

 

调试输出

多语言文本资源的访问(Windows:ini)