Index: babel/catalog/extract.py
===================================================================
--- babel/catalog/extract.py	(revision 9)
+++ babel/catalog/extract.py	(working copy)
@@ -34,9 +34,10 @@
 GROUP_NAME = 'babel.extractors'
 
 KEYWORDS = (
-    '_', 'gettext', 'ngettext',
-    'dgettext', 'dngettext',
-    'ugettext', 'ungettext'
+    ('_',        [1, 1]),
+    ('gettext',  [1, 1]),  ('ngettext', [1, 2]),
+    ('dgettext', [2, 2]), ('dngettext', [2, 3]),
+    ('ugettext', [1, 1]), ('ungettext', [1, 2])
 )
 
 DEFAULT_MAPPING = {
@@ -145,9 +146,23 @@
     :rtype: `list`
     :raise ValueError: if the extraction method is not registered
     """
+    args = dict([(k[0], k[1]) for k in keywords])
+    keywords = [k[0] for k in keywords]
     for entry_point in working_set.iter_entry_points(GROUP_NAME, method):
         func = entry_point.load(require=True)
-        return list(func(fileobj, keywords, options=options or {}))
+        for lineno, funcname, message in func(fileobj, keywords,
+                                              options=options or {}):
+            if funcname in args:
+                if not isinstance(message, (list, tuple)):
+                    message = [message]
+                start, end = args[funcname]
+                message = message[start - 1:end]
+                if len(message) == 1:
+                    message = message[0]
+                else:
+                    message = tuple(message)
+            yield lineno, funcname, message
+        return
     raise ValueError('Unknown extraction method %r' % method)
 
 def extract_genshi(fileobj, keywords, options):

