diff --git a/doc/CHANGES.txt b/doc/CHANGES.txt
index a5f88a1a3957c858a0eb089e606ba1c9dd9bd79c..b566f221946d90d46bf7b4aac859e0aa6b8b7f50 100644
--- a/doc/CHANGES.txt
+++ b/doc/CHANGES.txt
@@ -23,6 +23,10 @@ Zope Changes
 
       - Acquisition wrappers now correctly proxy __contains__.
 
+      - Collector #2116: sequence.sort() did not work properly
+        locale related comparison methods
+
+
   Zope 2.10.0 beta 1 (2006/05/30)
 
     Restructuring
diff --git a/lib/python/DocumentTemplate/sequence/SortEx.py b/lib/python/DocumentTemplate/sequence/SortEx.py
index c3cf5c81618da53bb828a02ccba67b74e509fda9..907efe04a8d13e4246376dc83619451eb645fd83 100644
--- a/lib/python/DocumentTemplate/sequence/SortEx.py
+++ b/lib/python/DocumentTemplate/sequence/SortEx.py
@@ -17,7 +17,8 @@ eg Sort(sequence, (("akey", "nocase"), ("anotherkey", "cmp", "desc")))
 $Id$
 """
 
-from types import TupleType
+from App.config import getConfiguration
+
 
 def sort(sequence, sort=(), _=None, mapping=0):
     """
@@ -82,7 +83,7 @@ def sort(sequence, sort=(), _=None, mapping=0):
     s=[]
     for client in sequence:
         k = None
-        if type(client)==TupleType and len(client)==2:
+        if isinstance(client, tuple) and len(client)==2:
             if isort: k=client[0]
             v=client[1]
         else:
@@ -133,12 +134,25 @@ basic_type={type(''): 1, type(0): 1, type(0.0): 1, type(()): 1, type([]): 1,
 def nocase(str1, str2):
     return cmp(str1.lower(), str2.lower())
 
-import sys
-if sys.modules.has_key("locale"): # only if locale is already imported
-    from locale import strcoll
+def getStrcoll():
+
+    if getConfiguration().locale:
+        from locale import strcoll
+        return strcoll
+    else:
+        raise RuntimeError("strcoll() is only available for a proper 'locale' configuration in zope.conf")
+
+def getStrcoll_nocase():
+
+    if getConfiguration().locale:
+        from locale import strcoll
+        return strcoll
+        def strcoll_nocase(str1, str2):
+            return strcoll(str1.lower(), str2.lower())
+        return strcoll_nocase
 
-    def strcoll_nocase(str1, str2):
-        return strcoll(str1.lower(), str2.lower())
+    else:
+        raise RuntimeError("strcoll() is only available for a proper 'locale' configuration in zope.conf")
 
 
 def make_sortfunctions(sortfields, _):
@@ -168,9 +182,9 @@ def make_sortfunctions(sortfields, _):
         elif f_name == "nocase":
             func = nocase
         elif f_name in ("locale", "strcoll"):
-            func = strcoll
+            func = getStrcoll()
         elif f_name in ("locale_nocase", "strcoll_nocase"):
-            func = strcoll_nocase
+            func = getStrcoll_nocase()
         else: # no - look it up in the namespace
             func = _.getitem(f_name, 0)