Penggunaan
Operasi dasar definisi kelas kesalahan, pendaftaran pesan, pengalihan bahasa, prefix, dan fallback.
Alur dasar
Mendefinisikan kelas kesalahan
Warisi I18nErrorBase<TMeta> dan definisikan info pembuatan pesan di TMeta.
Mendaftarkan pesan tiap bahasa
Daftarkan pesan tiap kelas dan bahasa dengan setErrorMessage.
Beralih bahasa dan membaca message
Beralih dengan setGlobalConfig({ lang }) dan baca 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
Mendefinisikan kelas kesalahan
TMeta adalah info tambahan untuk pembuatan pesan. Disimpan di error.meta dan diteruskan ke fungsi terdaftar.
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" }
Argumen kedua adalah string atau fungsi (meta) => string. Ketiga adalah { cause } dan opsi Error lain.
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
Jika TMeta adalah undefined, meta dapat dihilangkan.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Mendaftarkan pesan
setErrorMessage mendaftarkan fungsi factory per kelas dan bahasa.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
String juga boleh. Bahasa dapat ditentukan sebagai array.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
Pendaftaran ulang kelas dan bahasa yang sama menimpa. Hanya dipakai saat konstruktor pendaftaran dan referensi sama, bukan via instanceof.
Beralih bahasa
Beralih via pengaturan global Valibot. message merujuk ke lang saat ini setiap dibaca.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
lang yang belum diatur adalah "en". Bahasa tak terdaftar memakai pesan default konstruktor.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Menambahkan awalan
static prefix digabung di awal pesan yang diselesaikan. Berlaku untuk terjemahan maupun default.
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"
Jika tak diatur, dikembalikan apa adanya.
Perilaku sebagai Error
error instanceof Error,instanceof I18nErrorBase, maupuninstanceofkelas konkret semuanyatrueString(error)/error.toString()menyertakan pesan yang diselesaikan (contoh:"Error: ...")causedisimpan via{ cause }
Pola umum
Menetapkan pesan default di konstruktor
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);
}
}
Pemanggil cukup memberi meta, menghindari duplikasi teks default.
Mendaftarkan beberapa bahasa sekaligus
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Kode bahasa tidak dinormalisasi. "en" dan "en-US" adalah kunci berbeda, jadi daftarkan kode yang dibutuhkan secara eksplisit.