1/* 2 * Copyright (c) 2010-2011 Ævar Arnfjörð Bjarmason 3 * 4 * This is a skeleton no-op implementation of gettext for Git. 5 * You can replace it with something that uses libintl.h and wraps 6 * gettext() to try out the translations. 7 */ 8 9#ifndef GETTEXT_H 10#define GETTEXT_H 11 12#if defined(_) || defined(Q_) 13#error"namespace conflict: '_' or 'Q_' is pre-defined?" 14#endif 15 16#ifndef NO_GETTEXT 17# include <libintl.h> 18#else 19# ifdef gettext 20# undef gettext 21# endif 22# define gettext(s) (s) 23# ifdef ngettext 24# undef ngettext 25# endif 26# define ngettext(s, p, n) ((n == 1) ? (s) : (p)) 27#endif 28 29#define FORMAT_PRESERVING(n) __attribute__((format_arg(n))) 30 31intuse_gettext_poison(void); 32 33#ifndef NO_GETTEXT 34voidgit_setup_gettext(void); 35intgettext_width(const char*s); 36#else 37staticinlinevoidgit_setup_gettext(void) 38{ 39use_gettext_poison();/* getenv() reentrancy paranoia */ 40} 41staticinlineintgettext_width(const char*s) 42{ 43returnstrlen(s); 44} 45#endif 46 47staticinline FORMAT_PRESERVING(1)const char*_(const char*msgid) 48{ 49if(!*msgid) 50return""; 51returnuse_gettext_poison() ?"# GETTEXT POISON #":gettext(msgid); 52} 53 54staticinline FORMAT_PRESERVING(1)FORMAT_PRESERVING(2) 55const char*Q_(const char*msgid,const char*plu,unsigned long n) 56{ 57if(use_gettext_poison()) 58return"# GETTEXT POISON #"; 59returnngettext(msgid, plu, n); 60} 61 62/* Mark msgid for translation but do not translate it. */ 63#if !USE_PARENS_AROUND_GETTEXT_N 64#define N_(msgid) msgid 65#else 66/* 67 * Strictly speaking, this will lead to invalid C when 68 * used this way: 69 * static const char s[] = N_("FOO"); 70 * which will expand to 71 * static const char s[] = ("FOO"); 72 * and in valid C, the initializer on the right hand side must 73 * be without the parentheses. But many compilers do accept it 74 * as a language extension and it will allow us to catch mistakes 75 * like: 76 * static const char *msgs[] = { 77 * N_("one") 78 * N_("two"), 79 * N_("three"), 80 * NULL 81 * }; 82 * (notice the missing comma on one of the lines) by forcing 83 * a compilation error, because parenthesised ("one") ("two") 84 * will not get silently turned into ("onetwo"). 85 */ 86#define N_(msgid) (msgid) 87#endif 88 89const char*get_preferred_languages(void); 90intis_utf8_locale(void); 91 92#endif