Alvaro Herrera wrote:
> Tom Lane wrote:
> > No, you could have TEXTDOMAIN be defined as NULL by default, and let
> > modules redefine it as "foo".
>
> Doh, right.
So this'd seem to be the version ready to be applied (plus the needed
nls.mk files).
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/utils/error/elog.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/error/elog.c,v
retrieving revision 1.206
diff -c -p -r1.206 elog.c
*** src/backend/utils/error/elog.c 1 Sep 2008 20:42:45 -0000 1.206
--- src/backend/utils/error/elog.c 8 Oct 2008 23:44:09 -0000
*************** static void write_csvlog(ErrorData *edat
*** 160,166 ****
*/
bool
errstart(int elevel, const char *filename, int lineno,
! const char *funcname)
{
ErrorData *edata;
bool output_to_server;
--- 160,166 ----
*/
bool
errstart(int elevel, const char *filename, int lineno,
! const char *funcname, const char *domain)
{
ErrorData *edata;
bool output_to_server;
*************** errstart(int elevel, const char *filenam
*** 290,295 ****
--- 290,297 ----
edata->filename = filename;
edata->lineno = lineno;
edata->funcname = funcname;
+ /* the default text domain is the backend's */
+ edata->domain = domain ? domain : "postgres";
/* Select default errcode based on elevel */
if (elevel >= ERROR)
edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
*************** errcode_for_socket_access(void)
*** 611,617 ****
char *fmtbuf; \
StringInfoData buf; \
/* Internationalize the error format string */ \
! fmt = _(fmt); \
/* Expand %m in format string */ \
fmtbuf = expand_fmt_string(fmt, edata); \
initStringInfo(&buf); \
--- 613,619 ----
char *fmtbuf; \
StringInfoData buf; \
/* Internationalize the error format string */ \
! fmt = dgettext(edata->domain, fmt); \
/* Expand %m in format string */ \
fmtbuf = expand_fmt_string(fmt, edata); \
initStringInfo(&buf); \
*************** elog_finish(int elevel, const char *fmt,
*** 982,988 ****
*/
errordata_stack_depth--;
errno = edata->saved_errno;
! if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname))
return; /* nothing to do */
/*
--- 984,990 ----
*/
errordata_stack_depth--;
errno = edata->saved_errno;
! if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname, NULL))
return; /* nothing to do */
/*
Index: src/include/utils/elog.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/utils/elog.h,v
retrieving revision 1.94
diff -c -p -r1.94 elog.h
*** src/include/utils/elog.h 1 Sep 2008 20:42:45 -0000 1.94
--- src/include/utils/elog.h 9 Oct 2008 02:50:20 -0000
***************
*** 92,105 ****
* ERRCODE_INTERNAL_ERROR if elevel is ERROR or more, ERRCODE_WARNING
* if elevel is WARNING, or ERRCODE_SUCCESSFUL_COMPLETION if elevel is
* NOTICE or below.
*----------
*/
! #define ereport(elevel, rest) \
! (errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_MACRO) ? \
(errfinish rest) : (void) 0)
extern bool errstart(int elevel, const char *filename, int lineno,
! const char *funcname);
extern void errfinish(int dummy,...);
extern int errcode(int sqlerrcode);
--- 92,117 ----
* ERRCODE_INTERNAL_ERROR if elevel is ERROR or more, ERRCODE_WARNING
* if elevel is WARNING, or ERRCODE_SUCCESSFUL_COMPLETION if elevel is
* NOTICE or below.
+ *
+ * ereport_domain() allows a message domain to be specified, for modules that
+ * wish to use a different message catalog from the backend's. To avoid having
+ * one copy of the default text domain per .o file, we define it as NULL here
+ * and have errstart insert the default text domain. Modules can either use
+ * ereport_domain() directly, or preferrably they can override the TEXTDOMAIN
+ * macro.
*----------
*/
! #define ereport_domain(elevel, domain, rest) \
! (errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_MACRO, domain) ? \
(errfinish rest) : (void) 0)
+ #define ereport(level, rest) \
+ ereport_domain(level, TEXTDOMAIN, rest)
+
+ #define TEXTDOMAIN NULL
+
extern bool errstart(int elevel, const char *filename, int lineno,
! const char *funcname, const char *domain);
extern void errfinish(int dummy,...);
extern int errcode(int sqlerrcode);
*************** typedef struct ErrorData
*** 269,274 ****
--- 281,287 ----
const char *filename; /* __FILE__ of ereport() call */
int lineno; /* __LINE__ of ereport() call */
const char *funcname; /* __func__ of ereport() call */
+ const char *domain; /* message domain, NULL if default */
int sqlerrcode; /* encoded ERRSTATE */
char *message; /* primary error message */
char *detail; /* detail error message */
Index: src/pl/plperl/plperl.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plperl/plperl.c,v
retrieving revision 1.139
diff -c -p -r1.139 plperl.c
*** src/pl/plperl/plperl.c 28 Mar 2008 00:21:56 -0000 1.139
--- src/pl/plperl/plperl.c 9 Oct 2008 00:50:26 -0000
***************
*** 30,35 ****
--- 30,39 ----
#include "utils/typcache.h"
#include "utils/hsearch.h"
+ /* define our text domain for translations */
+ #undef TEXTDOMAIN
+ #define TEXTDOMAIN "plperl"
+
/* perl stuff */
#include "plperl.h"
*************** _PG_init(void)
*** 213,218 ****
--- 217,232 ----
plperl_init_interp();
+ #ifdef ENABLE_NLS
+ if (my_exec_path[0] != '\0')
+ {
+ char locale_path[MAXPGPATH];
+
+ get_locale_path(my_exec_path, locale_path);
+ bindtextdomain(TEXTDOMAIN, locale_path);
+ }
+ #endif
+
inited = true;
}
Index: src/pl/plpgsql/src/pl_handler.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/pl_handler.c,v
retrieving revision 1.40
diff -c -p -r1.40 pl_handler.c
*** src/pl/plpgsql/src/pl_handler.c 29 Aug 2008 13:02:33 -0000 1.40
--- src/pl/plpgsql/src/pl_handler.c 9 Oct 2008 00:51:22 -0000
*************** _PG_init(void)
*** 42,47 ****
--- 42,57 ----
if (inited)
return;
+ #ifdef ENABLE_NLS
+ if (my_exec_path[0] != '\0')
+ {
+ char locale_path[MAXPGPATH];
+
+ get_locale_path(my_exec_path, locale_path);
+ bindtextdomain(TEXTDOMAIN, locale_path);
+ }
+ #endif
+
plpgsql_HashTableInit();
RegisterXactCallback(plpgsql_xact_cb, NULL);
RegisterSubXactCallback(plpgsql_subxact_cb, NULL);
Index: src/pl/plpgsql/src/plpgsql.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/plpgsql.h,v
retrieving revision 1.100
diff -c -p -r1.100 plpgsql.h
*** src/pl/plpgsql/src/plpgsql.h 15 May 2008 22:39:49 -0000 1.100
--- src/pl/plpgsql/src/plpgsql.h 9 Oct 2008 00:51:53 -0000
***************
*** 28,33 ****
--- 28,37 ----
* Definitions
**********************************************************************/
+ /* define our text domain for translations */
+ #undef TEXTDOMAIN
+ #define TEXTDOMAIN "plpgsql"
+
/* ----------
* Compiler's namestack item types
* ----------
Index: src/pl/plpython/plpython.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpython/plpython.c,v
retrieving revision 1.112
diff -c -p -r1.112 plpython.c
*** src/pl/plpython/plpython.c 18 Jul 2008 03:32:53 -0000 1.112
--- src/pl/plpython/plpython.c 9 Oct 2008 00:51:04 -0000
*************** typedef int Py_ssize_t;
*** 63,68 ****
--- 63,72 ----
#include "utils/syscache.h"
#include "utils/typcache.h"
+ /* define our text domain for translations */
+ #undef TEXTDOMAIN
+ #define TEXTDOMAIN "plpython"
+
#include <compile.h>
#include <eval.h>
*************** _PG_init(void)
*** 2754,2759 ****
--- 2758,2773 ----
if (PLy_procedure_cache == NULL)
PLy_elog(ERROR, "could not create procedure cache");
+ #ifdef ENABLE_NLS
+ if (my_exec_path[0] != '\0')
+ {
+ char locale_path[MAXPGPATH];
+
+ get_locale_path(my_exec_path, locale_path);
+ bindtextdomain(TEXTDOMAIN, locale_path);
+ }
+ #endif
+
inited = true;
}
Index: src/pl/tcl/pltcl.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/tcl/pltcl.c,v
retrieving revision 1.121
diff -c -p -r1.121 pltcl.c
*** src/pl/tcl/pltcl.c 17 Jun 2008 00:52:43 -0000 1.121
--- src/pl/tcl/pltcl.c 9 Oct 2008 02:54:21 -0000
***************
*** 41,46 ****
--- 41,50 ----
#define Tcl_GetStringResult(interp) ((interp)->result)
#endif
+ /* redefine ereport() with our text domain */
+ #undef TEXTDOMAIN
+ #define TEXTDOMAIN "pltcl"
+
#if defined(UNICODE_CONVERSION) && HAVE_TCL_VERSION(8,1)
#include "mb/pg_wchar.h"
*************** _PG_init(void)
*** 318,323 ****
--- 322,337 ----
Tcl_InitHashTable(pltcl_norm_query_hash, TCL_STRING_KEYS);
Tcl_InitHashTable(pltcl_safe_query_hash, TCL_STRING_KEYS);
+ #ifdef ENABLE_NLS
+ if (my_exec_path[0] != '\0')
+ {
+ char locale_path[MAXPGPATH];
+
+ get_locale_path(my_exec_path, locale_path);
+ bindtextdomain(TEXTDOMAIN, locale_path);
+ }
+ #endif
+
pltcl_pm_init_done = true;
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers