← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/bug-1798297-locale-C into lp:widelands

 

GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1798297-locale-C into lp:widelands.

Commit message:
Fix fetching of translations when user locale is set to C. If the desired Widelands locale does not exist, try to fall back to en_US.utf8 to make libintl happy.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1798297 in widelands: "Language selection broken if locale is set to C"
  https://bugs.launchpad.net/widelands/+bug/1798297

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1798297-locale-C/+merge/358364
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1798297-locale-C into lp:widelands.
=== modified file 'src/base/i18n.cc'
--- src/base/i18n.cc	2018-08-12 06:47:11 +0000
+++ src/base/i18n.cc	2018-11-06 08:51:14 +0000
@@ -290,15 +290,26 @@
 		found = alt_str.find(',', 0);
 	}
 	if (leave_while) {
-		setenv("LANG", locale.c_str(), 1);
+		setenv("LC_ALL", locale.c_str(), 1);
+        setenv("LANG", locale.c_str(), 1);
 		setenv("LANGUAGE", locale.c_str(), 1);
 	} else {
-		log("No corresponding locale found - trying to set it via LANGUAGE=%s, LANG=%s\n",
-		    lang.c_str(), lang.c_str());
+		log("No corresponding locale found\n");
+        log(" - Set LANGUAGE, LANG and LC_ALL to '%s'\n",
+		    lang.c_str());
+
 		setenv("LANGUAGE", lang.c_str(), 1);
 		setenv("LANG", lang.c_str(), 1);
-		SETLOCALE(LC_MESSAGES, "");  // set locale according to the env. variables
-		                             // --> see  $ man 3 setlocale
+        setenv("LC_ALL", lang.c_str(), 1);
+
+        try {
+            SETLOCALE(LC_MESSAGES, "en_US.utf8");  // set locale according to the env. variables
+                                         // --> see  $ man 3 setlocale
+            log(" - Set system locale to 'en_US.utf8' to make '%s' accessible to libintl\n", lang.c_str());
+        } catch (std::exception&) {
+            SETLOCALE(LC_MESSAGES, "");  // set locale according to the env. variables
+                                         // --> see  $ man 3 setlocale
+        }
 		// assume that it worked
 		// maybe, do another check with the return value (?)
 		locale = lang;


Follow ups