Brug
Grundlæggende arbejdsgang for at definere fejlklasser, registrere meddelelser, skifte sprog, præfiks og fallback.
Grundforløb
Definér en fejlklasse
Nedarv I18nErrorBase<TMeta>, og definér info til meddelelsesgenerering i TMeta.
Registrer sprogspecifikke meddelelser
Registrer meddelelsen for hver klasse og hvert sprog med setErrorMessage.
Skift sprog og læs message
Skift med setGlobalConfig({ lang }), og læs error.message.
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
Definér en fejlklasse
TMeta er hjælpeinfo til meddelelsesgenerering. Den beholdes som error.meta og sendes til registrerede funktioner.
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" }
Konstruktørens andet argument er en streng eller en (meta) => string-funktion. Det tredje er { cause } og andre Error-indstillinger.
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
Hvis du sætter TMeta til undefined, kan du udelade meta.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Registrer meddelelser
setErrorMessage registrerer fabriksfunktioner pr. klasse og sprog.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
Strenge er også tilladt. Sprog kan angives som arrays.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
Genregistrering af samme klasse og sprog overskriver. Den gælder kun, når konstruktørerne ved registrering og opslag er ens, ikke via instanceof.
Skift sprog
Skift med Valibots globale indstilling. message slår den aktuelle lang op ved hver adgang.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
Uden angivet lang er den "en". Uregistrerede sprog bruger konstruktørens standardmeddelelse.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Tilføj et præfiks
static prefix sættes foran den løste meddelelse. Det gælder både oversatte meddelelser og standardmeddelelser.
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"
Når det ikke er angivet, returneres meddelelsen som den er.
Opførsel som Error
error instanceof Error,instanceof I18nErrorBaseoginstanceof <konkret klasse>er alletrueString(error)/error.toString()indeholder den løste meddelelse (f.eks."Error: ...")causebeholdes via{ cause }
Almindelige mønstre
Fastlås standardmeddelelsen i konstruktøren
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);
}
}
Kalderen skal kun sende meta, så dublering af standardteksten undgås.
Registrer flere sprog på én gang
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Sprogkoder normaliseres ikke. "en" og "en-US" er separate nøgler, så registrer de nødvendige koder eksplicit.