aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/init/miscinit.c4
-rw-r--r--src/backend/utils/init/postinit.c5
-rw-r--r--src/backend/utils/mb/mbutils.c36
-rw-r--r--src/include/mb/pg_wchar.h4
4 files changed, 33 insertions, 16 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 30ecbd3779e..2fcb23628dd 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.173 2009/03/08 16:07:12 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.174 2009/04/08 09:50:48 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1242,7 +1242,7 @@ pg_bindtextdomain(const char *domain)
get_locale_path(my_exec_path, locale_path);
bindtextdomain(domain, locale_path);
- pg_bind_textdomain_codeset(domain, GetDatabaseEncoding());
+ pg_bind_textdomain_codeset(domain);
}
#endif
}
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 7f2cfdaea0c..44d7dc25247 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.188 2009/02/18 15:58:41 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.189 2009/04/08 09:50:48 heikki Exp $
*
*
*-------------------------------------------------------------------------
@@ -265,6 +265,9 @@ CheckMyDatabase(const char *name, bool am_superuser)
SetConfigOption("lc_collate", collate, PGC_INTERNAL, PGC_S_OVERRIDE);
SetConfigOption("lc_ctype", ctype, PGC_INTERNAL, PGC_S_OVERRIDE);
+ /* Use the right encoding in translated messages */
+ pg_bind_textdomain_codeset(textdomain(NULL));
+
/*
* Lastly, set up any database-specific configuration variables.
*/
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 60c45761156..e1d1095cf5e 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -4,7 +4,7 @@
*
* Tatsuo Ishii
*
- * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.84 2009/04/06 19:34:52 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.85 2009/04/08 09:50:48 heikki Exp $
*/
#include "postgres.h"
@@ -890,7 +890,7 @@ cliplen(const char *str, int len, int limit)
return l;
}
-#if defined(ENABLE_NLS) && defined(WIN32)
+#if defined(ENABLE_NLS)
static const struct codeset_map {
int encoding;
const char *codeset;
@@ -929,7 +929,7 @@ static const struct codeset_map {
{PG_EUC_TW, "EUC-TW"},
{PG_EUC_JIS_2004, "EUC-JP"}
};
-#endif /* WIN32 */
+#endif /* ENABLE_NLS */
void
SetDatabaseEncoding(int encoding)
@@ -939,22 +939,36 @@ SetDatabaseEncoding(int encoding)
DatabaseEncoding = &pg_enc2name_tbl[encoding];
Assert(DatabaseEncoding->encoding == encoding);
-
-#ifdef ENABLE_NLS
- pg_bind_textdomain_codeset(textdomain(NULL), encoding);
-#endif
}
/*
- * On Windows, we need to explicitly bind gettext to the correct
- * encoding, because gettext() tends to get confused.
+ * Bind gettext to the codeset equivalent with the database encoding.
*/
void
-pg_bind_textdomain_codeset(const char *domainname, int encoding)
+pg_bind_textdomain_codeset(const char *domainname)
{
-#if defined(ENABLE_NLS) && defined(WIN32)
+#if defined(ENABLE_NLS)
+ int encoding = GetDatabaseEncoding();
int i;
+ /*
+ * gettext() uses the codeset specified by LC_CTYPE by default,
+ * so if that matches the database encoding we don't need to do
+ * anything. In CREATE DATABASE, we enforce or trust that the
+ * locale's codeset matches database encoding, except for the C
+ * locale. In C locale, we bind gettext() explicitly to the right
+ * codeset.
+ *
+ * On Windows, though, gettext() tends to get confused so we always
+ * bind it.
+ */
+#ifndef WIN32
+ const char *ctype = setlocale(LC_CTYPE, NULL);
+
+ if (pg_strcasecmp(ctype, "C") != 0 && pg_strcasecmp(ctype, "POSIX") != 0)
+ return;
+#endif
+
for (i = 0; i < lengthof(codeset_map_array); i++)
{
if (codeset_map_array[i].encoding == encoding)
diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h
index 5b780db2a2d..b7e1fe9c818 100644
--- a/src/include/mb/pg_wchar.h
+++ b/src/include/mb/pg_wchar.h
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.88 2009/04/02 17:30:53 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.89 2009/04/08 09:50:48 heikki Exp $
*
* NOTES
* This is used both by the backend and by libpq, but should not be
@@ -391,7 +391,7 @@ extern const char *pg_get_client_encoding_name(void);
extern void SetDatabaseEncoding(int encoding);
extern int GetDatabaseEncoding(void);
extern const char *GetDatabaseEncodingName(void);
-extern void pg_bind_textdomain_codeset(const char *domainname, int encoding);
+extern void pg_bind_textdomain_codeset(const char *domainname);
extern int pg_valid_client_encoding(const char *name);
extern int pg_valid_server_encoding(const char *name);