Signatur
Beschreibung
Die Eigenschaft locale eines IDBIndex gibt das Gebietsschema zurück, das beim Anlegen des Indexes mit IDBObjectStore.createIndex() über die Option locale festgelegt wurde. Ist ein Gebietsschema gesetzt, sortiert der Index Zeichenketten-Schlüssel nach den Regeln dieser Sprache. Das ist die locale-aware sorting, also eine Sortierung nach Sprachregeln. Ohne Gebietsschema vergleicht IndexedDB Zeichenketten einfach nach ihren UTF-16-Codeeinheiten.
Wurde beim Anlegen locale: "auto" übergeben, verwendet der Index das Standard-Gebietsschema der Plattform. locale gibt dann das tatsächlich verwendete Gebietsschema zurück (z. B. "de-DE"), und IDBIndex.isAutoLocale ist true. Wurde kein Gebietsschema angegeben, ist der Wert null.
Die Eigenschaft hat keine Parameter und ist schreibgeschützt. Man kann das Gebietsschema eines Indexes nachträglich nicht ändern. Dazu muss man den Index in einem upgradeneeded-Handler löschen und neu anlegen.
Wichtig: locale gehört nicht zum IndexedDB-Standard des W3C. Es gab die Eigenschaft nur als experimentelle Funktion in Firefox. Im Produktivcode sollte man deshalb vor dem Zugriff prüfen, ob sie vorhanden ist, oder die Sortierung selbst übernehmen, z. B. mit Intl.Collator.
Rückgabewert
"en-US"). Bei locale: "auto" ist es das tatsächlich verwendete Plattform-Gebietsschema. Wenn beim Anlegen kein Gebietsschema angegeben wurde, ist der Wert null. In Browsern ohne diese Funktion ist die Eigenschaft undefined.Beispiele
Index mit Gebietsschema anlegen und locale auslesen
const request = indexedDB.open('kontakte', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('personen', { keyPath: 'id', autoIncrement: true });
// Nicht standardisierte Option: Sortierung nach deutschen Sprachregeln
const index = store.createIndex('nachname', 'nachname', { unique: false, locale: 'de-DE' });
console.log('Gebietsschema:', index.locale ?? '(keins / nicht unterstützt)');
};
locale-Wert eines bestehenden Indexes mit Funktionsprüfung lesen
const openDb = (name) => new Promise((resolve, reject) => {
const req = indexedDB.open(name);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const zeigeIndexInfo = async () => {
const db = await openDb('kontakte');
const index = db.transaction('personen', 'readonly')
.objectStore('personen')
.index('nachname');
if ('locale' in index) {
console.log(`locale: ${index.locale}, auto: ${index.isAutoLocale}`);
} else {
console.log('IDBIndex.locale wird in diesem Browser nicht unterstützt.');
}
db.close();
};
zeigeIndexInfo();
Ausweichlösung: selbst nach Sprachregeln sortieren mit Intl.Collator
const sortiereNachSprache = async (index, locale = 'de') => {
const alle = await new Promise((resolve, reject) => {
const req = index.getAll();
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Nutze index.locale, falls vorhanden, sonst das übergebene Gebietsschema
const collator = new Intl.Collator(index.locale ?? locale);
return alle.sort((a, b) => collator.compare(a.nachname, b.nachname));
};
// Wichtig · Fallstricke
- Nicht standardisiert und veraltet: Die Eigenschaft steht nicht in der IndexedDB-Spezifikation. Nur Firefox (ab Version 43) hatte sie, und auch dort nur hinter dem Flag
dom.indexedDB.experimental. Chrome, Edge und Safari unterstützen sie nicht. Dort ist der Wertundefined, und die OptionlocaleincreateIndex()wird ignoriert. - Funktionsprüfung: Man sollte immer mit
'locale' in indexprüfen, ob die Eigenschaft vorhanden ist, bevor man sich darauf verlässt. Wenn eine Sortierung nach Sprachregeln wichtig ist, sortiert man besser selbst mitIntl.CollatoroderString.prototype.localeCompare(). - Schreibgeschützt: Eine Zuweisung an
index.localehat keine Wirkung. Im Strict Mode löst sie einenTypeErroraus. Das Gebietsschema kann man nur beim Anlegen des Indexes festlegen. - Unterschied
nullund"auto": Wurde beim Anlegen"auto"angegeben, liefertlocaledas aufgelöste Plattform-Gebietsschema und nicht den Text"auto". Ob"auto"verwendet wurde, zeigtisAutoLocale. - Zugriff auf einen Index nach dem Ende seiner Transaktion ist beim Lesen von Eigenschaften zwar möglich, Abfragen wie
getAll()werfen dann aber einenTransactionInactiveError.