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:56:41 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:
diff -r 275034865933 tests/regressiontests/i18n/resolution_high_priority/locale/de/LC_MESSAGES/django.mo
Binary file tests/regressiontests/i18n/resolution_high_priority/locale/de/LC_MESSAGES/django.mo has changed
diff -r 275034865933 tests/regressiontests/i18n/resolution_high_priority/locale/de/LC_MESSAGES/django.po
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/regressiontests/i18n/resolution_high_priority/locale/de/LC_MESSAGES/django.po	Thu Dec 16 15:56:41 2010 +0100
@@ -0,0 +1,22 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-02-14 17:33+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: models.py:3
+msgid "Date/time"
+msgstr "Datum/Zeit (FIRST APP)"
diff -r 275034865933 tests/regressiontests/i18n/resolution_high_priority/models.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/regressiontests/i18n/resolution_high_priority/models.py	Thu Dec 16 15:56:41 2010 +0100
@@ -0,0 +1,1 @@
+#
\ No newline at end of file
diff -r 275034865933 tests/regressiontests/i18n/tests.py
--- a/tests/regressiontests/i18n/tests.py	Thu Dec 16 12:11:20 2010 +0000
+++ b/tests/regressiontests/i18n/tests.py	Thu Dec 16 15:56:41 2010 +0100
@@ -654,6 +654,20 @@
     def test_app_translation(self):
         self.assertUgettext('Date/time', 'APP')
 
+class AppResolutionOrderI18NTests(ResolutionOrderI18NTests):
+
+    def setUp(self):
+        self.old_installed_apps = settings.INSTALLED_APPS
+        settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution_high_priority', 'regressiontests.i18n.resolution']
+        super(AppResolutionOrderI18NTests, self).setUp()
+
+    def tearDown(self):
+        settings.INSTALLED_APPS = self.old_installed_apps
+        super(AppResolutionOrderI18NTests, self).tearDown()
+
+    def test_app_translation(self):
+        self.assertUgettext('Date/time', 'FIRST APP')
+
 class LocalePathsResolutionOrderI18NTests(ResolutionOrderI18NTests):
 
     def setUp(self):
