From: Alvaro Herrera Date: Thu, 9 Oct 2008 17:24:05 +0000 (+0000) Subject: Improve translatability of error messages for external modules by tweaking X-Git-Tag: REL8_4_BETA1~892 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2532c54d82b4925fd882a2bf119a7cc01b804d48;p=postgresql Improve translatability of error messages for external modules by tweaking the ereport macro. Included in this commit are enough files for starting plpgsql, plpython, plperl and pltcl translations. --- diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index d2315fb1f6..178c55ad59 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -42,7 +42,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.206 2008/09/01 20:42:45 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.207 2008/10/09 17:24:05 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -160,7 +160,7 @@ static void write_csvlog(ErrorData *edata); */ bool errstart(int elevel, const char *filename, int lineno, - const char *funcname) + const char *funcname, const char *domain) { ErrorData *edata; bool output_to_server; @@ -290,6 +290,8 @@ errstart(int elevel, const char *filename, int lineno, 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; @@ -611,7 +613,7 @@ errcode_for_socket_access(void) char *fmtbuf; \ StringInfoData buf; \ /* Internationalize the error format string */ \ - fmt = _(fmt); \ + fmt = dgettext(edata->domain, fmt); \ /* Expand %m in format string */ \ fmtbuf = expand_fmt_string(fmt, edata); \ initStringInfo(&buf); \ @@ -982,7 +984,7 @@ elog_finish(int elevel, const char *fmt,...) */ errordata_stack_depth--; errno = edata->saved_errno; - if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname)) + if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname, NULL)) return; /* nothing to do */ /* diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 5369da439b..c3b26698e2 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.167 2008/03/27 17:24:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.168 2008/10/09 17:24:05 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -1212,3 +1212,17 @@ process_local_preload_libraries(void) "local_preload_libraries", true); } + +void +set_text_domain(const char *domain) +{ +#ifdef ENABLE_NLS + if (my_exec_path[0] != '\0') + { + char locale_path[MAXPGPATH]; + + get_locale_path(my_exec_path, locale_path); + bindtextdomain(domain, locale_path); + } +#endif +} diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 3d1511e58a..98e28e0d10 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -13,7 +13,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/miscadmin.h,v 1.202 2008/04/23 13:44:59 mha Exp $ + * $PostgreSQL: pgsql/src/include/miscadmin.h,v 1.203 2008/10/09 17:24:05 alvherre Exp $ * * NOTES * some of the information in this file should be moved to other files. @@ -329,6 +329,7 @@ extern void RecordSharedMemoryInLockFile(unsigned long id1, extern void ValidatePgVersion(const char *path); extern void process_shared_preload_libraries(void); extern void process_local_preload_libraries(void); +extern void set_text_domain(const char *domain); /* in access/transam/xlog.c */ extern bool BackupInProgress(void); diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 034fd420b5..982e3b2c65 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.94 2008/09/01 20:42:45 tgl Exp $ + * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.95 2008/10/09 17:24:05 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -92,14 +92,26 @@ * 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(elevel, rest) \ - (errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_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 *funcname, const char *domain); extern void errfinish(int dummy,...); extern int errcode(int sqlerrcode); @@ -269,6 +281,7 @@ typedef struct ErrorData 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 */ diff --git a/src/pl/plperl/nls.mk b/src/pl/plperl/nls.mk new file mode 100644 index 0000000000..a17dc4ac9e --- /dev/null +++ b/src/pl/plperl/nls.mk @@ -0,0 +1,5 @@ +# $PostgreSQL: pgsql/src/pl/plperl/nls.mk,v 1.1 2008/10/09 17:24:05 alvherre Exp $ +CATALOG_NAME := plperl +AVAIL_LANGUAGES := +GETTEXT_FILES := plperl.c SPI.xs +GETTEXT_TRIGGERS:= _ errmsg errdetail errdetail_log errhint errcontext write_stderr croak Perl_croak diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 1bf95d9605..073e41d400 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1,7 +1,7 @@ /********************************************************************** * plperl.c - perl as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.139 2008/03/28 00:21:56 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.140 2008/10/09 17:24:05 alvherre Exp $ * **********************************************************************/ @@ -30,6 +30,10 @@ #include "utils/typcache.h" #include "utils/hsearch.h" +/* define our text domain for translations */ +#undef TEXTDOMAIN +#define TEXTDOMAIN "plperl" + /* perl stuff */ #include "plperl.h" @@ -186,8 +190,10 @@ _PG_init(void) if (inited) return; + set_text_domain(TEXTDOMAIN); + DefineCustomBoolVariable("plperl.use_strict", - "If true, will compile trusted and untrusted perl code in strict mode", + gettext_noop("If true, will compile trusted and untrusted perl code in strict mode"), NULL, &plperl_use_strict, PGC_USERSET, diff --git a/src/pl/plpgsql/src/nls.mk b/src/pl/plpgsql/src/nls.mk new file mode 100644 index 0000000000..ddc585fc8d --- /dev/null +++ b/src/pl/plpgsql/src/nls.mk @@ -0,0 +1,8 @@ +# $PostgreSQL: pgsql/src/pl/plpgsql/src/nls.mk,v 1.1 2008/10/09 17:24:05 alvherre Exp $ +CATALOG_NAME := plpgsql +AVAIL_LANGUAGES := +GETTEXT_FILES := pl_comp.c pl_exec.c pl_gram.c pl_funcs.c pl_handler.c pl_scan.c +GETTEXT_TRIGGERS:= _ errmsg errdetail errdetail_log errhint errcontext write_stderr yyerror + +.PHONY: gettext-files +gettext-files: distprep diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index 818690501b..223d06f7b6 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.40 2008/08/29 13:02:33 petere Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.41 2008/10/09 17:24:05 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -42,6 +42,8 @@ _PG_init(void) if (inited) return; + set_text_domain(TEXTDOMAIN); + plpgsql_HashTableInit(); RegisterXactCallback(plpgsql_xact_cb, NULL); RegisterSubXactCallback(plpgsql_subxact_cb, NULL); diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 8cc050773f..95e6946563 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.101 2008/10/09 16:35:07 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.102 2008/10/09 17:24:05 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,10 @@ * Definitions **********************************************************************/ +/* define our text domain for translations */ +#undef TEXTDOMAIN +#define TEXTDOMAIN "plpgsql" + /* ---------- * Compiler's namestack item types * ---------- diff --git a/src/pl/plpython/nls.mk b/src/pl/plpython/nls.mk new file mode 100644 index 0000000000..72b9ca525d --- /dev/null +++ b/src/pl/plpython/nls.mk @@ -0,0 +1,5 @@ +# $PostgreSQL: pgsql/src/pl/plpython/nls.mk,v 1.1 2008/10/09 17:24:05 alvherre Exp $ +CATALOG_NAME := plpython +AVAIL_LANGUAGES := +GETTEXT_FILES := plpython.c +GETTEXT_TRIGGERS:= _ errmsg errdetail errdetail_log errhint errcontext write_stderr yyerror diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c index c4d6803fcf..ae17289cd2 100644 --- a/src/pl/plpython/plpython.c +++ b/src/pl/plpython/plpython.c @@ -1,7 +1,7 @@ /********************************************************************** * plpython.c - python as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.112 2008/07/18 03:32:53 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.113 2008/10/09 17:24:05 alvherre Exp $ * ********************************************************************* */ @@ -63,6 +63,10 @@ typedef int Py_ssize_t; #include "utils/syscache.h" #include "utils/typcache.h" +/* define our text domain for translations */ +#undef TEXTDOMAIN +#define TEXTDOMAIN "plpython" + #include #include @@ -2745,6 +2749,8 @@ _PG_init(void) if (inited) return; + set_text_domain(TEXTDOMAIN); + Py_Initialize(); PLy_init_interp(); PLy_init_plpy(); diff --git a/src/pl/tcl/nls.mk b/src/pl/tcl/nls.mk new file mode 100644 index 0000000000..1630b6c1e4 --- /dev/null +++ b/src/pl/tcl/nls.mk @@ -0,0 +1,5 @@ +# $PostgreSQL: pgsql/src/pl/tcl/nls.mk,v 1.1 2008/10/09 17:24:05 alvherre Exp $ +CATALOG_NAME := pltcl +AVAIL_LANGUAGES := +GETTEXT_FILES := pltcl.c +GETTEXT_TRIGGERS:= _ errmsg errdetail errdetail_log errhint errcontext write_stderr yyerror diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index e9fdf9fc38..1bbab485d1 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -2,7 +2,7 @@ * pltcl.c - PostgreSQL support for Tcl as * procedural language (PL) * - * $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.121 2008/06/17 00:52:43 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.122 2008/10/09 17:24:05 alvherre Exp $ * **********************************************************************/ @@ -41,6 +41,10 @@ #define Tcl_GetStringResult(interp) ((interp)->result) #endif +/* define our text domain for translations */ +#undef TEXTDOMAIN +#define TEXTDOMAIN "pltcl" + #if defined(UNICODE_CONVERSION) && HAVE_TCL_VERSION(8,1) #include "mb/pg_wchar.h" @@ -263,6 +267,8 @@ _PG_init(void) if (pltcl_pm_init_done) return; + set_text_domain(TEXTDOMAIN); + #ifdef WIN32 /* Required on win32 to prevent error loading init.tcl */ Tcl_FindExecutable("");