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; }
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(); }
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; }
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; }