mirror of
https://github.com/reactos/reactos.git
synced 2024-06-28 08:51:29 +00:00
[RAPPS] Translations
- Implemented HasNativeLanguage() and HasEnglishLanguage() - Moved config parser to it's own class CConfigParser - Added translation strings svn path=/branches/GSoC_2017/rapps/; revision=75375
This commit is contained in:
parent
ce70e3c89b
commit
f07567454b
|
@ -13,48 +13,49 @@
|
||||||
// CAvailableApplicationInfo
|
// CAvailableApplicationInfo
|
||||||
|
|
||||||
CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
|
CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
|
||||||
|
: m_Parser(sFileNameParam)
|
||||||
{
|
{
|
||||||
LicenseType = LICENSE_TYPE::None;
|
LicenseType = LICENSE_TYPE::None;
|
||||||
sFileName = sFileNameParam;
|
sFileName = sFileNameParam;
|
||||||
RetrieveCategory();
|
|
||||||
|
RetrieveGeneralInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CAvailableApplicationInfo::RefreshAppInfo()
|
VOID CAvailableApplicationInfo::RefreshAppInfo()
|
||||||
{
|
{
|
||||||
if (RetrieveGeneralInfo())
|
if (szUrlDownload.IsEmpty())
|
||||||
{
|
{
|
||||||
RetrieveLicenseType();
|
RetrieveGeneralInfo();
|
||||||
RetrieveLanguages();
|
|
||||||
RetrieveInstalledStatus();
|
|
||||||
if (m_IsInstalled)
|
|
||||||
{
|
|
||||||
RetrieveInstalledVersion();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CAvailableApplicationInfo::RetrieveGeneralInfo()
|
VOID CAvailableApplicationInfo::RetrieveGeneralInfo()
|
||||||
{
|
{
|
||||||
if (szUrlDownload.IsEmpty())
|
Category = m_Parser.GetInt(L"Category");
|
||||||
{
|
|
||||||
if (!GetString(L"Name", szName)
|
|
||||||
|| !GetString(L"URLDownload", szUrlDownload))
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetString(L"RegName", szRegName);
|
if (!GetString(L"Name", szName)
|
||||||
GetString(L"Version", szVersion);
|
|| !GetString(L"URLDownload", szUrlDownload))
|
||||||
GetString(L"License", szLicense);
|
{
|
||||||
GetString(L"Description", szDesc);
|
return;
|
||||||
GetString(L"Size", szSize);
|
}
|
||||||
GetString(L"URLSite", szUrlSite);
|
|
||||||
GetString(L"CDPath", szCDPath);
|
GetString(L"RegName", szRegName);
|
||||||
GetString(L"Language", szRegName);
|
GetString(L"Version", szVersion);
|
||||||
GetString(L"SHA1", szSHA1);
|
GetString(L"License", szLicense);
|
||||||
return TRUE;
|
GetString(L"Description", szDesc);
|
||||||
|
GetString(L"Size", szSize);
|
||||||
|
GetString(L"URLSite", szUrlSite);
|
||||||
|
GetString(L"CDPath", szCDPath);
|
||||||
|
GetString(L"Language", szRegName);
|
||||||
|
GetString(L"SHA1", szSHA1);
|
||||||
|
|
||||||
|
RetrieveLicenseType();
|
||||||
|
RetrieveLanguages();
|
||||||
|
RetrieveInstalledStatus();
|
||||||
|
if (m_IsInstalled)
|
||||||
|
{
|
||||||
|
RetrieveInstalledVersion();
|
||||||
}
|
}
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CAvailableApplicationInfo::RetrieveInstalledStatus()
|
VOID CAvailableApplicationInfo::RetrieveInstalledStatus()
|
||||||
|
@ -69,42 +70,45 @@ VOID CAvailableApplicationInfo::RetrieveInstalledVersion()
|
||||||
|| ::GetInstalledVersion(&szInstalledVersion, szName);
|
|| ::GetInstalledVersion(&szInstalledVersion, szName);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CAvailableApplicationInfo::RetrieveLanguages()
|
VOID CAvailableApplicationInfo::RetrieveLanguages()
|
||||||
{
|
{
|
||||||
const WCHAR cDelimiter = L'|';
|
const WCHAR cDelimiter = L'|';
|
||||||
ATL::CStringW szBuffer;
|
ATL::CStringW szBuffer;
|
||||||
|
|
||||||
// TODO: Get multiline parameter
|
// TODO: Get multiline parameter
|
||||||
if (!ParserGetString(L"Languages", sFileName, szBuffer))
|
if (!m_Parser.GetString(L"Languages", szBuffer))
|
||||||
return FALSE;
|
{
|
||||||
|
m_HasLanguageInfo = FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Parse parameter string
|
// Parse parameter string
|
||||||
ATL::CStringW szLocale;
|
ATL::CStringW m_szLocale;
|
||||||
for (INT i = 0; szBuffer[i] != UNICODE_NULL; ++i)
|
for (INT i = 0; szBuffer[i] != UNICODE_NULL; ++i)
|
||||||
{
|
{
|
||||||
if (szBuffer[i] != cDelimiter)
|
if (szBuffer[i] != cDelimiter)
|
||||||
{
|
{
|
||||||
szLocale += szBuffer[i];
|
m_szLocale += szBuffer[i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Languages.Add(szLocale);
|
Languages.Add(m_szLocale);
|
||||||
szLocale.Empty();
|
m_szLocale.Empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For the text after delimiter
|
// For the text after delimiter
|
||||||
if (!szLocale.IsEmpty())
|
if (!m_szLocale.IsEmpty())
|
||||||
{
|
{
|
||||||
Languages.Add(szLocale);
|
Languages.Add(m_szLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
m_HasLanguageInfo = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CAvailableApplicationInfo::RetrieveLicenseType()
|
VOID CAvailableApplicationInfo::RetrieveLicenseType()
|
||||||
{
|
{
|
||||||
INT IntBuffer = ParserGetInt(L"LicenseType", sFileName);
|
INT IntBuffer = m_Parser.GetInt(L"LicenseType");
|
||||||
|
|
||||||
if (IntBuffer < 0 || IntBuffer > LICENSE_TYPE::Max)
|
if (IntBuffer < 0 || IntBuffer > LICENSE_TYPE::Max)
|
||||||
{
|
{
|
||||||
|
@ -116,11 +120,6 @@ VOID CAvailableApplicationInfo::RetrieveLicenseType()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CAvailableApplicationInfo::RetrieveCategory()
|
|
||||||
{
|
|
||||||
Category = ParserGetInt(L"Category", sFileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CAvailableApplicationInfo::HasLanguageInfo() const
|
BOOL CAvailableApplicationInfo::HasLanguageInfo() const
|
||||||
{
|
{
|
||||||
return m_HasLanguageInfo;
|
return m_HasLanguageInfo;
|
||||||
|
@ -133,19 +132,52 @@ BOOL CAvailableApplicationInfo::HasNativeLanguage() const
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: make the actual check
|
//Find locale code in the list
|
||||||
return TRUE;
|
const INT nLanguagesSize = Languages.GetSize();
|
||||||
|
for (INT i = 0; i < nLanguagesSize; ++i)
|
||||||
|
{
|
||||||
|
if (Languages[i] == CConfigParser::GetLocale())
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CAvailableApplicationInfo::HasEnglishLanguage() const
|
BOOL CAvailableApplicationInfo::HasEnglishLanguage() const
|
||||||
{
|
{
|
||||||
|
static ATL::CStringW szEnglishLocaleID;
|
||||||
|
const INT cchLocaleSize = m_Parser.GetLocaleSize();
|
||||||
if (!m_HasLanguageInfo)
|
if (!m_HasLanguageInfo)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: make the actual check
|
//Get English locale code
|
||||||
return TRUE;
|
if (szEnglishLocaleID.IsEmpty())
|
||||||
|
{
|
||||||
|
INT result = GetLocaleInfoW(MAKELCID(LANG_ENGLISH, SORT_DEFAULT), LOCALE_ILANGUAGE,
|
||||||
|
szEnglishLocaleID.GetBuffer(cchLocaleSize), cchLocaleSize);
|
||||||
|
szEnglishLocaleID.ReleaseBuffer();
|
||||||
|
if (result != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Find locale code in the list
|
||||||
|
const INT nLanguagesSize = Languages.GetSize();
|
||||||
|
for (INT i = 0; i < nLanguagesSize; ++i)
|
||||||
|
{
|
||||||
|
if (Languages[i] == szEnglishLocaleID)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CAvailableApplicationInfo::IsInstalled() const
|
BOOL CAvailableApplicationInfo::IsInstalled() const
|
||||||
|
@ -170,13 +202,14 @@ VOID CAvailableApplicationInfo::SetLastWriteTime(FILETIME* ftTime)
|
||||||
|
|
||||||
inline BOOL CAvailableApplicationInfo::GetString(LPCWSTR lpKeyName, ATL::CStringW& ReturnedString)
|
inline BOOL CAvailableApplicationInfo::GetString(LPCWSTR lpKeyName, ATL::CStringW& ReturnedString)
|
||||||
{
|
{
|
||||||
if (!ParserGetString(lpKeyName, sFileName, ReturnedString))
|
if (!m_Parser.GetString(lpKeyName, ReturnedString))
|
||||||
{
|
{
|
||||||
ReturnedString.Empty();
|
ReturnedString.Empty();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
// CAvailableApplicationInfo
|
||||||
|
|
||||||
// CAvailableApps
|
// CAvailableApps
|
||||||
CAvailableApps::CAvailableApps()
|
CAvailableApps::CAvailableApps()
|
||||||
|
@ -277,7 +310,7 @@ BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnu
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/* loop for all the cached entries */
|
// loop for all the cached entries
|
||||||
POSITION CurrentListPosition = m_InfoList.GetHeadPosition();
|
POSITION CurrentListPosition = m_InfoList.GetHeadPosition();
|
||||||
CAvailableApplicationInfo* Info = NULL;
|
CAvailableApplicationInfo* Info = NULL;
|
||||||
|
|
||||||
|
@ -286,13 +319,13 @@ BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnu
|
||||||
POSITION LastListPosition = CurrentListPosition;
|
POSITION LastListPosition = CurrentListPosition;
|
||||||
Info = m_InfoList.GetNext(CurrentListPosition);
|
Info = m_InfoList.GetNext(CurrentListPosition);
|
||||||
|
|
||||||
/* do we already have this entry in cache? */
|
// do we already have this entry in cache?
|
||||||
if (Info->sFileName == FindFileData.cFileName)
|
if (Info->sFileName == FindFileData.cFileName)
|
||||||
{
|
{
|
||||||
/* is it current enough, or the file has been modified since our last time here? */
|
// is it current enough, or the file has been modified since our last time here?
|
||||||
if (CompareFileTime(&FindFileData.ftLastWriteTime, &Info->ftCacheStamp) == 1)
|
if (CompareFileTime(&FindFileData.ftLastWriteTime, &Info->ftCacheStamp) == 1)
|
||||||
{
|
{
|
||||||
/* recreate our cache, this is the slow path */
|
// recreate our cache, this is the slow path
|
||||||
m_InfoList.RemoveAt(LastListPosition);
|
m_InfoList.RemoveAt(LastListPosition);
|
||||||
|
|
||||||
delete Info;
|
delete Info;
|
||||||
|
@ -301,16 +334,16 @@ BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnu
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* speedy path, compare directly, we already have the data */
|
// speedy path, compare directly, we already have the data
|
||||||
goto skip_if_cached;
|
goto skip_if_cached;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create a new entry */
|
// create a new entry
|
||||||
Info = new CAvailableApplicationInfo(FindFileData.cFileName);
|
Info = new CAvailableApplicationInfo(FindFileData.cFileName);
|
||||||
|
|
||||||
/* set a timestamp for the next time */
|
// set a timestamp for the next time
|
||||||
Info->SetLastWriteTime(&FindFileData.ftLastWriteTime);
|
Info->SetLastWriteTime(&FindFileData.ftLastWriteTime);
|
||||||
m_InfoList.AddTail(Info);
|
m_InfoList.AddTail(Info);
|
||||||
|
|
||||||
|
@ -361,3 +394,112 @@ const LPCWSTR CAvailableApps::GetCabPathString()
|
||||||
{
|
{
|
||||||
return m_szPath.GetString();
|
return m_szPath.GetString();
|
||||||
}
|
}
|
||||||
|
// CAvailableApps
|
||||||
|
|
||||||
|
// CConfigParser
|
||||||
|
ATL::CStringW CConfigParser::m_szLocale;
|
||||||
|
ATL::CStringW CConfigParser::m_szCachedINISectionLocale;
|
||||||
|
ATL::CStringW CConfigParser::m_szCachedINISectionLocaleNeutral;
|
||||||
|
|
||||||
|
CConfigParser::CConfigParser(const ATL::CStringW& FileName) : szConfigPath(GetINIFullPath(FileName))
|
||||||
|
{
|
||||||
|
// we don't have cached section strings for the current system language, create them, lazy
|
||||||
|
CacheINILocaleLazy();
|
||||||
|
}
|
||||||
|
|
||||||
|
ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
|
||||||
|
{
|
||||||
|
ATL::CStringW szDir;
|
||||||
|
static ATL::CStringW szBuffer;
|
||||||
|
|
||||||
|
GetStorageDirectory(szDir);
|
||||||
|
szBuffer.Format(L"%ls\\rapps\\%ls", szDir, FileName);
|
||||||
|
|
||||||
|
return szBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID CConfigParser::CacheINILocaleLazy()
|
||||||
|
{
|
||||||
|
if (m_szLocale.IsEmpty())
|
||||||
|
{
|
||||||
|
// TODO: Set default locale if call fails
|
||||||
|
// find out what is the current system lang code (e.g. "0a") and append it to SectionLocale
|
||||||
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE,
|
||||||
|
m_szLocale.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
|
||||||
|
m_szLocale.ReleaseBuffer();
|
||||||
|
m_szCachedINISectionLocale = L"Section." + m_szLocale;
|
||||||
|
|
||||||
|
// turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part
|
||||||
|
m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocale.Right(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ATL::CStringW& CConfigParser::GetLocale()
|
||||||
|
{
|
||||||
|
CacheINILocaleLazy();
|
||||||
|
return m_szLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT CConfigParser::GetLocaleSize()
|
||||||
|
{
|
||||||
|
return m_cchLocaleSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT CConfigParser::GetString(const ATL::CStringW& KeyName, ATL::CStringW& ResultString)
|
||||||
|
{
|
||||||
|
DWORD dwResult;
|
||||||
|
|
||||||
|
LPWSTR ResultStringBuffer = ResultString.GetBuffer(MAX_PATH);
|
||||||
|
// 1st - find localized strings (e.g. "Section.0c0a")
|
||||||
|
dwResult = GetPrivateProfileStringW(m_szCachedINISectionLocale.GetString(),
|
||||||
|
KeyName.GetString(),
|
||||||
|
NULL,
|
||||||
|
ResultStringBuffer,
|
||||||
|
MAX_PATH,
|
||||||
|
szConfigPath.GetString());
|
||||||
|
|
||||||
|
if (!dwResult)
|
||||||
|
{
|
||||||
|
// 2nd - if they weren't present check for neutral sub-langs/ generic translations (e.g. "Section.0a")
|
||||||
|
dwResult = GetPrivateProfileStringW(m_szCachedINISectionLocaleNeutral.GetString(),
|
||||||
|
KeyName.GetString(),
|
||||||
|
NULL,
|
||||||
|
ResultStringBuffer,
|
||||||
|
MAX_PATH,
|
||||||
|
szConfigPath.GetString());
|
||||||
|
if (!dwResult)
|
||||||
|
{
|
||||||
|
// 3rd - if they weren't present fallback to standard english strings (just "Section")
|
||||||
|
dwResult = GetPrivateProfileStringW(L"Section",
|
||||||
|
KeyName.GetString(),
|
||||||
|
NULL,
|
||||||
|
ResultStringBuffer,
|
||||||
|
MAX_PATH,
|
||||||
|
szConfigPath.GetString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultString.ReleaseBuffer();
|
||||||
|
return (dwResult != 0 ? TRUE : FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
|
||||||
|
{
|
||||||
|
ATL::CStringW Buffer;
|
||||||
|
UNICODE_STRING BufferW;
|
||||||
|
ULONG Result;
|
||||||
|
|
||||||
|
// grab the text version of our entry
|
||||||
|
if (!GetString(KeyName, Buffer))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (Buffer.IsEmpty())
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// convert it to an actual integer
|
||||||
|
RtlInitUnicodeString(&BufferW, Buffer.GetString());
|
||||||
|
RtlUnicodeStringToInteger(&BufferW, 0, &Result);
|
||||||
|
|
||||||
|
return (UINT) Result;
|
||||||
|
}
|
||||||
|
// CConfigParser
|
||||||
|
|
|
@ -102,35 +102,50 @@ class CAvailableAppView
|
||||||
|
|
||||||
static VOID InsertLanguageInfo_RichEdit(CAvailableApplicationInfo* Info)
|
static VOID InsertLanguageInfo_RichEdit(CAvailableApplicationInfo* Info)
|
||||||
{
|
{
|
||||||
|
if (!Info->HasLanguageInfo())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const INT nTranslations = Info->Languages.GetSize();
|
const INT nTranslations = Info->Languages.GetSize();
|
||||||
ATL::CStringW szLangInfo;
|
ATL::CStringW szLangInfo;
|
||||||
ATL::CStringW szLoadedTextAvailability;
|
ATL::CStringW szLoadedTextAvailability;
|
||||||
ATL::CStringW szLoadedAInfoText;
|
ATL::CStringW szLoadedAInfoText;
|
||||||
szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES);
|
szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES);
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: replace those hardcoded strings
|
||||||
if (Info->HasNativeLanguage())
|
if (Info->HasNativeLanguage())
|
||||||
{
|
{
|
||||||
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION);
|
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION);
|
||||||
|
if (nTranslations > 1)
|
||||||
|
{
|
||||||
|
szLangInfo.Format(L" (+%d more)", nTranslations - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
|
||||||
|
szLangInfo = L" (" + szLangInfo + L")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Info->HasEnglishLanguage())
|
else if (Info->HasEnglishLanguage())
|
||||||
{
|
{
|
||||||
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION);
|
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION);
|
||||||
|
if (nTranslations > 1)
|
||||||
|
{
|
||||||
|
szLangInfo.Format(L" (+%d available)", nTranslations - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
|
||||||
|
szLangInfo = L" (" + szLangInfo + L")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_NO_TRANSLATION);
|
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_NO_TRANSLATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nTranslations > 1)
|
|
||||||
{
|
|
||||||
szLangInfo.Format(L" (+%d more)", nTranslations - 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
|
|
||||||
szLangInfo = L" (" + szLangInfo + L")";
|
|
||||||
}
|
|
||||||
|
|
||||||
InsertRichEditText(szLoadedAInfoText, CFE_BOLD);
|
InsertRichEditText(szLoadedAInfoText, CFE_BOLD);
|
||||||
InsertRichEditText(szLoadedTextAvailability, NULL);
|
InsertRichEditText(szLoadedTextAvailability, NULL);
|
||||||
InsertRichEditText(szLangInfo, CFE_ITALIC);
|
InsertRichEditText(szLangInfo, CFE_ITALIC);
|
||||||
|
|
|
@ -228,9 +228,8 @@ END
|
||||||
|
|
||||||
STRINGTABLE
|
STRINGTABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_LANGUAGE_AVAILABLE_TRANSLATION "In your language"
|
IDS_LANGUAGE_AVAILABLE_TRANSLATION "Supports your language"
|
||||||
IDS_LANGUAGE_NO_TRANSLATION "In your language"
|
IDS_LANGUAGE_NO_TRANSLATION "Supports other languages"
|
||||||
IDS_LANGUAGE_NOT_AVAILABLE "No translations"
|
IDS_LANGUAGE_ENGLISH_TRANSLATION "Supports English"
|
||||||
IDS_LANGUAGE_ENGLISH_TRANSLATION "In English"
|
|
||||||
IDS_LANGUAGE_SINGLE "Single language"
|
IDS_LANGUAGE_SINGLE "Single language"
|
||||||
END
|
END
|
||||||
|
|
|
@ -223,4 +223,12 @@ BEGIN
|
||||||
IDS_LICENSE_OPENSOURCE "Свободное ПО"
|
IDS_LICENSE_OPENSOURCE "Свободное ПО"
|
||||||
IDS_LICENSE_FREEWARE "Бесплатное ПО"
|
IDS_LICENSE_FREEWARE "Бесплатное ПО"
|
||||||
IDS_LICENSE_TRIAL "Пробная версия"
|
IDS_LICENSE_TRIAL "Пробная версия"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_LANGUAGE_AVAILABLE_TRANSLATION "Доступно на вашем языке"
|
||||||
|
IDS_LANGUAGE_NO_TRANSLATION "Доступно на других языках"
|
||||||
|
IDS_LANGUAGE_ENGLISH_TRANSLATION "Доступно на Английском"
|
||||||
|
IDS_LANGUAGE_SINGLE "Один язык"
|
||||||
END
|
END
|
|
@ -231,4 +231,12 @@ BEGIN
|
||||||
IDS_LICENSE_OPENSOURCE "Вільне ПЗ"
|
IDS_LICENSE_OPENSOURCE "Вільне ПЗ"
|
||||||
IDS_LICENSE_FREEWARE "Безкоштовне ПЗ"
|
IDS_LICENSE_FREEWARE "Безкоштовне ПЗ"
|
||||||
IDS_LICENSE_TRIAL "Пробна версія"
|
IDS_LICENSE_TRIAL "Пробна версія"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_LANGUAGE_AVAILABLE_TRANSLATION "Є переклад вашою мовою"
|
||||||
|
IDS_LANGUAGE_NO_TRANSLATION "Доступно іншими мовами"
|
||||||
|
IDS_LANGUAGE_ENGLISH_TRANSLATION "Є переклад Англійською"
|
||||||
|
IDS_LANGUAGE_SINGLE "Одна мова"
|
||||||
END
|
END
|
|
@ -15,12 +15,6 @@
|
||||||
#define EXTRACT_EXTRACTFILES 0x00000002
|
#define EXTRACT_EXTRACTFILES 0x00000002
|
||||||
|
|
||||||
static HANDLE hLog = NULL;
|
static HANDLE hLog = NULL;
|
||||||
ATL::CStringW szCachedINISectionLocale = L"Section.";
|
|
||||||
ATL::CStringW szCachedINISectionLocaleNeutral;
|
|
||||||
BYTE bCachedSectionStatus = FALSE;
|
|
||||||
|
|
||||||
#define LOCALIZED_STRING_LEN MAX_PATH
|
|
||||||
#define STR_VERSION_CURRENT L"CURRENT"
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -404,91 +398,4 @@ WriteLogMessage(WORD wType, DWORD dwEventID, LPCWSTR lpMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ATL::CStringW GetINIFullPath(const ATL::CStringW& FileName)
|
|
||||||
{
|
|
||||||
ATL::CStringW szDir;
|
|
||||||
static ATL::CStringW szBuffer;
|
|
||||||
|
|
||||||
GetStorageDirectory(szDir);
|
|
||||||
szBuffer.Format(L"%ls\\rapps\\%ls", szDir, FileName);
|
|
||||||
|
|
||||||
return szBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT ParserGetString(const ATL::CStringW& KeyName, const ATL::CStringW& FileName, ATL::CStringW& ResultString)
|
|
||||||
{
|
|
||||||
ATL::CStringW FullFileName = GetINIFullPath(FileName);
|
|
||||||
DWORD dwResult;
|
|
||||||
|
|
||||||
/* we don't have cached section strings for the current system language, create them */
|
|
||||||
if (bCachedSectionStatus == FALSE)
|
|
||||||
{
|
|
||||||
ATL::CStringW szLocale;
|
|
||||||
const INT LocaleSize = 5;
|
|
||||||
|
|
||||||
/* find out what is the current system lang code (e.g. "0a") and append it to SectionLocale */
|
|
||||||
GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
|
|
||||||
szLocale.GetBuffer(LocaleSize), LocaleSize);
|
|
||||||
szLocale.ReleaseBuffer();
|
|
||||||
|
|
||||||
/* turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part */
|
|
||||||
szCachedINISectionLocaleNeutral = szCachedINISectionLocale + szLocale.Right(2);
|
|
||||||
szCachedINISectionLocale += szLocale;
|
|
||||||
|
|
||||||
/* finally, mark us as cache-friendly for the next time */
|
|
||||||
bCachedSectionStatus = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LPWSTR ResultStringBuffer = ResultString.GetBuffer(MAX_PATH);
|
|
||||||
/* 1st - find localized strings (e.g. "Section.0c0a") */
|
|
||||||
dwResult = GetPrivateProfileStringW(szCachedINISectionLocale.GetString(),
|
|
||||||
KeyName.GetString(),
|
|
||||||
NULL,
|
|
||||||
ResultStringBuffer,
|
|
||||||
LOCALIZED_STRING_LEN,
|
|
||||||
FullFileName.GetString());
|
|
||||||
|
|
||||||
if (!dwResult)
|
|
||||||
{
|
|
||||||
/* 2nd - if they weren't present check for neutral sub-langs/ generic translations (e.g. "Section.0a") */
|
|
||||||
dwResult = GetPrivateProfileStringW(szCachedINISectionLocaleNeutral.GetString(),
|
|
||||||
KeyName.GetString(),
|
|
||||||
NULL,
|
|
||||||
ResultStringBuffer,
|
|
||||||
LOCALIZED_STRING_LEN,
|
|
||||||
FullFileName.GetString());
|
|
||||||
if (!dwResult)
|
|
||||||
{
|
|
||||||
/* 3rd - if they weren't present fallback to standard english strings (just "Section") */
|
|
||||||
dwResult = GetPrivateProfileStringW(L"Section",
|
|
||||||
KeyName.GetString(),
|
|
||||||
NULL,
|
|
||||||
ResultStringBuffer,
|
|
||||||
LOCALIZED_STRING_LEN,
|
|
||||||
FullFileName.GetString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultString.ReleaseBuffer();
|
|
||||||
return (dwResult != 0 ? TRUE : FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT ParserGetInt(const ATL::CStringW& KeyName, const ATL::CStringW& FileName)
|
|
||||||
{
|
|
||||||
ATL::CStringW Buffer;
|
|
||||||
UNICODE_STRING BufferW;
|
|
||||||
ULONG Result;
|
|
||||||
|
|
||||||
/* grab the text version of our entry */
|
|
||||||
if (!ParserGetString(KeyName, FileName, Buffer))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (Buffer.IsEmpty())
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* convert it to an actual integer */
|
|
||||||
RtlInitUnicodeString(&BufferW, Buffer.GetString());
|
|
||||||
RtlUnicodeStringToInteger(&BufferW, 0, &Result);
|
|
||||||
|
|
||||||
return (UINT) Result;
|
|
||||||
}
|
|
||||||
|
|
|
@ -143,18 +143,38 @@ typedef struct
|
||||||
} SETTINGS_INFO, *PSETTINGS_INFO;
|
} SETTINGS_INFO, *PSETTINGS_INFO;
|
||||||
|
|
||||||
/* available.cpp */
|
/* available.cpp */
|
||||||
|
class CConfigParser
|
||||||
|
{
|
||||||
|
// Loacale names cache
|
||||||
|
static ATL::CStringW m_szLocale;
|
||||||
|
const static INT m_cchLocaleSize = 5;
|
||||||
|
static ATL::CStringW m_szCachedINISectionLocale;
|
||||||
|
static ATL::CStringW m_szCachedINISectionLocaleNeutral;
|
||||||
|
|
||||||
|
const LPCWSTR STR_VERSION_CURRENT = L"CURRENT";
|
||||||
|
const ATL::CStringW szConfigPath;
|
||||||
|
|
||||||
|
static ATL::CStringW GetINIFullPath(const ATL::CStringW& FileName);
|
||||||
|
static VOID CacheINILocaleLazy();
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const ATL::CStringW& GetLocale();
|
||||||
|
static INT CConfigParser::GetLocaleSize();
|
||||||
|
|
||||||
|
CConfigParser(const ATL::CStringW& FileName);
|
||||||
|
|
||||||
|
UINT GetString(const ATL::CStringW& KeyName, ATL::CStringW& ResultString);
|
||||||
|
UINT GetInt(const ATL::CStringW& KeyName);
|
||||||
|
};
|
||||||
|
|
||||||
typedef BOOL (CALLBACK *AVAILENUMPROC)(PAPPLICATION_INFO Info, LPCWSTR szFolderPath);
|
typedef BOOL (CALLBACK *AVAILENUMPROC)(PAPPLICATION_INFO Info, LPCWSTR szFolderPath);
|
||||||
struct CAvailableApplicationInfo : public APPLICATION_INFO
|
struct CAvailableApplicationInfo : public APPLICATION_INFO
|
||||||
{
|
{
|
||||||
ATL::CStringW szInstalledVersion;
|
ATL::CStringW szInstalledVersion;
|
||||||
|
|
||||||
CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam);
|
CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam);
|
||||||
|
|
||||||
// Load all info from the file
|
// Load all info from the file
|
||||||
VOID RefreshAppInfo();
|
VOID RefreshAppInfo();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOL HasLanguageInfo() const;
|
BOOL HasLanguageInfo() const;
|
||||||
BOOL HasNativeLanguage() const;
|
BOOL HasNativeLanguage() const;
|
||||||
BOOL HasEnglishLanguage() const;
|
BOOL HasEnglishLanguage() const;
|
||||||
|
@ -169,17 +189,17 @@ private:
|
||||||
BOOL m_IsInstalled = FALSE;
|
BOOL m_IsInstalled = FALSE;
|
||||||
BOOL m_HasLanguageInfo = FALSE;
|
BOOL m_HasLanguageInfo = FALSE;
|
||||||
BOOL m_HasInstalledVersion = FALSE;
|
BOOL m_HasInstalledVersion = FALSE;
|
||||||
|
CConfigParser m_Parser;
|
||||||
|
|
||||||
inline BOOL GetString(LPCWSTR lpKeyName,
|
inline BOOL GetString(LPCWSTR lpKeyName,
|
||||||
ATL::CStringW& ReturnedString);
|
ATL::CStringW& ReturnedString);
|
||||||
|
|
||||||
// Lazily load general info from the file
|
// Lazily load general info from the file
|
||||||
BOOL RetrieveGeneralInfo();
|
VOID RetrieveGeneralInfo();
|
||||||
VOID RetrieveInstalledStatus();
|
VOID RetrieveInstalledStatus();
|
||||||
VOID RetrieveInstalledVersion();
|
VOID RetrieveInstalledVersion();
|
||||||
BOOL RetrieveLanguages();
|
VOID RetrieveLanguages();
|
||||||
VOID RetrieveLicenseType();
|
VOID RetrieveLicenseType();
|
||||||
VOID RetrieveCategory();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CAvailableApps
|
class CAvailableApps
|
||||||
|
@ -248,9 +268,6 @@ VOID InitLogs(VOID);
|
||||||
VOID FreeLogs(VOID);
|
VOID FreeLogs(VOID);
|
||||||
BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPCWSTR lpMsg);
|
BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPCWSTR lpMsg);
|
||||||
|
|
||||||
UINT ParserGetString(const ATL::CStringW& KeyName, const ATL::CStringW& FileName, ATL::CStringW& ReturnedString);
|
|
||||||
UINT ParserGetInt(const ATL::CStringW& KeyName, const ATL::CStringW& FileName);
|
|
||||||
|
|
||||||
/* settingsdlg.cpp */
|
/* settingsdlg.cpp */
|
||||||
VOID CreateSettingsDlg(HWND hwnd);
|
VOID CreateSettingsDlg(HWND hwnd);
|
||||||
|
|
||||||
|
|
|
@ -181,9 +181,8 @@
|
||||||
/* Language related strings */
|
/* Language related strings */
|
||||||
#define IDS_LANGUAGE_AVAILABLE_TRANSLATION 910
|
#define IDS_LANGUAGE_AVAILABLE_TRANSLATION 910
|
||||||
#define IDS_LANGUAGE_NO_TRANSLATION 911
|
#define IDS_LANGUAGE_NO_TRANSLATION 911
|
||||||
#define IDS_LANGUAGE_NOT_AVAILABLE 912
|
#define IDS_LANGUAGE_ENGLISH_TRANSLATION 912
|
||||||
#define IDS_LANGUAGE_ENGLISH_TRANSLATION 913
|
#define IDS_LANGUAGE_SINGLE 913
|
||||||
#define IDS_LANGUAGE_SINGLE 914
|
|
||||||
|
|
||||||
/* Accelerators */
|
/* Accelerators */
|
||||||
#define HOTKEYS 715
|
#define HOTKEYS 715
|
||||||
|
|
Loading…
Reference in a new issue