目标

本文要讨论对于开发多语言界面程序所需要解决的一个问题,即文本资源组织及访问的方法。

本文主要以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+];
CString iniPath;
public:
LangModule(LPCTSTR Path)
{
iniSwitch(Path);
}
void iniSwitch(LPCTSTR Path)
{
iniPath = Path;
memset(buffer, , 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 = ;
int len = ;
for (; n < count &&
(len = _tcslen(sStr)) > ; 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 = ; 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 = ; i < count; i++)
printf(" >%s\n", array[i]); return ;
}

#INI

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

调试输出

多语言文本资源的访问(Windows:ini)的更多相关文章

  1. 【Windows 10 应用开发】细说文本资源文件(resw)

    最近,小戏骨版<红楼梦>很是火热,老周一口气看完了9集,一直看到 Surface 的风扇呼呼响.林黛玉和薛宝钗这两个角色都演得不怎么样,倒是演史湘云的娃娃演得不错,老周甚是喜欢. 于是,昨 ...

  2. Linux怎样访问Windows共享文件和文件夹

    常常使用Windows的人可能会发现,Windows计算机之前共享资料非常方便,但是有时候想玩玩Linux的时候,如Fedora.Ubuntu.CentOS等,该怎样才能访问Windows计算机上的文 ...

  3. Linux访问windows共享(samba/smbclient/smbfs/cifs)

    samba是一个实现不同操作系统之间文件共享和打印机共享的一种SMB协议的免费软件.●安装samba,samba-client和cifs-utils.x86_64此步将自动安装好相关依赖包:samba ...

  4. Linux使用笔记: 使用Samba访问windows的共享目录(转载)

    转自:http://easwy.com/blog/archives/mount-a-windows-shared-folder-on-linux-with-samba/ 通常我们使用Samba都是在W ...

  5. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  6. Mac OS X 访问 Windows 共享文件夹

    Mac OS X 访问 Windows 共享文件夹 mac没有网络邻居,但可以使用finder访问局域网中windows共享的文件 1.点击 Finder 前往菜单中的「前往服务器」(或快捷键 com ...

  7. CentOS访问Windows共享文件夹的方法

    CentOS访问Windows共享文件夹的方法 1 在地址栏中输入下面内容: smb://Windows IP/Share folder name,smb为Server Message Block协议 ...

  8. SpringMVC 部署项目静态资源文件访问问题

    问题:采用SpringMVC 部署项目后程序加载或用浏览器访问时出现类似的警告,2011-01-19 10:52:51,646 WARN [org.springframework.web.servle ...

  9. linux访问windows共享文件夹的方法

    博客转自:http://www.01happy.com/linux-access-windows-shares-folders/ 有时需要在linux下需要访问windows的共享文件夹,可以使用mo ...

随机推荐

  1. win7 下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化” -摘自网络

    1.自动放大窗口 鼠标把窗口拖到屏幕边缘时,win7会自做聪明的把窗口放大,有时候这个很烦人. 解决办法: 运行“REGEDIT”打开注册表,找到 “HKEY_CURRENT_USER\Control ...

  2. KMP学习总结

    初学,理解可能不是那么准确~~ Next数组的含义:next[i]表示第0个元素到第i个元素组成的字符串的最大前缀后缀.Next[0]=0显然. 所以KMP的原理就是 通过找出每一阶段最大的相等的前缀 ...

  3. 问题-delphi 程序在某电脑中显示???问号 乱码

    问题现象:delphi 程序在某电脑中显示???问号 乱码 问题原因:因为语言的原因.不同的国家可能显示的编码不一样. 问题处理:“控制面板”>“区域和语言选项”>“区域选项”>“标 ...

  4. Sqlite在Windows、Linux 和 Mac OS X 上的安装过程

    一:在 Windows 上安装 SQLite 1,下载 请访问SQLite下载页面http://www.sqlite.org/download.html,从Windows 区下载预编译的二进制文件.需 ...

  5. Oracle数据库编程:PL/SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

  6. excel重复数据

    =COUNTIF(H:H,H1)>1

  7. c++虚表的使用 通过虚表调用虚函数的演示代码

    //演示一下c++如何找到虚表地址vptr以及如何通过虚表调用虚函数 //zhangpeng@myhexin.com 20130811 #include <iostream> using ...

  8. JSON数据的中文乱码问题

    问题描述: 在firefox中返回的JSON数据没有出现乱码,但在GridPanel中显示乱码,而jsp页面和xml文件都是utf-8类型. 解决方案: 在 PrintWriter out = res ...

  9. android114 c转换成c++

    ##C向C++改造 . 把c文件后缀名换成cpp . Android.mk文件中的hello.c也要换成hello.cpp . c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全 ...

  10. 监控mysql索引使用效率的脚本

      SELECT  t.table_schema AS db,  t.table_name   AS tab_name,  s.index_name   AS index_name,  s.colum ...