summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--docs/reference/ChangeLog5
-rw-r--r--docs/reference/glib/glib-sections.txt2
-rw-r--r--docs/reference/glib/tmpl/i18n.sgml35
-rw-r--r--glib/gi18n-lib.h1
-rw-r--r--glib/gi18n.h1
-rw-r--r--glib/glib.symbols1
-rw-r--r--glib/gstrfuncs.c56
-rw-r--r--glib/gstrfuncs.h3
9 files changed, 117 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 1b8bd6305..571e21f77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
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:
* tests/keyfile-test.c:
* tests/option-test.c: Remove
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index 00690cf05..cc8f1afc7 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,5 +1,10 @@
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
* 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 575e3f7a7..90f9899e5 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
<SUBSECTION>
g_get_language_names
diff --git a/docs/reference/glib/tmpl/i18n.sgml b/docs/reference/glib/tmpl/i18n.sgml
index 4c1fe7980..b9ce778e1 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:
+<!-- ##### 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>
diff --git a/glib/gi18n-lib.h b/glib/gi18n-lib.h
index f5bcc180d..b8be9aed0 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 011b52f89..b83554644 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 76267f661..d5cb4e844 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 fcb093740..ee07cc356 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 f58a28568..ee291f80f 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