Start · Sprachen · JavaScript · Referenz · NDEFRecord.lang

NDEFRecord.lang

Eigenschaft

Die schreibgeschützte Eigenschaft <code>lang</code> gibt das Sprach-Tag (z. B. <code>"de-DE"</code>) einer Text-Nutzlast eines NDEF-Datensatzes zurück oder <code>null</code>.

seit JavaScript Experimentell: Chrome/Edge für Android 89+ (Web NF Kategorie: webapi

Signatur

NDEFRecord.lang

Beschreibung

Die schreibgeschützte Eigenschaft lang der Schnittstelle NDEFRecord gehört zur Web-NFC-API. Sie enthält das Sprach-Tag nach BCP 47 (z. B. "en", "de-DE"), das zusammen mit einer Text-Nutzlast auf einem NFC-Tag gespeichert wurde.

Sinnvoll gefüllt ist lang nur bei Datensätzen mit recordType === "text". Bei allen anderen Typen ("url", "mime", "smart-poster" usw.) ist der Wert null. Damit lässt sich zum Beispiel ein mehrsprachiges Tag auslesen und der Text in der Sprache der Nutzerin oder des Nutzers anzeigen.

Beim Schreiben per NDEFReader.write() setzt man die Sprache über das Feld lang im Datensatz-Objekt. Fehlt es, verwendet der Browser document.documentElement.lang oder, falls das leer ist, "en". Wichtig für das Dekodieren ist aber die Eigenschaft encoding, denn lang sagt nichts über den Zeichensatz aus.

Rückgabewert

Typ
string | null
Beschreibung
Ein BCP-47-Sprach-Tag wie "de-DE" bei Text-Datensätzen, sonst null.

Beispiele

Sprache und Text eines gescannten Tags auslesen

const scanTag = async () => {
  const reader = new NDEFReader();
  await reader.scan();

  reader.addEventListener("reading", ({ message, serialNumber }) => {
    console.log(`Tag ${serialNumber} gelesen`);
    for (const record of message.records) {
      if (record.recordType !== "text") continue;
      const decoder = new TextDecoder(record.encoding);
      console.log(`Sprache: ${record.lang}`);
      console.log(`Text: ${decoder.decode(record.data)}`);
    }
  });
};

document.querySelector("#scan").addEventListener("click", scanTag);
Tag 04:a2:3b:c1:5e:80:00 gelesen Sprache: de-DE Text: Willkommen im Museum

Mehrsprachiges Tag schreiben

const writeTag = async () => {
  const reader = new NDEFReader();
  await reader.write({
    records: [
      { recordType: "text", lang: "de", data: "Ausgang links" },
      { recordType: "text", lang: "en", data: "Exit on the left" },
      { recordType: "text", lang: "fr", data: "Sortie à gauche" }
    ]
  });
  console.log("Tag beschrieben");
};

document.querySelector("#write").addEventListener("click", writeTag);
Tag beschrieben

Passenden Text anhand der Browsersprache wählen

const pickText = (records) => {
  const texts = records.filter((r) => r.recordType === "text");
  const wanted = navigator.language.toLowerCase();
  const short = wanted.split("-")[0];

  const match =
    texts.find((r) => r.lang?.toLowerCase() === wanted) ??
    texts.find((r) => r.lang?.toLowerCase().split("-")[0] === short) ??
    texts[0];

  return match ? new TextDecoder(match.encoding).decode(match.data) : null;
};

const reader = new NDEFReader();
await reader.scan();
reader.onreading = ({ message }) => {
  console.log(pickText(message.records));
};
Ausgang links

// Wichtig · Fallstricke

  • Browserunterstützung: Web NFC ist experimentell und läuft derzeit nur in Chromium-Browsern unter Android (ab Version 89). Desktop-Browser, Firefox und Safari/iOS unterstützen es nicht. Prüfe das vorab mit if ("NDEFReader" in window).
  • Die API funktioniert nur in sicheren Kontexten (HTTPS), nur im Top-Level-Frame und nur, während die Seite sichtbar ist. scan() und write() brauchen eine Nutzeraktion und fordern die NFC-Berechtigung an.
  • lang ist schreibgeschützt. Ändern kannst du die Sprache nur, indem du einen neuen Datensatz schreibst.
  • Bei Datensätzen, die kein Text sind, ist der Wert null. Nutze deshalb optionale Verkettung (record.lang?.…), bevor du String-Methoden aufrufst.
  • Der Wert kommt vom Tag und wird nicht geprüft. Er kann ein beliebiger, auch ungültiger String sein, also nicht blind übernehmen (z. B. nicht ungeprüft per innerHTML ausgeben).
  • Groß- und Kleinschreibung bei Sprach-Tags ist nicht festgelegt. Normalisiere vor dem Vergleich (z. B. mit toLowerCase() oder Intl.getCanonicalLocales()).