From 307df37ba76b92a118518239924dc139b085b234 Mon Sep 17 00:00:00 2001 From: A-lex-Ra Date: Tue, 26 Dec 2023 19:54:03 +0600 Subject: [PATCH 1/2] improve locale detection as much as possible --- src/engine.cpp | 2 +- src/frontend/locale/langs.cpp | 25 ++++++++++++++++++++++++- src/frontend/locale/langs.h | 3 +++ src/util/platform.cpp | 32 ++++++-------------------------- src/util/platform.h | 2 +- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/engine.cpp b/src/engine.cpp index 63762f09d..84583d779 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -68,7 +68,7 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) Audio::initialize(); gui = new gui::GUI(); if (settings.ui.language == "auto") { - settings.ui.language = platform::detect_locale(); + settings.ui.language = langs::locale_by_envlocale(platform::detect_locale(), paths->getResources()); } setLanguage(settings.ui.language); std::cout << "-- initializing finished" << std::endl; diff --git a/src/frontend/locale/langs.cpp b/src/frontend/locale/langs.cpp index 762e27566..af39b069f 100644 --- a/src/frontend/locale/langs.cpp +++ b/src/frontend/locale/langs.cpp @@ -77,6 +77,7 @@ void langs::loadLocalesInfo(const path& resdir, string& fallback) { auto langs = root->obj("langs"); if (langs) { + std::cout << "locales "; for (auto& entry : langs->map) { auto langInfo = entry.second; @@ -87,9 +88,31 @@ void langs::loadLocalesInfo(const path& resdir, string& fallback) { continue; } - std::cout << "locale " << entry.first << " (" << name << ") added" << std::endl; + std::cout << "[" << entry.first << " (" << name << ")] "; langs::locales_info[entry.first] = LocaleInfo {entry.first, name}; } + std::cout << "added" << std::endl; + } +} + +std::string langs::locale_by_envlocale(const std::string& envlocale, const path& resdir){ + string fallback = FALLBACK_DEFAULT; + if (locales_info.size() == 0) { + loadLocalesInfo(resdir, fallback); + } + if (locales_info.find(envlocale) != locales_info.end()) { + std::cout << "locale " << envlocale << " is automatically selected" << std::endl; + return envlocale; + } + else { + for (const auto& loc : locales_info) { + if (loc.first.find(envlocale.substr(0, 2)) != std::string::npos) { + std::cout << "locale " << loc.first << " is automatically selected" << std::endl; + return loc.first; + } + } + std::cout << "locale " << fallback << " is automatically selected" << std::endl; + return fallback; } } diff --git a/src/frontend/locale/langs.h b/src/frontend/locale/langs.h index 7f6d916c2..5f0e5aabe 100644 --- a/src/frontend/locale/langs.h +++ b/src/frontend/locale/langs.h @@ -48,6 +48,9 @@ namespace langs { const std::filesystem::path& resdir, std::string& fallback); + extern std::string locale_by_envlocale(const std::string& envlocale, + const std::filesystem::path& resdir); + extern void load(const std::filesystem::path& resdir, const std::string& locale, const std::vector& packs, diff --git a/src/util/platform.cpp b/src/util/platform.cpp index c4a3500f4..0ffc884fa 100644 --- a/src/util/platform.cpp +++ b/src/util/platform.cpp @@ -7,18 +7,6 @@ #include "../typedefs.h" -namespace platform { - const std::string DEFAULT_LOCALE = "en_EN"; -} - -/*System locale to engine locale mapping*/ -std::string platform::get_locale_by_lang(std::string lang) { - if (lang == "ru") { - return "ru_RU"; - } - return DEFAULT_LOCALE; -} - #ifdef WIN32 #include @@ -32,18 +20,12 @@ void platform::configure_encoding() { std::string platform::detect_locale() { LCID lcid = GetThreadLocale(); - wchar_t preferredLocaleName[LOCALE_NAME_MAX_LENGTH]; + wchar_t preferredLocaleName[LOCALE_NAME_MAX_LENGTH];//locale name format: ll-CC if (LCIDToLocaleName(lcid, preferredLocaleName, LOCALE_NAME_MAX_LENGTH, 0) == 0) { - std::cout << "error in platform::detect_locale! LCIDToLocaleName failed." << std::endl; - } - wchar_t parentLocaleName[LOCALE_NAME_MAX_LENGTH]; - if (GetLocaleInfoEx(preferredLocaleName, LOCALE_SPARENT, parentLocaleName, LOCALE_NAME_MAX_LENGTH) == 0){ - std::cout << "error in platform::detect_locale! GetLocaleInfoEx failed." << std::endl; + std::cerr << "error in platform::detect_locale! LCIDToLocaleName failed." << std::endl; } - std::wcout << "detected environment language locale: " << parentLocaleName << std::endl; - - std::string preferredLang = util::wstr2str_utf8(parentLocaleName); - return get_locale_by_lang(preferredLang); + //ll_CC format + return util::wstr2str_utf8(preferredLocaleName).replace(2, 1, "_").substr(0, 5); } #else @@ -53,12 +35,10 @@ void platform::configure_encoding(){ std::string platform::detect_locale() { std::string programLocaleName = setlocale(LC_ALL, nullptr); - std::string preferredLocaleName = setlocale(LC_ALL, ""); - std::cout << "detected environment locale: " << preferredLocaleName << std::endl; + std::string preferredLocaleName = setlocale(LC_ALL, ""); //locale name format: ll_CC.encoding setlocale(LC_ALL, programLocaleName.c_str()); - std::string preferredLang = preferredLocaleName.substr(0, 2); - return get_locale_by_lang(preferredLang); + return preferredLocaleName.substr(0, 5); } #endif \ No newline at end of file diff --git a/src/util/platform.h b/src/util/platform.h index f955cd550..a53ec40cc 100644 --- a/src/util/platform.h +++ b/src/util/platform.h @@ -5,8 +5,8 @@ namespace platform { extern void configure_encoding(); + // @return environment locale in ISO format ll_CC extern std::string detect_locale(); - extern std::string get_locale_by_lang(std::string lang); } #endif // UTIL_PLATFORM_H_ \ No newline at end of file From fa1345ac0a154d35efa60adf8ebdeb08494ce136 Mon Sep 17 00:00:00 2001 From: A-lex-Ra Date: Tue, 26 Dec 2023 20:30:47 +0600 Subject: [PATCH 2/2] refactoring WorldFiles.cpp a bit --- src/files/WorldFiles.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 9e3742a66..5c82a8340 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -166,18 +166,18 @@ fs::path WorldFiles::getLightsFolder() const { return directory/fs::path("lights"); } -fs::path WorldFiles::getRegionFilename(int x, int y) const { - std::string filename = std::to_string(x) + "_" + std::to_string(y) + ".bin"; +fs::path WorldFiles::getRegionFilename(int x, int z) const { + std::string filename = std::to_string(x) + "_" + std::to_string(z) + ".bin"; return fs::path(filename); } -bool WorldFiles::parseRegionFilename(const std::string& name, int& x, int& y) { +bool WorldFiles::parseRegionFilename(const std::string& name, int& x, int& z) { size_t sep = name.find('_'); if (sep == std::string::npos || sep == 0 || sep == name.length()-1) return false; try { x = std::stoi(name.substr(0, sep)); - y = std::stoi(name.substr(sep+1)); + z = std::stoi(name.substr(sep+1)); } catch (std::invalid_argument& err) { return false; } catch (std::out_of_range& err) { @@ -248,7 +248,7 @@ files::rafile* WorldFiles::getRegFile(glm::ivec3 coord, const fs::path& folder) auto iter = std::next(openRegFiles.begin(), rand() % openRegFiles.size()); openRegFiles.erase(iter); } - fs::path filename = folder/getRegionFilename(coord.x, coord.y); + fs::path filename = folder / getRegionFilename(coord[0], coord[1]); if (!fs::is_regular_file(filename)) { return nullptr; } @@ -297,25 +297,25 @@ ubyte* WorldFiles::readChunkData(int x, return data; } -void WorldFiles::fetchChunks(WorldRegion* region, int x, int y, fs::path folder, int layer) { +void WorldFiles::fetchChunks(WorldRegion* region, int x, int z, fs::path folder, int layer) { ubyte** chunks = region->getChunks(); uint32_t* sizes = region->getSizes(); for (size_t i = 0; i < REGION_CHUNKS_COUNT; i++) { int chunk_x = (i % REGION_SIZE) + x * REGION_SIZE; - int chunk_z = (i / REGION_SIZE) + y * REGION_SIZE; + int chunk_z = (i / REGION_SIZE) + z * REGION_SIZE; if (chunks[i] == nullptr) { chunks[i] = readChunkData(chunk_x, chunk_z, sizes[i], folder, layer); } } } -void WorldFiles::writeRegion(int x, int y, WorldRegion* entry, fs::path folder, int layer){ - fs::path filename = folder/getRegionFilename(x, y); +void WorldFiles::writeRegion(int x, int z, WorldRegion* entry, fs::path folder, int layer){ + fs::path filename = folder/getRegionFilename(x, z); - glm::ivec3 regcoord(x, y, layer); + glm::ivec3 regcoord(x, z, layer); if (getRegFile(regcoord, folder)) { - fetchChunks(entry, x, y, folder, layer); + fetchChunks(entry, x, z, folder, layer); openRegFiles.erase(regcoord); } @@ -359,7 +359,7 @@ void WorldFiles::writeRegions(regionsmap& regions, const fs::path& folder, int l if (region->getChunks() == nullptr || !region->isUnsaved()) continue; glm::ivec2 key = it.first; - writeRegion(key.x, key.y, region, folder, layer); + writeRegion(key[0], key[1], region, folder, layer); } }