nkeynes@755: /* Convenience header for conditional use of GNU . nkeynes@755: Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. nkeynes@755: nkeynes@755: This program is free software; you can redistribute it and/or modify it nkeynes@755: under the terms of the GNU Library General Public License as published nkeynes@755: by the Free Software Foundation; either version 2, or (at your option) nkeynes@755: any later version. nkeynes@755: nkeynes@755: This program is distributed in the hope that it will be useful, nkeynes@755: but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@755: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU nkeynes@755: Library General Public License for more details. nkeynes@755: nkeynes@755: You should have received a copy of the GNU Library General Public nkeynes@755: License along with this program; if not, write to the Free Software nkeynes@755: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, nkeynes@755: USA. */ nkeynes@755: nkeynes@755: #ifndef _LIBGETTEXT_H nkeynes@755: #define _LIBGETTEXT_H 1 nkeynes@755: nkeynes@755: #define _(String) gettext (String) nkeynes@755: #define Q_(String) g_strip_context ((String), gettext (String)) nkeynes@755: #ifdef gettext_noop nkeynes@755: #define N_(String) gettext_noop (String) nkeynes@755: #else nkeynes@755: #define N_(String) (String) nkeynes@755: #endif nkeynes@755: nkeynes@755: /* NLS can be disabled through the configure --disable-nls option. */ nkeynes@968: #ifdef ENABLE_NLS nkeynes@755: nkeynes@755: /* Get declarations of GNU message catalog functions. */ nkeynes@755: # include nkeynes@755: nkeynes@755: /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by nkeynes@755: the gettext() and ngettext() macros. This is an alternative to calling nkeynes@755: textdomain(), and is useful for libraries. */ nkeynes@755: # ifdef DEFAULT_TEXT_DOMAIN nkeynes@755: # undef gettext nkeynes@755: # define gettext(Msgid) \ nkeynes@755: dgettext (DEFAULT_TEXT_DOMAIN, Msgid) nkeynes@755: # undef ngettext nkeynes@755: # define ngettext(Msgid1, Msgid2, N) \ nkeynes@755: dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) nkeynes@755: # endif nkeynes@755: nkeynes@755: #else nkeynes@755: nkeynes@755: /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which nkeynes@755: chokes if dcgettext is defined as a macro. So include it now, to make nkeynes@755: later inclusions of a NOP. We don't include nkeynes@755: as well because people using "gettext.h" will not include , nkeynes@755: and also including would fail on SunOS 4, whereas nkeynes@755: is OK. */ nkeynes@755: #if defined(__sun) nkeynes@755: # include nkeynes@755: #endif nkeynes@755: nkeynes@755: /* Many header files from the libstdc++ coming with g++ 3.3 or newer include nkeynes@755: , which chokes if dcgettext is defined as a macro. So include nkeynes@755: it now, to make later inclusions of a NOP. */ nkeynes@755: #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) nkeynes@755: # include nkeynes@755: # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H nkeynes@755: # include nkeynes@755: # endif nkeynes@755: #endif nkeynes@755: nkeynes@755: /* Disabled NLS. nkeynes@755: The casts to 'const char *' serve the purpose of producing warnings nkeynes@755: for invalid uses of the value returned from these functions. nkeynes@755: On pre-ANSI systems without 'const', the config.h file is supposed to nkeynes@755: contain "#define const". */ nkeynes@755: # define gettext(Msgid) ((const char *) (Msgid)) nkeynes@755: # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) nkeynes@755: # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) nkeynes@755: # define ngettext(Msgid1, Msgid2, N) \ nkeynes@755: ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) nkeynes@755: # define dngettext(Domainname, Msgid1, Msgid2, N) \ nkeynes@755: ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) nkeynes@755: # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ nkeynes@755: ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) nkeynes@755: # define textdomain(Domainname) ((const char *) (Domainname)) nkeynes@755: # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) nkeynes@755: # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) nkeynes@755: nkeynes@755: #endif nkeynes@755: nkeynes@755: /* A pseudo function call that serves as a marker for the automated nkeynes@755: extraction of messages, but does not call gettext(). The run-time nkeynes@755: translation is done at a different place in the code. nkeynes@755: The argument, String, should be a literal string. Concatenated strings nkeynes@755: and other string expressions won't work. nkeynes@755: The macro's expansion is not parenthesized, so that it is suitable as nkeynes@755: initializer for static 'char[]' or 'const char[]' variables. */ nkeynes@755: #define gettext_noop(String) String nkeynes@755: nkeynes@755: /* The separator between msgctxt and msgid in a .mo file. */ nkeynes@755: #define GETTEXT_CONTEXT_GLUE "\004" nkeynes@755: nkeynes@755: /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a nkeynes@755: MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be nkeynes@755: short and rarely need to change. nkeynes@755: The letter 'p' stands for 'particular' or 'special'. */ nkeynes@755: #ifdef DEFAULT_TEXT_DOMAIN nkeynes@755: # define pgettext(Msgctxt, Msgid) \ nkeynes@755: pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) nkeynes@755: #else nkeynes@755: # define pgettext(Msgctxt, Msgid) \ nkeynes@755: pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) nkeynes@755: #endif nkeynes@755: #define dpgettext(Domainname, Msgctxt, Msgid) \ nkeynes@755: pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) nkeynes@755: #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ nkeynes@755: pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) nkeynes@755: #ifdef DEFAULT_TEXT_DOMAIN nkeynes@755: # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ nkeynes@755: npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) nkeynes@755: #else nkeynes@755: # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ nkeynes@755: npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) nkeynes@755: #endif nkeynes@755: #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ nkeynes@755: npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) nkeynes@755: #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ nkeynes@755: npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) nkeynes@755: nkeynes@755: #ifdef __GNUC__ nkeynes@755: __inline nkeynes@755: #else nkeynes@755: #ifdef __cplusplus nkeynes@755: inline nkeynes@755: #endif nkeynes@755: #endif nkeynes@755: static const char * nkeynes@755: pgettext_aux (const char *domain, nkeynes@755: const char *msg_ctxt_id, const char *msgid, nkeynes@755: int category) nkeynes@755: { nkeynes@755: const char *translation = dcgettext (domain, msg_ctxt_id, category); nkeynes@755: if (translation == msg_ctxt_id) nkeynes@755: return msgid; nkeynes@755: else nkeynes@755: return translation; nkeynes@755: } nkeynes@755: nkeynes@755: #ifdef __GNUC__ nkeynes@755: __inline nkeynes@755: #else nkeynes@755: #ifdef __cplusplus nkeynes@755: inline nkeynes@755: #endif nkeynes@755: #endif nkeynes@755: static const char * nkeynes@755: npgettext_aux (const char *domain, nkeynes@755: const char *msg_ctxt_id, const char *msgid, nkeynes@755: const char *msgid_plural, unsigned long int n, nkeynes@755: int category) nkeynes@755: { nkeynes@755: const char *translation = nkeynes@755: dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); nkeynes@755: if (translation == msg_ctxt_id || translation == msgid_plural) nkeynes@755: return (n == 1 ? msgid : msgid_plural); nkeynes@755: else nkeynes@755: return translation; nkeynes@755: } nkeynes@755: nkeynes@755: /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID nkeynes@755: can be arbitrary expressions. But for string literals these macros are nkeynes@755: less efficient than those above. */ nkeynes@755: nkeynes@755: #include nkeynes@755: nkeynes@755: #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ nkeynes@755: (__GNUC__ >= 3 || __GNUG__ >= 2 /* || __STDC_VERSION__ >= 199901L */ ) nkeynes@755: nkeynes@755: #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS nkeynes@755: #include nkeynes@755: #endif nkeynes@755: nkeynes@755: #define pgettext_expr(Msgctxt, Msgid) \ nkeynes@755: dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) nkeynes@755: #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ nkeynes@755: dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) nkeynes@755: nkeynes@755: #ifdef __GNUC__ nkeynes@755: __inline nkeynes@755: #else nkeynes@755: #ifdef __cplusplus nkeynes@755: inline nkeynes@755: #endif nkeynes@755: #endif nkeynes@755: static const char * nkeynes@755: dcpgettext_expr (const char *domain, nkeynes@755: const char *msgctxt, const char *msgid, nkeynes@755: int category) nkeynes@755: { nkeynes@755: size_t msgctxt_len = strlen (msgctxt) + 1; nkeynes@755: size_t msgid_len = strlen (msgid) + 1; nkeynes@755: const char *translation; nkeynes@755: #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS nkeynes@755: char msg_ctxt_id[msgctxt_len + msgid_len]; nkeynes@755: #else nkeynes@755: char buf[1024]; nkeynes@755: char *msg_ctxt_id = nkeynes@755: (msgctxt_len + msgid_len <= sizeof (buf) nkeynes@755: ? buf nkeynes@755: : (char *) malloc (msgctxt_len + msgid_len)); nkeynes@755: if (msg_ctxt_id != NULL) nkeynes@755: #endif nkeynes@755: { nkeynes@755: memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); nkeynes@755: msg_ctxt_id[msgctxt_len - 1] = '\004'; nkeynes@755: memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); nkeynes@755: translation = dcgettext (domain, msg_ctxt_id, category); nkeynes@755: #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS nkeynes@755: if (msg_ctxt_id != buf) nkeynes@755: free (msg_ctxt_id); nkeynes@755: #endif nkeynes@755: if (translation != msg_ctxt_id) nkeynes@755: return translation; nkeynes@755: } nkeynes@755: return msgid; nkeynes@755: } nkeynes@755: nkeynes@755: #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ nkeynes@755: dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) nkeynes@755: #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ nkeynes@755: dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) nkeynes@755: nkeynes@755: #ifdef __GNUC__ nkeynes@755: __inline nkeynes@755: #else nkeynes@755: #ifdef __cplusplus nkeynes@755: inline nkeynes@755: #endif nkeynes@755: #endif nkeynes@755: static const char * nkeynes@755: dcnpgettext_expr (const char *domain, nkeynes@755: const char *msgctxt, const char *msgid, nkeynes@755: const char *msgid_plural, unsigned long int n, nkeynes@755: int category) nkeynes@755: { nkeynes@755: size_t msgctxt_len = strlen (msgctxt) + 1; nkeynes@755: size_t msgid_len = strlen (msgid) + 1; nkeynes@755: const char *translation; nkeynes@755: #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS nkeynes@755: char msg_ctxt_id[msgctxt_len + msgid_len]; nkeynes@755: #else nkeynes@755: char buf[1024]; nkeynes@755: char *msg_ctxt_id = nkeynes@755: (msgctxt_len + msgid_len <= sizeof (buf) nkeynes@755: ? buf nkeynes@755: : (char *) malloc (msgctxt_len + msgid_len)); nkeynes@755: if (msg_ctxt_id != NULL) nkeynes@755: #endif nkeynes@755: { nkeynes@755: memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); nkeynes@755: msg_ctxt_id[msgctxt_len - 1] = '\004'; nkeynes@755: memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); nkeynes@755: translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); nkeynes@755: #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS nkeynes@755: if (msg_ctxt_id != buf) nkeynes@755: free (msg_ctxt_id); nkeynes@755: #endif nkeynes@755: if (!(translation == msg_ctxt_id || translation == msgid_plural)) nkeynes@755: return translation; nkeynes@755: } nkeynes@755: return (n == 1 ? msgid : msgid_plural); nkeynes@755: } nkeynes@755: nkeynes@755: #endif /* _LIBGETTEXT_H */