KitCore的组成部分之一 ----- LdxprojCore

KitCore的组成部分之一 ----- LdxprojCore

Ldxproj

Ldxproj这个词我也不好说,因为当时想的,现在已经很模糊了什么的,大概是language dynamically for x project. 不要笑我。。。
好吧好吧,娱乐而已。
首先是因为程序开发到一定程度,修改起来异常困难,所以需要外接动态的东西来保证自身具有高度的可修改特性,其中程序表现的文本语言即是这个可修改性的抑制源之一。如果一款程序希望内部切换语言,可能会使用内部的语言切换,然后调整,开发过程可能会有一堆赋值语句,不仅其过程虐身虐心,而且做不到随时增加语言的功能。所以我想到了使用外部加载的功能,为了动态加载表现文本语言,所有语言资源使用某种格式的文件进行保存,为了方便编辑和修改,使用人可读写的字符串进行保存。具体格式如下:
"key"="value"
一行只有一个,即切换语言时,程序内部的加载过程不变,即不断获取key所对应的value即可,而不同种语言所希望表达的意思的key是一样的,改变的是value,而用户所见为value,保证了在不修改程序本身的情况下,可快速调节程序显示的语言,实现程序的国际化、本地化。
举例:下面是TimKitCore使用的一个语言文件,此版为eng即English,文件存在于路径 /Kernel/root/ldxproj/TimKit/
"January"="January"
"February"="February"
"March"="March"
"April"="April"
"May"="May"
"June"="June"
"July"="July"
"August"="August"
"September"="September"
"October"="October"
"November"="November"
"December"="December"
"Monday"="Monday"
"Tuesday"="Tuesday"
"Wednesday"="Wednesday"
"Thursday"="Thursday"
"Friday"="Friday"
"Saturday"="Saturday"
"Sunday"="Sunday"
"AM"="AM"
"PM"="PM"
所对应的中文版语言即为:
"January"="一"
"February"="二"
"March"="三"
"April"="四"
"May"="五"
"June"="六"
"July"="七"
"August"="八"
"September"="九"
"October"="十"
"November"="十一"
"December"="十二"
"Monday"="星期一"
"Tuesday"="星期二"
"Wednesday"="星期三"
"Thursday"="星期四"
"Friday"="星期五"
"Saturday"="星期六"
"Sunday"="星期天"
"AM"="上午"
"PM"="下午"

现在大概有些了解了目的,那么可以来看看函数了。
LDXPROJKIT_API	LDXERR	LdxCreateFile(char* filePath,char* fileName,FILE** handle);
LDXPROJKIT_API	LDXERR	LdxCreateSignFile(char* filePath);
LDXPROJKIT_API	LDXERR	LdxCheckFileBySignFile(char* filePath);
LDXPROJKIT_API	char*	LdxInitZoneWithKeyName(char** zone,char* key,FILE* handle);
LDXPROJKIT_API	char*	LdxInitZoneWithKeyNameInCache(char** zone,char* key,char* cache);
LDXPROJKIT_API	bool	LdxCreateZoneWithKeyName(char* key,char* zone,FILE* handle);
LDXPROJKIT_API	bool	LdxCreateZoneWithKeyNameInCache(char* key,char* zone,char* cache);
LDXPROJKIT_API 为标准导入导出宏定义。
LdxCreateFile首先是制造一个文件,文件类型为ldxproj,返回出的handle即为文件句柄,具有可读写的权限。句柄使用IOCloesHandle(IOKit.core)来关闭。
LdxCreateSignFile为为ldxproj文件制造一枚签名,内部会自动制造签名并写入到文件系统上,用来进行内容校验,如果你的程序不希望外界有修改,使用此函数来为你的语言文件制造签名,在加载时使用LdxCheckFileBySignFile进行校验。
后面两个函数,两两各为一个版本,即一个是文件操作,后一个InCache版是在缓存中的操作,功能类似,不做多余阐述,直接看demo代码,此代码可以在initCore中找到。
int TimKitInitTimeZone(int mode)
{
	int err = 0;
	const char* timeFolder = SYS_LANGUAGE_FOLDER;//SYS_LANGUAGE_FOLDER is removed forever!do not use it anyway!
	const char* timeZoneIni[] = {SYS_LDXPROJ_ENG,SYS_LDXPROJ_CHA_ZN};//SYS_LDXPROJ_ENG is means English, the other is means Chinese.
	char filePath[BUFFER_SIZE] = {0};
	FILE* handle = nil;
	do 
	{
		if (mode > REG_MODE_LIMIT)
		{
			return RC_ERR_VERIFY;
		}
		strcat(filePath,initGetKitPath("TimKit",CSLdxproj));//initGetKitPath will return a path of a kit. now is the TimKit's ldxproj path.
		strcat(filePath,timeZoneIni[mode]);
		if (LdxCheckFileBySignFile(filePath))//check the sign file and you can do somethings in the block.
		{

		}
		IOOpenFile(filePath,&handle,IO_OPEN_RWB);//IOKit function to open a file,make sure the ldxproj file is existing in the file system.
		for (int i = 0;i < 12;i++)
		{
			LdxInitZoneWithKeyName(&timeZoneMonthX[mode][i],//initialize the month name
				g_MonthKey[i],handle);
		}
		for (int i = 0;i < 7;i++)//initialize the weekday name
		{
			LdxInitZoneWithKeyName(&timeZoneDayOfWeekX[mode][i],
				g_DayKey[i],handle);
		}
		for (int i = 0;i < 2;i++)//initialize the mode name AM/PM
		{
			LdxInitZoneWithKeyName(&timeZoneMonX[mode][i],
				g_MonKey[i],handle);
		}
		IOCloseFile(handle);//close the file.
	} while (0);
	return err;//now we load all we need from ldxproj file.
}
I add some comments in the code block. you can read it by yourself.


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值