Användning
Grundläggande åtgärder för att definiera felklasser, registrera meddelanden, byta språk, prefix och fallback.
Grundläggande flöde
Definiera en felklass
Ärv I18nErrorBase<TMeta> och definiera info för meddelandegenerering i TMeta.
Registrera meddelanden per språk
Registrera meddelandet per klass och språk med setErrorMessage.
Byt språk och läs message
Byt med setGlobalConfig({ lang }) och 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
Definiera en felklass
TMeta är hjälpeinfo för meddelandegenerering. Den behålls som error.meta och skickas till registrerade 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" }
Konstruktorns andra argument är en sträng eller en (meta) => string-funktion. Det tredje är { cause } och andra Error-alternativ.
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
Om du sätter TMeta till undefined kan du utelämna meta.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Registrera meddelanden
setErrorMessage registrerar fabriksfunktioner per klass och språk.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
Strängar är också tillåtna. Språk kan anges som arrayer.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
Omregistrering av samma klass och språk skriver över. Den gäller endast när konstruktorerna vid registrering och uppslagning är identiska, inte via instanceof.
Byta språk
Byt med Valibots globala konfiguration. message refererar till aktuell lang vid varje åtkomst.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
Oinställd lang är "en". Oregistrerade språk använder konstruktorns standardmeddelande.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Lägga till ett prefix
static prefix läggs till i början av det lösta meddelandet. Det gäller både översatta meddelanden och standardmeddelanden.
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 inte är inställt returneras meddelandet som det är.
Beteende som Error
error instanceof Error,instanceof I18nErrorBaseochinstanceof <konkret klass>är allatrueString(error)/error.toString()inkluderar det lösta meddelandet (t.ex."Error: ...")causebehålls via{ cause }
Vanliga mönster
Fixera standardmeddelandet i konstruktorn
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);
}
}
Anropare skickar bara meta, vilket undviker duplicering av standardtexten.
Registrera flera språk samtidigt
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Språkkoder normaliseras inte. "en" och "en-US" är separata nycklar, så registrera behövda koder explicit.