diff -r 8cd5ecf7b694 django/bin/compile-messages.py
--- a/django/bin/compile-messages.py	Mon Feb 04 05:57:56 2008 +0100
+++ b/django/bin/compile-messages.py	Tue Feb 05 22:18:57 2008 +0100
@@ -1,51 +1,7 @@
 #!/usr/bin/env python
 
 import optparse
-import os
-import sys
-
-try:
-    set
-except NameError:
-    from sets import Set as set     # For Python 2.3
-
-
-def compile_messages(locale=None):
-    basedirs = (os.path.join('conf', 'locale'), 'locale')
-    if os.environ.get('DJANGO_SETTINGS_MODULE'):
-        from django.conf import settings
-        basedirs += settings.LOCALE_PATHS
-
-    # Gather existing directories.
-    basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs)))
-
-    if not basedirs:
-        print "This script should be run from the Django SVN tree or your project or app tree, or with the settings module specified."
-        sys.exit(1)
-
-    for basedir in basedirs:
-        if locale:
-            basedir = os.path.join(basedir, locale, 'LC_MESSAGES')
-        compile_messages_in_dir(basedir)
-
-def compile_messages_in_dir(basedir):
-    for dirpath, dirnames, filenames in os.walk(basedir):
-        for f in filenames:
-            if f.endswith('.po'):
-                sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
-                pf = os.path.splitext(os.path.join(dirpath, f))[0]
-                # Store the names of the .mo and .po files in an environment
-                # variable, rather than doing a string replacement into the
-                # command, so that we can take advantage of shell quoting, to
-                # quote any malicious characters/escaping.
-                # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
-                os.environ['djangocompilemo'] = pf + '.mo'
-                os.environ['djangocompilepo'] = pf + '.po'
-                if sys.platform == 'win32': # Different shell-variable syntax
-                    cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
-                else:
-                    cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
-                os.system(cmd)
+from django.core import management
 
 def main():
     parser = optparse.OptionParser()
@@ -56,9 +12,9 @@ def main():
     options, args = parser.parse_args()
     if len(args):
         parser.error("This program takes no arguments")
-    if options.settings:
-        os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
-    compile_messages(options.locale)
+    if not options.settings:
+        options.settings = None
+    management.call_command('messagescompile', locale=options.locale, settings=options.settings)
 
 if __name__ == "__main__":
     main()
