This function is totally broken and leads to a SEGFAULT.
setlocale(3) isn't supposed to be used this way.

Index: src/wp/ap/gtk/ap_UnixPrefs.cpp
--- src/wp/ap/gtk/ap_UnixPrefs.cpp.orig
+++ src/wp/ap/gtk/ap_UnixPrefs.cpp
@@ -57,108 +57,5 @@ const char * AP_UnixPrefs::_getPrefsPathname(void) con
 
 void AP_UnixPrefs::overlayEnvironmentPrefs(void)
 {
-	// modify the "_builtin_" preferences with
-	// using information in the user's environment.
-	// we do not overlay a custom set of preferences.
-
-	if (!m_bUseEnvLocale)
-		return;							// nothing to do...
-
-#if 1
-	// TODO use various POSIX env variables
-	// TODO (such as LANG and LC_*) to compute
-	// TODO a name in our locale namespace
-	// TODO (see .../src/wp/ap/xp/ap_*_Languages.h)
-
-        // make a copy of the current locale so we can set it back
-	char *old_locale = g_strdup(setlocale(LC_ALL, nullptr));
-
-	// this will set our current locale information
-	// according to the user's env variables
-	setlocale(LC_ALL, "");
-
-	// locale categories:
-	// LC_COLLATE - collation of strings (functions strcoll and strxfrm)
-	// LC_CTYPE - classification and conversion of characters
-	// LC_MONETARY - formatting monetary values
-	// LC_NUMERIC - formatting numeric values that are not monetary
-	// LC_TIME - formatting date and time values
-	// LC_MESSAGES - language of messages and look of affirmative/negative answer
-
-	const char * szNewLang = "en-US"; // default to US English
-#if defined (LC_MESSAGES) && defined (UNDEF) // raphael
-// #if defined (LC_MESSAGES)
-	char * lc_ctype = g_strdup(setlocale(LC_MESSAGES, nullptr));
-#else
-	char * lc_ctype = getenv("LC_ALL");
-	if (!lc_ctype || !*lc_ctype) {
-		// TODO: implement $LANGUAGE parsing here
-		lc_ctype = getenv("LC_MESSAGES");
-		if (!lc_ctype || !*lc_ctype) {
-			lc_ctype = getenv("LANG");
-		}
-	}
-	if (lc_ctype)
-		lc_ctype = g_strdup(lc_ctype);
-	else
-		lc_ctype = g_strdup("en_US");
-#endif
-	// locale categories seem to always look like this:
-	// two letter for language (lowcase) _ two letter country code (upcase)
-	// ie. en_US, es_ES, pt_PT
-	// which goes to the Abiword format:
-	// en-US, es-ES, pt-PT
-
-	// we'll try this quick conversion
-	if (lc_ctype != nullptr && strlen(lc_ctype) >= 5)
-	{
-		char * uscore = strchr(lc_ctype, '_');
-		if (uscore)
-			*uscore = '-';
-
-		char* modifier = strrchr(lc_ctype,'@');
-		/*
-		  Temporarily remove modifier field to strip charset.
-		*/
-		if (modifier)
-		  *modifier = '\0';
-
-		char* dot = strrchr(lc_ctype,'.');
-		/*
-                  remove charset field. It's a right thing since expat
-  		  already converts data in stringset from ANY encoding to
-		  current one (if iconv knows this encoding).
-		 */
-		if (dot)
-			*dot = '\0';
-
-		if (modifier) {
-			// put modifier (if present) back
-			// memmove for overlapping regions caveat
-			char * dest = &lc_ctype[strlen(lc_ctype)];
-			*modifier = '@';
-			memmove(dest,modifier,strlen(modifier)+1);
-		}
-
-		szNewLang = lc_ctype;
-	}
-
-	UT_DEBUGMSG(("Prefs: Using LOCALE info from environment [%s]\n",szNewLang));
-
-
-	m_builtinScheme->setValue(AP_PREF_KEY_StringSet,
-				  szNewLang);
-
-	// g_free the language id, if it was allocated
-	if (lc_ctype)
-		g_free(lc_ctype);
-
-	// change back to the previous locale setting
-	// although, we might want to leave it in the user's preferred locale?
-	if (old_locale != nullptr) {
-	   setlocale(LC_ALL, old_locale);
-	   g_free(old_locale);
-	}
-#endif
 	return;
 }
