Verwendung
Grundlegende Abläufe zur Definition von Fehlerklassen, Registrierung von Nachrichten, Sprachwechsel, Präfix und Fallback.
Grundlegender Ablauf
Fehlerklasse definieren
Erweitern Sie I18nErrorBase<TMeta> und definieren Sie die Informationen zur Nachrichtenerzeugung als TMeta.
Sprachspezifische Nachrichten registrieren
Registrieren Sie mit setErrorMessage die zur Klasse und Sprache gehörende Nachricht.
Sprache wechseln und message lesen
Wechseln Sie mit setGlobalConfig({ lang }) und greifen Sie auf error.message zu.
import { setGlobalConfig } from "valibot";
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class BusinessRuleError extends I18nErrorBase<{ code: string; limit: number }> {
public constructor(meta: { code: string; limit: number }) {
super(meta, ({ code, limit }) => `Code: ${code}, Limit: ${limit}`);
}
}
setErrorMessage(
BusinessRuleError,
({ code, limit }) => `コード: ${code}、制限: ${limit}`,
"ja",
);
const error = new BusinessRuleError({ code: "ERR", limit: 50 });
setGlobalConfig({ lang: "ja" });
console.log(error.message); // コード: ERR、制限: 50
setGlobalConfig({ lang: "en" });
console.log(error.message); // Code: ERR, Limit: 50
Fehlerklasse definieren
TMeta sind Zusatzinformationen zur Nachrichtenerzeugung. Sie werden als error.meta gespeichert und an registrierte Funktionen übergeben.
import { I18nErrorBase } from "i18n-error-base";
class NotFoundError extends I18nErrorBase<{ resource: string }> {}
const error = new NotFoundError({ resource: "user" }, "fallback message");
console.log(error.meta); // { resource: "user" }
Das zweite Argument ist eine Zeichenkette oder eine (meta) => string-Funktion. Das dritte sind { cause } und weitere Error-Optionen.
class TestError extends I18nErrorBase<{ code: string }> {}
const cause = new Error("original");
const error = new TestError({ code: "ERR" }, "something went wrong", { cause });
console.log(error.cause === cause); // true
Wenn TMeta auf undefined gesetzt wird, kann meta weggelassen werden.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Nachrichten registrieren
setErrorMessage registriert Erzeugungsfunktionen pro Klasse und Sprache.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
Zeichenketten sind ebenfalls zulässig. Sprachen können als Arrays angegeben werden.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
Eine erneute Registrierung derselben Klasse und Sprache überschreibt den Eintrag. Sie gilt nur bei Übereinstimmung der Konstruktoren zum Registrierungs- und Zugriffszeitpunkt, nicht per instanceof.
Sprache wechseln
Die Sprache wird über die globale Konfiguration von Valibot gewechselt. message liest bei jedem Zugriff das aktuelle lang.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
Ohne gesetztes lang gilt "en". Nicht registrierte Sprachen verwenden die Standardnachricht des Konstruktors.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Präfix hinzufügen
Wenn static prefix gesetzt ist, wird es dem aufgelösten Nachrichtenanfang vorangestellt. Es gilt für übersetzte und Standardnachrichten.
class PrefixedError extends I18nErrorBase<{ code: string }> {
static {
this.prefix = "[ERROR] ";
}
}
setErrorMessage(PrefixedError, ({ code }) => `code is ${code}`, "ja");
const error = new PrefixedError({ code: "ERR" }, "fallback");
setGlobalConfig({ lang: "ja" });
console.log(error.message); // "[ERROR] code is ERR"
setGlobalConfig({ lang: "en" });
console.log(error.message); // "[ERROR] fallback"
Ohne Festlegung wird sie unverändert zurückgegeben.
Verhalten als Error
error instanceof Error,instanceof I18nErrorBaseundinstanceof <konkrete Klasse>sind alletrue.String(error)/error.toString()enthalten die aufgelöste Nachricht (z. B."Error: ...").causewird über{ cause }gespeichert.
Häufige Muster
Standardnachricht im Konstruktor festlegen
class BusinessRuleError extends I18nErrorBase<{ code: string; limit: number }> {
public constructor(meta: { code: string; limit: number }, options?: ErrorOptions) {
super(meta, ({ code, limit }) => `Code: ${code}, Limit: ${limit}`, options);
}
}
Aufrufende übergeben nur meta und vermeiden so eine Duplizierung des Standardtextes.
Mehrere Sprachen gemeinsam registrieren
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Sprachcodes werden nicht normalisiert. "en" und "en-US" sind separate Schlüssel, registrieren Sie benötigte Codes daher explizit.