diff -r 8cd5ecf7b694 django/bin/daily_cleanup.py
--- a/django/bin/daily_cleanup.py	Mon Feb 04 05:57:56 2008 +0100
+++ b/django/bin/daily_cleanup.py	Tue Feb 05 22:18:57 2008 +0100
@@ -7,14 +7,7 @@ sessions at the moment).
 sessions at the moment).
 """
 
-import datetime
-from django.db import transaction
-from django.contrib.sessions.models import Session
-
-def clean_up():
-    """Clean up expired sessions."""
-    Session.objects.filter(expire_date__lt=datetime.datetime.now()).delete()
-    transaction.commit_unless_managed()
+from django.core import management
 
 if __name__ == "__main__":
-    clean_up()
+    management.call_command('cleanup')
diff -r 8cd5ecf7b694 django/bin/make-messages.py
--- a/django/bin/make-messages.py	Mon Feb 04 05:57:56 2008 +0100
+++ b/django/bin/make-messages.py	Tue Feb 05 22:18:57 2008 +0100
@@ -1,155 +1,32 @@
 #!/usr/bin/env python
 
-# Need to ensure that the i18n framework is enabled
-from django.conf import settings
-settings.configure(USE_I18N = True)
-
-from django.utils.translation import templatize
-import re
 import os
 import sys
 import getopt
-from itertools import dropwhile
+import optparse
+from django.core import management
 
-pythonize_re = re.compile(r'\n\s*//')
+def main():
+    parser = optparse.OptionParser()
+    parser.add_option('-l', '--locale', dest='locale',
+        help='Creates or updates the message files only for the given locale (e.g. pt_BR).')
+    parser.add_option('-d', '--domain', dest='domain', default='django',
+        help='The domain of the message files (default: "django").')
+    parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False,
+        help='Verbosity output')
+    parser.add_option('-a', '--all', 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.')
 
-def make_messages():
-    localedir = None
-
-    if os.path.isdir(os.path.join('conf', 'locale')):
-        localedir = os.path.abspath(os.path.join('conf', 'locale'))
-    elif os.path.isdir('locale'):
-        localedir = os.path.abspath('locale')
+    options, args = parser.parse_args()
+    if len(args):
+        parser.error("This program takes no arguments")
+    if options.verbose:
+        verbosity = 2
     else:
-        print "This script should be run from the django svn tree or your project or app tree."
-        print "If you did indeed run it from the svn checkout or your project or application,"
-        print "maybe you are just missing the conf/locale (in the django tree) or locale (for project"
-        print "and application) directory?"
-        print "make-messages.py doesn't create it automatically, you have to create it by hand if"
-        print "you want to enable i18n for your project or application."
-        sys.exit(1)
-
-    (opts, args) = getopt.getopt(sys.argv[1:], 'l:d:va')
-
-    lang = None
-    domain = 'django'
-    verbose = False
-    all = False
-
-    for o, v in opts:
-        if o == '-l':
-            lang = v
-        elif o == '-d':
-            domain = v
-        elif o == '-v':
-            verbose = True
-        elif o == '-a':
-            all = True
-
-    if domain not in ('django', 'djangojs'):
-        print "currently make-messages.py only supports domains 'django' and 'djangojs'"
-        sys.exit(1)
-    if (lang is None and not all) or domain is None:
-        print "usage: make-messages.py -l <language>"
-        print "   or: make-messages.py -a"
-        sys.exit(1)
-
-    languages = []
-
-    if lang is not None:
-        languages.append(lang)
-    elif all:
-        languages = [el for el in os.listdir(localedir) if not el.startswith('.')]
-
-    for lang in languages:
-
-        print "processing language", lang
-        basedir = os.path.join(localedir, lang, 'LC_MESSAGES')
-        if not os.path.isdir(basedir):
-            os.makedirs(basedir)
-
-        pofile = os.path.join(basedir, '%s.po' % domain)
-        potfile = os.path.join(basedir, '%s.pot' % domain)
-
-        if os.path.exists(potfile):
-            os.unlink(potfile)
-
-        all_files = []
-        for (dirpath, dirnames, filenames) in os.walk("."):
-            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'):
-                if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
-                src = open(os.path.join(dirpath, file), "rb").read()
-                src = pythonize_re.sub('\n#', src)
-                open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
-                thefile = '%s.py' % file
-                cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
-                    os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
-                (stdin, stdout, stderr) = os.popen3(cmd, 't')
-                msgs = stdout.read()
-                errors = stderr.read()
-                if errors:
-                    print "errors happened while running xgettext on %s" % file
-                    print errors
-                    sys.exit(8)
-                old = '#: '+os.path.join(dirpath, thefile)[2:]
-                new = '#: '+os.path.join(dirpath, file)[2:]
-                msgs = msgs.replace(old, new)
-                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')):
-                thefile = file
-                if file.endswith('.html'):
-                    src = open(os.path.join(dirpath, file), "rb").read()
-                    thefile = '%s.py' % file
-                    open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
-                if verbose:
-                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
-                cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
-                    domain, os.path.join(dirpath, thefile))
-                (stdin, stdout, stderr) = os.popen3(cmd, 't')
-                msgs = stdout.read()
-                errors = stderr.read()
-                if errors:
-                    print "errors happened while running xgettext on %s" % file
-                    print errors
-                    sys.exit(8)
-                if thefile != file:
-                    old = '#: '+os.path.join(dirpath, thefile)[2:]
-                    new = '#: '+os.path.join(dirpath, file)[2:]
-                    msgs = msgs.replace(old, new)
-                if os.path.exists(potfile):
-                    # Strip the header
-                    msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
-                else:
-                    msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
-                if msgs:
-                    open(potfile, 'ab').write(msgs)
-                if thefile != file:
-                    os.unlink(os.path.join(dirpath, thefile))
-
-        if os.path.exists(potfile):
-            (stdin, stdout, stderr) = os.popen3('msguniq --to-code=utf-8 "%s"' % potfile, 'b')
-            msgs = stdout.read()
-            errors = stderr.read()
-            if errors:
-                print "errors happened while running msguniq"
-                print errors
-                sys.exit(8)
-            open(potfile, 'w').write(msgs)
-            if os.path.exists(pofile):
-                (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b')
-                msgs = stdout.read()
-                errors = stderr.read()
-                if errors:
-                    print "errors happened while running msgmerge"
-                    print errors
-                    sys.exit(8)
-            open(pofile, 'wb').write(msgs)
-            os.unlink(potfile)
+        verbosity = 1
+    
+    management.call_command('messagesmake', locale=options.locale,
+        domain=options.domain, verbosity=verbosity, all=options.all)
 
 if __name__ == "__main__":
-    make_messages()
+    main()
diff -r 8cd5ecf7b694 django/core/management/base.py
--- a/django/core/management/base.py	Mon Feb 04 05:57:56 2008 +0100
+++ b/django/core/management/base.py	Tue Feb 05 22:18:57 2008 +0100
@@ -220,6 +220,17 @@ def copy_helper(style, app_or_project, n
             except OSError:
                 sys.stderr.write(style.NOTICE("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new))
 
+def get_locale_dir():
+    "Returns the locale directory from the Django SVN tree or an application/project"
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        basedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        basedir = os.path.abspath('locale')
+    else:
+        raise CommandError("This script should be run from the Django SVN tree or your project or app tree. If you did indeed run it from the SVN checkout or your project or application, maybe you are just missing the conf/locale (in the django tree) or locale (for project and application) directory? It is not created automatically, you have to create it by hand if you want to enable i18n for your project or application.")
+    return basedir
+
+
 def _make_writeable(filename):
     "Makes sure that the file is writeable. Useful if our source is read-only."
     import stat
diff -r 8cd5ecf7b694 django/core/management/commands/cleanup.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/django/core/management/commands/cleanup.py	Tue Feb 05 22:18:57 2008 +0100
@@ -0,0 +1,11 @@
+import datetime
+from django.core.management.base import NoArgsCommand
+
+class Command(NoArgsCommand):
+    help = "Can be run as a cronjob or directly to clean out old data from the database (only expired sessions at the moment)."
+
+    def handle_noargs(self, **options):
+        from django.db import transaction
+        from django.contrib.sessions.models import Session
+        Session.objects.filter(expire_date__lt=datetime.datetime.now()).delete()
+        transaction.commit_unless_managed()
diff -r 8cd5ecf7b694 django/core/management/commands/messagescompile.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/django/core/management/commands/messagescompile.py	Tue Feb 05 22:18:57 2008 +0100
@@ -0,0 +1,58 @@
+import os
+import sys
+from optparse import make_option
+from django.core.management.base import BaseCommand, CommandError, get_locale_dir
+from django.core.management.color import no_style
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--locale', '-l', dest='locale',
+            help='The locale to process. Default is to process all.'),
+    )
+    help = 'Compiles .po files to .mo files for use with builtin gettext support.'
+
+    requires_model_validation = False
+    can_import_settings = False
+
+    def handle(self, **options):
+        basedirs = (os.path.join('conf', 'locale'), 'locale')
+        if os.environ.get('DJANGO_SETTINGS_MODULE'):
+            from django.conf import settings
+            basedirs += settings.LOCALE_PATHS
+
+        # Gather existing directories.
+        basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs)))
+        
+        if not basedirs:
+            raise CommandError("This script should be run from the Django SVN tree or your project or app tree, or with the settings module specified.")
+
+        locale = options.get('locale', None)
+
+        def compile_messages_in_dir(basedir):
+            for dirpath, dirnames, filenames in os.walk(basedir):
+                for f in filenames:
+                    if f.endswith('.po'):
+                        sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
+                        pf = os.path.splitext(os.path.join(dirpath, f))[0]
+                        # Store the names of the .mo and .po files in an environment
+                        # variable, rather than doing a string replacement into the
+                        # command, so that we can take advantage of shell quoting, to
+                        # quote any malicious characters/escaping.
+                        # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
+                        os.environ['djangocompilemo'] = pf + '.mo'
+                        os.environ['djangocompilepo'] = pf + '.po'
+                        if sys.platform == 'win32': # Different shell-variable syntax
+                            cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
+                        else:
+                            cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
+                        os.system(cmd)
+
+        for basedir in basedirs:
+            if locale:
+                basedir = os.path.join(basedir, locale, 'LC_MESSAGES')
+            compile_messages_in_dir(basedir)
diff -r 8cd5ecf7b694 django/core/management/commands/messagesmake.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/django/core/management/commands/messagesmake.py	Tue Feb 05 22:18:57 2008 +0100
@@ -0,0 +1,145 @@
+import re
+import os
+import sys
+from itertools import dropwhile
+from optparse import make_option
+from django.core.management.base import CommandError, BaseCommand, get_locale_dir
+from django.utils.translation import templatize
+
+pythonize_re = re.compile(r'\n\s*//')
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--locale', '-l', default=None, dest='locale',
+            help='Creates or updates the message files only for the given locale (e.g. pt_BR).'),
+        make_option('--domain', '-d', default='django', dest='domain',
+            help='The domain of the message files (default: "django").'),
+        make_option('--verbosity', '-v', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            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.'),
+    )
+    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."
+
+    requires_model_validation = False
+    can_import_settings = False
+
+    def handle(self, *args, **options):
+        if len(args) != 0:
+            raise CommandError("Command doesn't accept any arguments")
+
+        localedir = get_locale_dir()
+        locale = options.get('locale', None)
+        domain = options.get('domain', 'django')
+        verbosity = int(options.get('verbosity', 1))
+        all = options.get('all', False)
+
+        if domain not in ('django', 'djangojs'):
+            raise CommandError("currently messagesmake only supports domains 'django' and 'djangojs'")
+        if (locale is None and not all) or domain is None:
+            # backwards compatible error message
+            if not sys.argv[0].endswith("make-messages.py"):
+                message = "Type '%s help %s' for usage.\n" % (os.path.basename(sys.argv[0]), sys.argv[1])
+            else:
+                message = "usage: make-messages.py -l <language>\n   or: make-messages.py -a\n"
+            sys.stderr.write(message)
+            sys.exit(1)
+
+        languages = []
+
+        if locale is not None:
+            languages.append(locale)
+        elif all:
+            languages = [el for el in os.listdir(localedir) if not el.startswith('.')]
+
+        for locale in languages:
+            if verbosity > 0:
+                print "processing language", locale
+            basedir = os.path.join(localedir, locale, 'LC_MESSAGES')
+            if not os.path.isdir(basedir):
+                os.makedirs(basedir)
+
+            pofile = os.path.join(basedir, '%s.po' % domain)
+            potfile = os.path.join(basedir, '%s.pot' % domain)
+
+            if os.path.exists(potfile):
+                os.unlink(potfile)
+
+            all_files = []
+            for (dirpath, dirnames, filenames) in os.walk("."):
+                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'):
+                    if verbosity > 1:
+                        sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                    src = open(os.path.join(dirpath, file), "rb").read()
+                    src = pythonize_re.sub('\n#', src)
+                    open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
+                    thefile = '%s.py' % file
+                    cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
+                        os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
+                    (stdin, stdout, stderr) = os.popen3(cmd, 't')
+                    msgs = stdout.read()
+                    errors = stderr.read()
+                    if errors:
+                        print "errors happened while running xgettext on %s" % file
+                        print errors
+                        sys.exit(8)
+                    old = '#: '+os.path.join(dirpath, thefile)[2:]
+                    new = '#: '+os.path.join(dirpath, file)[2:]
+                    msgs = msgs.replace(old, new)
+                    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')):
+                    thefile = file
+                    if file.endswith('.html'):
+                        src = open(os.path.join(dirpath, file), "rb").read()
+                        thefile = '%s.py' % file
+                        open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
+                    if verbosity > 1:
+                        sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                    cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
+                        domain, os.path.join(dirpath, thefile))
+                    (stdin, stdout, stderr) = os.popen3(cmd, 't')
+                    msgs = stdout.read()
+                    errors = stderr.read()
+                    if errors:
+                        print "errors happened while running xgettext on %s" % file
+                        print errors
+                        sys.exit(8)
+                    if thefile != file:
+                        old = '#: '+os.path.join(dirpath, thefile)[2:]
+                        new = '#: '+os.path.join(dirpath, file)[2:]
+                        msgs = msgs.replace(old, new)
+                    if os.path.exists(potfile):
+                        # Strip the header
+                        msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
+                    else:
+                        msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
+                    if msgs:
+                        open(potfile, 'ab').write(msgs)
+                    if thefile != file:
+                        os.unlink(os.path.join(dirpath, thefile))
+
+            if os.path.exists(potfile):
+                (stdin, stdout, stderr) = os.popen3('msguniq --to-code=utf-8 "%s"' % potfile, 'b')
+                msgs = stdout.read()
+                errors = stderr.read()
+                if errors:
+                    print "errors happened while running msguniq"
+                    print errors
+                    sys.exit(8)
+                open(potfile, 'w').write(msgs)
+                if os.path.exists(pofile):
+                    (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b')
+                    msgs = stdout.read()
+                    errors = stderr.read()
+                    if errors:
+                        print "errors happened while running msgmerge"
+                        print errors
+                        sys.exit(8)
+                open(pofile, 'wb').write(msgs)
+                os.unlink(potfile)
diff -r 8cd5ecf7b694 docs/django-admin.txt
--- a/docs/django-admin.txt	Mon Feb 04 05:57:56 2008 +0100
+++ b/docs/django-admin.txt	Tue Feb 05 22:18:57 2008 +0100
@@ -84,6 +84,12 @@ your admin's index page. See `Tutorial 2
 your admin's index page. See `Tutorial 2`_ for more information.
 
 .. _Tutorial 2: ../tutorial02/
+
+cleanup
+-------
+
+Can be run as a cronjob or directly to clean out old data from the database
+(only expired sessions at the moment).
 
 createcachetable <tablename>
 ----------------------------
@@ -320,6 +326,79 @@ Example usage::
 Example usage::
 
     django-admin.py loaddata --verbosity=2
+
+messagescompile
+---------------
+
+Compiles .po files created with ``messagesmake`` to .mo files for use with
+the builtin gettext support.
+
+.. i18n documentation: ../i18n/#compiling-message-files
+
+--locale
+~~~~~~~~
+
+Use the ``--locale`` or ``-l`` option to specify the locale to process.
+If not provided all locales are processed.
+
+Example usage::
+
+    django-admin.py messagescompile --locale=br_PT
+
+messagesmake
+------------
+
+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. After making changes to the messages files you need to compile them
+with ``messagescompile`` for use with the builtin gettext support.
+
+.. i18n documentation: ../i18n/#message-files
+
+--all
+~~~~~
+
+Use the ``--all`` or ``-a`` option to update the message files for all
+available languages.
+
+Example usage::
+
+    django-admin.py messagesmake --all
+
+--locale
+~~~~~~~~
+
+Use the ``--locale`` or ``-l`` option to specify the locale to process.
+
+Example usage::
+
+    django-admin.py messagesmake --locale=br_PT
+
+--domain
+~~~~~~~~
+
+Use the ``--domain`` or ``-d`` option to change the domain of the messages files.
+Currently supported:
+
+	* ``django`` for all ``*.py`` and ``*.html`` files (default) 
+	* ``djangojs`` for ``*.js`` files
+
+--verbosity
+~~~~~~~~~~~
+
+Use ``--verbosity`` or ``-v`` to specify the amount of notification and debug
+information that ``django-admin.py`` should print to the console.
+
+	* ``0`` means no input.
+	* ``1`` means normal input (default).
+	* ``2`` means verbose input.
+
+Example usage::
+
+    django-admin.py messagesmake --verbosity=2
+
+
 
 reset <appname appname ...>
 ---------------------------
diff -r 8cd5ecf7b694 docs/i18n.txt
--- a/docs/i18n.txt	Mon Feb 04 05:57:56 2008 +0100
+++ b/docs/i18n.txt	Tue Feb 05 22:18:57 2008 +0100
@@ -122,8 +122,8 @@ Translation works on variables. Again, h
 
 (The caveat with using variables or computed values, as in the previous two
 examples, is that Django's translation-string-detecting utility,
-``make-messages.py``, won't be able to find these strings. More on
-``make-messages`` later.)
+``djangoadmin.py messagesmake``, won't be able to find these strings. More on
+``messagesmake`` later.)
 
 The strings you pass to ``_()`` or ``ugettext()`` can take placeholders,
 specified with Python's standard named-string interpolation syntax. Example::
@@ -392,12 +392,12 @@ available translation strings and how th
 available translation strings and how they should be represented in the given
 language. Message files have a ``.po`` file extension.
 
-Django comes with a tool, ``bin/make-messages.py``, that automates the creation
+Django comes with a tool, ``bin/djangoadmin.py messagesmake``, that automates the creation
 and upkeep of these files.
 
 To create or update a message file, run this command::
 
-    bin/make-messages.py -l de
+    bin/djangoadmin.py messagesmake -l de
 
 ...where ``de`` is the language code for the message file you want to create.
 The language code, in this case, is in locale format. For example, it's
@@ -422,7 +422,7 @@ do the same, but the location of the loc
 
 .. admonition:: No gettext?
 
-    If you don't have the ``gettext`` utilities installed, ``make-messages.py``
+    If you don't have the ``gettext`` utilities installed, ``djangoadmin.py messagesmake``
     will create empty files. If that's the case, either install the ``gettext``
     utilities or just copy the English message file
     (``conf/locale/en/LC_MESSAGES/django.po``) and use it as a starting point;
@@ -439,7 +439,7 @@ For example, if your Django app containe
 
     _("Welcome to my site.")
 
-...then ``make-messages.py`` will have created a ``.po`` file containing the
+...then ``djangoadmin.py messagesmake`` will have created a ``.po`` file containing the
 following snippet -- a message::
 
     #: path/to/python/module.py:23
@@ -475,21 +475,21 @@ To reexamine all source code and templat
 To reexamine all source code and templates for new translation strings and
 update all message files for **all** languages, run this::
 
-    make-messages.py -a
+    djangoadmin.py messagesmake -a
 
 Compiling message files
 -----------------------
 
 After you create your message file -- and each time you make changes to it --
 you'll need to compile it into a more efficient form, for use by ``gettext``.
-Do this with the ``bin/compile-messages.py`` utility.
+Do this with the ``bin/djangoadmin.py messagescompile`` utility.
 
 This tool runs over all available ``.po`` files and creates ``.mo`` files,
 which are binary files optimized for use by ``gettext``. In the same directory
-from which you ran ``make-messages.py``, run ``compile-messages.py`` like
+from which you ran ``djangoadmin.py messagesmake``, run ``djangoadmin.py messagescompile`` like
 this::
 
-   bin/compile-messages.py
+   bin/djangoadmin.py messagescompile
 
 That's it. Your translations are ready for use.
 
@@ -597,7 +597,7 @@ Notes:
               ('en', ugettext('English')),
           )
 
-      With this arrangement, ``make-messages.py`` will still find and mark
+      With this arrangement, ``djangoadmin.py messagesmake`` will still find and mark
       these strings for translation, but the translation won't happen at
       runtime -- so you'll have to remember to wrap the languages in the *real*
       ``ugettext()`` in any code that uses ``LANGUAGES`` at runtime.
@@ -676,11 +676,11 @@ All message file repositories are struct
       searched in that order for ``<language>/LC_MESSAGES/django.(po|mo)``
     * ``$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)``
 
-To create message files, you use the same ``make-messages.py`` tool as with the
+To create message files, you use the same ``djangoadmin.py messagesmake`` tool as with the
 Django message files. You only need to be in the right place -- in the directory
 where either the ``conf/locale`` (in case of the source tree) or the ``locale/``
 (in case of app messages or project messages) directory are located. And you
-use the same ``compile-messages.py`` to produce the binary ``django.mo`` files
+use the same ``djangoadmin.py messagescompile`` to produce the binary ``django.mo`` files
 that are used by ``gettext``.
 
 You can also run ``compile-message.py --settings=path.to.settings`` to make
@@ -694,13 +694,13 @@ files. If your applications need to be d
 files. If your applications need to be delivered to other users and will
 be used in other projects, you might want to use app-specific translations.
 But using app-specific translations and project translations could produce
-weird problems with ``make-messages``: ``make-messages`` will traverse all
+weird problems with ``messagesmake``: ``messagesmake`` will traverse all
 directories below the current path and so might put message IDs into the
 project message file that are already in application message files.
 
 The easiest way out is to store applications that are not part of the project
 (and so carry their own translations) outside the project tree. That way,
-``make-messages`` on the project level will only translate strings that are
+``messagesmake`` on the project level will only translate strings that are
 connected to your explicit project and not strings that are distributed
 independently.
 
@@ -832,13 +832,13 @@ Creating JavaScript translation catalogs
 ----------------------------------------
 
 You create and update the translation catalogs the same way as the other
-Django translation catalogs -- with the make-messages.py tool. The only
+Django translation catalogs -- with the ``djangoadmin.py messagesmake`` tool. The only
 difference is you need to provide a ``-d djangojs`` parameter, like this::
 
-    make-messages.py -d djangojs -l de
+    djangoadmin.py messagesmake -d djangojs -l de
 
 This would create or update the translation catalog for JavaScript for German.
-After updating translation catalogs, just run ``compile-messages.py`` the same
+After updating translation catalogs, just run ``djangoadmin.py messagescompile`` the same
 way as you do with normal Django translation catalogs.
 
 Specialties of Django translation
diff -r 8cd5ecf7b694 docs/man/django-admin.1
--- a/docs/man/django-admin.1	Mon Feb 04 05:57:56 2008 +0100
+++ b/docs/man/django-admin.1	Tue Feb 05 22:18:57 2008 +0100
@@ -1,4 +1,4 @@
-.TH "django-admin.py" "1" "June 2007" "Django Project" ""
+.TH "django-admin.py" "1" "February 2008" "Django Project" ""
 .SH "NAME"
 django\-admin.py \- Utility script for the Django web framework
 .SH "SYNOPSIS"
@@ -21,6 +21,9 @@ script found at the top level of each Dj
 .BI "adminindex [" "appname ..." "]"
 Prints the admin\-index template snippet for the given app name(s).
 .TP
+.BI cleanup
+Cleans out old data from the database (only expired sessions at the moment).
+.TP
 .BI "createcachetable [" "tablename" "]"
 Creates the table needed to use the SQL cache backend
 .TP
@@ -42,6 +45,14 @@ Executes
 Executes
 .B sqlall
 for the given app(s) in the current database.
+.TP
+.BI "messagescompile [" "\-\-locale=LOCALE" "]"
+Compiles .po files to .mo files for use with builtin gettext support.
+.TP
+.BI "messagesmake [" "\-\-locale=LOCALE" "] [" "\-\-domain=DOMAIN" "] [" "\-\-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.
 .TP
 .BI "reset [" "appname ..." "]"
 Executes
@@ -136,7 +147,15 @@ Verbosity level: 0=minimal output, 1=nor
 .TP
 .I \-\-adminmedia=ADMIN_MEDIA_PATH
 Specifies the directory from which to serve admin media when using the development server.
-
+.TP
+.I \-l, \-\-locale=LOCALE
+The locale to process when using messagesmake or messagecompile.
+.TP
+.I \-d, \-\-domain=DOMAIN
+The domain of the message files (default: "django") when using messagesmake.
+.TP
+.I \-a, \-\-all
+Process all available locales when using messagesmake.
 .SH "ENVIRONMENT"
 .TP
 .I DJANGO_SETTINGS_MODULE
diff -r 8cd5ecf7b694 docs/settings.txt
--- a/docs/settings.txt	Mon Feb 04 05:57:56 2008 +0100
+++ b/docs/settings.txt	Tue Feb 05 22:18:57 2008 +0100
@@ -614,7 +614,7 @@ settings file::
         ('en', gettext('English')),
     )
 
-With this arrangement, ``make-messages.py`` will still find and mark these
+With this arrangement, ``django-admin.py messagesmake`` will still find and mark these
 strings for translation, but the translation won't happen at runtime -- so
 you'll have to remember to wrap the languages in the *real* ``gettext()`` in
 any code that uses ``LANGUAGES`` at runtime.
diff -r 8cd5ecf7b694 extras/django_bash_completion
--- a/extras/django_bash_completion	Mon Feb 04 05:57:56 2008 +0100
+++ b/extras/django_bash_completion	Tue Feb 05 22:18:57 2008 +0100
@@ -42,13 +42,15 @@ _django_completion()
     prev="${COMP_WORDS[COMP_CWORD-1]}"
 
     # Standalone options
-    opts="--help --settings --pythonpath --noinput --noreload --format --indent --verbosity --adminmedia --version"
+    opts="--help --settings --pythonpath --noinput --noreload --locale --all --domain --format --indent --verbosity --adminmedia --version"
+
     # Actions
-    actions="adminindex createcachetable dbshell diffsettings \
-             dumpdata flush inspectdb loaddata reset runfcgi runserver \
-             shell sql sqlall sqlclear sqlcustom sqlflush sqlindexes \
-             sqlreset sqlsequencereset startapp startproject \
-             syncdb test validate"
+    actions="adminindex createcachetable cleanup dbshell diffsettings \
+             dumpdata flush inspectdb loaddata messagescompile messagesmake \
+             reset runfcgi runserver shell sql sqlall sqlclear sqlcustom \
+             sqlflush sqlindexes sqlreset sqlsequencereset startapp \
+             startproject syncdb test validate"
+
     # Action's options
     action_shell_opts="--plain"
     action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir"
@@ -112,8 +114,9 @@ _django_completion()
                 return 0
                 ;;
 
-            createcachetable|dbshell|diffsettings| \
-            inspectdb|runserver|startapp|startproject|syncdb| \
+            createcachetable|cleanup|dbshell|diffsettings| \
+            inspectdb|messagescompile|messagesmake| \
+            runserver|startapp|startproject|syncdb| \
             validate)
                 COMPREPLY=()
                 return 0
