diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py
index 13fc8a8..a831c83 100644
--- a/django/utils/translation/__init__.py
+++ b/django/utils/translation/__init__.py
@@ -2,6 +2,8 @@
 Internationalization support.
 """
 from django.utils.functional import lazy
+import traceback
+import threading
 
 __all__ = ['gettext', 'gettext_noop', 'gettext_lazy', 'ngettext',
         'ngettext_lazy', 'string_concat', 'activate', 'deactivate',
@@ -18,6 +20,9 @@ __all__ = ['gettext', 'gettext_noop', 'gettext_lazy', 'ngettext',
 # replace the functions with their real counterparts (once we do access the
 # settings).
 
+_init_lock = threading.Lock()
+_initialised = False
+
 def delayed_loader(*args, **kwargs):
     """
     Replace each real_* function with the corresponding function from either
@@ -26,20 +31,26 @@ def delayed_loader(*args, **kwargs):
     first time any i18n method is called. It replaces all the i18n methods at
     once at that time.
     """
-    import traceback
-    from django.conf import settings
-    if settings.USE_I18N:
-        import trans_real as trans
-    else:
-        import trans_null as trans
-    caller = traceback.extract_stack(limit=2)[0][2]
-    g = globals()
-    for name in __all__:
-        if hasattr(trans, name):
-            g['real_%s' % name] = getattr(trans, name)
-
-    # Make the originally requested function call on the way out the door.
-    return g[caller](*args, **kwargs)
+    global _initialised
+    _init_lock.acquire()
+    try:
+        caller = traceback.extract_stack(limit=2)[0][2]
+        g = globals()
+        if not _initialised:
+            from django.conf import settings
+            if settings.USE_I18N:
+                import trans_real as trans
+            else:
+                import trans_null as trans
+            for name in __all__:
+                if hasattr(trans, name):
+                    g['real_%s' % name] = getattr(trans, name)
+            _initialised = True
+
+        # Make the originally requested function call on the way out the door.
+        return g[caller](*args, **kwargs)
+    finally:
+        _init_lock.release()
 
 g = globals()
 for name in __all__:
