OSDN Git Service

Improve translatability of error messages for external modules by tweaking
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 9 Oct 2008 17:24:05 +0000 (17:24 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 9 Oct 2008 17:24:05 +0000 (17:24 +0000)
the ereport macro.  Included in this commit are enough files for starting
plpgsql, plpython, plperl and pltcl translations.

13 files changed:
src/backend/utils/error/elog.c
src/backend/utils/init/miscinit.c
src/include/miscadmin.h
src/include/utils/elog.h
src/pl/plperl/nls.mk [new file with mode: 0644]
src/pl/plperl/plperl.c
src/pl/plpgsql/src/nls.mk [new file with mode: 0644]
src/pl/plpgsql/src/pl_handler.c
src/pl/plpgsql/src/plpgsql.h
src/pl/plpython/nls.mk [new file with mode: 0644]
src/pl/plpython/plpython.c
src/pl/tcl/nls.mk [new file with mode: 0644]
src/pl/tcl/pltcl.c

index d2315fb..178c55a 100644 (file)
@@ -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 */
 
        /*
index 5369da4..c3b2669 100644 (file)
@@ -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
+}
index 3d1511e..98e28e0 100644 (file)
@@ -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);
index 034fd42..982e3b2 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
  * 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 (file)
index 0000000..a17dc4a
--- /dev/null
@@ -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
index 1bf95d9..073e41d 100644 (file)
@@ -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 $
  *
  **********************************************************************/
 
 #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 (file)
index 0000000..ddc585f
--- /dev/null
@@ -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
index 8186905..223d06f 100644 (file)
@@ -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);
index 8cc0507..95e6946 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
  * 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 (file)
index 0000000..72b9ca5
--- /dev/null
@@ -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
index c4d6803..ae17289 100644 (file)
@@ -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 <compile.h>
 #include <eval.h>
 
@@ -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 (file)
index 0000000..1630b6c
--- /dev/null
@@ -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
index e9fdf9f..1bbab48 100644 (file)
@@ -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 $
  *
  **********************************************************************/
 
 #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("");