diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index fe368f591aeda12f8541313d97d0256b29efcafd..b2557572184399831c85120073488c77b6b4bd00 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/main/main.c,v 1.75 2004/03/05 01:11:04 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/main/main.c,v 1.76 2004/03/15 16:14:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -74,6 +74,10 @@ main(int argc, char *argv[])
 #endif   /* NOPRINTADE */
 #endif   /* __alpha */
 
+#ifdef WIN32
+	char *env_locale;
+#endif
+
 #if defined(NOFIXADE) || defined(NOPRINTADE)
 
 #if defined(ultrix4)
@@ -143,8 +147,30 @@ main(int argc, char *argv[])
 	 * set later during GUC option processing, but we set it here to allow
 	 * startup error messages to be localized.
 	 */
+
+#ifdef WIN32
+	/* 
+	 * Windows uses codepages rather than the environment, so we work around
+	 * that by querying the environment explicitly first for LC_COLLATE
+	 * and LC_CTYPE. We have to do this because initdb passes those values
+	 * in the environment. If there is nothing there we fall back on the
+	 * codepage.
+	 */
+
+	if ((env_locale = getenv("LC_COLLATE")) != NULL)
+	    setlocale(LC_COLLATE,env_locale);
+	else
+	  setlocale(LC_COLLATE, "");
+
+	if ((env_locale = getenv("LC_CTYPE")) != NULL)
+	    setlocale(LC_CTYPE,env_locale);
+	else
+	  setlocale(LC_CTYPE, "");
+#else
 	setlocale(LC_COLLATE, "");
 	setlocale(LC_CTYPE, "");
+#endif
+
 #ifdef LC_MESSAGES
 	setlocale(LC_MESSAGES, "");
 #endif