import { I18nLang, LanguagesContent, ContentStore } from './types';
import * as i0 from "@angular/core";
/**
 * Servicio de internacionalización basado en Angular Signals.
 *
 * Características:
 * - Sin RxJS: usa Signals para evitar memory leaks y congelamiento
 * - Namespace-based: organiza traducciones por contexto
 * - Fallback multi-nivel: namespace → _global → placeholder
 * - Interpolación: soporta {variable} en textos
 *
 * @example
 * // En un componente
 * i18n = inject(I18nService);
 *
 * // Obtener texto
 * const title = this.i18n.t('title', 'Login');
 *
 * // Con interpolación
 * const welcome = this.i18n.t('welcome', 'Login', { name: 'Juan' });
 *
 * // Cambiar idioma
 * this.i18n.setLanguage('en');
 */
export declare class I18nService {
    private readonly _lang;
    private readonly _content;
    private readonly _supportedLanguages;
    readonly lang: import("@angular/core").Signal<I18nLang>;
    readonly supportedLanguages: import("@angular/core").Signal<I18nLang[]>;
    readonly isSpanish: import("@angular/core").Signal<boolean>;
    readonly isEnglish: import("@angular/core").Signal<boolean>;
    private readonly isBrowser;
    /**
     * Keys faltantes ya advertidas (`ns.key.lang`). Garantiza que el warning se
     * emita UNA sola vez por key, nunca por cada change-detection.
     *
     * Crítico: `getText` se evalúa en bindings de template (una vez por CD). Si
     * advirtiéramos en cada llamada, un `console.warn` por CD + el `val-debug-console`
     * (que espeja `console.*` a un signal) crea un loop infinito de CD que congela
     * el navegador en dev. Deduplicar corta ese loop en su origen.
     */
    private readonly _warnedMissing;
    constructor(platformId: Object);
    /**
     * Obtiene texto traducido (alias corto de getText)
     *
     * @param key Clave del texto
     * @param namespace Namespace (default: '_global')
     * @param data Variables para interpolación
     * @returns Texto traducido o placeholder [namespace.key]
     *
     * @example
     * i18n.t('submit');                    // busca en _global
     * i18n.t('title', 'Login');            // busca en Login
     * i18n.t('welcome', 'Login', {name});  // con interpolación
     */
    t(key: string, namespace?: string, data?: Record<string, string>): string;
    /**
     * Returns a time-of-day greeting in the current language.
     *
     * Uses bundled keys `goodMorning` / `goodAfternoon` / `goodEvening` from `_global`.
     * Reactive to `lang()` when called inside a `computed()`.
     *
     * @param name Optional name to append: "Buenos días, Juan"
     * @param date Optional date to evaluate (defaults to now)
     *
     * @example
     * greeting = computed(() => {
     *   this.i18n.lang();
     *   return this.i18n.greeting(this.auth.user()?.name);
     * });
     */
    greeting(name?: string, date?: Date): string;
    /**
     * Obtiene texto traducido
     *
     * Fallback order:
     * 1. content[namespace][lang][key]
     * 2. content['_global'][lang][key]
     * 3. "" (string vacío) — nunca un placeholder visible ni un valor que
     *    rompa el render. El consumer puede aplicar su propio fallback con `||`.
     */
    getText(key: string, namespace?: string, data?: Record<string, string>): string;
    /**
     * Cambia el idioma de la aplicación
     *
     * @param lang Nuevo idioma
     * @param forceReload Si true, recarga la página (fallback si reactividad falla)
     */
    setLanguage(lang: I18nLang, forceReload?: boolean): void;
    /**
     * Registra contenido de traducciones para un namespace
     *
     * @param namespace Nombre del namespace
     * @param content Contenido de traducciones
     *
     * @example
     * i18n.registerContent('Login', {
     *   es: { title: 'Iniciar sesión' },
     *   en: { title: 'Sign in' }
     * });
     */
    registerContent(namespace: string, content: LanguagesContent): void;
    /**
     * Registra múltiples namespaces de una vez
     *
     * @param contentStore Objeto con namespaces como keys
     */
    registerContentBulk(contentStore: ContentStore): void;
    /**
     * Configura los idiomas soportados
     */
    setI18nLanguages(languages: I18nLang[]): void;
    /**
     * Obtiene todos los namespaces registrados
     */
    getNamespaces(): string[];
    /**
     * Verifica si un namespace tiene traducciones
     */
    hasNamespace(namespace: string): boolean;
    /**
     * Carga idioma guardado en localStorage o detecta del navegador
     */
    private loadStoredLanguage;
    /**
     * Valida si un idioma está soportado
     */
    private isValidLanguage;
    /**
     * Reemplaza {variable} en texto con valores de data
     *
     * @example
     * interpolate('Hola {name}', { name: 'Juan' }) // 'Hola Juan'
     */
    private interpolate;
    static ɵfac: i0.ɵɵFactoryDeclaration<I18nService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<I18nService>;
}
