mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Clean up gettext initialization
This commit is contained in:
		
							
								
								
									
										112
									
								
								src/gettext.cpp
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								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"));
 | 
			
		||||
		}
 | 
			
		||||
		std::string current_language;
 | 
			
		||||
		const char *env_lang = getenv("LANGUAGE");
 | 
			
		||||
		if (env_lang)
 | 
			
		||||
			current_language = env_lang;
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
 | 
			
		||||
		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;
 | 
			
		||||
		// 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 = "";
 | 
			
		||||
			std::string parameters;
 | 
			
		||||
 | 
			
		||||
			for (unsigned int i = 1; i < argc; i++) {
 | 
			
		||||
				if (!parameters.empty())
 | 
			
		||||
					parameters += ' ';
 | 
			
		||||
 | 
			
		||||
			for (unsigned int i=1;i < argc; i++) {
 | 
			
		||||
				if (parameters != "") {
 | 
			
		||||
					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";
 | 
			
		||||
 | 
			
		||||
			if (!CreateProcess(appname.c_str(),
 | 
			
		||||
					(char*) ptr_parameters,
 | 
			
		||||
					NULL,
 | 
			
		||||
					NULL,
 | 
			
		||||
					false,
 | 
			
		||||
					DETACHED_PROCESS | CREATE_UNICODE_ENVIRONMENT,
 | 
			
		||||
					NULL,
 | 
			
		||||
					NULL,
 | 
			
		||||
					&startupinfo,
 | 
			
		||||
					&processinfo)) {
 | 
			
		||||
			STARTUPINFO startup_info = {0};
 | 
			
		||||
			PROCESS_INFORMATION process_info = {0};
 | 
			
		||||
 | 
			
		||||
			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
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user