       (> c1 c2) 1
       :else (reduce
              (fn [_ [s1 s2]]
-               (let [comparison (locale-compare 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)))

     (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)

    ;; 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.
    ;; 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)]
