diff --git a/src/Main/locale.cxx b/src/Main/locale.cxx
index bb6092ab4..fe2be4bc6 100644
--- a/src/Main/locale.cxx
+++ b/src/Main/locale.cxx
@@ -41,8 +41,8 @@ using std::vector;
 using std::string;
 
 FGLocale::FGLocale(SGPropertyNode* root) :
-    _intl(root->getNode("/sim/intl",0, true)),
-    _defaultLocale(_intl->getChild("locale",0, true))
+	_intl(root->getNode("/sim/intl", 0, true)),
+	_defaultLocale(_intl->getChild("locale", 0, true))
 {
 }
 
@@ -73,19 +73,42 @@ string FGLocale::removeEncodingPart(const string& locale)
 string_list
 FGLocale::getUserLanguage()
 {
-    string_list result;
-    static wchar_t localeNameBuf[LOCALE_NAME_MAX_LENGTH];
+	unsigned long bufSize = 128;
+	wchar_t* localeNameBuf = reinterpret_cast<wchar_t*>(alloca(bufSize));
+	unsigned long numLanguages = 0;
 
-    if (GetUserDefaultLocaleName(localeNameBuf, LOCALE_NAME_MAX_LENGTH)) {
-        std::wstring ws(localeNameBuf);
-        std::string localeNameUTF8 = simgear::strutils::convertWStringToUtf8(ws);
+	bool ok = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages,
+		localeNameBuf, &bufSize);
+	if (!ok) {
+		// if we have a lot of languages, can fail, allocate a bigger
+		// buffer
+		if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+			bufSize = 0;
+			GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages,
+				nullptr, &bufSize);
+			localeNameBuf = reinterpret_cast<wchar_t*>(alloca(bufSize));
+			ok = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages,
+				localeNameBuf, &bufSize);
+		}
+	}
 
-        SG_LOG(SG_GENERAL, SG_INFO, "Detected user locale:" << localeNameUTF8);
-        result.push_back(localeNameUTF8);
-        return result;
-    } else {
-        SG_LOG(SG_GENERAL, SG_WARN, "Failed to detected user locale");
-    }
+	if (!ok) {
+		SG_LOG(SG_GENERAL, SG_WARN, "Failed to detected user locale via GetUserPreferredUILanguages");
+		return{};
+	}
+
+	string_list result;
+	result.reserve(numLanguages);
+	for (unsigned int l = 0; l < numLanguages; ++l) {
+		std::wstring ws(localeNameBuf);
+		if (ws.empty())
+			break;
+
+		// skip to next string, past this string and trailing NULL
+		localeNameBuf += (ws.size() + 1);
+		result.push_back(simgear::strutils::convertWStringToUtf8(ws));
+		SG_LOG(SG_GENERAL, SG_INFO, "User langauge " << l << ":" << result.back());
+	}
 
     return result;
 }