From: Matthias Clasen Date: Fri, 18 Jul 2008 18:14:04 +0000 (+0000) Subject: Bug 536996 – Missing noop i18n macro equivalent to C_ X-Git-Tag: GLIB_2_17_4~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e417f54c28b8bc241391612009a2bab81699850a;p=platform%2Fupstream%2Fglib.git Bug 536996 – Missing noop i18n macro equivalent to C_ * glib/glib.symbols: * glib/gstrfuncs.[hc]: Add g_dpgettext2() which is a variant of g_dpgettext() taking context and id as separate arguments. * glib/gi18n-lib.h: * glib/gi18n.h: Add an NC_() macro that is to C_() as N_() is to _(). svn path=/trunk/; revision=7202 --- diff --git a/ChangeLog b/ChangeLog index 1b8bd63..571e21f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2008-07-18 Matthias Clasen + Bug 536996 – Missing noop i18n macro equivalent to C_ + + * glib/glib.symbols: + * glib/gstrfuncs.[hc]: Add g_dpgettext2() which is a + variant of g_dpgettext() taking context and id as separate + arguments. + + * glib/gi18n-lib.h: + * glib/gi18n.h: Add an NC_() macro that is to C_() as N_() + is to _(). + +2008-07-18 Matthias Clasen + * tests/Makefile.am: * tests/keyfile-test.c: * tests/option-test.c: Remove diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 00690cf..cc8f1af 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,5 +1,10 @@ 2008-07-18 Matthias Clasen + * glib/glib-sections.txt: + * glib/tmpl/i18n.sgml: Add new gettext stuff + +2008-07-18 Matthias Clasen + Bug 530759 – update the gobject tutorial to the XXI century * gobject/*: Some updates to the tutorial. Patch by Emmanuele diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 575e3f7..90f9899 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -2503,9 +2503,11 @@ g_unichar_to_utf8 Q_ C_ N_ +NC_ g_dgettext g_dngettext g_dpgettext +g_dpgettext2 g_strip_context g_get_language_names diff --git a/docs/reference/glib/tmpl/i18n.sgml b/docs/reference/glib/tmpl/i18n.sgml index 4c1fe79..b9ce778 100644 --- a/docs/reference/glib/tmpl/i18n.sgml +++ b/docs/reference/glib/tmpl/i18n.sgml @@ -148,6 +148,41 @@ To get the translated string, call gettext() at runtime. @Returns: + + +Only marks a string for translation, with context. +This is useful in situations where the translated strings can't +be directly used, e.g. in string array initializers. +To get the translated string, you should call g_dpgettext2() at runtime. + +|[ + { + static const char *messages[] = { + NC_("some context", "some very meaningful message"), + NC_("some context", "and another one") + }; + const char *string; + ... + string + = index > 1 ? g_dpgettext2 (NULL, "some context", "a default message") : g_dpgettext2 (NULL, "some context", messages[index]); + + fputs (string); + ... + } +]| + + +If you are using the NC_() macro, you need to make sure that you +pass to xgettext when extracting +messages. Note that this only works with GNU gettext >= 0.15. + + + +@Context: a message context, must be a string literal +@String: a message id, must be a string literal +@Since: 2.18 + + diff --git a/glib/gi18n-lib.h b/glib/gi18n-lib.h index f5bcc18..b8be9ae 100644 --- a/glib/gi18n-lib.h +++ b/glib/gi18n-lib.h @@ -32,5 +32,6 @@ #define Q_(String) g_dpgettext (GETTEXT_PACKAGE, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (GETTEXT_PACKAGE, Context "\004" String, strlen (Context) + 1) +#define NC_(Context, String) (String) #endif /* __G_I18N_LIB_H__ */ diff --git a/glib/gi18n.h b/glib/gi18n.h index 011b52f..b835546 100644 --- a/glib/gi18n.h +++ b/glib/gi18n.h @@ -28,5 +28,6 @@ #define Q_(String) g_dpgettext (NULL, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (NULL, Context "\004" String, strlen (Context) + 1) +#define NC_(Context, String) (String) #endif /* __G_I18N_H__ */ diff --git a/glib/glib.symbols b/glib/glib.symbols index 76267f6..d5cb4e8 100644 --- a/glib/glib.symbols +++ b/glib/glib.symbols @@ -1154,6 +1154,7 @@ g_strip_context G_GNUC_FORMAT(1) g_dgettext G_GNUC_FORMAT(2) g_dngettext G_GNUC_FORMAT(3) g_dpgettext G_GNUC_FORMAT(2) +g_dpgettext2 G_GNUC_FORMAT(3) #endif #endif diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index fcb0937..ee07cc3 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -2909,6 +2909,62 @@ g_dpgettext (const gchar *domain, return translation; } +/* This function is taken from gettext.h + * GNU gettext uses '\004' to separate context and msgid in .mo files. + */ +/** + * g_dpgettext2: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @context: the message context + * @msgid: the message + * + * This function is a variant of g_dgettext() which supports + * a disambiguating message context. GNU gettext uses the + * '\004' character to separate the message context and + * message id in @msgctxtid. + * + * This uses g_dgettext() internally. See that functions for differences + * with dgettext() proper. + * + * This function differs from C_() in that it is not a macro and + * thus you may use non-string-literals as context and msgid arguments. + * + * Returns: The translated string + * + * Since: 2.18 + */ +G_CONST_RETURN char * +g_dpgettext2 (const char *domain, + const char *msgctxt, + const char *msgid) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; + char* msg_ctxt_id; + + msg_ctxt_id = g_alloca (msgctxt_len + msgid_len); + + 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 = g_dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + { + /* try the old way of doing message contexts, too */ + msg_ctxt_id[msgctxt_len - 1] = '|'; + translation = g_dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + return msgid; + } + + return translation; +} + static gboolean _g_dgettext_should_translate (void) { diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h index f58a285..ee291f8 100644 --- a/glib/gstrfuncs.h +++ b/glib/gstrfuncs.h @@ -257,6 +257,9 @@ G_CONST_RETURN gchar *g_dngettext (const gchar *domain, G_CONST_RETURN gchar *g_dpgettext (const gchar *domain, const gchar *msgctxtid, gsize msgidoffset) G_GNUC_FORMAT(2); +G_CONST_RETURN gchar *g_dpgettext2 (const gchar *domain, + const gchar *context, + const gchar *msgid) G_GNUC_FORMAT(3); G_END_DECLS