Zum Inhalt springen
i18n-error-base
Deutsch
Esc
↑↓navigieren↵öffnen⌘Jvorschau
Auf dieser Seite

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 I18nErrorBase und instanceof <konkrete Klasse> sind alle true.
  • String(error) / error.toString() enthalten die aufgelöste Nachricht (z. B. "Error: ...").
  • cause wird ü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.

War diese Seite hilfreich?