diff --git a/babel/support.py b/babel/support.py
--- a/babel/support.py
+++ b/babel/support.py
@@ -19,6 +19,7 @@
 
 from datetime import date, datetime, time, timedelta
 import gettext
+import os
 
 try:
     set
@@ -281,11 +282,11 @@
     def __setitem__(self, key, value):
         self.value[key] = value
 
-    
 class Translations(gettext.GNUTranslations, object):
     """An extended translation catalog class."""
 
     DEFAULT_DOMAIN = 'messages'
+    _loaded_domains = {} # loaded domains cache
 
     def __init__(self, fileobj=None):
         """Initialize the translations catalog.
@@ -294,7 +295,9 @@
                         from
         """
         gettext.GNUTranslations.__init__(self, fp=fileobj)
+        
         self.files = filter(None, [getattr(fileobj, 'name', None)])
+        self.locale = self.files[0].split(os.sep)[-3]
 
     def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):
         """Load translations from the given directory.
@@ -315,7 +318,9 @@
         filename = gettext.find(domain or cls.DEFAULT_DOMAIN, dirname, locales)
         if not filename:
             return gettext.NullTranslations()
-        return cls(fileobj=open(filename, 'rb'))
+        instance = cls(fileobj=open(filename, 'rb'))
+        instance.default_domain = domain or cls.DEFAULT_DOMAIN
+        return instance
     load = classmethod(load)
 
     def merge(self, translations):
@@ -334,7 +339,45 @@
             self._catalog.update(translations._catalog)
             self.files.extend(translations.files)
         return self
+    
+    def add_domain(self, domain, dirname):
+        """Add a new domain to the translations object so that domain gettext
+        calls can be used."""
+        translation = Translations.load(dirname, self.locale, domain)
+        # Have the current domain as a fallback
+        translation.add_fallback(self)
+        # Store it
+        self._loaded_domains[domain] = translation
+        
+    def dgettext(self, domain, message):
+        """Like gettext() but look the message up in the specified domain."""
+        return self._domain_call('gettext', domain, message)
+    
+    def ldgettext(self, domain, message):
+        """Like lgettext() but look the message up in the specified domain.""" 
+        return self._domain_call('lgettext', domain, message)
+    
+    def dugettext(self, domain, message):
+        """Like ugettext() but look the message up in the specified domain."""
+        return self._domain_call('ugettext', domain, message)
+    
+    def dngettext(self, domain, singular, plural, num):
+        """Like ngettext() but look the message up in the specified domain."""
+        return self._domain_call('ngettext', domain, singular, plural, num)
+    
+    def ldngettext(self, domain, singular, plural, num):
+        """Like lngettext() but look the message up in the specified domain."""
+        return self._domain_call('lngettext', domain, singular, plural, num)
+    
+    def dungettext(self, domain, singular, plural, num):
+        """Like ungettext() but look the message up in the specified domain."""
+        return self._domain_call('ungettext', domain, singular, plural, num)
+    
+    def _domain_call(self, func, domain, *args, **kwargs):
+        return getattr(self._loaded_domains.get(domain, self),
+                       func)(*args, **kwargs)
 
     def __repr__(self):
-        return '<%s: "%s">' % (type(self).__name__,
-                               self._info.get('project-id-version'))
+        return '<%s "%s": "%s">' % (type(self).__name__,
+                                    self.info().get('project-id-version'),
+                                    self.locale)

