/** A persistent label resolved in the presenting app's language. */ declare const pluginMessage: unique symbol; export interface PluginMessage { readonly [pluginMessage]: true; } export type PluginText = string | PluginMessage; export interface TranslationResource { readonly [key: string]: string | TranslationResource; } export interface TranslationOptions { readonly count?: number; readonly [name: string]: unknown; } export type TranslationKey = { [Key in keyof Resource & string]: Resource[Key] extends string ? | Key | (Key extends `${infer Base}_${"zero" | "one" | "two" | "few" | "many" | "other"}` ? Base : never) : Resource[Key] extends TranslationResource ? `${Key}.${TranslationKey}` : never; }[keyof Resource & string]; export interface PluginTranslations { readonly resources: Readonly> & { readonly en: Resource }; message>( key: Key, ...args: TranslationArguments ): PluginMessage; } type Lookup = Key extends `${infer Head}.${infer Tail}` ? Head extends keyof Resource ? Lookup : never : Key extends keyof Resource ? Resource[Key] : never; type Trim = Value extends ` ${infer Rest}` | `${infer Rest} ` ? Trim : Value; type InterpolationName = Trim extends `-${infer Rest}` ? InterpolationName : Trim extends `${infer Name},${string}` ? Trim : Trim; type InterpolationNames = Value extends string ? string extends Value ? never : Value extends `${string}{{${infer Name}}}${infer Rest}` ? InterpolationName | InterpolationNames : never : never; type MessageOptions = TranslationOptions & ([Lookup] extends [never] ? {} : { count: number }) & { [Name in InterpolationNames | Lookup>]: | string | number | boolean | Date; }; export type TranslationArguments = {} extends MessageOptions ? [options?: MessageOptions] : [options: MessageOptions];