Index: src/ch/OptionsDlg.cpp
===================================================================
diff -u -rcdf6a22ddf857f56ce2e27e26d8cd6f0b8034b2e -r37a273b73ad2ba80df122121bc36c7a11a5492bc
--- src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision cdf6a22ddf857f56ce2e27e26d8cd6f0b8034b2e)
+++ src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision 37a273b73ad2ba80df122121bc36c7a11a5492bc)
@@ -254,7 +254,7 @@
 	UINT uiIndex=0;
 	for (vector<CLangData>::iterator it=m_vld.begin();it != m_vld.end();it++)
 	{
-		strLangs+=(*it).pszLngName;
+		strLangs+=(*it).m_pszLngName;
 		strLangs+=_T("!");
 		if (_tcsicmp((*it).GetFilename(true), GetResManager()->m_ld.GetFilename(true)) == 0)
 			uiIndex=it-m_vld.begin();
Index: src/ch/ResourceManager.cpp
===================================================================
diff -u -rcdf6a22ddf857f56ce2e27e26d8cd6f0b8034b2e -r37a273b73ad2ba80df122121bc36c7a11a5492bc
--- src/ch/ResourceManager.cpp	(.../ResourceManager.cpp)	(revision cdf6a22ddf857f56ce2e27e26d8cd6f0b8034b2e)
+++ src/ch/ResourceManager.cpp	(.../ResourceManager.cpp)	(revision 37a273b73ad2ba80df122121bc36c7a11a5492bc)
@@ -20,24 +20,52 @@
 #include "stdafx.h"
 #include "IniFile.h"
 #include "ResourceManager.h"
+#include "../libicpf/cfg.h"
+#include <assert.h>
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #endif
 
-CLangData::CLangData(const CLangData& ld)
+#define EMPTY_STRING _t("")
+
+CLangData::CLangData() :
+	m_pszFilename(NULL),
+	m_pszLngName(NULL),
+	m_pszBaseFile(NULL),
+	m_pszFontFace(NULL),
+	m_pszHelpName(NULL),
+	m_pszAuthor(NULL),
+	m_pszVersion(NULL),
+	m_uiSectionID(0)
 {
-	szDefString=0;
-	pszFilename=NULL;
-	pszLngName=NULL;
-	pszBaseFile=NULL;
-	pszFontFace=NULL;
-	pszHelpName=NULL;
-	pszAuthor=NULL;
-	pszVersion=NULL;
-	pszStrings=NULL;
-	tCount=0;
+}
 
+CLangData::~CLangData()
+{
+	delete [] m_pszFilename;
+	delete [] m_pszLngName;
+	delete [] m_pszBaseFile;
+	delete [] m_pszFontFace;
+	delete [] m_pszHelpName;
+	delete [] m_pszAuthor;
+	delete [] m_pszVersion;
+
+	for(strings_map::iterator it = m_mStrings.begin(); it != m_mStrings.end(); it++)
+	{
+		delete [] (*it).second;
+	}
+}
+
+CLangData::CLangData(const CLangData& ld) :
+	m_pszFilename(NULL),
+	m_pszLngName(NULL),
+	m_pszBaseFile(NULL),
+	m_pszFontFace(NULL),
+	m_pszHelpName(NULL),
+	m_pszAuthor(NULL),
+	m_pszVersion(NULL)
+{
 	SetFilename(ld.GetFilename(true));
 	SetLangName(ld.GetLangName());
 	SetLangCode(ld.GetLangCode());
@@ -48,48 +76,71 @@
 	SetHelpName(ld.GetHelpName());
 	SetAuthor(ld.GetAuthor());
 	SetVersion(ld.GetVersion());
-
-	SetStringData(ld.pszStrings, ld.tCount);
 }
 
 bool CLangData::ReadInfo(PCTSTR pszFile)
 {
 	try
 	{
-		CIniFile file;
-		file.Open(pszFile, _T("Info"), true);
+		icpf::config cfg(icpf::config::eIni);
+		const uint_t uiLangName = cfg.register_string(_T("Info/Lang Name"), _t(""));
+		const uint_t uiLangCode = cfg.register_signed_num(_T("Info/Lang Code"), 0, 0, 0xffff);
+		const uint_t uiBaseLanguage = cfg.register_string(_T("Info/Base Language"), _T(""));
+		const uint_t uiFontFace = cfg.register_string(_T("Info/Font Face"), _T(""));
+		const uint_t uiCharset = cfg.register_signed_num(_T("Info/Charset"), 0, 0, 0xffff);
+		const uint_t uiSize = cfg.register_signed_num(_T("Info/Size"), 0, 0, 0xffff);
+		const uint_t uiRTL = cfg.register_bool(_T("Info/RTL reading order"), false);
+		const uint_t uiHelpName = cfg.register_string(_T("Info/Help name"), _T(""));
+		const uint_t uiAuthor = cfg.register_string(_T("Info/Author"), _T(""));
+		const uint_t uiVersion = cfg.register_string(_T("Info/Version"), _T(""));
+		cfg.read(pszFile);
 		
-		TCHAR szData[512];
-		SetLangName(file.GetString(_T("000"), _T("Info"), _T("Lang Name"), szData, _T("")));
-		if (file.IsDefault())
+		const tchar_t* psz = cfg.get_string(uiLangName);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetLangCode((WORD)file.GetInt(_T("000"), _T("Info"), _T("Lang Code"), 0, szData));
-		if (file.IsDefault())
+		SetLangName(psz);
+
+		ll_t ll = cfg.get_signed_num(uiLangCode);
+		if(ll == 0)
 			return false;
-		SetBaseFile(file.GetString(_T("000"), _T("Info"), _T("Base Language"), szData, _T("")));
-		if (file.IsDefault())
+		SetLangCode((WORD)ll);
+
+		psz = cfg.get_string(uiBaseLanguage);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetFontFace(file.GetString(_T("000"), _T("Info"), _T("Font Face"), szData, _T("")));
-		if (file.IsDefault())
+		SetBaseFile(psz);
+
+		psz = cfg.get_string(uiFontFace);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetCharset((BYTE)file.GetInt(_T("000"), _T("Info"), _T("Charset"), 0, szData));
-		if (file.IsDefault())
+		SetFontFace(psz);
+
+		ll = cfg.get_signed_num(uiCharset);
+		if(ll == 0)
 			return false;
-		SetPointSize((WORD)file.GetInt(_T("000"), _T("Info"), _T("Size"), 0, szData));
-		if (file.IsDefault())
+		SetCharset((BYTE)ll);
+
+		ll = cfg.get_signed_num(uiSize);
+		if(ll == 0)
 			return false;
-		SetDirection(file.GetBool(_T("000"), _T("Info"), _T("RTL reading order"), false, szData));
-		if (file.IsDefault())
+		SetPointSize((WORD)ll);
+
+		SetDirection(cfg.get_bool(uiRTL));
+
+		psz = cfg.get_string(uiHelpName);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetHelpName(file.GetString(_T("000"), _T("Info"), _T("Help name"), szData, _T("")));
-		if (file.IsDefault())
+		SetHelpName(psz);
+
+		psz = cfg.get_string(uiAuthor);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetAuthor(file.GetString(_T("000"), _T("Info"), _T("Author"), szData, _T("")));
-		if (file.IsDefault())
+		SetAuthor(psz);
+
+		psz = cfg.get_string(uiVersion);
+		if(!psz || psz[0] == _t('\0'))
 			return false;
-		SetVersion(file.GetString(_T("000"), _T("Info"), _T("Version"), szData, _T("")));
-		if (file.IsDefault())
-			return false;
+		SetVersion(psz);
 
 		SetFilename(pszFile);
 
@@ -101,134 +152,109 @@
 	}
 }
 
+void CLangData::EnumAttributesCallback(bool bGroup, const tchar_t* pszName, const tchar_t* pszValue, ptr_t pData)
+{
+	CLangData* pLangData = (CLangData*)pData;
+	assert(pLangData);
+	assert(pszName);
+
+	if(bGroup && _tcsicmp(pszName, _t("Info")) != 0)
+	{
+		// new section - remember in member
+		pLangData->m_uiSectionID = _ttoi(pszName);
+	}
+	else
+	{
+		uint_t uiVal = _ttoi(pszName);
+		if(pLangData->m_bUpdating)
+		{
+			// check if the entry already exists
+			strings_map::iterator it = pLangData->m_mStrings.find(pLangData->m_uiSectionID << 16 | uiVal);
+			if(it != pLangData->m_mStrings.end())
+				return;
+		}
+		size_t stLen = _tcslen(pszValue);
+		tchar_t* pszStr = new tchar_t[stLen + 1];
+		_tcscpy(pszStr, pszValue);
+		pLangData->m_mStrings.insert(strings_map::value_type(pLangData->m_uiSectionID << 16 | uiVal, pszStr));
+	}
+}
+
 bool CLangData::ReadTranslation(PCTSTR pszFile, bool bUpdate)
 {
 	try
 	{
 		// load data from file
-		CIniFile file;
-		file.Open(pszFile, NULL, true);
+		icpf::config cfg(icpf::config::eIni);
+		const uint_t uiLangName = cfg.register_string(_T("Info/Lang Name"), _t(""));
+		const uint_t uiLangCode = cfg.register_signed_num(_T("Info/Lang Code"), 0, 0, 0xffff);
+		const uint_t uiBaseLanguage = cfg.register_string(_T("Info/Base Language"), _T(""));
+		const uint_t uiFontFace = cfg.register_string(_T("Info/Font Face"), _T(""));
+		const uint_t uiCharset = cfg.register_signed_num(_T("Info/Charset"), 0, 0, 0xffff);
+		const uint_t uiSize = cfg.register_signed_num(_T("Info/Size"), 0, 0, 0xffff);
+		const uint_t uiRTL = cfg.register_bool(_T("Info/RTL reading order"), false);
+		const uint_t uiHelpName = cfg.register_string(_T("Info/Help name"), _T(""));
+		const uint_t uiAuthor = cfg.register_string(_T("Info/Author"), _T(""));
+		const uint_t uiVersion = cfg.register_string(_T("Info/Version"), _T(""));
+		cfg.read(pszFile);
 
 		TCHAR szData[512];
-		if (!bUpdate)
+		if(!bUpdate)
 		{
-			// std data
-			SetLangName(file.GetString(_T("000"), _T("Info"), _T("Lang Name"), szData, _T("")));
-			if (file.IsDefault())
+			const tchar_t* psz = cfg.get_string(uiLangName);
+			if(!psz || psz[0] == _t('\0'))
 				return false;
-			SetLangCode((WORD)file.GetInt(_T("000"), _T("Info"), _T("Lang Code"), 0, szData));
-			if (file.IsDefault())
+			SetLangName(psz);
+
+			ll_t ll = cfg.get_signed_num(uiLangCode);
+			if(ll == 0)
 				return false;
-			SetBaseFile(file.GetString(_T("000"), _T("Info"), _T("Base Language"), szData, _T("")));
-			if (file.IsDefault())
+			SetLangCode((WORD)ll);
+
+			psz = cfg.get_string(uiBaseLanguage);
+			if(!psz || psz[0] == _t('\0'))
 				return false;
-			SetFontFace(file.GetString(_T("000"), _T("Info"), _T("Font Face"), szData, _T("")));
-			if (file.IsDefault())
+			SetBaseFile(psz);
+
+			psz = cfg.get_string(uiFontFace);
+			if(!psz || psz[0] == _t('\0'))
 				return false;
-			SetCharset((BYTE)file.GetInt(_T("000"), _T("Info"), _T("Charset"), 0, szData));
-			if (file.IsDefault())
+			SetFontFace(psz);
+
+			ll = cfg.get_signed_num(uiCharset);
+			if(ll == 0)
 				return false;
-			SetPointSize((WORD)file.GetInt(_T("000"), _T("Info"), _T("Size"), 0, szData));
-			if (file.IsDefault())
+			SetCharset((BYTE)ll);
+
+			ll = cfg.get_signed_num(uiSize);
+			if(ll == 0)
 				return false;
-			SetDirection(file.GetBool(_T("000"), _T("Info"), _T("RTL reading order"), false, szData));
-			if (file.IsDefault())
-				return false;
-			SetHelpName(file.GetString(_T("000"), _T("Info"), _T("Help name"), szData, _T("")));
-			if (file.IsDefault())
-				return false;
-			SetAuthor(file.GetString(_T("000"), _T("Info"), _T("Author"), szData, _T("")));
-			if (file.IsDefault())
-				return false;
-			SetVersion(file.GetString(_T("000"), _T("Info"), _T("Version"), szData, _T("")));
-			if (file.IsDefault())
-				return false;
-		}
-		
-		// read strings section
-		const _PROFILE* pcfg=file.GetProfile(_T("000"));
-		if (pcfg)
-		{
-			// enum through the sections
-			size_t tSkipped=(size_t)-1;
-			WORD wHiID, wLoID;
-			size_t tDataCount=0;
-			
-			// 1st phase - count data length
-			vector<_SECTION*>::const_iterator sit;
-			for (sit=pcfg->vSections.begin();sit != pcfg->vSections.end();sit++)
-			{
-				// skip "Info" section
-				if (tSkipped == -1 && _tcscmp((*sit)->pszSectionName, _T("Info")) == 0)
-				{
-					tSkipped=sit-pcfg->vSections.begin();
-					continue;
-				}
-				
-				// now translate all the section of form [000] to the ID's, enum through the entries
-				for (vector<_ENTRY*>::iterator it=(*sit)->vEntries.begin();it != (*sit)->vEntries.end();it++)
-				{
-					if (!bUpdate || m_mStrings.find((_ttoi((*sit)->pszSectionName) << 16) | (_ttoi((*it)->pszKey))) == m_mStrings.end())
-						tDataCount+=_tcslen((*it)->pszValue)+1;
-				}
-			}
-			
-			// allocate the buffer for all data
-			size_t tOffset=0;
-			if (bUpdate)
-			{
-				if (tDataCount == 0)
-					return true;
+			SetPointSize((WORD)ll);
 
-				// we need to reallocate the buffer
-				TCHAR* pszData=new TCHAR[tCount+tDataCount];
-				memcpy(pszData, pszStrings, tCount*sizeof(TCHAR));
+			SetDirection(cfg.get_bool(uiRTL));
 
-				delete [] pszStrings;
-				pszStrings=pszData;
+			psz = cfg.get_string(uiHelpName);
+			if(!psz || psz[0] == _t('\0'))
+				return false;
+			SetHelpName(psz);
 
-				tOffset=tCount;
-				tCount+=tDataCount;
-			}
-			else
-			{
-				// delete old settings
-				delete [] pszStrings;
-				m_mStrings.clear();
+			psz = cfg.get_string(uiAuthor);
+			if(!psz || psz[0] == _t('\0'))
+				return false;
+			SetAuthor(psz);
 
-				tCount=tDataCount;
-				pszStrings=new TCHAR[tDataCount];
-			}
-			
-			// 2nd phase - copy all the data
-			for (sit=pcfg->vSections.begin();sit != pcfg->vSections.end();sit++)
-			{
-				// skip "Info" section
-				if (tSkipped == (size_t)(sit-pcfg->vSections.begin()))
-					continue;
-				
-				// now translate all the section of form [000] to the ID's, enum through the entries
-				wHiID=(WORD)_ttoi((*sit)->pszSectionName);
-				for (vector<_ENTRY*>::iterator it=(*sit)->vEntries.begin();it != (*sit)->vEntries.end();it++)
-				{
-					// add to the map
-					wLoID=(WORD)_ttoi((*it)->pszKey);
-					if (!bUpdate || m_mStrings.find((wHiID << 16) | wLoID) == m_mStrings.end())
-					{
-						m_mStrings.insert(strings_map::value_type((((DWORD)wHiID) << 16 | wLoID), tOffset));
-						
-						// copy string
-						_tcscpy(pszStrings+tOffset, (*it)->pszValue);
-						tOffset+=_tcslen(pszStrings+tOffset)+1;
-					}
-				}
-			}
+			psz = cfg.get_string(uiVersion);
+			if(!psz || psz[0] == _t('\0'))
+				return false;
+			SetVersion(psz);
 		}
 		
-		// free unneded data
-		file.Close();
-		
-		if (!bUpdate)
+		m_bUpdating = bUpdate;
+		m_uiSectionID = 0;
+		if(!cfg.enum_properties(_t("*"), EnumAttributesCallback, this))
+			return false;
+
+		if(!bUpdate)
 		{
 			// remember the filename
 			SetFilename(pszFile);
@@ -259,32 +285,32 @@
 {
 	strings_map::iterator it=m_mStrings.find((wHiID << 16) | wLoID);
 	if (it != m_mStrings.end())
-		return pszStrings+(*it).second;
+		return (*it).second;
 	else
-		return &szDefString;
+		return EMPTY_STRING;
 }
 
 void CLangData::SetFilename(PCTSTR psz)
 {
-	if (pszFilename)
-		delete [] pszFilename;
+	if (m_pszFilename)
+		delete [] m_pszFilename;
 
 	// copy
-	pszFilename=new TCHAR[_tcslen(psz)+1];
-	_tcscpy(pszFilename, psz);
+	m_pszFilename=new TCHAR[_tcslen(psz)+1];
+	_tcscpy(m_pszFilename, psz);
 }
 
 PCTSTR CLangData::GetFilename(bool bFullPath) const
 {
 	if (bFullPath)
-		return pszFilename;
+		return m_pszFilename;
 	else
 	{
-		TCHAR *pszFnd=_tcsrchr(pszFilename, _T('\\'));
+		TCHAR *pszFnd=_tcsrchr(m_pszFilename, _T('\\'));
 		if (pszFnd)
 			return pszFnd+1;
 		else
-			return pszFilename;
+			return m_pszFilename;
 	}
 }
 
Index: src/ch/ResourceManager.h
===================================================================
diff -u -r3493e9fc470285b0a0b417d50be281467a071eb7 -r37a273b73ad2ba80df122121bc36c7a11a5492bc
--- src/ch/ResourceManager.h	(.../ResourceManager.h)	(revision 3493e9fc470285b0a0b417d50be281467a071eb7)
+++ src/ch/ResourceManager.h	(.../ResourceManager.h)	(revision 37a273b73ad2ba80df122121bc36c7a11a5492bc)
@@ -24,6 +24,7 @@
 #include <vector>
 #include <list>
 #include "af_defs.h"
+#include "../libicpf/gen_types.h"
 
 using namespace std;
 
@@ -34,20 +35,16 @@
 
 ///////////////////////////////////////////////////////////
 // language description structure
-typedef map<DWORD, size_t> strings_map;
+typedef map<DWORD, tchar_t*> strings_map;
 
 class CLangData
 {
 public:
 // construction/destruction
-	CLangData() { szDefString=0; pszFilename=NULL; pszLngName=NULL; pszBaseFile=NULL; pszFontFace=NULL; pszHelpName=NULL; pszAuthor=NULL; pszVersion=NULL; pszStrings=NULL; tCount=0; }
-	~CLangData() { delete [] pszFilename; delete [] pszLngName; delete [] pszBaseFile; delete [] pszFontFace; delete [] pszHelpName; delete [] pszAuthor; delete [] pszVersion; delete [] pszStrings; };
+	CLangData();
+	~CLangData();
 	CLangData(const CLangData& ld);
 
-protected:
-	void SetFnameData(PTSTR *ppszDst, PCTSTR pszSrc);
-
-public:
 // operations
 	bool ReadInfo(PCTSTR pszFile);
 	bool ReadTranslation(PCTSTR pszFile, bool bUpdate=false);
@@ -58,56 +55,61 @@
 	void SetFilename(PCTSTR psz);
 	PCTSTR GetFilename(bool bFullPath) const;
 
-	void SetLangName(PCTSTR psz) { if (pszLngName) delete [] pszLngName; pszLngName=new TCHAR[_tcslen(psz)+1]; _tcscpy(pszLngName, psz); };
-	PCTSTR GetLangName() const { return pszLngName; };
+	void SetLangName(PCTSTR psz) { if (m_pszLngName) delete [] m_pszLngName; m_pszLngName=new TCHAR[_tcslen(psz)+1]; _tcscpy(m_pszLngName, psz); };
+	PCTSTR GetLangName() const { return m_pszLngName; };
 
-	void SetBaseFile(PCTSTR psz) { SetFnameData(&pszBaseFile, psz); };
-	PCTSTR GetBaseFile() const { return pszBaseFile; };
+	void SetBaseFile(PCTSTR psz) { SetFnameData(&m_pszBaseFile, psz); };
+	PCTSTR GetBaseFile() const { return m_pszBaseFile; };
 
-	void SetLangCode(WORD wLang) { wLangCode=wLang; };
-	WORD GetLangCode() const { return wLangCode; };
+	void SetLangCode(WORD wLang) { m_wLangCode=wLang; };
+	WORD GetLangCode() const { return m_wLangCode; };
 
-	void SetFontFace(PCTSTR psz) { if (pszFontFace) delete [] pszFontFace; pszFontFace=new TCHAR[_tcslen(psz)+1]; _tcscpy(pszFontFace, psz); };
-	PCTSTR GetFontFace() const { return pszFontFace; };
+	void SetFontFace(PCTSTR psz) { if (m_pszFontFace) delete [] m_pszFontFace; m_pszFontFace=new TCHAR[_tcslen(psz)+1]; _tcscpy(m_pszFontFace, psz); };
+	PCTSTR GetFontFace() const { return m_pszFontFace; };
 
-	void SetCharset(BYTE byChar) { byCharset=byChar; };
-	BYTE GetCharset() const { return byCharset; };
+	void SetCharset(BYTE byChar) { m_byCharset=byChar; };
+	BYTE GetCharset() const { return m_byCharset; };
 
-	void SetPointSize(WORD wSize) { wPointSize=wSize; };
-	WORD GetPointSize() const { return wPointSize; };
+	void SetPointSize(WORD wSize) { m_wPointSize=wSize; };
+	WORD GetPointSize() const { return m_wPointSize; };
 
-	void SetDirection(bool brtl) { bRTL=brtl; };
-	bool GetDirection() const { return bRTL; };
+	void SetDirection(bool brtl) { m_bRTL=brtl; };
+	bool GetDirection() const { return m_bRTL; };
 
-	void SetHelpName(PCTSTR psz) { SetFnameData(&pszHelpName, psz); };
-	PCTSTR GetHelpName() const { return pszHelpName; };
+	void SetHelpName(PCTSTR psz) { SetFnameData(&m_pszHelpName, psz); };
+	PCTSTR GetHelpName() const { return m_pszHelpName; };
 
-	void SetAuthor(PCTSTR psz) { if (pszAuthor) delete [] pszAuthor; pszAuthor=new TCHAR[_tcslen(psz)+1]; _tcscpy(pszAuthor, psz); };
-	PCTSTR GetAuthor() const { return pszAuthor; };
+	void SetAuthor(PCTSTR psz) { if (m_pszAuthor) delete [] m_pszAuthor; m_pszAuthor=new TCHAR[_tcslen(psz)+1]; _tcscpy(m_pszAuthor, psz); };
+	PCTSTR GetAuthor() const { return m_pszAuthor; };
 
-	void SetVersion(PCTSTR psz) { if (pszVersion) delete [] pszVersion; pszVersion=new TCHAR[_tcslen(psz)+1]; _tcscpy(pszVersion, psz); };
-	PCTSTR GetVersion() const { return pszVersion; };
+	void SetVersion(PCTSTR psz) { if (m_pszVersion) delete [] m_pszVersion; m_pszVersion=new TCHAR[_tcslen(psz)+1]; _tcscpy(m_pszVersion, psz); };
+	PCTSTR GetVersion() const { return m_pszVersion; };
 
-	void SetStringData(PCTSTR psz, size_t tCnt) { tCount=tCnt; if (pszStrings) delete [] pszStrings; if (tCount > 0) { pszStrings=new TCHAR[tCnt]; memcpy(pszStrings, psz, tCnt*sizeof(TCHAR)); } };
+//	void SetStringData(PCTSTR psz, size_t tCnt) { tCount=tCnt; if (pszStrings) delete [] pszStrings; if (tCount > 0) { pszStrings=new TCHAR[tCnt]; memcpy(pszStrings, psz, tCnt*sizeof(TCHAR)); } };
 
+protected:
+	void SetFnameData(PTSTR *ppszDst, PCTSTR pszSrc);
+	static void EnumAttributesCallback(bool bGroup, const tchar_t* pszName, const tchar_t* pszValue, ptr_t pData);
+
 public:
-	TCHAR *pszFilename;		// file name of the language data (with path)
-	TCHAR *pszLngName;		// name of the language (ie. Chinese (PRC))
-	TCHAR *pszBaseFile;		// file with base language data (wo path)
-	TCHAR *pszFontFace;		// face name of the font that will be used in dialogs
-	WORD wLangCode;			// language code
-	WORD wPointSize;		// font point size
-	TCHAR *pszHelpName;		// help name (wo the directory) for this language
-	TCHAR *pszAuthor;		// author name
-	TCHAR *pszVersion;		// version of this file
-	BYTE byCharset;			// charset for use with the font
-	bool bRTL;				// does the language require right-to-left reading order ?
+	TCHAR *m_pszFilename;		// file name of the language data (with path)
+	TCHAR *m_pszLngName;		// name of the language (ie. Chinese (PRC))
+	TCHAR *m_pszBaseFile;		// file with base language data (wo path)
+	TCHAR *m_pszFontFace;		// face name of the font that will be used in dialogs
+	WORD m_wLangCode;			// language code
+	WORD m_wPointSize;		// font point size
+	TCHAR *m_pszHelpName;		// help name (wo the directory) for this language
+	TCHAR *m_pszAuthor;		// author name
+	TCHAR *m_pszVersion;		// version of this file
+	BYTE m_byCharset;			// charset for use with the font
+	bool m_bRTL;				// does the language require right-to-left reading order ?
 
 	// strings (for controls in dialog boxes the ID contains hi:dlg ID, lo:ctrl ID, for strings hi part is 0)
 	strings_map m_mStrings;	// maps string ID to the offset in pszStrings
-	TCHAR *pszStrings;				// contains all the strings - NULL separated
-	size_t tCount;					// length of the string table
-	TCHAR szDefString;				// default empty string
+
+private:
+	uint_t m_uiSectionID;			///< ID of the currently processed section
+	bool m_bUpdating;				///< Are we updating the language with base language ?
 };
 
 /////////////////////////////////////////////////////////////////////////////////////