From 45996501402030f9784260bd9eea6de0492ed116 Mon Sep 17 00:00:00 2001 From: oetiker Date: Wed, 27 May 2009 16:19:46 +0000 Subject: [PATCH] switch from intltoolize to autopoint ... for a more happy gettext experiance git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.3/program@1827 a5681a0c-68f1-0310-ab6d-d61299d08faa --- MakeMakefile | 56 ++---- Makefile.am | 14 +- autogen.sh | 2 + configure.ac | 46 +---- acinclude.m4 => m4/acinclude.m4 | 0 po/LINGUAS | 1 - po/de.po | 334 -------------------------------- src/Makefile.am | 2 +- src/gettext.h | 271 ++++++++++++++++++++++++++ src/rrd_i18n.h | 22 ++- 10 files changed, 306 insertions(+), 442 deletions(-) create mode 100755 autogen.sh rename acinclude.m4 => m4/acinclude.m4 (100%) delete mode 100644 po/de.po create mode 100644 src/gettext.h diff --git a/MakeMakefile b/MakeMakefile index 4623a72..03a5f34 100755 --- a/MakeMakefile +++ b/MakeMakefile @@ -3,9 +3,8 @@ # Run this script after the first cvs checkout to build # makefiles and friends -PATH="/usr/pack/automake-1.9.6-rp/bin:/usr/pack/autoconf-2.61-rp/bin:/usr/pack/libtool-1.5.22-rp/amd64-debian-linux3.1/bin:$PATH" -#export PATH - +PATH="/usr/pack/automake-1.11-to/amd64-linux-debian3.1/:/usr/pack/automake-1.11-to/amd64-linux-ubuntu8.04/bin:$PATH" +export PATH vcheck (){ perl <= $AUTOMAKE_VER" ERROR=1 else - automake=automake-1.9 - aclocal="aclocal-1.9" - for d in /usr/pack/automake-1.9.5-to/share/aclocal-1.9 /usr/share/aclocal-1.9 /usr/share/aclocal /usr/pack/rrdtool-1.3svn-to/share/aclocal /usr/pack/intltool-0.37.0-to/share/aclocal ; do - [ -d $d ] && aclocal="$aclocal -I $d" - done + AUTOMAKE="automake-1.11" + ACLOCAL="aclocal-1.11" + export AUTOMAKE ACLOCAL fi -else - automake="automake" - aclocal="aclocal" -# aclocal="aclocal -I /usr/pack/libtool-1.5.14-to/share/aclocal" fi + if vcheck $AUTOCONF_VER "autoconf --version" then echo "get a copy of GNU autoconf >= $autoconf_ver" ERROR=1 fi -if vcheck $INTLTOOL_VER "intltoolize --version" -then - echo "get a copy of GNU intltoolize >= $INTLTOOL_VER" - ERROR=1 -fi - if [ $ERROR -ne 0 ] then exit 1 fi -# remove the bits we are going to recreate - -echo Removing old Makefiles -touch Makefile -find . -name "Makefile" -or -name "Makefile.in" -print0 | xargs -0 rm -echo Cleaning out other leftovers -for x in configure install-sh intltool-merge.in rrd_config.h.in \ - missing intltool-update po/Makefile.in.in config.sub \ - intltool-extract intltool-extract.in config.guess \ - depcomp intltool-update.in autom4te.cache \ - intltool-merge compile; do - [ ! -L $x -a -d $x ] && rm -r "$x" - [ ! -L $x -a -f $x ] && rm "$x" -done -set -x -intltoolize --automake -c -f -$aclocal -libtoolize --copy --force -autoheader --force -$aclocal -$automake --foreign --add-missing --force-missing --copy -autoconf --force +./autogen.sh # vim: set syntax=sh : diff --git a/Makefile.am b/Makefile.am index b703754..bda0889 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,19 +1,11 @@ -ACLOCAL_AMFLAGS = -I m4 ## Process this file with automake to produce Makefile.in RSYNC = rsync --rsh=ssh -# build the following subdirectories -if BUILD_LIBINTL -PO=po -else -PO= -endif - -SUBDIRS = $(PO) src examples doc bindings +SUBDIRS = po src examples doc bindings intl # the following files are not mentioned in any other Makefile EXTRA_DIST = COPYRIGHT CHANGES WIN32-BUILD-TIPS.txt TODO CONTRIBUTORS THREADS \ - intltool-extract.in intltool-merge.in intltool-update.in \ + autogen.sh \ rrdtool.spec favicon.ico win32/Makefile win32/config.h \ win32/rrd.dsp win32/rrd.sln win32/rrd.vcproj \ win32/rrd_config.h.msvc win32/rrdlib.vcproj win32/rrdtool.dsp \ @@ -27,7 +19,7 @@ CLEANFILES = config.cache AUTOMAKE_OPTIONS= foreign # where we keep local rules for automake - +ACLOCAL_AMFLAGS = -I m4 ACLOCAL_M4= $(top_srcdir)/aclocal.m4 #AUTOHEADER = @AUTOHEADER@ --localdir=$(top_srcdir)/config #AUTOCONF = @AUTOCONF@ --localdir=$(top_srcdir)/config diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..0f4bfad --- /dev/null +++ b/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/sh +autoreconf --force --install --verbose -Iconfig -Im4 diff --git a/configure.ac b/configure.ac index 10e08f9..064c1a6 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ dnl see http://sourceware.org/autobook/autobook/autobook_91.html dnl LIBVERS=4:7:0 AC_SUBST(LIBVERS) - +AC_USE_SYSTEM_EXTENSIONS AC_CANONICAL_TARGET AM_INIT_AUTOMAKE AM_MAINTAINER_MODE @@ -246,45 +246,8 @@ AC_CHECK_FUNCS(posix_fadvise) CONFIGURE_PART(Libintl Processing) - -dnl gettext -GETTEXT_PACKAGE=rrdtool -AC_SUBST(GETTEXT_PACKAGE) -AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Gettext package]) - -AM_GLIB_GNU_GETTEXT() - -AC_ARG_ENABLE(libintl,[ --disable-libintl i18n support (libintl)], -[],[enable_libintl=yes]) - -if test x$enable_libintl = xyes; then - IT_PROG_INTLTOOL([0.35.0],[no-xml]) -fi - -if test x$enable_libintl = xyes -a x$MSGFMT = xno; then - AC_MSG_WARN(I could not find msgfmt. Diabeling libintl build.) - enable_libintl=no -fi - -if test x$enable_libintl = xyes; then - AC_CHECK_HEADERS(libintl.h,[],[AC_MSG_RESULT(disabeling libintl build); enable_libintl=no]) -fi - -if test x$enable_libintl = xyes ; then - dnl it seems bsd synstems need to link against libintl - dnl when compiling rrdupdate. lets check - AC_CHECK_LIB(intl, libintl_gettext,[LIB_LIBINTL="-lintl"]) -fi - -dnl use for linking rrdupdate -AC_SUBST(LIB_LIBINTL) - -dnl do not touch the po stuff if we are not going to build intl -AM_CONDITIONAL(BUILD_LIBINTL,[test x$enable_libintl = xyes]) - -if test x$enable_libintl = xyes; then - AC_DEFINE([BUILD_LIBINTL], [], [Use this in code sections to mark them for libintl build]) -fi +AM_GNU_GETTEXT_VERSION(0.17) +AM_GNU_GETTEXT() CONFIGURE_PART(IEEE Math Checks) @@ -729,6 +692,7 @@ AC_CONFIG_FILES([examples/perftest.pl]) AC_CONFIG_FILES([examples/Makefile]) AC_CONFIG_FILES([doc/Makefile]) AC_CONFIG_FILES([po/Makefile.in]) +AC_CONFIG_FILES([intl/Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([src/librrd.sym.in]) AC_CONFIG_FILES([src/librrd.pc]) @@ -772,7 +736,7 @@ echo " Build Tcl Bindings: $enable_tcl" echo " Build Python Bindings: $enable_python" echo " Build rrdcgi: $enable_rrdcgi" echo " Build librrd MT: $enable_pthread" -echo " Link with libintl: $enable_libintl" +echo " Use gettext: $USE_NLS" echo echo " Libraries: $ALL_LIBS" echo diff --git a/acinclude.m4 b/m4/acinclude.m4 similarity index 100% rename from acinclude.m4 rename to m4/acinclude.m4 diff --git a/po/LINGUAS b/po/LINGUAS index 46ae20d..8b13789 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -1,2 +1 @@ -de diff --git a/po/de.po b/po/de.po deleted file mode 100644 index 4c556c7..0000000 --- a/po/de.po +++ /dev/null @@ -1,334 +0,0 @@ -#: ../src/rrd_getopt.c:615 -#, c-format -msgid "%s: option `%s' is ambiguous\n" -msgstr "" - -#: ../src/rrd_getopt.c:637 -#, c-format -msgid "%s: option `--%s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_getopt.c:643 -#, c-format -msgid "%s: option `%c%s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_getopt.c:658 ../src/rrd_getopt.c:811 -#, c-format -msgid "%s: option `%s' requires an argument\n" -msgstr "" - -#. --option -#: ../src/rrd_getopt.c:684 -#, c-format -msgid "%s: unrecognized option `--%s'\n" -msgstr "" - -#. +option or -option -#: ../src/rrd_getopt.c:688 -#, c-format -msgid "%s: unrecognized option `%c%s'\n" -msgstr "" - -#. 1003.2 specifies the format of this message. -#: ../src/rrd_getopt.c:712 -#, c-format -msgid "%s: illegal option -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:715 -#, c-format -msgid "%s: invalid option -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:741 ../src/rrd_getopt.c:849 -#, c-format -msgid "%s: option requires an argument -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:783 -#, c-format -msgid "%s: option `-W %s' is ambiguous\n" -msgstr "" - -#: ../src/rrd_getopt.c:798 -#, c-format -msgid "%s: option `-W %s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_tool.c:49 -#, c-format -msgid "" -"RRDtool %s Copyright 1997-2007 by Tobias Oetiker \n" -" Compiled %s %s\n" -"\n" -"Usage: rrdtool [options] command command_options\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:55 -msgid "" -"Valid commands: create, update, updatev, graph, dump, restore,\n" -"\t\tlast, lastupdate, first, info, fetch, tune,\n" -"\t\tresize, xport\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:60 -msgid "" -"Valid remote commands: quit, ls, cd, mkdir, pwd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:64 -msgid "" -"* create - create a new RRD\n" -"\n" -"\trrdtool create filename [--start|-b start time]\n" -"\t\t[--step|-s step]\n" -"\t\t[DS:ds-name:DST:dst arguments]\n" -"\t\t[RRA:CF:cf arguments]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:71 -msgid "" -"* dump - dump an RRD to XML\n" -"\n" -"\trrdtool dump filename.rrd >filename.xml\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:75 -msgid "" -"* info - returns the configuration and status of the RRD\n" -"\n" -"\trrdtool info filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:79 -msgid "" -"* restore - restore an RRD file from its XML form\n" -"\n" -"\trrdtool restore [--range-check|-r] [--force-overwrite|-f] filename.xml " -"filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:83 -msgid "" -"* last - show last update time for RRD\n" -"\n" -"\trrdtool last filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:87 -msgid "" -"* lastupdate - returns the most recent datum stored for\n" -" each DS in an RRD\n" -"\n" -"\trrdtool lastupdate filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:91 -msgid "" -"* first - show first update time for RRA within an RRD\n" -"\n" -"\trrdtool first filename.rrd [--rraindex number]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:95 -msgid "" -"* update - update an RRD\n" -"\n" -"\trrdtool update filename\n" -"\t\t--template|-t ds-name:ds-name:...\n" -"\t\ttime|N:value[:value...]\n" -"\n" -"\t\tat-time@value[:value...]\n" -"\n" -"\t\t[ time:value[:value...] ..]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:103 -msgid "" -"* updatev - a verbose version of update\n" -"\treturns information about values, RRAs, and datasources updated\n" -"\n" -"\trrdtool updatev filename\n" -"\t\t--template|-t ds-name:ds-name:...\n" -"\t\ttime|N:value[:value...]\n" -"\n" -"\t\tat-time@value[:value...]\n" -"\n" -"\t\t[ time:value[:value...] ..]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:112 -msgid "" -"* fetch - fetch data out of an RRD\n" -"\n" -"\trrdtool fetch filename.rrd CF\n" -"\t\t[-r|--resolution resolution]\n" -"\t\t[-s|--start start] [-e|--end end]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:120 -msgid "" -"* graph - generate a graph from one or several RRD\n" -"\n" -"\trrdtool graph filename [-s|--start seconds] [-e|--end seconds]\n" -"\t\t[-x|--x-grid x-axis grid and label]\n" -"\t\t[-Y|--alt-y-grid]\n" -"\t\t[-y|--y-grid y-axis grid and label]\n" -"\t\t[-v|--vertical-label string] [-w|--width pixels]\n" -"\t\t[-h|--height pixels] [-o|--logarithmic]\n" -"\t\t[-u|--upper-limit value] [-z|--lazy]\n" -"\t\t[-l|--lower-limit value] [-r|--rigid]\n" -"\t\t[-g|--no-legend]\n" -"\t\t[-F|--force-rules-legend]\n" -"\t\t[-j|--only-graph]\n" -msgstr "" - -#: ../src/rrd_tool.c:132 -msgid "" -"\t\t[-n|--font FONTTAG:size:font]\n" -"\t\t[-m|--zoom factor]\n" -"\t\t[-A|--alt-autoscale]\n" -"\t\t[-M|--alt-autoscale-max]\n" -"\t\t[-R|--font-render-mode {normal,light,mono}]\n" -"\t\t[-B|--font-smoothing-threshold size]\n" -"\t\t[-E|--slope-mode]\n" -"\t\t[-N|--no-gridfit]\n" -"\t\t[-X|--units-exponent value]\n" -"\t\t[-L|--units-length value]\n" -"\t\t[-S|--step seconds]\n" -"\t\t[-f|--imginfo printfstr]\n" -"\t\t[-a|--imgformat PNG]\n" -"\t\t[-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]\n" -"\t\t[-W|--watermark string]\n" -"\t\t[DEF:vname=rrd:ds-name:CF]\n" -msgstr "" - -#: ../src/rrd_tool.c:148 -msgid "" -"\t\t[CDEF:vname=rpn-expression]\n" -"\t\t[VDEF:vdefname=rpn-expression]\n" -"\t\t[PRINT:vdefname:format]\n" -"\t\t[GPRINT:vdefname:format]\n" -"\t\t[COMMENT:text]\n" -"\t\t[SHIFT:vname:offset]\n" -"\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n" -"\t\t[HRULE:value#rrggbb[aa][:legend]]\n" -"\t\t[VRULE:value#rrggbb[aa][:legend]]\n" -"\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n" -"\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n" -"\t\t[PRINT:vname:CF:format] (deprecated)\n" -"\t\t[GPRINT:vname:CF:format] (deprecated)\n" -"\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:164 -msgid "" -" * tune - Modify some basic properties of an RRD\n" -"\n" -"\trrdtool tune filename\n" -"\t\t[--heartbeat|-h ds-name:heartbeat]\n" -"\t\t[--data-source-type|-d ds-name:DST]\n" -"\t\t[--data-source-rename|-r old-name:new-name]\n" -"\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n" -"\t\t[--deltapos scale-value] [--deltaneg scale-value]\n" -"\t\t[--failure-threshold integer]\n" -"\t\t[--window-length integer]\n" -"\t\t[--alpha adaptation-parameter]\n" -msgstr "" - -#: ../src/rrd_tool.c:175 -msgid "" -" * tune - Modify some basic properties of an RRD\n" -"\n" -"\t\t[--beta adaptation-parameter]\n" -"\t\t[--gamma adaptation-parameter]\n" -"\t\t[--gamma-deviation adaptation-parameter]\n" -"\t\t[--aberrant-reset ds-name]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:182 -msgid "" -" * resize - alter the length of one of the RRAs in an RRD\n" -"\n" -"\trrdtool resize filename rranum GROW|SHRINK rows\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:186 -msgid "" -"* xport - generate XML dump from one or several RRD\n" -"\n" -"\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n" -"\t\t[-m|--maxrows rows]\n" -"\t\t[--step seconds]\n" -"\t\t[--enumds]\n" -"\t\t[DEF:vname=rrd:ds-name:CF]\n" -"\t\t[CDEF:vname=rpn-expression]\n" -"\t\t[XPORT:vname:legend]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:195 -msgid "" -" * quit - closing a session in remote mode\n" -"\n" -"\trrdtool quit\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:198 -msgid "" -" * ls - lists all *.rrd files in current directory\n" -"\n" -"\trrdtool ls\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:202 -msgid "" -" * cd - changes the current directory\n" -"\n" -"\trrdtool cd new directory\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:206 -msgid "" -" * mkdir - creates a new directory\n" -"\n" -"\trrdtool mkdir newdirectoryname\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:210 -msgid "" -" * pwd - returns the current working directory\n" -"\n" -"\trrdtool pwd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:214 -msgid "" -"RRDtool is distributed under the Terms of the GNU General\n" -"Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n" -"\n" -"For more information read the RRD manpages\n" -"\n" -msgstr "" diff --git a/src/Makefile.am b/src/Makefile.am index 74d382f..ccdd604 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,7 +52,7 @@ noinst_HEADERS = \ rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_rpncalc.h \ rrd_hw.h rrd_hw_math.h rrd_hw_update.h \ fnv.h rrd_graph.h \ - rrd_is_thread_safe.h + rrd_is_thread_safe.h gettext.h if BUILD_GETOPT noinst_HEADERS += rrd_getopt.h diff --git a/src/gettext.h b/src/gettext.h new file mode 100644 index 0000000..209921e --- /dev/null +++ b/src/gettext.h @@ -0,0 +1,271 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by + the gettext() and ngettext() macros. This is an alternative to calling + textdomain(), and is useful for libraries. */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(Msgid) \ + dgettext (DEFAULT_TEXT_DOMAIN, Msgid) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) +# endif + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 \ + ? ((void) (Msgid2), (const char *) (Msgid1)) \ + : ((void) (Msgid1), (const char *) (Msgid2))) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) \ + ((void) (Domainname), (const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) \ + ((void) (Domainname), (const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +/* The separator between msgctxt and msgid in a .mo file. */ +#define GETTEXT_CONTEXT_GLUE "\004" + +/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a + MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be + short and rarely need to change. + The letter 'p' stands for 'particular' or 'special'. */ +#ifdef DEFAULT_TEXT_DOMAIN +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#else +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#endif +#define dpgettext(Domainname, Msgctxt, Msgid) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) +#ifdef DEFAULT_TEXT_DOMAIN +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#else +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#endif +#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +pgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + int category) +{ + const char *translation = dcgettext (domain, msg_ctxt_id, category); + if (translation == msg_ctxt_id) + return msgid; + else + return translation; +} + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +npgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + const char *translation = + dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); + if (translation == msg_ctxt_id || translation == msgid_plural) + return (n == 1 ? msgid : msgid_plural); + else + return translation; +} + +/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID + can be arbitrary expressions. But for string literals these macros are + less efficient than those above. */ + +#include + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include +#endif + +#define pgettext_expr(Msgctxt, Msgid) \ + dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) +#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ + dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcgettext (domain, msg_ctxt_id, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (translation != msg_ctxt_id) + return translation; + } + return msgid; +} + +#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcnpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (!(translation == msg_ctxt_id || translation == msgid_plural)) + return translation; + } + return (n == 1 ? msgid : msgid_plural); +} + +#endif /* _LIBGETTEXT_H */ diff --git a/src/rrd_i18n.h b/src/rrd_i18n.h index adeed37..c7ea78c 100644 --- a/src/rrd_i18n.h +++ b/src/rrd_i18n.h @@ -11,19 +11,23 @@ extern "C" { #ifndef _RRD_I18N_H #define _RRD_I18N_H -#ifndef _ -/* This is for other GNU distributions with internationalized messages. - When compiling libc, the _ macro is predefined. */ -#if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL) -# include -#define _(String) gettext (String) +#ifdef ENABLE_NLS +# ifdef _LIBC +# include +# else +# include "gettext.h" +# define _(String) gettext (String) +# endif #else -#define _(String) (String) -#endif -#define N_(String) (String) +# define _(String) (String) #endif +#define N_(String) String + +#endif +#ifdef __cplusplus +} #endif #ifdef __cplusplus -- 2.30.2