diff -r 275034865933 django/utils/translation/trans_real.py
--- a/django/utils/translation/trans_real.py	Thu Dec 16 12:11:20 2010 +0000
+++ b/django/utils/translation/trans_real.py	Thu Dec 16 15:10:26 2010 +0100
@@ -79,7 +79,9 @@
         self.__language = '??'
 
     def merge(self, other):
-        self._catalog.update(other._catalog)
+        for k, v in other._catalog.items():
+            if k not in self._catalog:
+                self._catalog[k] = v
 
     def set_language(self, language):
         self.__language = language
@@ -138,29 +140,26 @@
             except IOError, e:
                 return None
 
-        res = _translation(globalpath)
-
-        # We want to ensure that, for example,  "en-gb" and "en-us" don't share
-        # the same translation object (thus, merging en-us with a local update
-        # doesn't affect en-gb), even though they will both use the core "en"
-        # translation. So we have to subvert Python's internal gettext caching.
-        base_lang = lambda x: x.split('-', 1)[0]
-        if base_lang(lang) in [base_lang(trans) for trans in _translations]:
-            res._info = res._info.copy()
-            res._catalog = res._catalog.copy()
-
         def _merge(path):
             t = _translation(path)
             if t is not None:
                 if res is None:
+                    # We want to ensure that, for example,  "en-gb" and "en-us" don't share
+                    # the same translation object (thus, merging en-us with a local update
+                    # doesn't affect en-gb), even though they will both use the core "en"
+                    # translation. So we have to subvert Python's internal gettext caching.
+
+                    base_lang = lambda x: x.split('-', 1)[0]
+                    if base_lang(lang) in [base_lang(trans) for trans in _translations]:
+                        t._info = t._info.copy()
+                        t._catalog = t._catalog.copy()
                     return t
                 else:
                     res.merge(t)
             return res
 
-        for localepath in settings.LOCALE_PATHS:
-            if os.path.isdir(localepath):
-                res = _merge(localepath)
+        if projectpath and os.path.isdir(projectpath):
+            res = _merge(projectpath)
 
         for appname in settings.INSTALLED_APPS:
             app = import_module(appname)
@@ -169,8 +168,11 @@
             if os.path.isdir(apppath):
                 res = _merge(apppath)
 
-        if projectpath and os.path.isdir(projectpath):
-            res = _merge(projectpath)
+        for localepath in settings.LOCALE_PATHS:
+            if os.path.isdir(localepath):
+                res = _merge(localepath)
+
+        res = _merge(globalpath)
 
         if res is None:
             if fallback is not None:
