Index: glib/gutils.c
===================================================================
--- glib/gutils.c	(revision 6968)
+++ glib/gutils.c	(working copy)
@@ -3280,7 +3280,7 @@ glib_gettext (const gchar *str)
       _glib_gettext_initialized = TRUE;
     }
   
-  return dgettext (GETTEXT_PACKAGE, str);
+  return g_dgettext (GETTEXT_PACKAGE, str);
 }
 
 #ifdef G_OS_WIN32
Index: glib/glib.symbols
===================================================================
--- glib/glib.symbols	(revision 6968)
+++ glib/glib.symbols	(working copy)
@@ -1148,6 +1148,7 @@ g_strdown
 #endif
 g_strv_length
 g_strip_context
+g_dgettext
 g_dpgettext
 #endif
 #endif
Index: glib/gstrfuncs.c
===================================================================
--- glib/gstrfuncs.c	(revision 6968)
+++ glib/gstrfuncs.c	(working copy)
@@ -2876,7 +2876,7 @@ g_dpgettext (const gchar *domain, 
   const gchar *translation;
   gchar *sep;
 
-  translation = dgettext (domain, msgctxtid);
+  translation = g_dgettext (domain, msgctxtid);
 
   if (translation == msgctxtid)
     {
@@ -2894,7 +2894,7 @@ g_dpgettext (const gchar *domain, 
           strcpy (tmp, msgctxtid);
           tmp[sep - msgctxtid] = '\004';
 
-          translation = dgettext (domain, tmp);
+          translation = g_dgettext (domain, tmp);
    
           if (translation == tmp)
             return sep + 1; 
@@ -2904,6 +2904,78 @@ g_dpgettext (const gchar *domain, 
   return translation;
 }
 
+static gboolean
+_g_dgettext_should_translate (void)
+{
+  static gsize translate = 0;
+  enum {
+    SHOULD_TRANSLATE = 1,
+    SHOULD_NOT_TRANSLATE = 2
+  };
+
+  if (G_UNLIKELY (g_once_init_enter (&translate)))
+    {
+      gboolean should_translate = TRUE;
+
+      const char *default_domain     = textdomain (NULL);
+      const char *translator_comment = gettext ("");
+      const char *translate_locale   = setlocale (LC_MESSAGES, NULL);
+
+      /* We should NOT translate only if all the following hold:
+       *   - user has called textdomain() and set textdomain to non-default
+       *   - default domain has no translations
+       *   - locale does not start with "en_" and is not "C"
+       *
+       * Rationale:
+       *   - If text domain is still the default domain, maybe user calls
+       *     it later. Continue with old behavior of translating.
+       *   - If locale starts with "en_", we can continue using the
+       *     translations even if the app doesn't have translations for
+       *     this locale.  That is, en_UK and en_CA for example.
+       *   - If locale is "C", maybe user calls setlocale(LC_ALL,"") later.
+       *     Continue with old behavior of translating.
+       */
+      if (0 != strcmp (default_domain, "messages") &&
+	  '\0' == *translator_comment &&
+	  0 != strncmp (translate_locale, "en_", 3) &&
+	  0 != strcmp (translate_locale, "C"))
+        should_translate = FALSE;
+      
+      g_once_init_leave (&translate,
+			 should_translate ?
+			 SHOULD_TRANSLATE :
+			 SHOULD_NOT_TRANSLATE);
+    }
+
+  return translate == SHOULD_TRANSLATE;
+}
+
+/**
+ * g_dgettext:
+ * @domain: the translation domain to use, or %NULL to use
+ *   the domain set with textdomain()
+ * @msgid: message to translate
+ *
+ * This function is a wrapper of dgettext() which does not not translate
+ * the message if the application who initialized glib i18n is not translated.
+ *
+ * Applications should normally not use this function directly,
+ * but use the _() macro for translations.
+ *
+ * Returns: The translated string
+ *
+ * Since: 2.16
+ */
+const gchar *
+g_dgettext (const gchar *domain,
+            const gchar *msgid)
+{
+  if (domain && G_UNLIKELY (!_g_dgettext_should_translate ()))
+    return msgid;
+
+  return dgettext (domain, msgid);
+}
+
 
 #define __G_STRFUNCS_C__
 #include "galiasdef.c"
Index: glib/goption.c
===================================================================
--- glib/goption.c	(revision 6888)
+++ glib/goption.c	(working copy)
@@ -2058,7 +2058,7 @@ static gchar *
 dgettext_swapped (const gchar *msgid, 
 		  const gchar *domainname)
 {
-  return dgettext (domainname, msgid);
+  return g_dgettext (domainname, msgid);
 }
 
 /**
Index: glib/gstrfuncs.h
===================================================================
--- glib/gstrfuncs.h	(revision 6888)
+++ glib/gstrfuncs.h	(working copy)
@@ -247,6 +247,9 @@ gchar*                g_stpcpy         (
 G_CONST_RETURN gchar *g_strip_context  (const gchar *msgid, 
 					const gchar *msgval);
 
+G_CONST_RETURN gchar *g_dgettext       (const gchar *domain,
+					const gchar *msgid);
+
 G_CONST_RETURN gchar *g_dpgettext      (const gchar *domain,
                                         const gchar *msgctxtid,
                                         gsize        msgidoffset);
Index: glib/gi18n-lib.h
===================================================================
--- glib/gi18n-lib.h	(revision 6968)
+++ glib/gi18n-lib.h	(working copy)
@@ -28,7 +28,7 @@
 #error You must define GETTEXT_PACKAGE before including gi18n-lib.h.
 #endif
 
-#define  _(String) dgettext (GETTEXT_PACKAGE, String)
+#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
 #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)
