Signatur
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
"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);
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);
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));
};
// 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()undwrite()brauchen eine Nutzeraktion und fordern die NFC-Berechtigung an. langist 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
innerHTMLausgeben). - Groß- und Kleinschreibung bei Sprach-Tags ist nicht festgelegt. Normalisiere vor dem Vergleich (z. B. mit
toLowerCase()oderIntl.getCanonicalLocales()).