示例#1
0
std::tuple<os::fs::file, string, uintptr_t> OpenLangFile(string_view const Path, string_view const Mask, string_view const Language)
{
	FN_RETURN_TYPE(OpenLangFile) CurrentFileData, EnglishFileData;

	for (const auto& FindData: os::fs::enum_files(path::join(Path, Mask)))
	{
		const auto CurrentFileName = path::join(Path, FindData.FileName);

		auto& CurrentFile = std::get<0>(CurrentFileData);
		auto& CurrentLngName = std::get<1>(CurrentFileData);
		auto& CurrentCodepage = std::get<2>(CurrentFileData);

		CurrentFile = os::fs::file(CurrentFileName, FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING);
		if (CurrentFile)
		{
			CurrentCodepage = GetFileCodepage(CurrentFile, encoding::codepage::oem(), nullptr, false);

			if (GetLangParam(CurrentFile, L"Language"sv, CurrentLngName, nullptr, CurrentCodepage) && equal_icase(CurrentLngName, Language))
			{
				return CurrentFileData;
			}

			if (equal_icase(CurrentLngName, L"English"sv))
			{
				EnglishFileData = std::move(CurrentFileData);
			}
		}
	}

	if (std::get<0>(EnglishFileData))
		return EnglishFileData;

	return CurrentFileData;
}
示例#2
0
bool OpenLangFile(api::File& LangFile, const string& Path,const string& Mask,const string& Language, string &strFileName, uintptr_t &nCodePage, bool StrongLang,string *pstrLangName)
{
	strFileName.clear();
	string strFullName, strEngFileName;
	api::FAR_FIND_DATA FindData;
	string strLangName;
	ScanTree ScTree(false, false);
	ScTree.SetFindPath(Path,Mask);

	while (ScTree.GetNextName(&FindData, strFullName))
	{
		strFileName = strFullName;

		if (!LangFile.Open(strFileName, FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING))
		{
			strFileName.clear();
		}
		else
		{
			GetFileFormat(LangFile, nCodePage, nullptr, false);

			if (GetLangParam(LangFile,L"Language",&strLangName,nullptr, nCodePage) && !StrCmpI(strLangName, Language))
				break;

			LangFile.Close();

			if (StrongLang)
			{
				strFileName.clear();
				strEngFileName.clear();
				break;
			}

			if (!StrCmpI(strLangName.data(),L"English"))
				strEngFileName = strFileName;
		}
	}

	if (!LangFile.Opened())
	{
		if (!strEngFileName.empty())
			strFileName = strEngFileName;

		if (!strFileName.empty())
		{
			LangFile.Open(strFileName, FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING);

			if (pstrLangName)
				*pstrLangName=L"English";
		}
	}

	return LangFile.Opened();
}
示例#3
0
static bool SelectLanguage(bool HelpLanguage)
{
	const wchar_t *Title,*Mask;
	StringOption *strDest;

	if (HelpLanguage)
	{
		Title=MSG(MHelpLangTitle);
		Mask=Global->HelpFileMask;
		strDest=&Global->Opt->strHelpLanguage;
	}
	else
	{
		Title=MSG(MLangTitle);
		Mask=LangFileMask;
		strDest=&Global->Opt->strLanguage;
	}

	VMenu2 LangMenu(Title,nullptr,0,ScrY-4);
	LangMenu.SetFlags(VMENU_WRAPMODE);
	LangMenu.SetPosition(ScrX/2-8+5*HelpLanguage,ScrY/2-4+2*HelpLanguage,0,0);
	string strFullName;
	api::FAR_FIND_DATA FindData;
	ScanTree ScTree(false, false);
	ScTree.SetFindPath(Global->g_strFarPath, Mask);

	while (ScTree.GetNextName(&FindData,strFullName))
	{
		api::File LangFile;
		if (!LangFile.Open(strFullName, FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING))
			continue;

		uintptr_t nCodePage=CP_OEMCP;
		GetFileFormat(LangFile, nCodePage, nullptr, false);
		string strLangName, strLangDescr;

		if (GetLangParam(LangFile,L"Language",&strLangName,&strLangDescr,nCodePage))
		{
			string strEntryName;

			if (!HelpLanguage || (!GetLangParam(LangFile,L"PluginContents",&strEntryName,nullptr,nCodePage) &&
			                      !GetLangParam(LangFile,L"DocumentContents",&strEntryName,nullptr,nCodePage)))
			{
				MenuItemEx LangMenuItem(str_printf(L"%.40s", !strLangDescr.empty() ? strLangDescr.data():strLangName.data()));

				/* $ 01.08.2001 SVS
				   Не допускаем дубликатов!
				   Если в каталог с ФАРом положить еще один HLF с одноименным
				   языком, то... фигня получается при выборе языка.
				*/
				if (LangMenu.FindItem(0,LangMenuItem.strName,LIFIND_EXACTMATCH) == -1)
				{
					LangMenuItem.SetSelect(!StrCmpI(*strDest, strLangName));
					LangMenu.SetUserData(strLangName.data(), (strLangName.size()+1)*sizeof(wchar_t), LangMenu.AddItem(LangMenuItem));
				}
			}
		}
	}

	LangMenu.AssignHighlights(FALSE);
	LangMenu.Run();

	if (LangMenu.GetExitCode()<0)
		return false;

	*strDest = static_cast<const wchar_t*>(LangMenu.GetUserData(nullptr, 0));
	return true;
}
示例#4
0
static bool SelectLanguage(bool HelpLanguage, string& Dest)
{
	lng Title;
	string_view Mask;

	if (HelpLanguage)
	{
		Title = lng::MHelpLangTitle;
		Mask=Global->HelpFileMask;
	}
	else
	{
		Title = lng::MLangTitle;
		Mask=LangFileMask;
	}

	const auto LangMenu = VMenu2::create(msg(Title), {}, ScrY - 4);
	LangMenu->SetMenuFlags(VMENU_WRAPMODE);
	LangMenu->SetPosition(ScrX/2-8+5*HelpLanguage,ScrY/2-4+2*HelpLanguage,0,0);

	for (const auto& FindData: os::fs::enum_files(path::join(Global->g_strFarPath, Mask)))
	{
		const os::fs::file LangFile(path::join(Global->g_strFarPath, FindData.FileName), FILE_READ_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING);
		if (!LangFile)
			continue;

		const auto Codepage = GetFileCodepage(LangFile, encoding::codepage::oem(), nullptr, false);

		string strLangName, strLangDescr;

		if (GetLangParam(LangFile, L"Language"sv, strLangName, &strLangDescr, Codepage))
		{
			string strEntryName;

			if (!HelpLanguage || (
				!GetLangParam(LangFile, L"PluginContents"sv, strEntryName, nullptr, Codepage) &&
				!GetLangParam(LangFile, L"DocumentContents"sv, strEntryName, nullptr, Codepage)))
			{
				MenuItemEx LangMenuItem(!strLangDescr.empty()? strLangDescr : strLangName);

				/* $ 01.08.2001 SVS
				   Не допускаем дубликатов!
				   Если в каталог с ФАРом положить еще один HLF с одноименным
				   языком, то... фигня получается при выборе языка.
				*/
				if (LangMenu->FindItem(0,LangMenuItem.Name,LIFIND_EXACTMATCH) == -1)
				{
					LangMenuItem.SetSelect(equal_icase(Dest, strLangName));
					LangMenuItem.ComplexUserData = strLangName;
					LangMenu->AddItem(LangMenuItem);
				}
			}
		}
	}

	LangMenu->AssignHighlights(FALSE);
	LangMenu->Run();

	if (LangMenu->GetExitCode()<0)
		return false;

	Dest = *LangMenu->GetComplexUserDataPtr<string>();
	return true;
}