Index: src/gettext.cpp
===================================================================
--- src/gettext.cpp	(revision 19300)
+++ src/gettext.cpp	(working copy)
@@ -14,7 +14,6 @@
 #include "gettext.h"
 #include "Messages.h"
 
-#include "support/environment.h"
 #include "support/lstrings.h"
 
 #ifdef HAVE_LOCALE_H
@@ -26,38 +25,24 @@
 
 namespace lyx {
 
-using support::setEnv;
-
-
 docstring const _(string const & str)
 {
 	return getGuiMessages().get(str);
 }
 
 
-#ifdef ENABLE_NLS
-
 void locale_init()
 {
-	// Disable, as otherwise it overrides everything else incl. the doc language
-	setEnv("LANGUAGE", "");
+#ifdef ENABLE_NLS
 #  ifdef HAVE_LC_MESSAGES
 	setlocale(LC_MESSAGES, "");
 #  endif
 	setlocale(LC_CTYPE, "");
+#endif
 	setlocale(LC_NUMERIC, "C");
 }
 
-#else // ENABLE_NLS
 
-void locale_init()
-{
-	setlocale(LC_NUMERIC, "C");
-}
-
-#endif
-
-
 docstring const translateIfPossible(docstring const & name)
 {
 	if (support::isAscii(name))
Index: src/Messages.cpp
===================================================================
--- src/Messages.cpp	(revision 19300)
+++ src/Messages.cpp	(working copy)
@@ -56,13 +56,6 @@
 Messages::Messages(string const & l)
 	: lang_(l), warned_(false)
 {
-	if ( lang_.empty() ) {
-		char const * lc_msgs = 0;
-#ifdef HAVE_LC_MESSAGES
-		lc_msgs = setlocale(LC_MESSAGES, NULL);
-#endif
-		lang_ = lc_msgs ? lc_msgs : "";
-	}
 	// strip off any encoding suffix, i.e., assume 8-bit po files
 	string::size_type i = lang_.find(".");
 	lang_ = lang_.substr(0, i);
@@ -82,35 +75,7 @@
 		return it->second;
 	// The string was not found, use gettext to generate it:
 
-	// In this order, see support/filetools.cpp:
-	string lang = getEnv("LC_ALL");
-	if (lang.empty()) {
-		lang = getEnv("LC_MESSAGES");
-		if (lang.empty()) {
-			lang = getEnv("LANG");
-			if (lang.empty())
-				lang = "C";
-		}
-	}
-#ifdef HAVE_LC_MESSAGES
-	char const * lc_msgs = setlocale(LC_MESSAGES, lang_.c_str());
-#endif
-	// setlocale fails (returns NULL) if the corresponding locale
-	// is not installed.
-	// On windows (mingw and cygwin) it always returns NULL.
-	// Since this method gets called for every translatable
-	// buffer string like e.g. "Figure:" we warn only once.
-#if !defined(_WIN32) && !defined(__CYGWIN__)
-	if (!warned_ && !lc_msgs) {
-		warned_ = true;
-		lyxerr << "Locale " << lang_ << " could not be set" << endl;
-	}
-#endif
-	// CTYPE controls what getmessage thinks what encoding the po file uses
-	char const * lc_ctype = setlocale(LC_CTYPE, NULL);
-	string oldCTYPE = lc_ctype ? lc_ctype : "";
-
-	setlocale(LC_CTYPE, lang_.c_str());
+	// FIXME: this textdomain stuff should only be done once!
 	errno = 0;
 	string const locale_dir = package().locale_dir().toFilesystemEncoding();
 	char const * c = bindtextdomain(PACKAGE, locale_dir.c_str());
@@ -133,6 +98,13 @@
 	}
 
 	textdomain(PACKAGE);
+
+	string const oldLANGUAGE = getEnv("LANGUAGE");
+	if (!lang_.empty()) {
+		setEnv("LANGUAGE", lang_);
+		lyxerr << "Setting LANGUAGES to " << lang_ << endl;
+	}
+
 	char const * tmp = m.c_str();
 	char const * msg = gettext(tmp);
 	docstring translated;
@@ -161,11 +133,9 @@
 		char_type const * ucs4 = reinterpret_cast<char_type const *>(msg);
 		translated = ucs4;
 	}
-#ifdef HAVE_LC_MESSAGES
-	setlocale(LC_MESSAGES, lang.c_str());
-#endif
-	setlocale(LC_CTYPE, oldCTYPE.c_str());
 
+	setEnv("LANGUAGE", oldLANGUAGE);
+
 	std::pair<TranslationCache::iterator, bool> result =
 		cache_.insert(std::make_pair(m, translated));
 
