type NestedMessages = {
    readonly [key: string]: string | NestedMessages;
};
interface I18n<L extends string = string> {
    locales: readonly L[];
    defaultLocale: L;
    messages: Record<L, NestedMessages>;
}
declare class I18nConfigError extends Error {
    readonly offending: Record<string, unknown>;
    constructor(message: string, offending: Record<string, unknown>);
}
declare function createI18n<L extends string>(config: I18n<L>): I18n<L>;
declare function t<L extends string>(i18n: I18n<L>, locale: L, key: string, vars?: Record<string, string | number>): string;
declare function resolveLocale<L extends string>(i18n: I18n<L>, request: Request): L;

export { type I18n, I18nConfigError, type NestedMessages, createI18n, resolveLocale, t };
