*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
get_locale_path(my_exec_path, locale_path);
bindtextdomain(domain, locale_path);
- pg_bind_textdomain_codeset(domain, GetDatabaseEncoding());
+ pg_bind_textdomain_codeset(domain);
}
#endif
}
*
*
* 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 $
*
*
*-------------------------------------------------------------------------
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.
*/
*
* 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"
return l;
}
-#if defined(ENABLE_NLS) && defined(WIN32)
+#if defined(ENABLE_NLS)
static const struct codeset_map {
int encoding;
const char *codeset;
{PG_EUC_TW, "EUC-TW"},
{PG_EUC_JIS_2004, "EUC-JP"}
};
-#endif /* WIN32 */
+#endif /* ENABLE_NLS */
void
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)
* 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
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);