type Translation = string | Record<string, string>;
type Keyset = Record<string, Translation>;
export type LanguageConfig = {
    keyset: Keyset | (() => Promise<Keyset>);
    pluralize: (count: number) => string;
};
interface I18NOptions<LanguagesMap extends Record<string, LanguageConfig>, Lang extends keyof LanguagesMap = keyof LanguagesMap> {
    defaultLang: Lang;
    languages: LanguagesMap;
}
type KeyType<KeysetsMap extends Record<string, LanguageConfig>> = keyof KeysetType<KeysetsMap>;
type KeysetType<KeysetsMap extends Record<string, LanguageConfig>> = UnwrapKeysetType<KeysetsMap[keyof KeysetsMap]["keyset"]>;
type UnwrapKeysetType<MaybeUnresolvedKeyset extends Keyset | (() => Promise<Keyset>)> = MaybeUnresolvedKeyset extends () => Promise<infer ResolvedKeyset> ? ResolvedKeyset : MaybeUnresolvedKeyset;
type GetRestParams<KeysetsMap extends Record<string, LanguageConfig>, Key extends KeyType<KeysetsMap>> = KeysetType<KeysetsMap>[Key] extends object ? [options: {
    count: number;
    [key: string]: number | string;
}] : [options?: Record<string, string | number>];
export declare class I18N<KeysetsMap extends Record<string, LanguageConfig>> {
    private lang;
    private subscribers;
    private keysets;
    constructor(options: I18NOptions<KeysetsMap>);
    getLang(): keyof KeysetsMap;
    get<Key extends KeyType<KeysetsMap>>(key: Key, ...rest: GetRestParams<KeysetsMap, Key>): string;
    setLang(newLang: keyof KeysetsMap): Promise<void>;
    subscribe(cb: (fn: keyof KeysetsMap) => void, options?: {
        immediate: boolean;
    }): () => void;
}
export {};
