feat: i18n support with first translations

This commit is contained in:
2026-02-21 10:45:41 +01:00
parent a5281a7750
commit b8005bec30
48 changed files with 2792 additions and 462 deletions

View File

@@ -0,0 +1,320 @@
{
"common.save": "Guardar",
"common.cancel": "Cancelar",
"common.clear": "Limpiar",
"common.settings": "Configuración",
"common.tasks": "Tareas",
"common.running": "en ejecución",
"common.pending": "pendiente",
"activity.posts": "Entradas",
"activity.pages": "Páginas",
"activity.media": "Medios",
"activity.tags": "Etiquetas",
"activity.aiAssistant": "Asistente IA",
"activity.import": "Importar",
"activity.sourceControl": "Control de código fuente",
"activity.toggleHint": "(haz clic de nuevo para alternar la barra lateral)",
"tasks.backgroundTasks": "Tareas en segundo plano",
"tasks.clearCompleted": "Limpiar completadas",
"tasks.recent": "Recientes",
"tasks.noActive": "No hay tareas activas",
"tasks.cancelTask": "Cancelar tarea",
"tasks.triggerTitle": "{running} en ejecución, {pending} pendiente",
"app.taskCompleted": "Tarea completada: {message}",
"app.taskFailed": "Tarea fallida: {message}",
"app.databaseRebuildFailed": "La reconstrucción de la base de datos falló",
"app.textReindexFailed": "La reindexación de texto falló",
"app.sitemapGenerationFailed": "La generación del sitemap falló",
"app.previewOpenFailed": "No se pudo abrir la vista previa de la entrada seleccionada",
"app.metadataDiff": "Diferencia de Metadatos",
"app.importComplete": "Importación completada: {posts} entradas, {media} archivos multimedia",
"settings.language.english": "Inglés",
"settings.language.german": "Alemán",
"settings.language.french": "Francés",
"settings.language.italian": "Italiano",
"settings.language.spanish": "Español",
"settings.language.portuguese": "Portugués (Português)",
"settings.language.dutch": "Neerlandés (Nederlands)",
"settings.language.polish": "Polaco (Polski)",
"settings.language.russian": "Ruso (Русский)",
"settings.language.japanese": "Japonés (日本語)",
"settings.language.chinese": "Chino (中文)",
"settings.language.korean": "Coreano (한국어)",
"settings.language.arabic": "Árabe (العربية)",
"settings.language.hindi": "Hindi",
"settings.language.turkish": "Turco (Türkçe)",
"settings.language.swedish": "Sueco (Svenska)",
"settings.language.danish": "Danés (Dansk)",
"settings.language.norwegian": "Noruego (Norsk)",
"settings.language.finnish": "Finés (Suomi)",
"settings.language.czech": "Checo (Čeština)",
"settings.project.title": "Proyecto",
"settings.project.browse": "Examinar",
"settings.project.reset": "Restablecer",
"settings.project.resetDefault": "Restablecer por defecto",
"settings.project.selectDataFolder": "Seleccionar carpeta de datos del proyecto",
"settings.editor.title": "Editor de texto",
"settings.editor.mode.wysiwyg": "WYSIWYG (editor visual)",
"settings.editor.mode.markdown": "Markdown (fuente)",
"settings.editor.mode.preview": "Vista previa (solo lectura)",
"settings.editor.diff.inline": "En línea",
"settings.editor.diff.sideBySide": "Lado a lado",
"settings.content.title": "Categorías de entradas",
"settings.content.renderInLists": "Mostrar en listas",
"settings.content.showTitles": "Mostrar títulos",
"settings.ai.title": "Asistente IA",
"settings.ai.noModels": "No hay modelos disponibles",
"settings.publishing.ftpTitle": "Publicación FTP",
"settings.publishing.sshTitle": "Publicación SSH",
"settings.data.title": "Mantenimiento de base de datos",
"settings.data.fileSystemTitle": "Sistema de archivos",
"settings.search.placeholder": "Buscar configuración...",
"settings.search.noResults": "No configuración found matching \"{query}\"",
"settings.search.clear": "Limpiar búsqueda",
"settings.toast.publishingSaved": "Credenciales de publicación guardadas",
"settings.toast.saveCredentialsFailed": "No se pudo save credentials",
"settings.toast.credentialsCleared": "Credenciales de {type} borradas",
"settings.toast.projectSaved": "Project configuración saved",
"settings.toast.projectSaveFailed": "No se pudo save project configuración",
"settings.toast.categoryAdded": "Categoría \"{category}\" agregada",
"settings.toast.categoryAddFailed": "No se pudo add category",
"settings.toast.categoryExists": "La categoría ya existe",
"settings.toast.categoryProtected": "No se puede eliminar la categoría estándar \"{category}\"",
"settings.toast.categoryAtLeastOne": "Debe haber al menos una categoría",
"settings.toast.categoryRemoved": "Categoría \"{category}\" eliminada",
"settings.toast.categoryRemoveFailed": "No se pudo remove category",
"settings.toast.categoriesReset": "Categorías restablecidas a los valores predeterminados",
"settings.toast.categoriesResetFailed": "No se pudo reset categories",
"settings.toast.categorySettingsUpdateFailed": "No se pudo update category configuración",
"settings.toast.systemPromptSaved": "Prompt del sistema guardado",
"settings.toast.systemPromptSaveFailed": "No se pudo save system prompt",
"settings.toast.systemPromptReset": "Prompt del sistema restablecido al predeterminado",
"settings.toast.systemPromptResetFailed": "No se pudo reset system prompt",
"settings.toast.apiKeySaved": "Clave API guardada y validada",
"settings.toast.apiKeyInvalid": "Clave API no válida",
"settings.toast.apiKeySaveFailed": "No se pudo save API key",
"settings.toast.defaultModelUpdated": "Modelo predeterminado actualizado",
"settings.toast.defaultModelUpdateFailed": "No se pudo set default model",
"settings.toast.rebuildPostsLoading": "Rebuilding entradas database...",
"settings.toast.rebuildPostsSuccess": "Base de datos de publicaciones reconstruida",
"settings.toast.rebuildPostsFailed": "No se pudo rebuild entradas database",
"settings.toast.rebuildMediaLoading": "Rebuilding medios database...",
"settings.toast.rebuildMediaSuccess": "Base de datos de medios reconstruida",
"settings.toast.rebuildMediaFailed": "No se pudo rebuild medios database",
"settings.toast.rebuildLinksLoading": "Rebuilding entrada links...",
"settings.toast.rebuildLinksSuccess": "Enlaces de publicaciones reconstruidos",
"settings.toast.rebuildLinksFailed": "No se pudo rebuild entrada links",
"settings.toast.thumbnailsLoading": "Generando miniaturas...",
"settings.toast.thumbnailsGenerated": "Se generaron {count} miniaturas",
"settings.toast.thumbnailsAlreadyExist": "Todas las miniaturas ya existen",
"settings.toast.thumbnailsComplete": "Generación de miniaturas completa",
"settings.toast.thumbnailsFailed": "No se pudo generate thumbnails",
"chat.setupTitle": "Configuración de chat IA",
"chat.apiKeyRequiredTitle": "Se requiere clave API de OpenCode Zen",
"chat.apiKeyRequiredDescription": "Introduce tu clave API de OpenCode para habilitar el chat de IA.",
"chat.apiKeyPlaceholder": "Introduce tu clave API...",
"chat.apiKeySave": "Guardar clave",
"chat.apiKeyValidating": "Validando...",
"chat.apiKeyInvalid": "Clave API no válida. Compruébala e inténtalo de nuevo.",
"chat.apiKeyValidationFailed": "No se pudo validate API key.",
"chat.newChat": "Nuevo chat",
"chat.welcomeTitle": "Bienvenido al asistente de IA",
"chat.welcomeDescription": "I can help you manage your entradas and medios. Try asking me to:",
"chat.welcomeTipSearch": "Buscar for entradas about a specific topic",
"chat.welcomeTipDetails": "Get details about a specific entrada",
"chat.welcomeTipTags": "Lista todas las etiquetas o categorías de tu blog",
"chat.welcomeTipMetadata": "Update metadata for entradas or medios",
"chat.welcomeTipImages": "List all images in your medios library",
"chat.role.you": "Tú",
"chat.role.assistant": "Asistente",
"chat.stop": "Detener",
"chat.inputPlaceholder": "Escribe un mensaje...",
"chat.errorPrefix": "Error del sistema: {error}",
"chat.errorNoResponse": "No se pudo get a response. Please try again.",
"chat.errorEmptyResponse": "El modelo devolvió una respuesta vacía. Prueba otro modelo o reformula tu pregunta.",
"chat.errorGeneric": "Sorry, an error occurred while processing your mensaje.",
"chat.cancelledSuffix": "(cancelado)",
"aiSuggestions.title": "Análisis de imagen IA",
"aiSuggestions.close": "Cerrar",
"aiSuggestions.analyzing": "Analizando imagen...",
"aiSuggestions.titleField": "Título",
"aiSuggestions.altField": "Texto alternativo",
"aiSuggestions.captionField": "Pie de foto",
"aiSuggestions.hasExisting": "(tiene valor existente)",
"aiSuggestions.current": "Actual",
"aiSuggestions.intro": "Selecciona qué valores generados por IA aplicar. Los valores existentes se conservan de forma predeterminada.",
"aiSuggestions.empty": "No se generaron sugerencias para esta imagen.",
"aiSuggestions.wait": "Por favor espera...",
"aiSuggestions.applySelected": "Aplicar seleccionados",
"insert.title.link": "Insertar enlace",
"insert.title.image": "Insertar imagen",
"insert.tab.linkInternal": "Enlazar a entrada",
"insert.tab.imageInternal": "Biblioteca multimedia",
"insert.tab.linkExternal": "URL externa",
"insert.tab.imageExternal": "Imagen externa",
"insert.searchPlaceholder.link": "Buscar entradas by title or content...",
"insert.searchPlaceholder.image": "Buscar medios by name, title, or alt text...",
"insert.status.searching": "Buscando...",
"insert.status.typeMore": "Escribe al menos 2 caracteres para buscar",
"insert.status.noResults": "No se encontró {kind} para \"{query}\"",
"insert.label.url": "Dirección URL",
"insert.label.linkTextOptional": "Texto del enlace (opcional)",
"insert.label.altText": "Texto alternativo",
"insert.placeholder.linkUrl": "https://ejemplo.es",
"insert.placeholder.imageUrl": "https://ejemplo.es/imagen.jpg",
"insert.placeholder.linkText": "Haz clic aquí",
"insert.placeholder.imageAlt": "Descripción de la imagen",
"insert.submit.link": "Insertar enlace",
"insert.submit.image": "Insertar imagen",
"insert.hint.internal": "Usa ↑↓ para navegar, Enter para seleccionar, Esc para cerrar",
"insert.hint.external": "Introduce la URL y pulsa Enter o haz clic en el botón, Esc para cerrar",
"insert.hint.canonicalPost": "Canónico: /YYYY/MM/DD/slug",
"insert.hint.canonicalMedia": "Canonical: /medios/YYYY/MM/file.ext",
"postLinks.loading": "Cargando enlaces...",
"postLinks.link": "enlace",
"postLinks.links": "enlaces",
"postLinks.linksTo": "Enlaces a ({count})",
"postLinks.linkedBy": "Enlazado por ({count})",
"postLinks.openTitle": "Abrir: {title}",
"docs.title": "Documentación",
"docs.subtitle": "Guía de usuario para esta versión instalada de bDS.",
"gitDiff.header": "Diferencia: {target}",
"gitDiff.noProject": "No hay un proyecto activo seleccionado.",
"gitDiff.noProjectPath": "No se pudo resolver la ruta del proyecto.",
"gitDiff.loadFailed": "No se pudo load diff.",
"gitDiff.loading": "Cargando diff...",
"gitDiff.changedFiles": "Archivos modificados",
"gitDiff.previousFile": "Archivo anterior",
"gitDiff.nextFile": "Archivo siguiente",
"errorModal.error": "Error del sistema",
"errorModal.stackTrace": "Traza de pila",
"errorModal.copyClipboard": "Copiar al portapapeles",
"errorModal.copy": "Copiar",
"errorModal.noStack": "No hay traza de pila disponible",
"confirmDelete.title": "Confirmar eliminación",
"confirmDelete.promptPost": "Are you sure you want to delete the entrada",
"confirmDelete.promptMedia": "Are you sure you want to delete the medios file",
"confirmDelete.warning": "Advertencia:",
"confirmDelete.referencedBy": "Este {itemType} está referenciado por los siguientes elementos:",
"confirmDelete.note": "Eliminar este {itemType} quitará todas estas referencias.",
"confirmDelete.cancel": "Cancelar",
"confirmDelete.deletePost": "Eliminar publicación",
"confirmDelete.deleteMedia": "Eliminar medio",
"confirmDelete.itemType.post": "entrada",
"confirmDelete.itemType.media": "medios",
"lightbox.close": "Cerrar (Esc)",
"lightbox.previous": "Anterior (←)",
"lightbox.next": "Siguiente (→)",
"credentials.error.load": "No se pudo load credentials:",
"credentials.error.save": "No se pudo save credentials:",
"credentials.toast.saved": "Credenciales guardadas",
"credentials.toast.saveFailed": "No se pudo save credentials",
"credentials.toast.testing": "Probando conexión {type}...",
"credentials.toast.connectionFailed": "Connection falló - check credentials",
"credentials.tab.ftp": "Acceso FTP",
"credentials.tab.ssh": "Acceso SSH",
"credentials.ftp.title": "Publicación FTP",
"credentials.ftp.description": "Configura FTP para publicar tu blog en un servidor web.",
"credentials.ssh.title": "Publicación SSH",
"credentials.ssh.description": "Configura SSH para publicar de forma segura en tu servidor.",
"credentials.field.host": "Servidor",
"credentials.field.username": "Nombre de usuario",
"credentials.field.password": "Contraseña",
"credentials.field.sshKeyPath": "Ruta de clave SSH",
"credentials.action.testConnection": "Probar conexión",
"credentials.ftp.placeholder.host": "ftp.ejemplo.es",
"credentials.ftp.placeholder.username": "usuario-ftp",
"credentials.ftp.placeholder.password": "Contraseña",
"credentials.ssh.placeholder.host": "servidor.ejemplo.es",
"credentials.ssh.placeholder.username": "usuario-ssh",
"credentials.ssh.placeholder.keyPath": "~/.ssh/clave_id_rsa",
"gitSidebar.header": "CONTROL DE CÓDIGO FUENTE",
"gitSidebar.loading": "Cargando...",
"gitSidebar.error.fetchRemoteUpdates": "No se pudo fetch remote updates.",
"gitSidebar.error.refreshRemoteState": "No se pudo actualizar el estado de seguimiento remoto.",
"gitSidebar.error.gitMissing": "No se encontró el ejecutable de Git. Instala Git y reinicia la aplicación.",
"gitSidebar.error.noActiveProject": "No hay un proyecto activo seleccionado.",
"gitSidebar.error.loadRepoStatus": "No se pudo cargar el estado del repositorio.",
"gitSidebar.error.initFailed": "No se pudo initialize git repository.",
"gitSidebar.error.actionFailed": "No se pudo {action}.",
"gitSidebar.error.commitFailed": "No se pudo commit changes.",
"gitSidebar.progress.preparingInit": "Preparando inicialización del repositorio...",
"gitSidebar.progress.pushingRemote": "Enviando commits al remoto... esto puede tardar con cargas grandes.",
"gitSidebar.progress.fetching": "Obteniendo actualizaciones remotas...",
"gitSidebar.progress.pulling": "Extrayendo los últimos cambios...",
"gitSidebar.progress.pruningLfs": "Limpiando caché local de Git LFS...",
"gitSidebar.progress.committing": "Creando commit...",
"gitSidebar.progress.initializingRepo": "Inicializando repositorio...",
"gitSidebar.history.synced": "Sincronizado",
"gitSidebar.history.localOnly": "Solo local",
"gitSidebar.history.remoteOnly": "Solo remoto",
"gitSidebar.init.transcript": "Registro de inicialización",
"gitSidebar.aria.repoActions": "Acciones del repositorio",
"gitSidebar.aria.openChanges": "Cambios abiertos",
"gitSidebar.aria.commitStatusLegend": "Leyenda del estado de commit",
"gitSidebar.aria.versionHistory": "Historial de versiones",
"gitSidebar.action.fetch": "Obtener",
"gitSidebar.action.fetching": "Obteniendo...",
"gitSidebar.action.pull": "Traer",
"gitSidebar.action.pulling": "Trayendo cambios...",
"gitSidebar.action.push": "Enviar",
"gitSidebar.action.pushing": "Enviando...",
"gitSidebar.action.pruneLfs": "Podar LFS",
"gitSidebar.action.pruning": "Podando...",
"gitSidebar.action.commit": "Realizar commit",
"gitSidebar.action.committing": "Haciendo commit...",
"gitSidebar.action.initializeGit": "Inicializar Git",
"gitSidebar.action.initializing": "Inicializando...",
"gitSidebar.openChanges": "Abrir Changes ({count})",
"gitSidebar.versionHistory": "Historial de versiones ({count})",
"gitSidebar.loadingChanges": "Cargando cambios...",
"gitSidebar.noChanges": "Sin cambios",
"gitSidebar.loadingHistory": "Cargando historial...",
"gitSidebar.noCommits": "Aún no hay commits",
"gitSidebar.branch": "Rama: {branch}",
"gitSidebar.aheadBehind": "adelante {ahead} / detrás {behind}",
"gitSidebar.notRepo": "Este proyecto no es un repositorio git.",
"gitSidebar.placeholder.remoteUrl": "URL opcional del repositorio remoto",
"gitSidebar.placeholder.commitMessage": "Mensaje de commit",
"editor.untitled": "Sin título",
"tabBar.style": "Estilo",
"tabBar.loading": "Cargando...",
"tabBar.unknown": "Desconocido",
"tabBar.preview": "Vista previa",
"tabBar.modified": "Modificado",
"tabBar.closeHint": "Cerrar (Ctrl+W)",
"tabBar.scrollLeft": "Desplazar pestañas a la izquierda",
"tabBar.scrollRight": "Desplazar pestañas a la derecha",
"tabBar.commitTitle": "Confirmación {hash}",
"tabBar.error.fetchPostTitle": "No se pudo fetch entrada title:",
"tabBar.error.fetchChatTitle": "No se pudo fetch chat title:",
"tabBar.error.fetchImportTitle": "No se pudo fetch import definition title:",
"tabBar.error.fetchCommitTitle": "No se pudo fetch commit titles:",
"metadataDiff.title": "Herramienta diff de metadatos",
"metadataDiff.description": "Compare entrada metadata between database and markdown files. Fix inconsistencies caused by bugs or manual edits.",
"metadataDiff.error.loadStats": "No se pudo load database statistics",
"metadataDiff.error.scan": "No se pudo scan for differences",
"metadataDiff.progress.starting": "Iniciando escaneo...",
"metadataDiff.progress.scanningPublished": "Scanning published entradas...",
"metadataDiff.progress.scanning": "Escaneando...",
"metadataDiff.action.scan": "Buscar diferencias",
"metadataDiff.action.rescan": "Volver a escanear",
"metadataDiff.stats.totalPosts": "Entradas totales",
"metadataDiff.stats.published": "Publicadas",
"metadataDiff.stats.drafts": "Borradores",
"metadataDiff.stats.mediaFiles": "Archivos multimedia",
"metadataDiff.summary.noDiffs": "✅ No differences found! All {total} published entradas are in sync.",
"metadataDiff.summary.withDiffs": "⚠️ Found {count} entradas with differences out of {total} published entradas.",
"metadataDiff.group.differences": "Diferencias de {label}",
"metadataDiff.group.postsCount": "{count} entradas",
"metadataDiff.sync.failed": "falló",
"metadataDiff.sync.dbToFile.title": "Actualizar archivos con valores de la base de datos",
"metadataDiff.sync.dbToFile.success": "Synced {success} entradas to files{falló}",
"metadataDiff.sync.dbToFile.error": "No se pudo sync to files",
"metadataDiff.sync.fileToDb.title": "Actualizar base de datos con valores de archivos",
"metadataDiff.sync.fileToDb.success": "Synced {success} files to database{falló}",
"metadataDiff.sync.fileToDb.error": "No se pudo sync to database",
"metadataDiff.value.database": "Base de datos",
"metadataDiff.value.file": "Archivo",
"metadataDiff.empty": "Haz clic en \"Buscar diferencias\" para comparar metadatos de base de datos con metadatos de archivos."
}