export interface Bundle<K extends string = string, D = any> {
    key: K;
    data?: D;
}
export interface StringBuilder<D = any> {
    (data?: D): string;
}
export interface StringBuilders {
    constant(str: string): StringBuilder<undefined>;
    callback<D>(callback: (data?: D) => string): StringBuilder<D>;
    messageFormat<D>(formatString: string): StringBuilder<D>;
}
export declare type Definition<T> = {
    [P in keyof T]: StringBuilder<T[P]>;
};
export interface Locale<T> {
    locale: string;
    definition: (builders: StringBuilders) => Definition<T>;
}
export declare function buildLocale<T>(locale: string, definition: (stringBuilders: StringBuilders) => Definition<T>): Locale<T>;
export declare type Keys<T> = {
    [P in keyof T]: P;
};
export interface Bundler<T> {
    <K extends keyof T>(key: K, data?: T[K]): Bundle<K, T[K]>;
}
export interface Formatter<T> {
    <K extends keyof T>(key: K, data?: T[K]): string;
    <K extends keyof T>(bundle: Bundle<K, T[K]>): string;
}
export interface Internationalization<T> {
    keys: Keys<T>;
    bundle: Bundler<T>;
    buildFormatter(locale: string): Formatter<T>;
}
export declare function internationalize<T>(main: Locale<T>, ...alts: Locale<Partial<T>>[]): Internationalization<T>;
export declare function combine<T1, T2>(i18n1: Internationalization<T1>, i18n2: Internationalization<T2>): Internationalization<T1 & T2>;
