Index: django/bin/make-messages.py
===================================================================
--- django/bin/make-messages.py	(Revision 7599)
+++ django/bin/make-messages.py	(Arbeitskopie)
@@ -2,7 +2,7 @@
 
 import os
 import optparse
-from django.core.management.commands.makemessages import make_messages
+from django.core.management.commands.makemessages import make_messages, handle_extensions
 
 def main():
     parser = optparse.OptionParser()
@@ -17,6 +17,9 @@
         default=False, help='Reexamines all source code and templates for \
             new translation strings and updates all message files for all \
             available languages.')
+    parser.add_option('-e', '--extension', default=[], dest='extensions',
+        help='The file extension(s) to examine (default: ".html", separate multiple extensions with commas, or use -e multiple times)',
+        action='append'),
 
     options, args = parser.parse_args()
     if len(args):
@@ -25,9 +28,11 @@
         verbosity = 2
     else:
         verbosity = 1
-    
+
+    extensions = handle_extensions(options.extensions)
+    print extensions
     make_messages(locale=options.locale, domain=options.domain,
-        verbosity=verbosity, all=options.all)
+        verbosity=verbosity, all=options.all, extensions=extensions)
 
 if __name__ == "__main__":
     main()
 
Index: docs/django-admin.txt
===================================================================
--- docs/django-admin.txt	(Revision 7599)
+++ docs/django-admin.txt	(Arbeitskopie)
@@ -390,6 +390,20 @@

     django-admin.py makemessages --all

+--extension
+~~~~~~~~~~~
+
+Use the ``--extension`` or ``-e`` option to specify a list of file extensions
+to examine (default: ".html").
+
+Example usage::
+
+    django-admin.py makemessages --locale=de --extension xhtml
+
+Separate multiple extensions with commas or use -e/--extension multiple times::
+
+    django-admin.py makemessages --locale=de --extension=tpl,xml --extension=txt
+
 --locale
 ~~~~~~~~
 
Index: docs/man/django-admin.1
===================================================================
--- docs/man/django-admin.1	(Revision 7599)
+++ docs/man/django-admin.1	(Arbeitskopie)
@@ -49,7 +49,7 @@
 .B sqlall
 for the given app(s) in the current database.
 .TP
-.BI "makemessages [" "\-\-locale=LOCALE" "] [" "\-\-domain=DOMAIN" "] [" "\-\-all" "]"
+.BI "makemessages [" "\-\-locale=LOCALE" "] [" "\-\-domain=DOMAIN" "] [" "\-\-extension=EXTENSION" "] [" "\-\-all" "]"
 Runs over the entire source tree of the current directory and pulls out all
 strings marked for translation. It creates (or updates) a message file in the
 conf/locale (in the django tree) or locale (for project and application) directory.
@@ -154,6 +154,10 @@
 .I \-d, \-\-domain=DOMAIN
 The domain of the message files (default: "django") when using makemessages.
 .TP
+.I \-e, \-\-extension=EXTENSION
+The file extension(s) to examine (default: ".html", separate multiple
+extensions with commas, or use -e multiple times).
+.TP
 .I \-a, \-\-all
 Process all available locales when using makemessages.
 .SH "ENVIRONMENT"
 
Index: django/core/management/commands/makemessages.py
===================================================================
--- django/core/management/commands/makemessages.py	(Revision 7599)
+++ django/core/management/commands/makemessages.py	(Arbeitskopie)
@@ -5,9 +5,40 @@
 from optparse import make_option
 from django.core.management.base import CommandError, BaseCommand

+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
 pythonize_re = re.compile(r'\n\s*//')

-def make_messages(locale=None, domain='django', verbosity='1', all=False):
+def handle_extensions(extensions, default='.html'):
+    """
+    organizes multiple extensions that are separated with commas or passed by
+    using --extension/-e multiple times.
+    
+    for example: running 'django-admin makemessages -e js,txt -e xhtml -a'
+    would result in a extension list: ['.js', '.txt', '.xhtml']
+    
+    >>> organize_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py'])
+    ['.html', '.js']
+    """
+    ext_list = []
+    for ext in extensions:
+        ext_list += ext.lower().split(',')
+    for i, ext in enumerate(ext_list):
+        if not ext.startswith('.'):
+            ext_list[i] = '.%s' % ext_list[i]
+
+    # we don't want *.py files here because of the way non-*.py files
+    # are handled in make_messages() (they are copied to file.ext.py files to
+    # trick xgettext to parse them as python files)
+    extensions = list(set([x for x in ext_list if not x == ('.py')]))
+    if not extensions:
+        return [default]
+    return extensions
+
+def make_messages(locale=None, domain='django', verbosity='1', all=False, extensions=['.html']):
     """
     Uses the locale directory from the Django SVN tree or an application/
     project to process all 
@@ -61,7 +92,8 @@
             all_files.extend([(dirpath, f) for f in filenames])
         all_files.sort()
         for dirpath, file in all_files:
-            if domain == 'djangojs' and file.endswith('.js'):
+            file_base, file_ext = os.path.splitext(file)
+            if domain == 'djangojs' and file_ext == '.js':
                 if verbosity > 1:
                     sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
                 src = open(os.path.join(dirpath, file), "rb").read()
@@ -87,9 +119,9 @@
                 if msgs:
                     open(potfile, 'ab').write(msgs)
                 os.unlink(os.path.join(dirpath, thefile))
-            elif domain == 'django' and (file.endswith('.py') or file.endswith('.html')):
+            elif domain == 'django' and (file_ext == '.py' or file_ext in extensions):
                 thefile = file
-                if file.endswith('.html'):
+                if file_ext in extensions:
                     src = open(os.path.join(dirpath, file), "rb").read()
                     thefile = '%s.py' % file
                     open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
@@ -150,6 +182,9 @@
             help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
         make_option('--all', '-a', action='store_true', dest='all',
             default=False, help='Reexamines all source code and templates for new translation strings and updates all message files for all available languages.'),
+        make_option('--extension', '-e', default=[], dest='extensions',
+            help='The file extension(s) to examine (default: ".html", separate multiple extensions with commas, or use -e multiple times)',
+            action='append'),
     )
     help = "Runs over the entire source tree of the current directory and pulls out all strings marked for translation. It creates (or updates) a message file in the conf/locale (in the django tree) or locale (for project and application) directory."

@@ -164,5 +199,7 @@
         domain = options.get('domain')
         verbosity = int(options.get('verbosity'))
         process_all = options.get('all')
-
-        make_messages(locale, domain, verbosity, process_all)
+        extensions = options.get('extensions')
+        
+        extensions = organize_extensions(extensions)
+        make_messages(locale, domain, verbosity, process_all, extensions)
 