Add localization support and language selection

Introduces English and Spanish translation files, integrates localization throughout dialogs, and adds a language selection tab to the custom options dialog. UI strings are now loaded via the localization manager, enabling dynamic language switching and improved internationalization.
This commit is contained in:
Your Name
2025-09-30 20:53:59 +03:00
parent 0376c1c4cd
commit c5916d57c0
12 changed files with 1293 additions and 311 deletions
+316
View File
@@ -0,0 +1,316 @@
{
"app": {
"title": "YTSage",
"version": "v{version}",
"ready": "Ready"
},
"formats": {
"show_formats": "Show Formats:",
"video_format": "Video Format:",
"audio_format": "Audio Format:",
"no_formats": "No formats available",
"loading": "Loading formats...",
"select": "Select",
"quality": "Quality",
"extension": "Extension",
"resolution": "Resolution",
"file_size": "File Size",
"codec": "Codec",
"audio": "Audio",
"notes": "Notes",
"will_merge_audio": "Will merge audio",
"has_audio": "✓ Has Audio",
"audio_only": "Audio Only",
"large_size": "Large size",
"medium_size": "Medium size",
"standard_size": "Standard size",
"compatible": "Compatible",
"efficient": "Efficient",
"high_quality": "High quality",
"best_4k": "Best (4K)",
"best_2k": "Best (2K)",
"high_1080p": "High (1080p)",
"high_720p": "High (720p)",
"medium_480p": "Medium (480p)",
"low_quality": "Low Quality",
"best_audio": "Best Audio",
"high_audio": "High Audio",
"medium_audio": "Medium Audio",
"low_audio": "Low Audio",
"audio_only_resolution": "Audio only"
},
"buttons": {
"download": "Download",
"pause": "Pause",
"resume": "Resume",
"cancel": "Cancel",
"browse": "Browse",
"clear": "Clear",
"ok": "OK",
"apply": "Apply",
"close": "Close",
"run_command": "Run Command",
"custom_command_help": "Help",
"about": "About",
"analyze": "Analyze",
"paste_url": "Paste URL",
"select_videos": "Select Videos...",
"video": "Video",
"audio_only": "Audio Only",
"custom_options": "Custom Options",
"trim_video": "Trim Video",
"download_settings": "Download Settings",
"update": "Update yt-dlp",
"select_defaults": "Select Defaults",
"select_all": "Select All",
"deselect_all": "Deselect All"
},
"dialogs": {
"custom_options": "Custom Options",
"settings": "Settings",
"select_folder": "Select Download Folder",
"sponsorblock_categories": "SponsorBlock Categories",
"sponsorblock_description": "Select which types of video segments to automatically remove during download.\nSponsorBlock uses community-submitted data to identify these segments.",
"select_subtitles": "Select Subtitles",
"filter_languages_placeholder": "Filter languages (e.g., en, es)...",
"no_subtitles_available": "No subtitles available",
"matching": "matching"
},
"tabs": {
"cookies": "Login with Cookies",
"custom_command": "Custom Command",
"proxy": "Proxy",
"language": "Language"
},
"cookies": {
"help_text": "Choose how to provide cookies for logging in.\nThis allows downloading of private videos and premium quality audio.",
"cookie_source": "Cookie Source",
"use_cookie_file": "Use cookie file",
"extract_from_browser": "Extract from browser",
"cookie_file": "Cookie File",
"cookie_file_placeholder": "Path to cookies.txt file...",
"browser_selection": "Browser Selection",
"browser_help": "Select the browser to extract cookies from:",
"browser_label": "Browser:",
"profile_label": "Profile:",
"profile_placeholder": "default",
"browser_extract_message": "Browser cookies will be extracted when applied",
"file_selected_message": "Cookie file selected - Click OK to apply",
"select_file_title": "Select Cookie File",
"file_filter": "Cookies files (*.txt *.lwp)"
},
"custom_command": {
"help_text": "Enter your custom yt-dlp command below. The current URL will be appended automatically.<br><br>For the full list of options and usage examples, <a href=\"{docs_url}\">click here to view the official yt-dlp documentation</a>.<br><br>Note: Download path and filename template will be handled automatically.",
"input_label": "yt-dlp Arguments:",
"input_placeholder": "Enter yt-dlp arguments here...\n\ne.g. --extract-audio --audio-format mp3",
"output_label": "Command Output:",
"output_placeholder": "Command output will appear here...",
"command_placeholder": "Enter custom yt-dlp command...",
"command_help": "Available placeholders:\n{url} - Video URL\n{output} - Output directory\n\nExample: --write-info-json --write-thumbnail",
"full_command": "🔧 Full command: {command}",
"command_success": "✅ Custom command completed successfully!",
"command_failed": "❌ Command failed with exit code {code}",
"command_error": "❌ Error running custom command: {error}"
},
"proxy": {
"help_text": "Configure proxy settings for downloading. Leave empty to use direct connection.",
"main_proxy": "Main Proxy",
"main_proxy_help": "Primary proxy server for all downloads. Supports HTTP/HTTPS and SOCKS5 protocols.",
"proxy_url_label": "Proxy URL:",
"proxy_url_placeholder": "http://proxy:port or socks5://proxy:port",
"proxy_examples": "Examples:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080",
"geo_proxy": "Geo-bypass Proxy",
"geo_proxy_help": "Secondary proxy specifically for bypassing geographic restrictions.",
"geo_proxy_url_label": "Geo-bypass Proxy URL:",
"geo_proxy_url_placeholder": "http://geo-proxy:port",
"clear_main_proxy": "Clear Main Proxy",
"clear_geo_proxy": "Clear Geo Proxy",
"proxy_url": "Proxy URL",
"proxy_placeholder": "http://proxy:port or socks5://proxy:port",
"geo_bypass": "Geo-bypass proxy (for geographic restrictions)",
"geo_bypass_placeholder": "http://proxy:port for bypassing geo-blocks",
"invalid_main_url": "Invalid main proxy URL format",
"invalid_geo_url": "Invalid geo proxy URL format",
"main_configured": "Main proxy configured",
"geo_configured": "Geo proxy configured"
},
"language": {
"help_text": "Select your preferred language for the interface.",
"current_language": "Current Language:",
"restart_notice": "Language change will take effect after restarting the application."
},
"download": {
"preparing": "Preparing download...",
"please_enter_url": "Please enter a URL first.",
"please_set_path": "Please set a download path first.",
"please_enter_url_and_path": "Please enter a URL and set download path.",
"please_select_format": "Please select a format first."
},
"update": {
"title": "Update yt-dlp",
"checking": "Checking for updates...",
"update_available": "Update available!\nCurrent version: {current}\nLatest version: {latest}",
"up_to_date": "yt-dlp is up to date (version {version})",
"could_not_determine": "Could not determine versions.",
"error_comparing": "Error comparing versions: {error}",
"update_available_failed": "Update available! (Comparison failed)\nCurrent: {current}\nLatest: {latest}",
"updating": "Updating...",
"initializing": "🚀 Initializing update process...",
"checking_current": "🔍 Checking current installation...",
"found_at": "📍 Found yt-dlp at: {path}",
"error_getting_path": "❌ Error getting yt-dlp path: {error}",
"updating_binary": "📦 Updating app-managed yt-dlp binary...",
"updating_pip": "🐍 Updating system yt-dlp via pip...",
"update_failed": "❌ Failed to update yt-dlp. Please try again or check your internet connection.",
"binary_updated": "✅ Binary successfully updated!",
"update_failed_stderr": "❌ yt-dlp update failed: {error}",
"update_timeout": "❌ yt-dlp update timed out.",
"unexpected_error": "❌ Unexpected error during update: {error}",
"checking_pip": "🔍 Checking current pip installation...",
"current_version": "📋 Current version: {version}",
"not_found_pip": "⚠️ yt-dlp not found via pip, attempting installation...",
"checking_latest": "🌐 Checking for latest version...",
"failed_check_updates": "❌ Failed to check for updates",
"latest_version": "🆕 Latest version: {version}",
"updating_from_to": "⬆️ Updating from {current} to {latest}...",
"running_pip_install": "📦 Running pip install --upgrade...",
"pip_completed": "✅ Pip update completed successfully!",
"pip_failed": "❌ Pip update failed: {error}"
},
"about": {
"title": "About YTSage",
"version": "Version: {version}",
"description": "A modern YouTube downloader with advanced features",
"author": "Created with ❤️",
"license": "License: MIT",
"system_info": "System Information",
"python_version": "Python Version: {version}",
"pyside_version": "PySide6 Version: {version}",
"ytdlp_version": "yt-dlp Version: {version}",
"ffmpeg_status": "FFmpeg Status: {status}",
"ffmpeg_available": "Available",
"ffmpeg_not_available": "Not Available",
"error_getting_info": "Error getting system information: {error}"
},
"time_range": {
"title": "Trim Video",
"start_time": "Start Time (HH:MM:SS)",
"end_time": "End Time (HH:MM:SS)",
"start_placeholder": "00:00:00",
"end_placeholder": "00:00:00",
"help_text": "Set the start and end times to trim the video.\nLeave empty to download the full video.",
"invalid_format": "Invalid time format. Use HH:MM:SS format.",
"start_after_end": "Start time cannot be after end time."
},
"settings": {
"title": "Download Settings",
"download_path": "Download Path",
"browse": "Browse...",
"speed_limit": "Speed Limit",
"speed_limit_placeholder": "None",
"auto_update_ytdlp": "Auto-Update yt-dlp",
"enable_auto_updates": "Enable automatic yt-dlp updates",
"update_frequency": "Update frequency:",
"check_startup": "Check on every startup (minimum 1 hour between checks)",
"check_daily": "Check daily",
"check_weekly": "Check weekly",
"check_updates_now": "Check for Updates Now",
"update_check_title": "Update Check",
"could_not_determine_version": "Could not determine current yt-dlp version.",
"update_available_dialog": "Update available!\n\nCurrent: {current}\nLatest: {latest}\n\nUse the 'Update yt-dlp' button in the main window to update.",
"up_to_date_dialog": "yt-dlp is up to date!\n\nCurrent version: {version}",
"error_checking_updates": "Error checking for updates: {error}",
"settings_saved_title": "Settings Saved",
"settings_saved_message": "Auto-update settings have been saved successfully!",
"error_title": "Error",
"failed_save_settings": "Failed to save auto-update settings.",
"error_saving_settings": "Error saving auto-update settings: {error}",
"auto_update_title": "Auto-Update Settings",
"auto_update_header": "🔄 Auto-Update Settings",
"auto_update_description": "Configure automatic updates for yt-dlp to ensure you always have the latest features and bug fixes.",
"current_status": "Current Status",
"current_version_label": "Current yt-dlp version: Checking...",
"last_check_label": "Last update check: Never",
"next_check_label": "Next check: Based on settings",
"manual_check_button": "🔍 Check for Updates Now",
"update_frequency_group": "Update Frequency",
"save_settings": "Save Settings",
"settings_saved_successfully": "✅ Settings saved successfully!",
"error_saving": "❌ Error saving settings: {error}"
},
"main_ui": {
"url_placeholder": "Enter YouTube video or playlist URL",
"merge_subtitles": "Merge Subtitles",
"save_thumbnail": "Save Thumbnail",
"save_description": "Save Description",
"embed_chapters": "Embed Chapters",
"subtitles_selected": "{count} selected",
"all_selected": "All selected",
"select_videos_all": "Select Videos... (All selected)",
"please_enter_url": "Please enter a URL first",
"cookie_file_selected_title": "Cookie File Selected",
"cookie_file_selected_message": "Cookie file selected: {path}",
"browser_cookies_selected_title": "Browser Cookies Selected",
"browser_cookies_selected_message": "Browser cookies will be extracted from: {browser}",
"error_no_format_info": "Error: No format information available.",
"error_extract_info": "Error: Could not extract basic video information. Please check your link.",
"analyzing_preparing": "Analyzing (0%)... Preparing request",
"analyzing_extracting_basic": "Analyzing (15%)... Extracting basic info",
"analyzing_extracting_detailed": "Analyzing (30%)... Extracting detailed info",
"analyzing_processing_video": "Analyzing (45%)... Processing video data",
"analyzing_processing_formats": "Analyzing (60%)... Processing formats",
"analyzing_loading_thumbnail": "Analyzing (75%)... Loading thumbnail",
"analyzing_processing_subtitles": "Analyzing (85%)... Processing subtitles",
"analyzing_updating_table": "Analyzing (95%)... Updating format table",
"analysis_complete": "Analysis complete!",
"analyzing_extracting_ytdlp": "Analyzing (30%)... Extracting info with yt-dlp executable",
"analyzing_processing_data": "Analyzing (60%)... Processing data",
"analyzing_processing_formats_ytdlp": "Analyzing (75%)... Processing formats",
"analyzing_loading_thumbnail_ytdlp": "Analyzing (85%)... Loading thumbnail",
"analyzing_processing_subtitles_ytdlp": "Analyzing (90%)... Processing subtitles",
"select_subtitles": "Select Subtitles...",
"sponsorblock_categories": "SponsorBlock Categories..."
},
"sponsorblock": {
"sponsor": "Sponsor",
"sponsor_desc": "Paid promotion, paid referrals and direct advertisements",
"selfpromo": "Unpaid/Self Promotion",
"selfpromo_desc": "Unpaid promotion of creators' own content",
"interaction": "Interaction Reminder",
"interaction_desc": "Asking viewers to like, subscribe, or follow social media",
"intro": "Intro",
"intro_desc": "Video introduction that can be skipped",
"outro": "Outro/End Cards",
"outro_desc": "Credits or when the video ends",
"preview": "Preview/Recap",
"preview_desc": "Quick recap of previous videos or preview of what's coming up",
"music_offtopic": "Non-Music Section",
"music_offtopic_desc": "Only for music videos. Marks non-music sections",
"filler": "Filler Tangent",
"filler_desc": "Tangential scenes added only for filler or humor"
},
"video_info": {
"channel": "Channel",
"views": "Views",
"likes": "Likes",
"upload_date": "Upload date",
"duration": "Duration",
"unknown_channel": "Unknown channel",
"unknown_date": "Unknown date",
"unknown_title": "Unknown title"
},
"command": {
"running": "Running...",
"run_command": "Run Command"
},
"selection": {
"none_selected": "0 selected",
"one_selected": "1 category selected",
"count_selected": "{count} selected"
},
"status": {
"ready": "Ready",
"file_exists": "⚠️ File already exists",
"cancelling": "Cancelling download..."
}
}
+313
View File
@@ -0,0 +1,313 @@
{
"language": {
"display_name": "Español (Spanish)",
"select_language": "Seleccionar idioma:",
"current_language": "Idioma actual: {language}",
"restart_required": "Los cambios de idioma tendrán efecto después de reiniciar la aplicación.",
"english": "Inglés",
"spanish": "Español (Spanish)"
},
"app": {
"title": "YTSage",
"version": "v{version}",
"ready": "Listo"
},
"buttons": {
"download": "Descargar",
"pause": "Pausar",
"resume": "Reanudar",
"cancel": "Cancelar",
"browse": "Examinar",
"clear": "Limpiar",
"ok": "Aceptar",
"apply": "Aplicar",
"close": "Cerrar",
"run_command": "Ejecutar Comando",
"about": "Acerca de",
"update": "Actualizar",
"analyze": "Analizar",
"paste_url": "Pegar URL",
"select_videos": "Seleccionar Videos...",
"video": "Video",
"audio_only": "Solo Audio",
"custom_options": "Opciones Personalizadas",
"trim_video": "Recortar Video",
"download_settings": "Configuración de Descarga",
"select_defaults": "Seleccionar Predeterminados",
"select_all": "Seleccionar Todos",
"deselect_all": "Deseleccionar Todos"
},
"dialogs": {
"custom_options": "Opciones Personalizadas",
"settings": "Configuración",
"select_folder": "Seleccionar Carpeta de Descarga",
"sponsorblock_categories": "Categorías SponsorBlock",
"sponsorblock_description": "Selecciona qué tipos de segmentos de video se eliminarán automáticamente durante la descarga.\nSponsorBlock utiliza datos enviados por la comunidad para identificar estos segmentos.",
"select_subtitles": "Seleccionar Subtítulos",
"filter_languages_placeholder": "Filtrar idiomas (ej., en, es)...",
"no_subtitles_available": "No hay subtítulos disponibles",
"matching": "que coincidan con"
},
"tabs": {
"cookies": "Iniciar sesión con Cookies",
"custom_command": "Comando Personalizado",
"proxy": "Proxy",
"language": "Idioma"
},
"cookies": {
"help_text": "Elige cómo proporcionar cookies para iniciar sesión.\nEsto permite la descarga de videos privados y audio de calidad premium.",
"cookie_source": "Origen de Cookie",
"use_cookie_file": "Usar archivo de cookie (formato Netscape)",
"extract_from_browser": "Extraer cookies del navegador",
"cookie_file": "Archivo de Cookie",
"cookie_file_placeholder": "Ruta al archivo de cookies (formato Netscape)",
"browser_selection": "Selección de Navegador",
"browser_help": "Selecciona el navegador del cual extraer cookies. Asegúrate de que el navegador esté cerrado antes de la extracción.",
"browser_label": "Navegador:",
"profile_label": "Perfil (opcional):",
"profile_placeholder": "Nombre o ruta del perfil (dejar vacío para el predeterminado)",
"browser_extract_message": "Las cookies del navegador se extraerán al aplicar",
"file_selected_message": "Archivo de cookies seleccionado - Haz clic en Aceptar para aplicar",
"select_file_title": "Seleccionar Archivo de Cookies",
"file_filter": "Archivos de cookies (*.txt *.lwp)"
},
"custom_command": {
"help_text": "Ingresa tu comando yt-dlp personalizado a continuación. La URL actual se añadirá automáticamente.<br><br>Para ver la lista completa de opciones y ejemplos de uso, <a href=\"{docs_url}\">haz clic aquí para ver la documentación oficial de yt-dlp</a>.<br><br>Nota: La ruta de descarga y la plantilla de nombre de archivo se manejarán automáticamente.",
"input_label": "Argumentos de yt-dlp:",
"input_placeholder": "Ingresa argumentos de yt-dlp aquí...\n\nej. --extract-audio --audio-format mp3",
"output_label": "Salida del Comando:",
"output_placeholder": "La salida del comando aparecerá aquí...",
"full_command": "🔧 Comando completo: {command}",
"command_failed": "❌ El comando falló con código de salida {code}",
"command_success": "✅ ¡Comando completado exitosamente!",
"command_error": "❌ Error ejecutando comando: {error}"
},
"proxy": {
"help_text": "Configurar ajustes de proxy para conexiones de red y geo-verificación.\nEl proxy puede ayudar a evitar restricciones regionales y mejorar el rendimiento de descarga.",
"main_proxy": "Proxy Principal",
"main_proxy_help": "Usar el proxy HTTP/HTTPS/SOCKS especificado para todas las conexiones.",
"proxy_url_label": "URL del Proxy:",
"proxy_url_placeholder": "ej., http://proxy.example.com:8080 o socks5://user:pass@127.0.0.1:1080",
"proxy_examples": "Ejemplos: http://proxy.com:8080, https://proxy.com:8080, socks5://127.0.0.1:1080",
"geo_proxy": "Proxy de Geo-verificación",
"geo_proxy_help": "Usar este proxy para verificar dirección IP para sitios con restricciones geográficas. El proxy principal (si está configurado) se usa para la descarga real.",
"geo_proxy_url_label": "URL del Geo Proxy:",
"geo_proxy_url_placeholder": "ej., http://us-proxy.example.com:8080",
"clear_main_proxy": "Limpiar Proxy Principal",
"clear_geo_proxy": "Limpiar Geo Proxy",
"invalid_main_url": "Formato de URL de proxy principal inválido",
"invalid_geo_url": "Formato de URL de geo proxy inválido",
"main_configured": "Proxy principal configurado",
"geo_configured": "Geo proxy configurado"
},
"download": {
"preparing": "🚀 Preparando tu descarga...",
"completed": "✅ ¡Descarga completada!",
"video_completed": "✅ ¡Descarga de video completada!",
"audio_completed": "✅ ¡Descarga de audio completada!",
"subtitle_completed": "✅ ¡Descarga de subtítulos completada!",
"please_set_path": "Por favor establece una ruta de descarga usando 'Cambiar Ruta'",
"please_enter_url": "Por favor ingresa una URL",
"please_enter_url_and_path": "Por favor ingresa URL y establece ruta de descarga",
"please_select_format": "Por favor selecciona un formato"
},
"formats": {
"show_formats": "Mostrar formatos:",
"select": "Seleccionar",
"quality": "Calidad",
"extension": "Extensión",
"resolution": "Resolución",
"file_size": "Tamaño",
"codec": "Códec",
"audio": "Audio",
"notes": "Notas",
"will_merge_audio": "Se combinará audio",
"has_audio": "✓ Tiene Audio",
"audio_only": "Solo Audio",
"large_size": "Tamaño grande",
"medium_size": "Tamaño mediano",
"standard_size": "Tamaño estándar",
"compatible": "Compatible",
"efficient": "Eficiente",
"high_quality": "Alta calidad",
"best_4k": "Óptima (4K)",
"best_2k": "Óptima (2K)",
"high_1080p": "Alta (1080p)",
"high_720p": "Alta (720p)",
"medium_480p": "Media (480p)",
"low_quality": "Baja Calidad",
"best_audio": "Mejor Audio",
"high_audio": "Audio Alto",
"medium_audio": "Audio Medio",
"low_audio": "Audio Bajo",
"audio_only_resolution": "Solo audio"
},
"about": {
"title": "Acerca de YTSage",
"version": "Versión {version}",
"description": "Descargador moderno de YouTube con una interfaz limpia de PySide6.",
"author": "Por: {author}",
"github": "GitHub: {repo}",
"system_info": "Información del Sistema",
"loading": "🔄 Cargando información del sistema...",
"refresh": "🔄",
"refreshing": "🔄 Actualizando...",
"refresh_failed": "Actualización Fallida",
"refresh_failed_message": "No se pudo actualizar la información de versión.",
"detected": "✓ Detectado",
"missing": "✗ Faltante",
"not_available": "No Disponible"
},
"time_range": {
"title": "Descargar Sección del Video",
"help_text": "Descarga solo partes específicas de un video especificando rangos de tiempo.\nUsa formato HH:MM:SS o segundos. Deja inicio o fin vacío para descargar desde el principio o hasta el final.",
"time_range_group": "Rango de Tiempo",
"start_time": "Tiempo de Inicio:",
"end_time": "Tiempo de Fin:",
"start_time_placeholder": "00:00:00 (o dejar vacío para inicio)",
"end_time_placeholder": "00:10:00 (o dejar vacío para fin)",
"force_keyframes": "Forzar fotogramas clave en cortes (mejor precisión, más lento)"
},
"update": {
"title": "Actualizar yt-dlp",
"checking": "Verificando actualizaciones...",
"update_available": "¡Actualización disponible!\nVersión actual: {current}\nÚltima versión: {latest}",
"up_to_date": "yt-dlp está actualizado (versión {version})",
"could_not_determine": "No se pudieron determinar las versiones.",
"error_comparing": "Error al comparar versiones: {error}",
"update_available_failed": "¡Actualización disponible! (Comparación fallida)\nActual: {current}\nÚltima: {latest}",
"updating": "Actualizando...",
"initializing": "🚀 Inicializando proceso de actualización...",
"checking_current": "🔍 Verificando instalación actual...",
"found_at": "📍 Se encontró yt-dlp en: {path}",
"error_getting_path": "❌ Error al obtener la ruta de yt-dlp: {error}",
"updating_binary": "📦 Actualizando binario de yt-dlp administrado por la app...",
"updating_pip": "🐍 Actualizando yt-dlp del sistema vía pip...",
"update_failed": "❌ Falló la actualización de yt-dlp. Inténtalo de nuevo o verifica tu conexión a internet.",
"binary_updated": "✅ ¡Binario actualizado exitosamente!",
"update_failed_stderr": "❌ Falló la actualización de yt-dlp: {error}",
"update_timeout": "❌ Tiempo agotado en la actualización de yt-dlp.",
"unexpected_error": "❌ Error inesperado durante la actualización: {error}",
"checking_pip": "🔍 Verificando instalación actual de pip...",
"current_version": "📋 Versión actual: {version}",
"not_found_pip": "⚠️ yt-dlp no encontrado vía pip, intentando instalación...",
"checking_latest": "🌐 Verificando última versión...",
"failed_check_updates": "❌ Falló la verificación de actualizaciones",
"latest_version": "🆕 Última versión: {version}",
"updating_from_to": "⬆️ Actualizando de {current} a {latest}...",
"running_pip_install": "📦 Ejecutando pip install --upgrade...",
"pip_completed": "✅ ¡Actualización de pip completada exitosamente!",
"pip_failed": "❌ Actualización de pip falló: {error}"
},
"settings": {
"title": "Configuración de Descarga",
"download_path": "Ruta de Descarga",
"browse": "Examinar...",
"speed_limit": "Límite de Velocidad",
"speed_limit_placeholder": "Ninguno",
"auto_update_ytdlp": "Auto-Actualizar yt-dlp",
"enable_auto_updates": "Habilitar actualizaciones automáticas de yt-dlp",
"update_frequency": "Frecuencia de actualización:",
"check_startup": "Verificar en cada inicio (mínimo 1 hora entre verificaciones)",
"check_daily": "Verificar diariamente",
"check_weekly": "Verificar semanalmente",
"check_updates_now": "Verificar Actualizaciones Ahora",
"update_check_title": "Verificación de Actualizaciones",
"could_not_determine_version": "No se pudo determinar la versión actual de yt-dlp.",
"update_available_dialog": "¡Actualización disponible!\n\nActual: {current}\nÚltima: {latest}\n\nUsa el botón 'Actualizar yt-dlp' en la ventana principal para actualizar.",
"up_to_date_dialog": "¡yt-dlp está actualizado!\n\nVersión actual: {version}",
"error_checking_updates": "Error al verificar actualizaciones: {error}",
"settings_saved_title": "Configuración Guardada",
"settings_saved_message": "¡La configuración de auto-actualización se ha guardado exitosamente!",
"error_title": "Error",
"failed_save_settings": "Falló al guardar la configuración de auto-actualización.",
"error_saving_settings": "Error al guardar la configuración de auto-actualización: {error}",
"auto_update_title": "Configuración de Auto-Actualización",
"auto_update_header": "🔄 Configuración de Auto-Actualización",
"auto_update_description": "Configura las actualizaciones automáticas de yt-dlp para asegurar que siempre tengas las últimas funciones y correcciones de errores.",
"current_status": "Estado Actual",
"current_version_label": "Versión actual de yt-dlp: Verificando...",
"last_check_label": "Última verificación de actualización: Nunca",
"next_check_label": "Próxima verificación: Basado en configuración",
"manual_check_button": "🔍 Verificar Actualizaciones Ahora",
"update_frequency_group": "Frecuencia de Actualización",
"save_settings": "Guardar Configuración",
"settings_saved_successfully": "✅ ¡Configuración guardada exitosamente!",
"error_saving": "❌ Error al guardar configuración: {error}"
},
"main_ui": {
"url_placeholder": "Ingresa URL de video o lista de YouTube",
"merge_subtitles": "Combinar Subtítulos",
"save_thumbnail": "Guardar Miniatura",
"save_description": "Guardar Descripción",
"embed_chapters": "Incrustar Capítulos",
"subtitles_selected": "{count} seleccionados",
"all_selected": "Todos seleccionados",
"select_videos_all": "Seleccionar Videos... (Todos seleccionados)",
"please_enter_url": "Por favor ingresa primero una URL",
"cookie_file_selected_title": "Archivo de Cookies Seleccionado",
"cookie_file_selected_message": "Archivo de cookies seleccionado: {path}",
"browser_cookies_selected_title": "Cookies de Navegador Seleccionadas",
"browser_cookies_selected_message": "Las cookies del navegador serán extraídas de: {browser}",
"error_no_format_info": "Error: No hay información de formato disponible.",
"error_extract_info": "Error: No se pudo extraer la información básica del video. Por favor verifica tu enlace.",
"analyzing_preparing": "Analizando (0%)... Preparando solicitud",
"analyzing_extracting_basic": "Analizando (15%)... Extrayendo información básica",
"analyzing_extracting_detailed": "Analizando (30%)... Extrayendo información detallada",
"analyzing_processing_video": "Analizando (45%)... Procesando datos de video",
"analyzing_processing_formats": "Analizando (60%)... Procesando formatos",
"analyzing_loading_thumbnail": "Analizando (75%)... Cargando miniatura",
"analyzing_processing_subtitles": "Analizando (85%)... Procesando subtítulos",
"analyzing_updating_table": "Analizando (95%)... Actualizando tabla de formatos",
"analysis_complete": "¡Análisis completo!",
"analyzing_extracting_ytdlp": "Analizando (30%)... Extrayendo información con ejecutable yt-dlp",
"analyzing_processing_data": "Analizando (60%)... Procesando datos",
"analyzing_processing_formats_ytdlp": "Analizando (75%)... Procesando formatos",
"analyzing_loading_thumbnail_ytdlp": "Analizando (85%)... Cargando miniatura",
"analyzing_processing_subtitles_ytdlp": "Analizando (90%)... Procesando subtítulos",
"select_subtitles": "Seleccionar Subtítulos...",
"sponsorblock_categories": "Categorías SponsorBlock..."
},
"sponsorblock": {
"sponsor": "Patrocinador",
"sponsor_desc": "Promoción pagada, referencias pagadas y anuncios directos",
"selfpromo": "Autopromoción No Pagada",
"selfpromo_desc": "Promoción no pagada del propio contenido del creador",
"interaction": "Recordatorio de Interacción",
"interaction_desc": "Pedir a los espectadores que den like, se suscriban o sigan en redes sociales",
"intro": "Introducción",
"intro_desc": "Introducción del video que se puede omitir",
"outro": "Outro/Tarjetas Finales",
"outro_desc": "Créditos o cuando termina el video",
"preview": "Vista Previa/Resumen",
"preview_desc": "Resumen rápido de videos anteriores o vista previa de lo que viene",
"music_offtopic": "Sección No Musical",
"music_offtopic_desc": "Solo para videos musicales. Marca secciones no musicales",
"filler": "Relleno/Tangente",
"filler_desc": "Escenas tangenciales agregadas solo como relleno o humor"
},
"video_info": {
"channel": "Canal",
"views": "Visualizaciones",
"likes": "Me gusta",
"upload_date": "Fecha de subida",
"duration": "Duración",
"unknown_channel": "Canal desconocido",
"unknown_date": "Fecha desconocida",
"unknown_title": "Título desconocido"
},
"command": {
"running": "Ejecutando...",
"run_command": "Ejecutar Comando"
},
"selection": {
"none_selected": "0 seleccionados",
"one_selected": "1 categoría seleccionada",
"count_selected": "{count} seleccionados"
},
"status": {
"ready": "Listo",
"file_exists": "⚠️ El archivo ya existe",
"cancelling": "Cancelando descarga..."
}
}