[langswitcher] Use winapi to edit ini file.

This commit is contained in:
lzwdgc 2024-02-25 19:23:45 +03:00
parent 9bfb5384c9
commit 7efbef37cc

View file

@ -32,9 +32,8 @@ void err(const std::wstring &s) {
} }
struct cfg { struct cfg {
fs::path cfgfn; fs::path cfgfn;
std::string findstr = "TextFile="s; const wchar_t *sectionstr = L"PATH";
size_t pos{UINT64_MAX},pose{UINT64_MAX}; const wchar_t *keystr = L"TextFile";
std::string s;
cfg() { cfg() {
if (fs::exists(datadir / "data")) { if (fs::exists(datadir / "data")) {
@ -46,21 +45,17 @@ struct cfg {
cfgfn = datadir / "config" / "cfg.ini"; cfgfn = datadir / "config" / "cfg.ini";
} }
std::wstring get_current_lang() { std::wstring get_current_lang() {
s = read_file(cfgfn); std::wstring fn(256,0);
pos = s.find(findstr); GetPrivateProfileStringW(sectionstr, keystr, 0, fn.data(), fn.size(), cfgfn.wstring().c_str());
if (pos == -1) { if (GetLastError() != 0) {
err(L"cant find"); err(L"can't read file");
return {};
} }
pose = s.find_first_of("\r\n", pos); fn = fn.c_str();
fs::path fn = s.substr(pos + findstr.size(), pose - (pos + findstr.size())); auto w = fs::path{fn}.stem().wstring();
auto w = fn.stem().wstring();
std::transform(w.begin(), w.end(), w.begin(), ::towlower); std::transform(w.begin(), w.end(), w.begin(), ::towlower);
auto tofind = L"quest_"s; auto tofind = L"quest_"s;
if (w.starts_with(tofind)) { if (w.starts_with(tofind)) {
auto lang = w.substr(tofind.size()); return w.substr(tofind.size());
std::transform(lang.begin(), lang.end(), lang.begin(), ::tolower);
return lang;
} }
return L"no language set (your default language)"; return L"no language set (your default language)";
} }
@ -68,9 +63,10 @@ struct cfg {
if (lang.contains(L' ') || lang.contains(L" ")) { if (lang.contains(L' ') || lang.contains(L" ")) {
return false; return false;
} }
auto out = s.substr(0, pos + findstr.size()) + std::format("Data\\Quest_{}.dat", fs::path{lang}.string()) + s.substr(pose); auto fn = std::format(L"Data\\Quest_{}.dat", lang);
write_file(cfgfn, out); if (!WritePrivateProfileStringW(sectionstr, keystr, fn.c_str(), cfgfn.wstring().c_str())) {
write_file(cfgfn.parent_path() / "language.txt", fs::path{lang}.string()); return false;
}
return true; return true;
} }
} c; } c;
@ -141,12 +137,12 @@ struct DemoApp {
continue; continue;
} }
auto q = fn.path().stem().wstring(); auto q = fn.path().stem().wstring();
std::transform(q.begin(), q.end(), q.begin(), ::towlower);
auto tofind = L"quest_"s; auto tofind = L"quest_"s;
if (!q.starts_with(tofind)) { if (!q.starts_with(tofind)) {
continue; continue;
} }
auto lang = q.substr(tofind.size()); auto lang = q.substr(tofind.size());
std::transform(lang.begin(), lang.end(), lang.begin(), ::towlower);
langs.insert(lang); langs.insert(lang);
} }
auto [it,_] = langs.insert(c.get_current_lang()); auto [it,_] = langs.insert(c.get_current_lang());