     ;; sort by creator, title, subtitles and name-of-part. If there is
     ;; no creator then sort just by title. Likewise if there are no
     ;; subtitles then sort by name-of-part.
-    (sort-by (juxt #(or (:creator %) (:title %))
-                   :title
-                   #(or (and (:subtitles %) (string/join (:subtitles %))) (:name-of-part %))
-                   :name-of-part) by-vector)
+    ;; Chunkify all strings, i.e. split them into strings and numbers
+    ;; to enable natural
+    ;; sort (http://www.davekoelle.com/alphanum.html)
+    (sort-by (comp
+              #(map chunkify %)
+              (juxt #(or (:creator %) (:title %))
+                    :title
+                    #(or (and (:subtitles %) (string/join (:subtitles %))) (:name-of-part %))
+                    :name-of-part)) by-vector)
     (reduce
      (fn [m item]
        (let [update-keys (get-update-keys-fn item)]

     (mapcat collate-duplicate-items [braille-items musiknoten-items taktile-items])
     others)))

(defn locale-compare [x y]
  (cond
    (and (nil? x) (nil? y)) 0
    (nil? x) -1
    (nil? y) 1
    :else (. collator compare x y)))

(defn- by-vector [v1 v2]
  (let [c1 (count v1)

      (> c1 c2) 1
      :else (reduce
             (fn [_ [s1 s2]]
               (let [comparison (if (every? seq? [s1 s2])
                                  ;; a chunked string
                                  (by-vector s1 s2)
                                  ;; locale aware comparison
                                  (locale-compare s1 s2))]
                 (if (not= 0 comparison)
                   (reduced comparison)
                   comparison)))
