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; readonly supportedLanguages: import("@angular/core").Signal; readonly isSpanish: import("@angular/core").Signal; readonly isEnglish: import("@angular/core").Signal; 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; /** * 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; /** * 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; static ɵprov: i0.ɵɵInjectableDeclaration; }