Start · Sprachen · JavaScript · Referenz · IDBIndex.locale

IDBIndex.locale

Eigenschaft

Schreibgeschützte, nicht standardisierte Eigenschaft, die das Gebietsschema eines Indexes (z. B. <code>"en-US"</code> oder <code>"pl"</code>) liefert – oder <code>null</code>, wenn keines angegeben wurde.

seit JavaScript Nicht standardisiert, veraltet: nur Firefox 43+ hi deprecated seit ja Kategorie: webapi

Signatur

IDBIndex.locale

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

Typ
string | null
Beschreibung
Das Gebietsschema des Indexes als BCP-47-Sprachcode (z. B. "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)');
};
Gebietsschema: de-DE // Firefox mit aktiviertem Flag Gebietsschema: (keins / nicht unterstützt) // andere Browser

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();
IDBIndex.locale wird in diesem Browser nicht unterstützt.

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 Wert undefined, und die Option locale in createIndex() wird ignoriert.
  • Funktionsprüfung: Man sollte immer mit 'locale' in index prüfen, ob die Eigenschaft vorhanden ist, bevor man sich darauf verlässt. Wenn eine Sortierung nach Sprachregeln wichtig ist, sortiert man besser selbst mit Intl.Collator oder String.prototype.localeCompare().
  • Schreibgeschützt: Eine Zuweisung an index.locale hat keine Wirkung. Im Strict Mode löst sie einen TypeError aus. Das Gebietsschema kann man nur beim Anlegen des Indexes festlegen.
  • Unterschied null und "auto": Wurde beim Anlegen "auto" angegeben, liefert locale das aufgelöste Plattform-Gebietsschema und nicht den Text "auto". Ob "auto" verwendet wurde, zeigt isAutoLocale.
  • Zugriff auf einen Index nach dem Ende seiner Transaktion ist beim Lesen von Eigenschaften zwar möglich, Abfragen wie getAll() werfen dann aber einen TransactionInactiveError.