diff -r 07f47c5cbf3b -r 9d25ba043f6e languages/urls.py
--- a/languages/urls.py	Mon Apr 13 00:29:21 2009 +0300
+++ b/languages/urls.py	Mon Apr 13 00:47:25 2009 +0300
@@ -3,7 +3,8 @@
 from models import Language
 from feeds import AllLanguages, LanguageReleaseFeed
 from views import (language_detail, slug_feed,
-                   language_release, language_release_feed)
+                   language_release, language_release_feed,
+                   language_release_download)
 
 admin.autodiscover()
 
@@ -51,5 +52,9 @@
         regex = '^(?P<slug>[-_@\w]+)/collection/(?P<collection_slug>[-\w]+)/(?P<release_slug>[-\w]+)/$',
         view = language_release,
     ),
-
+    url(
+        name = 'language_release_download',
+        regex = '^(?P<slug>[-_@\w]+)/collection/(?P<collection_slug>[-\w]+)/(?P<release_slug>[-\w]+)/download_(?P<filetype>[\w]+)/$',
+        view = language_release_download,
+    ),
 )
diff -r 07f47c5cbf3b -r 9d25ba043f6e languages/views.py
--- a/languages/views.py	Mon Apr 13 00:29:21 2009 +0300
+++ b/languages/views.py	Mon Apr 13 00:47:25 2009 +0300
@@ -1,4 +1,5 @@
 import os
+from django.http import Http404, HttpResponseRedirect, HttpResponse
 from django.shortcuts import render_to_response, get_object_or_404
 from django.views.generic import list_detail
 from django.utils.translation import ugettext_lazy as _
@@ -62,7 +63,7 @@
 
 def language_release(request, slug, collection_slug, release_slug):
     language, collection, release, pofile_list = get_lang_rel_objs(
-        language_slug, collection_slug, release_slug)
+        slug, collection_slug, release_slug)
     untrans_comps = Component.objects.untranslated_by_lang_release(language, 
                                                                    release)
 
@@ -73,3 +74,24 @@
         'untrans_comps': untrans_comps,
     }, context_instance=RequestContext(request))
 
+
+def language_release_download(request, slug, collection_slug, release_slug,
+                              filetype):
+    """
+    Download a compressed file of all files for a language-release.
+    """
+    from exceptions import NotImplementedError
+    language, collection, release, pofile_list = get_lang_rel_objs(
+        slug, collection_slug, release_slug)
+
+    filename = '%s.%s_%s' % (language.code, collection.slug, release.slug)
+    from translations.util.compressed import POCompressedArchive
+    try:
+        archive = POCompressedArchive(pofile_list, filename, filetype)
+        response = HttpResponse(file(archive.file_path).read())
+        response['Content-Disposition'] = 'attachment; filename=%s' % archive.filename
+        response['Content-Type'] = archive.content_type
+        archive.cleanup()
+    except NotImplementedError:
+        raise Http404
+    return response
diff -r 07f47c5cbf3b -r 9d25ba043f6e site_media/css/icons.css
--- a/site_media/css/icons.css	Mon Apr 13 00:29:21 2009 +0300
+++ b/site_media/css/icons.css	Mon Apr 13 00:47:25 2009 +0300
@@ -39,6 +39,7 @@
 .i16.branch { background-image: url('../images/icons/arrow_branch.png'); }
 .i16.collection { background-image: url('../images/icons/basket.png'); }
 .i16.component { background-image: url('../images/icons/brick.png'); }
+.i16.compress { background-image: url('../images/icons/compress.png'); }
 .i16.delete { background-image: url('../images/icons/cross.png'); }
 .i16.delete_circle { background-image: url('../images/icons/cancel.png'); }
 .i16.edit { background-image: url('../images/icons/pencil.png'); }
diff -r 07f47c5cbf3b -r 9d25ba043f6e site_media/images/icons/compress.png
diff -r 07f47c5cbf3b -r 9d25ba043f6e templates/languages/language_release.html
--- a/templates/languages/language_release.html	Mon Apr 13 00:29:21 2009 +0300
+++ b/templates/languages/language_release.html	Mon Apr 13 00:47:25 2009 +0300
@@ -30,9 +30,15 @@
 
 {% if pofile_list %}
 
-    <h3>{% trans "Project/Component statistics" %} </h3>
+<h3>{% trans "Project/Component statistics" %} </h3>
 
-    {% lang_stats_table pofile_list %}
+{% lang_stats_table pofile_list %}
+
+<h4>Download</h4>
+
+Receive all the translation files in a compressed archive.
+<a class="i16 compress buttonized" href="{% url language_release_download slug=language.code collection_slug=release.collection.slug release_slug=release.slug filetype="zip" %}">Get <code>.zip</code></a>
+<a class="i16 compress buttonized" href="{% url language_release_download slug=language.code collection_slug=release.collection.slug release_slug=release.slug filetype="targz" %}">Get <code>.tar.gz</code></a>
 
 {% endif %}
 
diff -r 07f47c5cbf3b -r 9d25ba043f6e translations/util/compressed.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/translations/util/compressed.py	Mon Apr 13 00:47:25 2009 +0300
@@ -0,0 +1,40 @@
+from exceptions import NotImplementedError
+import tempfile, os, time
+import zipfile, tarfile
+
+"""
+Support for handling compressed files and data.
+"""
+
+class POCompressedArchive:
+    """A compressed archive with PO files inside."""
+    
+    SUPPORTED_TYPES = ['zip', 'targz']
+
+    def __init__(self, pofiles, filename, type):
+        tmpdir = tempfile.gettempdir()
+        if type == 'zip':
+            self.filename = '%s.zip' % filename
+        elif type == 'targz':
+            self.filename = '%s.tar.gz' % filename
+
+        self.file_path = os.path.join(tmpdir,
+                                      '%s.%s' % (self.filename, time.time()))
+        if not type in self.SUPPORTED_TYPES:
+            raise NotImplementedError("Unsupported archive type")
+        if type == 'zip':
+            self.file = zipfile.ZipFile(self.file_path, 'w')
+            self.content_type = 'application/x-zip'
+            for pofile in pofiles:
+                path = pofile.object.trans.tm.get_file_path(pofile.filename)
+                self.file.write(str(path), str(pofile.symbolic_path))
+        elif type == 'targz':
+            self.file = tarfile.open(self.file_path, 'w')
+            self.content_type = 'application/x-gzip'
+            for pofile in pofiles:
+                path = pofile.object.trans.tm.get_file_path(pofile.filename)
+                self.file.add(str(path), str(pofile.symbolic_path))
+        self.file.close()
+                
+    def cleanup(self):
+        os.unlink(self.file_path)

