Index: django/templatetags/i18n.py
===================================================================
--- django/templatetags/i18n.py	(revision 6182)
+++ django/templatetags/i18n.py	(working copy)
@@ -14,6 +14,26 @@
         context[self.variable] = [(k, translation.ugettext(v)) for k, v in settings.LANGUAGES]
         return ''
 
+class GetAvailableLanguageNamesNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        from django.conf import settings
+        original_language = translation.get_language()
+        context[self.variable] = []
+        for code, name in settings.LANGUAGES:
+            try:
+                translation.activate(code)
+            except IndexError:
+                translation.activate(original_language)
+            context[self.variable].append({
+                'language_code': code,
+                'name': name,
+                'name_local': translation.ugettext(name)})
+        translation.activate(original_language)
+        return ''
+
 class GetCurrentLanguageNode(Node):
     def __init__(self, variable):
         self.variable = variable
@@ -95,6 +115,31 @@
         raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args
     return GetAvailableLanguagesNode(args[2])
 
+def do_get_available_language_names(parser, token):
+    """
+    This will store in the context a list of available
+    languages and supply each item with the name of the
+    language both in the current language and the
+    language itself.
+
+    Usage::
+
+        {% get_available_language_names as languages %}
+        {% for language in languages %}
+        ...
+        {% endfor %}
+
+    This will convert the LANGUAGES setting from your
+    setting file (or the default settings) to a list of
+    dicts and put it into the named variable.  Each item
+    will have the keys ``language_code``, ``name`` and
+    ``name_local``.
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_available_language_names' requires 'as variable' (got %r)" % args
+    return GetAvailableLanguageNamesNode(args[2])
+
 def do_get_current_language(parser, token):
     """
     This will store the current language in the context.
@@ -240,6 +285,7 @@
     return BlockTranslateNode(extra_context, singular, plural, countervar, counter)
 
 register.tag('get_available_languages', do_get_available_languages)
+register.tag('get_available_language_names', do_get_available_language_names)
 register.tag('get_current_language', do_get_current_language)
 register.tag('get_current_language_bidi', do_get_current_language_bidi)
 register.tag('trans', do_translate)
