diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 84c7d07085b240297c2e6ffdb0a9c683e40b114d..865aba3cec44986efbbfb4b24b9b1d54450a2e33 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -246,6 +246,14 @@ LLWindowSDL::LLWindowSDL(char *title, S32 x, S32 y, S32 width,
 	mSDL_Display = NULL;
 #endif // LL_X11
 
+#if LL_GTK
+	// We MUST be the first to initialize GTK, i.e. we have to beat
+	// our embedded Mozilla to the punch so that GTK doesn't get badly
+	// initialized with a non-C locale and cause lots of serious random
+	// weirdness.
+	ll_try_gtk_init();
+#endif // LL_GTK
+
 	// Get the original aspect ratio of the main device.
 	mOriginalAspectRatio = 1024.0 / 768.0;  // !!! FIXME //(double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay);
 
@@ -313,7 +321,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
 	{
 		llinfos << "sdl_init() failed! " << SDL_GetError() << llendl;
 		setupFailure("window creation error", "error", OSMB_OK);
-	    return false;
+		return false;
 	}
 
 	SDL_version c_sdl_version;
@@ -1000,7 +1008,7 @@ void LLWindowSDL::beforeDialog()
 
 #if LL_GTK
 	// this is a good time to grab some GTK version information for
-	// diagnostics
+	// diagnostics, if not already done.
 	ll_try_gtk_init();
 #endif // LL_GTK
 
@@ -1840,12 +1848,21 @@ void LLWindowSDL::gatherInput()
     // Pump GTK events so embedded Gecko doesn't starve.
     if (ll_try_gtk_init())
     {
+	    // Yuck, Mozilla's GTK callbacks play with the locale - push/pop
+	    // the locale to protect it, as exotic/non-C locales
+	    // causes our code lots of general critical weirdness
+	    // and crashness. (SL-35450)
+	    char *saved_locale = setlocale(LC_ALL, NULL);
+
 	    // Do a limited number of pumps so SL doesn't starve!
 	    // FIXME - this should ideally be time-limited, not count-limited.
 	    gtk_main_iteration_do(0); // Always do one non-blocking pump
 	    for (int iter=0; iter<10; ++iter)
 		    if (gtk_events_pending())
 			    gtk_main_iteration();
+
+	    if (saved_locale)
+		    setlocale(LC_ALL, saved_locale);
     }
 #endif // LL_GTK && LL_LIBXUL_ENABLED
 
@@ -2336,9 +2353,7 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type)
 {
 	S32 rtn = OSBTN_CANCEL;
 
-#if LL_GTK
 	ll_try_gtk_init();
-#endif // LL_GTK
 
 	if(gWindowImplementation != NULL)
 		gWindowImplementation->beforeDialog();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index fc95ebd067c80f4dd2ce86c0eba40079b04bc824..282de240609ededa1a4ac2a859971612af541491 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -464,12 +464,13 @@ BOOL idle_startup()
 		#if LL_LIBXUL_ENABLED
 		set_startup_status(0.48f, "Initializing embedded web browser...", gAgent.mMOTD.c_str());
 		display_startup();
+		llinfos << "Initializing embedded web browser..." << llendl;
 
 		#if LL_DARWIN
 			// For Mac OS, we store both the shared libraries and the runtime files (chrome/, plugins/, etc) in
 			// Second Life.app/Contents/MacOS/.  This matches the way Firefox is distributed on the Mac.
 			std::string profileBaseDir(gDirUtilp->getExecutableDir());
-		#else
+		#elif LL_WINDOWS
 			std::string profileBaseDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
 			profileBaseDir += gDirUtilp->getDirDelimiter();
 			#ifdef LL_DEBUG
@@ -477,8 +478,24 @@ BOOL idle_startup()
 			#else
 			profileBaseDir += "mozilla";
 			#endif
+                #else
+			std::string profileBaseDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
+			profileBaseDir += gDirUtilp->getDirDelimiter();
+			profileBaseDir += "mozilla";
 		#endif
-		LLMozLib::getInstance()->init( profileBaseDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) ); 
+
+#if LL_LINUX
+		// Yuck, Mozilla init plays with the locale - push/pop
+		// the locale to protect it, as exotic/non-C locales
+		// causes our code lots of general critical weirdness
+		// and crashness. (SL-35450)
+		char *saved_locale = setlocale(LC_ALL, NULL);
+#endif // LL_LINUX
+		LLMozLib::getInstance()->init( profileBaseDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) );
+#if LL_LINUX
+		if (saved_locale)
+			setlocale(LC_ALL, saved_locale);
+#endif // LL_LINUX
 
 		std::ostringstream codec;
 		codec << "[Second Life " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD << "]";