mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Easier to translate psql help
Instead of requiring translators to translate the entire SQL command synopses, change create_help.pl to only require them to translate the placeholders, and paste those into the synopsis using a printf mechanism. Make some small updates to the markup to make it easier to parse. Note: This causes msgmerge of gettext 0.17 to segfault. You will need the patch from https://savannah.gnu.org/bugs/?27474 to make it work. msgmerge usually only runs on babel.postgresql.org, however.
This commit is contained in:
@ -5,7 +5,7 @@
|
||||
# Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
||||
# Portions Copyright (c) 1994, Regents of the University of California
|
||||
#
|
||||
# $PostgreSQL: pgsql/src/bin/psql/Makefile,v 1.65 2009/08/28 20:26:19 petere Exp $
|
||||
# $PostgreSQL: pgsql/src/bin/psql/Makefile,v 1.66 2009/09/18 05:00:42 petere Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@ -22,6 +22,7 @@ override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) -I$(top_srcdir)/src/bin/p
|
||||
OBJS= command.o common.o help.o input.o stringutils.o mainloop.o copy.o \
|
||||
startup.o prompt.o variables.o large_obj.o print.o describe.o \
|
||||
psqlscan.o tab-complete.o mbprint.o dumputils.o keywords.o kwlookup.o \
|
||||
sql_help.o \
|
||||
$(WIN32RES)
|
||||
|
||||
FLEXFLAGS = -Cfe
|
||||
@ -40,8 +41,9 @@ dumputils.c keywords.c: % : $(top_srcdir)/src/bin/pg_dump/%
|
||||
kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
|
||||
rm -f $@ && $(LN_S) $< .
|
||||
|
||||
sql_help.c: sql_help.h ;
|
||||
sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
|
||||
$(PERL) $< $(REFDOCDIR) $@
|
||||
$(PERL) $< $(REFDOCDIR) $*
|
||||
|
||||
psqlscan.c: psqlscan.l
|
||||
ifdef FLEX
|
||||
@ -67,4 +69,4 @@ clean distclean:
|
||||
rm -f psql$(X) $(OBJS) dumputils.c keywords.c kwlookup.c
|
||||
|
||||
maintainer-clean: distclean
|
||||
rm -f sql_help.h psqlscan.c
|
||||
rm -f sql_help.h sql_help.c psqlscan.c
|
||||
|
@ -5,7 +5,7 @@
|
||||
#
|
||||
# Copyright (c) 2000-2009, PostgreSQL Global Development Group
|
||||
#
|
||||
# $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.19 2009/01/01 17:23:54 momjian Exp $
|
||||
# $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.20 2009/09/18 05:00:42 petere Exp $
|
||||
#################################################################
|
||||
|
||||
#
|
||||
@ -14,7 +14,7 @@
|
||||
# enough that this worked, but this here is by no means an SGML
|
||||
# parser.
|
||||
#
|
||||
# Call: perl create_help.pl docdir sql_help.h
|
||||
# Call: perl create_help.pl docdir sql_help
|
||||
# The name of the header file doesn't matter to this script, but it
|
||||
# sure does matter to the rest of the source.
|
||||
#
|
||||
@ -22,26 +22,29 @@
|
||||
use strict;
|
||||
|
||||
my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
|
||||
my $outputfile = $ARGV[1] or die "$0: missing required argument: output file\n";
|
||||
my $hfile = $ARGV[1] . '.h' or die "$0: missing required argument: output file\n";
|
||||
my $cfile = $ARGV[1] . '.c';
|
||||
|
||||
my $outputfilebasename;
|
||||
if ($outputfile =~ m!.*/([^/]+)$!) {
|
||||
$outputfilebasename = $1;
|
||||
my $hfilebasename;
|
||||
if ($hfile =~ m!.*/([^/]+)$!) {
|
||||
$hfilebasename = $1;
|
||||
}
|
||||
else {
|
||||
$outputfilebasename = $outputfile;
|
||||
$hfilebasename = $hfile;
|
||||
}
|
||||
|
||||
my $define = $outputfilebasename;
|
||||
my $define = $hfilebasename;
|
||||
$define =~ tr/a-z/A-Z/;
|
||||
$define =~ s/\W/_/g;
|
||||
|
||||
opendir(DIR, $docdir)
|
||||
or die "$0: could not open documentation source dir '$docdir': $!\n";
|
||||
open(OUT, ">$outputfile")
|
||||
or die "$0: could not open output file '$outputfile': $!\n";
|
||||
open(HFILE, ">$hfile")
|
||||
or die "$0: could not open output file '$hfile': $!\n";
|
||||
open(CFILE, ">$cfile")
|
||||
or die "$0: could not open output file '$cfile': $!\n";
|
||||
|
||||
print OUT
|
||||
print HFILE
|
||||
"/*
|
||||
* *** Do not change this file by hand. It is automatically
|
||||
* *** generated from the DocBook documentation.
|
||||
@ -56,15 +59,31 @@ print OUT
|
||||
|
||||
#define N_(x) (x) /* gettext noop */
|
||||
|
||||
#include \"postgres_fe.h\"
|
||||
#include \"pqexpbuffer.h\"
|
||||
|
||||
struct _helpStruct
|
||||
{
|
||||
const char *cmd; /* the command name */
|
||||
const char *help; /* the help associated with it */
|
||||
const char *syntax; /* the syntax associated with it */
|
||||
void (*syntaxfunc)(PQExpBuffer); /* function that prints the syntax associated with it */
|
||||
int nl_count; /* number of newlines in syntax (for pager) */
|
||||
};
|
||||
|
||||
";
|
||||
|
||||
print CFILE
|
||||
"/*
|
||||
* *** Do not change this file by hand. It is automatically
|
||||
* *** generated from the DocBook documentation.
|
||||
*
|
||||
* generated by
|
||||
* $^X $0 @ARGV
|
||||
*
|
||||
*/
|
||||
|
||||
#include \"$hfile\"
|
||||
|
||||
static const struct _helpStruct QL_HELP[] = {
|
||||
";
|
||||
|
||||
my $maxlen = 0;
|
||||
@ -95,12 +114,25 @@ foreach my $file (sort readdir DIR) {
|
||||
$cmddesc =~ s/\s+/ /g;
|
||||
$cmddesc =~ s/\"/\\"/g;
|
||||
|
||||
$cmdsynopsis =~ s/<[^>]+>//g;
|
||||
my @params = ();
|
||||
|
||||
my $nl_count = () = $cmdsynopsis =~ /\n/g;
|
||||
|
||||
$cmdsynopsis =~ m!</>! and die "$0:$file: null end tag not supported in synopsis\n";
|
||||
$cmdsynopsis =~ s/%/%%/g;
|
||||
|
||||
while ($cmdsynopsis =~ m!<(\w+)[^>]*>(.+?)</\1[^>]*>!) {
|
||||
my $match = $2;
|
||||
$match =~ s/<[^>]+>//g;
|
||||
$match =~ s/%%/%/g;
|
||||
push @params, $match;
|
||||
$cmdsynopsis =~ s!<(\w+)[^>]*>.+?</\1[^>]*>!%s!;
|
||||
}
|
||||
$cmdsynopsis =~ s/\r?\n/\\n/g;
|
||||
$cmdsynopsis =~ s/\"/\\"/g;
|
||||
|
||||
foreach my $cmdname (@cmdnames) {
|
||||
$entries{$cmdname} = { cmddesc => $cmddesc, cmdsynopsis => $cmdsynopsis };
|
||||
$entries{$cmdname} = { cmddesc => $cmddesc, cmdsynopsis => $cmdsynopsis, params => \@params, nl_count => $nl_count };
|
||||
$maxlen = ($maxlen >= length $cmdname) ? $maxlen : length $cmdname;
|
||||
}
|
||||
}
|
||||
@ -109,9 +141,41 @@ foreach my $file (sort readdir DIR) {
|
||||
}
|
||||
}
|
||||
|
||||
print OUT " { \"$_\",\n N_(\"".$entries{$_}{cmddesc}."\"),\n N_(\"".$entries{$_}{cmdsynopsis}."\") },\n\n" foreach (sort keys %entries);
|
||||
foreach (sort keys %entries) {
|
||||
my $prefix = "\t"x5 . ' ';
|
||||
my $id = $_;
|
||||
$id =~ s/ /_/g;
|
||||
my $synopsis = "\"$entries{$_}{cmdsynopsis}\"";
|
||||
$synopsis =~ s/\\n/\\n"\n$prefix"/g;
|
||||
my @args = ("buf",
|
||||
$synopsis,
|
||||
map("_(\"$_\")", @{$entries{$_}{params}}));
|
||||
print HFILE "extern void sql_help_$id(PQExpBuffer buf);\n";
|
||||
print CFILE "void
|
||||
sql_help_$id(PQExpBuffer buf)
|
||||
{
|
||||
\tappendPQExpBuffer(".join(",\n$prefix", @args).");
|
||||
}
|
||||
|
||||
print OUT "
|
||||
";
|
||||
}
|
||||
|
||||
print HFILE "
|
||||
|
||||
static const struct _helpStruct QL_HELP[] = {
|
||||
";
|
||||
foreach (sort keys %entries) {
|
||||
my $id = $_;
|
||||
$id =~ s/ /_/g;
|
||||
print HFILE " { \"$_\",
|
||||
N_(\"$entries{$_}{cmddesc}\"),
|
||||
sql_help_$id,
|
||||
$entries{$_}{nl_count} },
|
||||
|
||||
";
|
||||
}
|
||||
|
||||
print HFILE "
|
||||
{ NULL, NULL, NULL } /* End of list marker */
|
||||
};
|
||||
|
||||
@ -123,5 +187,6 @@ print OUT "
|
||||
#endif /* $define */
|
||||
";
|
||||
|
||||
close OUT;
|
||||
close CFILE;
|
||||
close HFILE;
|
||||
closedir DIR;
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (c) 2000-2009, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.151 2009/07/24 19:35:44 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.152 2009/09/18 05:00:42 petere Exp $
|
||||
*/
|
||||
#include "postgres_fe.h"
|
||||
|
||||
@ -349,7 +349,6 @@ helpSQL(const char *topic, unsigned short int pager)
|
||||
size_t len,
|
||||
wordlen;
|
||||
int nl_count = 0;
|
||||
const char *ch;
|
||||
|
||||
/* User gets two chances: exact match, then the first word */
|
||||
|
||||
@ -386,10 +385,8 @@ helpSQL(const char *topic, unsigned short int pager)
|
||||
if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
|
||||
strcmp(topic, "*") == 0)
|
||||
{
|
||||
nl_count += 5;
|
||||
for (ch = QL_HELP[i].syntax; *ch != '\0'; ch++)
|
||||
if (*ch == '\n')
|
||||
nl_count++;
|
||||
nl_count += 5 + QL_HELP[i].nl_count;
|
||||
|
||||
/* If we have an exact match, exit. Fixes \h SELECT */
|
||||
if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
|
||||
break;
|
||||
@ -403,13 +400,17 @@ helpSQL(const char *topic, unsigned short int pager)
|
||||
if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
|
||||
strcmp(topic, "*") == 0)
|
||||
{
|
||||
PQExpBufferData buffer;
|
||||
|
||||
initPQExpBuffer(&buffer);
|
||||
QL_HELP[i].syntaxfunc(&buffer);
|
||||
help_found = true;
|
||||
fprintf(output, _("Command: %s\n"
|
||||
"Description: %s\n"
|
||||
"Syntax:\n%s\n\n"),
|
||||
QL_HELP[i].cmd,
|
||||
_(QL_HELP[i].help),
|
||||
_(QL_HELP[i].syntax));
|
||||
buffer.data);
|
||||
/* If we have an exact match, exit. Fixes \h SELECT */
|
||||
if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
|
||||
break;
|
||||
|
@ -1,7 +1,7 @@
|
||||
# $PostgreSQL: pgsql/src/bin/psql/nls.mk,v 1.23 2009/06/26 19:33:50 petere Exp $
|
||||
# $PostgreSQL: pgsql/src/bin/psql/nls.mk,v 1.24 2009/09/18 05:00:42 petere Exp $
|
||||
CATALOG_NAME := psql
|
||||
AVAIL_LANGUAGES := cs de es fr ja pt_BR sv tr
|
||||
GETTEXT_FILES := command.c common.c copy.c help.c input.c large_obj.c \
|
||||
mainloop.c print.c startup.c describe.c sql_help.h \
|
||||
mainloop.c print.c startup.c describe.c sql_help.h sql_help.c \
|
||||
../../port/exec.c
|
||||
GETTEXT_TRIGGERS:= _ N_ psql_error simple_prompt
|
||||
|
Reference in New Issue
Block a user