目标

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

本文主要以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. POJ3107--Godfather(树的重心)

    vector建图被卡了..改为链式前向星500ms过的..差了四倍多?... 表示不太会用链表建图啊..自己试着写的,没看模板..嗯..果然错了..落了一句话orz 树的重心就是找到一个树中一个点,其 ...

  2. SPOJ4206Fast Maximum Matching(hopcroft-karp)

    题目请戳这里 题目大意:裸的二分匹配. 题目分析:数据比较强,用来测模版的.这题用hungry跑着会比较吃力,所以用hopcroft-karp算法.这个算法较hungry高效是因为每次bfs找到一个增 ...

  3. 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

    [问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...

  4. springboot 详细配置2

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  5. 【转】Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  6. Xenomai 的模式切换浅析

    在Xenomai的用户空间下,有两种模式:primary mode (主模式) 和 secondary mode(次模式). 在主模式下调用Linux系统调用后程序就会进入次模式,反之,在次模式下调用 ...

  7. android FakeWindow的小应用大用途

    android FakeWindow的小应用大用途 在windowmanager里面有一个FakeWindow,细致一看也就是一个透明的应用覆盖到屏幕的最前端,这样有什么优点呢?首先我们还是从应用的需 ...

  8. Android自定义进度条

    Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧: 一)变换前背景 先来看看 ...

  9. 从本地上传整个目录到hdfs的java程序

    首先在网上找了好久没有找到从本地文件系统上传整个目录到hdfs文件系统的程序,权威指南上也没有,都是单个文件上传,所以这里自己编写了一个程序,封装成jar包执行能够复制. 先说明一下代码:须要手动输入 ...

  10. linux上配置jdk+Apache

    一:安装jdk下载将jdk加压后放到/usr/local目录下: [root@master ~]#chmod 755 jdk-6u5-linux-x64.bin [root@master ~]# ./ ...