Let plugins throw exceptions that carry a message key resolved against the plugin's messages, instead of a hard-coded human string — e.g. throw new PermissionError("treasury.error.no-permission").
Hibernia's CommandManager (hibernia-framework/.../commander/CommandManager.java) already maps its built-in exceptions to fixed keys (NoPermissionException → hibernia.error.no-permission, BadCommandException → hibernia.error.bad-command, plus NotFoundException/ConflictException/ExceedsLimitException) and renders them via the injected Message bean (sendError / handleInvocationFailure, ~lines 489–534). But a thrown exception's own getMessage() is treated as a literal string — there's no way to pass a plugin-specific message key + placeholders.
LocalizableException interface exposing getMessageKey() + getPlaceholders().handleInvocationFailure/sendError, if the thrown exception is LocalizableException, resolve its key against the plugin's Message bean (with placeholders) rather than using the raw message.throw new SomeError(messageKey, placeholders…) and HF renders the resolved, localized message from that plugin's properties.