diff --git a/trac/admin/console.py b/trac/admin/console.py
--- a/trac/admin/console.py
+++ b/trac/admin/console.py
@@ -169,9 +169,9 @@ Type:  '?' or 'help' for help on command
         # fixup language according to env settings
         if has_babel:
             default = env.config.get('trac', 'default_language', '')
-            negotiated = get_negotiated_locale([LANG, default])
+            negotiated = get_negotiated_locale([LANG, default], env.log)
             if negotiated:
-                translation.activate(negotiated)
+                translation.activate(negotiated, env.path)
         
     ##
     ## Utility methods
diff --git a/trac/prefs/web_ui.py b/trac/prefs/web_ui.py
--- a/trac/prefs/web_ui.py
+++ b/trac/prefs/web_ui.py
@@ -106,7 +106,7 @@ class PreferencesModule(Component):
         }
 
         if Locale:
-            locales = map(Locale.parse, get_available_locales())
+            locales = map(Locale.parse, get_available_locales(self.log))
             languages = sorted([(str(locale).replace('_','-'),
                                  locale.display_name) for locale in locales])
             data['locales'] = locales
diff --git a/trac/util/translation.py b/trac/util/translation.py
--- a/trac/util/translation.py
+++ b/trac/util/translation.py
@@ -143,8 +143,8 @@ try:
                 locale_dir = pkg_resources.resource_filename('trac', 'locale')
             except pkg_resources.ExtractionError:
                 return # delay extraction
-            except KeyError:
-                return # No locale data in egg
+            except Exception:
+                return
             t = Translations.load(locale_dir, locale or 'en_US')
             if not t or t.__class__ is NullTranslations:
                 t = self._null_translations
@@ -325,19 +325,26 @@ try:
     def get_translations():
         return translations
 
-    def get_available_locales():
+    def get_available_locales(log=None):
         """Return a list of locale identifiers of the locales for which
         translations are available.
         """
-        return [dirname for dirname
-                in pkg_resources.resource_listdir('trac', 'locale')
-                if '.' not in dirname]
+        try:
+            locales = [dirname for dirname
+                       in pkg_resources.resource_listdir('trac', 'locale')
+                       if '.' not in dirname]
+        except Exception:
+            locales = []
+        if not locales and log is not None:
+            log.warning("Locale data not found")
+        return locales
+                   
 
-    def get_negotiated_locale(preferred_locales):
+    def get_negotiated_locale(preferred_locales, log=None):
         def normalize(locale_ids):
             return [id.replace('_', '-') for id in locale_ids if id]
         return Locale.negotiate(normalize(preferred_locales),
-                                normalize(get_available_locales()), sep='-')
+                                normalize(get_available_locales(log)), sep='-')
         
     has_babel = True
 
@@ -368,8 +375,8 @@ except ImportError: # fall back on 0.11 
     def get_translations():
         return translations
 
-    def get_available_locales():
+    def get_available_locales(log=None):
         return []
 
-    def get_negotiated_locale(preferred=None, default=None):
+    def get_negotiated_locale(preferred=None, log=None):
         return None
diff --git a/trac/web/main.py b/trac/web/main.py
--- a/trac/web/main.py
+++ b/trac/web/main.py
@@ -308,7 +308,7 @@ class RequestDispatcher(Component):
             preferred = req.session.get('language')
             default = self.env.config.get('trac', 'default_language', '')
             negotiated = get_negotiated_locale([preferred, default] +
-                                               req.languages)
+                                               req.languages, self.log)
             self.log.debug("Negotiated locale: %s -> %s", preferred, negotiated)
             return negotiated
 

