Utilisation
Opérations de base — définition des classes d'erreur, enregistrement des messages, changement de langue, préfixe et repli.
Flux de base
Définir la classe d'erreur
Héritez de I18nErrorBase<TMeta> et définissez dans TMeta les informations pour générer les messages.
Enregistrer les messages par langue
Enregistrez les messages correspondant à la classe et à la langue avec setErrorMessage.
Changer de langue et lire message
Basculez avec setGlobalConfig({ lang }), puis lisez 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
Définir la classe d’erreur
TMeta est une information auxiliaire pour générer les messages. Elle est conservée dans error.meta et transmise aux fonctions enregistrées.
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" }
Le 2e argument est une chaîne ou une fonction (meta) => string. Le 3e accepte { cause } et les autres options de Error.
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
Si TMeta vaut undefined, meta peut être omis.
class NoMetaError extends I18nErrorBase<undefined> {}
const a = new NoMetaError("no meta");
const b = new NoMetaError(undefined, "no meta");
console.log(a.meta); // undefined
Enregistrer les messages
setErrorMessage enregistre des fonctions de création par classe et par langue.
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
class TestError extends I18nErrorBase<{ code: string }> {}
setErrorMessage(TestError, ({ code }) => `エラーコード: ${code}`, "ja");
setErrorMessage(TestError, "something went wrong", "en");
Les chaînes sont aussi acceptées. Les langues peuvent être indiquées sous forme de tableaux.
const message = ({ code }: { code: string }) => `エラーコード: ${code}`;
setErrorMessage(TestError, message, ["ja", "ko", "zh"]);
La réinscription d’une même classe et langue écrase l’entrée. Elle ne s’applique que si les constructeurs d’enregistrement et de référence sont identiques, pas via instanceof.
Changer de langue
La langue se change via la configuration globale de Valibot. message se réfère au lang actuel à chaque accès.
import { setGlobalConfig } from "valibot";
setGlobalConfig({ lang: "ja" });
console.log(error.message); // 日本語の登録メッセージ
setGlobalConfig({ lang: "en" });
console.log(error.message); // 英語の登録メッセージ or 既定メッセージ
lang non défini vaut "en". Les langues non enregistrées utilisent le message par défaut du constructeur.
setErrorMessage(BusinessRuleError, () => "日本語メッセージ", "ja");
setGlobalConfig({ lang: "fr" });
console.log(error.message); // "Code: ERR, Limit: 50"(既定メッセージ)
Ajouter un préfixe
static prefix est ajouté au début du message résolu. Il s’applique aux messages traduits comme au message par défaut.
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"
Sans configuration, le message est retourné tel quel.
Comportement en tant qu’Error
error instanceof Error,instanceof I18nErrorBaseetinstanceofde la classe concrète valent toustrue.String(error)/error.toString()incluent le message résolu (ex. :"Error: ...").causeest conservé via{ cause }.
Motifs courants
Figer le message par défaut dans le constructeur
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);
}
}
Le côté appelant ne passe que meta, ce qui évite de dupliquer le texte par défaut.
Enregistrer plusieurs langues ensemble
setErrorMessage(MyError, "エラーが発生しました", ["ja"]);
setErrorMessage(MyError, "An error occurred", ["en", "en-US"]);
Les codes de langue ne sont pas normalisés. "en" et "en-US" sont des clés distinctes, donc enregistrez explicitement les codes nécessaires.