// ui18.ts export type SupportedLocale = | 'es' // Español | 'en' // English | 'de' // Deutsch | 'fr' // Français | 'it' // Italiano | 'pt' // Português | 'ca' // Català | 'eu' // Euskara | 'gl'; // Galego /** * Locale por defecto del sistema */ export const DEFAULT_LOCALE: SupportedLocale = 'es'; /** * Lista de todos los locales soportados */ export const SUPPORTED_LOCALES: readonly SupportedLocale[] = [ 'es', 'en', 'de', 'fr', 'it', 'pt', 'ca', 'eu', 'gl' ] as const; // ============================================================================ // I18N STRING TYPES // ============================================================================ /** * Objeto con traducciones tipadas * Garantiza que al menos existe el locale por defecto */ export type I18nTranslations = { [K in SupportedLocale]?: string; } & { [DEFAULT_LOCALE]: string; // Español es obligatorio }; /** * String internacionalizable * * Puede ser: * - `string`: Texto simple (mismo en todos los idiomas) * - `I18nTranslations`: Objeto con traducciones por locale * * @example * // Simple (mismo en todos los idiomas) * const label: I18nString = "OK"; * * // Con traducciones * const greeting: I18nString = { * es: "Hola", * en: "Hello", * de: "Hallo" * }; * * // Solo español (obligatorio) + algún otro * const name: I18nString = { * es: "Configuración", * en: "Configuration" * }; */ export type I18nString = string | I18nTranslations; // ============================================================================ // LOCALE METADATA // ============================================================================ /** * Información sobre un locale */ export interface LocaleInfo { code: SupportedLocale; name: string; nativeName: string; flag: string; rtl?: boolean; }