interface Ii18nConfigs<TLanguage extends string, TResources extends object> {
    /**
     * Flag to enable adding query params for current language
     */
    enableQueryParams?: boolean;
    /**
     * An array of languages that wants to be supported
     */
    languages: TLanguage[];
    /**
     * To read current language through query param
     */
    queryParam?: string;
    resources: Record<TLanguage, TResources> | undefined;
}
type TNestedKeyOf<T extends object> = {
    [Key in keyof T]: T[Key] extends object ? TNestedKeyOf<T[Key]> : Key;
};
type ILooseObject = Record<string, any>;
interface IEventListener<T extends any[]> {
    (...args: T): void;
}
interface ITranslateOptions extends ILooseObject {
    escapeHTML?: boolean;
    /**
     * To add interpolation to you translation.
     *
     * @example
     * en: {
     *  greeting: "Good [time]"
     * }
     *
     * translate("greeting", { interpolation: { time: "Morning" } }) // Good Morning
     */
    interpolation?: ILooseObject;
}
type TEvents = "language_changed";

declare class i18n<TLanguage extends string, TResources extends object, TPredefinedEvents extends string = TEvents> {
    private languageManager;
    private eventManager;
    private translationManager;
    constructor(configs: Ii18nConfigs<TLanguage, TResources>);
    getCurrentLanguage(): TLanguage;
    getChangeLanguageHandler(language?: TLanguage): void;
    translate(identifier: string, data?: ITranslateOptions): any;
    on(eventName: TPredefinedEvents, callback: () => any): void;
}

export { type IEventListener, type ILooseObject, type ITranslateOptions, type Ii18nConfigs, type TEvents, type TNestedKeyOf, i18n as default };
