From: ShadowNinja Date: Thu, 15 Oct 2015 04:45:56 +0000 (-0400) Subject: Clean up gettext initialization X-Git-Tag: 0.4.14~609 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=e067ceacb8787f1dc5b1ab69b50dba4497c55433;p=oweals%2Fminetest.git Clean up gettext initialization --- diff --git a/src/gettext.cpp b/src/gettext.cpp index e8819f131..26b16f434 100644 --- a/src/gettext.cpp +++ b/src/gettext.cpp @@ -118,106 +118,90 @@ const char* MSVC_LocaleLookup(const char* raw_shortname) { /******************************************************************************/ #ifdef _MSC_VER -void init_gettext(const char *path, const std::string &configured_language, int argc, char** argv) { +void init_gettext(const char *path, const std::string &configured_language, + int argc, const char *argv[]) #else -void init_gettext(const char *path, const std::string &configured_language) { +void init_gettext(const char *path, const std::string &configured_language) #endif +{ #if USE_GETTEXT - /** first try to set user override environment **/ - if (configured_language.length() != 0) { + // First, try to set user override environment + if (!configured_language.empty()) { #ifndef _WIN32 - /* add user specified locale to environment */ + // Add user specified locale to environment setenv("LANGUAGE", configured_language.c_str(), 1); - /* reload locale with changed environment */ + // Reload locale with changed environment setlocale(LC_ALL, ""); #elif defined(_MSC_VER) - std::string current_language_var(""); - if (getenv("LANGUAGE") != 0) { - current_language_var = std::string(getenv("LANGUAGE")); - } - - char *lang_str = (char*)calloc(10 + configured_language.length(), sizeof(char)); - strcat(lang_str, "LANGUAGE="); - strcat(lang_str, configured_language.c_str()); - putenv(lang_str); + std::string current_language; + const char *env_lang = getenv("LANGUAGE"); + if (env_lang) + current_language = env_lang; - SetEnvironmentVariableA("LANGUAGE",configured_language.c_str()); + _putenv(("LANGUAGE=" + configured_language).c_str()); + SetEnvironmentVariableA("LANGUAGE", configured_language.c_str()); #ifndef SERVER - //very very dirty workaround to force gettext to see the right environment - if (current_language_var != configured_language) { - STARTUPINFO startupinfo; - PROCESS_INFORMATION processinfo; - memset(&startupinfo, 0, sizeof(startupinfo)); - memset(&processinfo, 0, sizeof(processinfo)); - errorstream << "MSVC localization workaround active restating minetest in new environment!" << std::endl; - - std::string parameters = ""; - - for (unsigned int i=1;i < argc; i++) { - if (parameters != "") { - parameters += " "; - } + // Hack to force gettext to see the right environment + if (current_language != configured_language) { + errorstream << "MSVC localization workaround active. " + "Restarting " PROJECT_NAME_C " in a new environment!" << std::endl; + + std::string parameters; + + for (unsigned int i = 1; i < argc; i++) { + if (!parameters.empty()) + parameters += ' '; + parameters += argv[i]; } - const char* ptr_parameters = 0; + const char *ptr_parameters = NULL; - if (parameters != "") { + if (!parameters.empty()) ptr_parameters = parameters.c_str(); - } - /** users may start by short name in commandline without extention **/ - std::string appname = argv[0]; - if (appname.substr(appname.length() - 4) != ".exe") { - appname += ".exe"; - } + // Allow calling without an extension + std::string app_name = argv[0]; + if (app_name.compare(appname.size() - 4, 4, ".exe") != 0) + app_name += ".exe"; + + STARTUPINFO startup_info = {0}; + PROCESS_INFORMATION process_info = {0}; - if (!CreateProcess(appname.c_str(), - (char*) ptr_parameters, - NULL, - NULL, - false, - DETACHED_PROCESS | CREATE_UNICODE_ENVIRONMENT, - NULL, - NULL, - &startupinfo, - &processinfo)) { + bool success = CreateProcess(app_name.c_str(), (char *)ptr_parameters, + NULL, NULL, false, DETACHED_PROCESS | CREATE_UNICODE_ENVIRONMENT, + NULL, NULL, &startup_info, &process_info); + + if (success) { + exit(0); + // NOTREACHED + } else { char buffer[1024]; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), - buffer, - sizeof(buffer)-1, - NULL); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), + MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), buffer, + sizeof(buffer) - 1, NULL); + errorstream << "*******************************************************" << std::endl; - errorstream << "CMD: " << appname << std::endl; + errorstream << "CMD: " << app_name << std::endl; errorstream << "Failed to restart with current locale: " << std::endl; errorstream << buffer; errorstream << "Expect language to be broken!" << std::endl; errorstream << "*******************************************************" << std::endl; } - else { - exit(0); - } } #else errorstream << "*******************************************************" << std::endl; errorstream << "Can't apply locale workaround for server!" << std::endl; errorstream << "Expect language to be broken!" << std::endl; errorstream << "*******************************************************" << std::endl; - #endif - setlocale(LC_ALL,configured_language.c_str()); + setlocale(LC_ALL, configured_language.c_str()); #else // Mingw - char *lang_str = (char*)calloc(10 + configured_language.length(), sizeof(char)); - strcat(lang_str, "LANGUAGE="); - strcat(lang_str, configured_language.c_str()); - putenv(lang_str); - + _putenv(("LANGUAGE=" + configured_language).c_str()); setlocale(LC_ALL, ""); #endif // ifndef _WIN32 } diff --git a/src/gettext.h b/src/gettext.h index 9b4e801f7..0170d1c45 100644 --- a/src/gettext.h +++ b/src/gettext.h @@ -34,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifdef _MSC_VER void init_gettext(const char *path, const std::string &configured_language, - int argc, char** argv); + int argc, const char *argv[]); #else void init_gettext(const char *path, const std::string &configured_language); #endif