diff -ur GConf-2.6.1/gconf/gconf-locale.c GConf-2.6.1.hacked/gconf/gconf-locale.c
--- GConf-2.6.1/gconf/gconf-locale.c.orig	2004-08-02 13:19:41.166861000 -0700
+++ GConf-2.6.1/gconf/gconf-locale.c	2004-08-02 13:20:49.947469000 -0700
@@ -22,6 +22,7 @@
 #include <sys/time.h>
 #include <time.h>
 #include <string.h>
+#include <stdio.h>
 
 static void
 gconf_locale_cache_add (GConfLocaleCache* cache,
@@ -189,7 +190,66 @@
  * Big mess o' cut-and-pasted code
  */
 
-/* --------------------------------------------------------------- */
+static GHashTable *alias_table = NULL;
+
+/*read an alias file for the locales*/
+static void
+read_aliases (char *file)
+{
+  FILE *fp;
+  char buf[256];
+  if (!alias_table)
+    alias_table = g_hash_table_new (g_str_hash, g_str_equal);
+  fp = fopen (file,"r");
+  if (!fp)
+    return;
+  while (fgets (buf,256,fp))
+    {
+      char *p;
+      g_strstrip(buf);
+      if (buf[0]=='#' || buf[0]=='\0')
+        continue;
+      p = strtok (buf,"\t ");
+      if (!p)
+	continue;
+      p = strtok (NULL,"\t ");
+      if(!p)
+	continue;
+      if (!g_hash_table_lookup (alias_table, buf))
+	g_hash_table_insert (alias_table, g_strdup(buf), g_strdup(p));
+    }
+  fclose (fp);
+}
+
+/*return the un-aliased language as a newly allocated string*/
+static char *
+unalias_lang (char *lang)
+{
+  char *p;
+  int i;
+  if (!alias_table)
+    {
+      read_aliases ("/usr/share/locale/locale.alias");
+      read_aliases ("/usr/local/share/locale/locale.alias");
+      read_aliases ("/usr/lib/X11/locale/locale.alias");
+      read_aliases ("/usr/openwin/lib/locale/locale.alias");
+    }
+  i = 0;
+  while ((p=g_hash_table_lookup(alias_table,lang)) && strcmp(p, lang))
+    {
+      lang = p;
+      if (i++ == 30)
+        {
+          static gboolean said_before = FALSE;
+	  if (!said_before)
+            g_warning (_("Too many alias levels for a locale, "
+			 "may indicate a loop"));
+	  said_before = TRUE;
+	  return lang;
+	}
+    }
+  return lang;
+}
 
 /* Mask for components of locale spec. The ordering here is from
  * least significant to most significant
@@ -360,6 +420,8 @@
           category_memory[0]= '\0'; 
           category_memory++;
           
+	  cp = unalias_lang (cp); /* add locale alias support */
+
           if (strcmp (cp, "C") == 0)
             c_locale_defined= TRUE;