Utilizare
Operații de bază pentru definirea claselor de eroare, înregistrarea mesajelor, comutarea limbilor, prefix și fallback.
Fluxul de bază
Definiți o clasă de eroare
Extindeți I18nErrorBase<TMeta> și definiți în TMeta datele pentru generarea mesajului.
Înregistrați mesajele pe limbi
Înregistrați mesajul clasei și limbii cu setErrorMessage.
Comutați limba și citiți message
Comutați cu setGlobalConfig({ lang }) și citiți 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
Definirea unei clase de eroare
TMeta sunt datele auxiliare pentru generarea mesajului. Sunt păstrate în error.meta și transmise funcțiilor înregistrate.
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" }
Al doilea argument este un șir sau o funcție (meta) => string. Al treilea sunt opțiunile Error, cum ar fi { cause }.
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
Setarea TMeta la undefined vă permite să omiteți meta.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Înregistrarea mesajelor
setErrorMessage înregistrează funcții de creare a mesajelor pentru clasă și limbă.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
Șirurile sunt permise. Limbile pot fi date ca tablou.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
Reînregistrarea aceleiași clase și limbi suprascrie intrarea. Se aplică doar constructorilor identici la înregistrare și consultare, nu prin instanceof.
Comutarea limbilor
Comutați în configurația globală Valibot. message consultă lang curent la fiecare citire.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
lang nesetat este "en". Limbile neînregistrate folosesc mesajul implicit din constructor.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Adăugarea unui prefix
static prefix este adăugat la începutul mesajului rezolvat. Se aplică mesajelor traduse și celor implicite.
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"
Când nu este setat, este returnat ca atare.
Comportamentul ca Error
error instanceof Error,instanceof I18nErrorBaseșiinstanceof <clasa concretă>sunt toatetrueString(error)/error.toString()includ mesajul rezolvat (de ex."Error: ...")causeeste păstrat prin{ cause }
Modele comune
Fixarea mesajului implicit în constructor
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);
}
}
Apelanții transmit doar meta, ceea ce evită duplicarea textului implicit.
Înregistrarea mai multor limbi deodată
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Codurile de limbă nu sunt normalizate. "en" și "en-US" sunt chei separate, deci înregistrați explicit codurile necesare.