|
|
@@ -1,5 +1,5 @@
|
|
|
/* Convenience header for conditional use of GNU <libintl.h>.
|
|
|
- Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
|
|
|
+ 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 Library General Public License as published
|
|
|
@@ -13,7 +13,7 @@
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
|
License along with this program; if not, write to the Free Software
|
|
|
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
|
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
|
USA. */
|
|
|
|
|
|
#ifndef _LIBGETTEXT_H
|
|
|
@@ -25,6 +25,18 @@
|
|
|
/* Get declarations of GNU message catalog functions. */
|
|
|
# include <libintl.h>
|
|
|
|
|
|
+/* 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
|
|
|
@@ -37,6 +49,16 @@
|
|
|
# include <locale.h>
|
|
|
#endif
|
|
|
|
|
|
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
|
|
|
+ <libintl.h>, which chokes if dcgettext is defined as a macro. So include
|
|
|
+ it now, to make later inclusions of <libintl.h> a NOP. */
|
|
|
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
|
|
+# include <cstdlib>
|
|
|
+# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
|
|
|
+# include <libintl.h>
|
|
|
+# 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.
|
|
|
@@ -66,4 +88,178 @@
|
|
|
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 <string.h>
|
|
|
+
|
|
|
+#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
|
|
|
+ (__GNUC__ >= 3 || __GNUG__ >= 2 /* || __STDC_VERSION__ >= 199901L */ )
|
|
|
+
|
|
|
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
|
|
+#include <stdlib.h>
|
|
|
+#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 */
|