diff --git a/src/util/platform.cpp b/src/util/platform.cpp index e61329d04..c4a3500f4 100644 --- a/src/util/platform.cpp +++ b/src/util/platform.cpp @@ -3,30 +3,62 @@ #include #include #include +#include #include "../typedefs.h" -std::string platform::detect_locale() { - // TODO: implement - std::string name = setlocale(LC_ALL, nullptr); - if (name.find("ru_RU") != std::string::npos) { +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 "en_US"; + return DEFAULT_LOCALE; } #ifdef WIN32 #include +#include "./stringutil.h" + void platform::configure_encoding() { // set utf-8 encoding to console output SetConsoleOutputCP(CP_UTF8); setvbuf(stdout, nullptr, _IOFBF, 1000); } +std::string platform::detect_locale() { + LCID lcid = GetThreadLocale(); + wchar_t preferredLocaleName[LOCALE_NAME_MAX_LENGTH]; + 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::wcout << "detected environment language locale: " << parentLocaleName << std::endl; + + std::string preferredLang = util::wstr2str_utf8(parentLocaleName); + return get_locale_by_lang(preferredLang); +} + #else void platform::configure_encoding(){ } -#endif +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; + setlocale(LC_ALL, programLocaleName.c_str()); + + std::string preferredLang = preferredLocaleName.substr(0, 2); + return get_locale_by_lang(preferredLang); +} + +#endif \ No newline at end of file diff --git a/src/util/platform.h b/src/util/platform.h index 66b7917cc..f955cd550 100644 --- a/src/util/platform.h +++ b/src/util/platform.h @@ -6,6 +6,7 @@ namespace platform { extern void configure_encoding(); 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