多语言文本资源的访问(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]
api
test2
中文
测试
一下
string
ini
extend
[test2]
;Dear
同志
同学
朋友
hi,all
hello

 

调试输出

posted @ 2014-10-11 16:14  鱼木  阅读(1009)  评论(2编辑  收藏  举报