Hello hackers,

As it mentioned in pg_locale.c, the variable LC_MESSAGES is ignored in 
Windows(pg_locale.c:162). In other systems, this variable is
used to select a messages language. But in Windows, the language is
selected based on system locale and couldn't be changed via
configuration. Additionally, this affects regress tests, since language
for messages generated by psql is also configured via LC_MESSAGES and
ignored on Windows installations and cause failure of tests on
non-English Windows installations.

I've done a little patch to fix that problem via usage of LANGUAGE 
variable on Windows systems. To get more information about LC_MESSAGES, 
LANGUAGE and other variable used in GNU gettext look at documentation 
[1].
IMHO that patch is more like a workaround and I'm not sure that it is 
safe for all combination of systems/compilers. I think we can find a
better way to solve the problem.

Also, there is a problem of mixing encoding in the log in case of 
databases with different encoding on one server. I didn't find any good 
solution how to work in such a case because each backend should use its 
own encoding in order to work with data and client properly. This 
problem is not Windows specific, but most of the OS use one Unicode 
encoding for all languages (e.g. UTF-8).

The main point of this message is to say about the problem, try to
find an appropriate solution and ask community's opinion about the
problem.

[1] 
https://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index a3dc3be5a8..2548f6bbd2 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -216,6 +216,11 @@ pg_perm_setlocale(int category, const char *locale)
 			envvar = "LC_MESSAGES";
 			envbuf = lc_messages_envbuf;
 #ifdef WIN32
+			/*
+			 * Use LANGUAGE instead of LC_MESSAGES since Windows doesn't support
+			 * LC_MESSAGES environment variable.
+			 */
+			envvar = "LANGUAGE";
 			result = IsoLocaleName(locale);
 			if (result == NULL)
 				result = (char *) locale;
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index a1ee1041b4..631f31729e 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -760,6 +760,13 @@ initialize_environment(void)
 	unsetenv("LANGUAGE");
 	unsetenv("LC_ALL");
 	putenv("LC_MESSAGES=C");
+#ifdef WIN32
+	/*
+	 * Use LANGUAGE instead of LC_MESSAGES since Windows doesn't support
+	 * LC_MESSAGES environment variable.
+	 */
+	putenv("LANGUAGE=C");
+#endif
 
 	/*
 	 * Set encoding as requested

Reply via email to