zoukankan      html  css  js  c++  java
  • 多语言文本资源的访问(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("
    [test]
    ");
        DWORD count = 
            t.StringSplit(
            t.readySection(_T("test")), array, _countof(array));
        printf("Tx0: %s
    ", array[Tx0]);
        printf("Tx3: %s
    ", array[Tx3]);
        printf("Tx5: %s
    ", array[Tx5]);
        printf("
    list String[%d]:
    ", count);
        for (DWORD i = 0; i < count; i++)
            printf(" >%s
    ", array[i]);
        //////////////////////////////////////////////////////////////////////////
        // test2
    
        printf("
    [test2]
    ");
        count = t.StringSplit(t.readySection(_T("test2")), array, _countof(array));
        printf("Tx0: %s
    ", array[Tx0]);
        printf("Tx3: %s
    ", array[Tx3]);
        printf("Tx5: %s
    ", array[Tx5]);
        printf("
    list String[%d]:
    ", count);
        for (DWORD i = 0; i < count; i++)
            printf(" >%s
    ", array[i]);
    
        return 0;
    }
    View Code

    #INI

    [test]
    api
    test2
    中文
    测试
    一下
    string
    ini
    extend
    [test2]
    ;Dear
    同志
    同学
    朋友
    hi,all
    hello

    调试输出

  • 相关阅读:
    apache和tomcat有什么不同,为什么要整合apache 和tomcat
    使用jstack分析cpu消耗过高的问题
    eclipse建立springMVC 简单项目
    JAVA中的反射机制
    MySQL索引的Index method中btree和hash的优缺点
    JAVA中的线程安全与非线程安全
    Java中普通代码块,构造代码块,静态代码块执行顺序
    jvm的内部体系结构浅析
    CPU思考
    linux内核调度算法(2)--CPU时间片如何分配 转!
  • 原文地址:https://www.cnblogs.com/qianwen36/p/4019276.html
Copyright © 2011-2022 走看看