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
This commit is contained in:
Matthias Clasen 2008-07-18 18:14:04 +00:00
parent adae2cf59b
commit e417f54c28
9 changed files with 117 additions and 0 deletions

View File

@ -1,3 +1,16 @@
2008-07-18 Matthias Clasen <mclasen@redhat.com>
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 <mclasen@redhat.com>
* tests/Makefile.am:

View File

@ -1,3 +1,8 @@
2008-07-18 Matthias Clasen <mclasen@redhat.com>
* glib/glib-sections.txt:
* glib/tmpl/i18n.sgml: Add new gettext stuff
2008-07-18 Matthias Clasen <mclasen@redhat.com>
Bug 530759 update the gobject tutorial to the XXI century

View File

@ -2503,9 +2503,11 @@ g_unichar_to_utf8
Q_
C_
N_
NC_
g_dgettext
g_dngettext
g_dpgettext
g_dpgettext2
g_strip_context
<SUBSECTION>
g_get_language_names

View File

@ -148,6 +148,41 @@ To get the translated string, call gettext() at runtime.
@Returns:
<!-- ##### MACRO NC_ ##### -->
<para>
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.
</para>
|[
{
static const char *messages[] = {
NC_("some context", "some very meaningful message"),
NC_("some context", "and another one")
};
const char *string;
...
string
= index &gt; 1 ? g_dpgettext2 (NULL, "some context", "a default message") : g_dpgettext2 (NULL, "some context", messages[index]);
<!-- -->
fputs (string);
...
}
]|
<note><para>
If you are using the NC_() macro, you need to make sure that you
pass <option>--keyword=NC_:1c,2</option> to xgettext when extracting
messages. Note that this only works with GNU gettext >= 0.15.
</para></note>
@Context: a message context, must be a string literal
@String: a message id, must be a string literal
@Since: 2.18
<!-- ##### FUNCTION g_strip_context ##### -->
<para>

View File

@ -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__ */

View File

@ -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__ */

View File

@ -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

View File

@ -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)
{

View File

@ -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