chore: complete i18n files

This commit is contained in:
2026-04-24 18:38:51 +02:00
parent d4b0213a55
commit 20ed1348ad
4 changed files with 389 additions and 3 deletions

View File

@@ -44,5 +44,122 @@
"render.taxonomy.ariaLabel": "Taxonomía", "render.taxonomy.ariaLabel": "Taxonomía",
"render.video.vimeoTitle": "Vídeo de Vimeo", "render.video.vimeoTitle": "Vídeo de Vimeo",
"render.video.youtubeTitle": "Vídeo de YouTube", "render.video.youtubeTitle": "Vídeo de YouTube",
"sidebar.chat.yesterday": "Ayer" "sidebar.chat.yesterday": "Ayer",
"%{count} media": "%{count} medios",
"%{count} posts": "%{count} publicaciones",
"2 langs": "2 idiomas",
"AI Assistant": "Asistente de IA",
"Across draft, published, and archive": "Entre borradores, publicaciones y archivo",
"Activated %{name}": "%{name} activado",
"Archived": "Archivado",
"Archived Jan 12, 2026": "Archivado el 12 ene 2026",
"Assistant": "Asistente",
"Automatic AI actions stay gated by airplane mode.": "Las acciones automáticas de IA siguen bloqueadas por el modo avión.",
"Automation can boot the shell in a separate process and capture screenshots": "La automatización puede iniciar el shell en un proceso separado y capturar pantallas",
"Blog": "Blog",
"Calendar regeneration is not wired yet, but the base shell now surfaces the command and keeps the Output tab selectable.": "La regeneración del calendario aún no está conectada, pero el shell base ahora muestra el comando y mantiene seleccionable la pestaña Salida.",
"Chat": "Chat",
"Close %{title}": "Cerrar %{title}",
"Close tab": "Cerrar pestaña",
"Command completed": "Comando completado",
"Command failed": "El comando falló",
"Command failed with HTTP %{status}": "El comando falló con HTTP %{status}",
"Create Project": "Crear proyecto",
"Dashboard": "Panel",
"Desktop Runtime": "Entorno de escritorio",
"Desktop workbench content routed through the Elixir shell.": "El contenido del área de trabajo de escritorio se enruta a través del shell de Elixir.",
"Desktop workbench shell wired through Elixir": "Shell del área de trabajo de escritorio conectado mediante Elixir",
"Diff Reports": "Informes de diff",
"Diffs": "Diferencias",
"Documentation": "Documentación",
"Drafts": "Borradores",
"Drafts, published entries, and archive history": "Borradores, entradas publicadas e historial de archivo",
"Edit": "Editar",
"Extra": "Extra",
"Extra Pages": "Páginas extra",
"File": "Archivo",
"Filesystem Sync": "Sincronización del sistema de archivos",
"Fill Missing Translations": "Completar traducciones faltantes",
"Find Duplicates": "Buscar duplicados",
"Git": "Git",
"Git Log": "Registro Git",
"Help": "Ayuda",
"Idle": "Inactivo",
"Images and documents indexed": "Imágenes y documentos indexados",
"Import": "Importar",
"Launch plan": "Plan de lanzamiento",
"Main Language": "Idioma principal",
"Media": "Medios",
"Menu": "Menú",
"Metadata": "Metadatos",
"Metadata Diff": "Diff de metadatos",
"Metadata flush, diffing, and rebuild hooks still need editor wiring.": "El guardado de metadatos, el diff y los hooks de reconstrucción todavía necesitan la conexión del editor.",
"Missing": "Faltante",
"Missing Pages": "Páginas faltantes",
"Missing Translations": "Traducciones faltantes",
"Mode": "Modo",
"Native menu groups mirror the old application shell": "Los grupos de menús nativos reflejan el antiguo shell de la aplicación",
"New Project": "Nuevo proyecto",
"New project name": "Nombre del nuevo proyecto",
"No active background tasks": "No hay tareas activas en segundo plano",
"No background tasks running": "No hay tareas en segundo plano en ejecución",
"No items": "No hay elementos",
"No missing pages": "No faltan páginas",
"No orphan translation files": "No hay archivos de traducción huérfanos",
"No shell output yet": "Aún no hay salida del shell",
"Offline": "Sin conexión",
"Offline Gate": "Bloqueo sin conexión",
"Open": "Abrir",
"Open Data Folder": "Abrir carpeta de datos",
"Open in Browser": "Abrir en el navegador",
"Opened URL": "URL abierta",
"Orphan Files": "Archivos huérfanos",
"Orphan Reports": "Informes de huérfanos",
"Orphans": "Huérfanos",
"Output": "Salida",
"Pages": "Páginas",
"Pairs": "Pares",
"Post": "Publicación",
"Posts": "Publicaciones",
"Preview": "Vista previa",
"Projects": "Proyectos",
"Published": "Publicado",
"Published Feb 10, 2026": "Publicado el 10 feb 2026",
"Queued": "En cola",
"Regenerate Calendar": "Regenerar calendario",
"Retrospective": "Retrospectiva",
"Roadmap": "Hoja de ruta",
"Running": "En ejecución",
"Script": "Script",
"Scripts": "Scripts",
"Select Project": "Seleccionar proyecto",
"Settings": "Configuración",
"Sidebar, tabs, panel, and assistant panes are inspectable DOM regions": "La barra lateral, las pestañas, el panel y el asistente son regiones DOM inspeccionables",
"Site Validation": "Validación del sitio",
"Source Control": "Control de código fuente",
"Stale": "Desactualizado",
"Stale Pages": "Páginas desactualizadas",
"Status": "Estado",
"Style": "Estilo",
"Switch project": "Cambiar proyecto",
"Tags": "Etiquetas",
"Tasks": "Tareas",
"Template": "Plantilla",
"Templates": "Plantillas",
"The app window is now served from the Elixir shell renderer.": "La ventana de la aplicación ahora se sirve desde el renderizador shell de Elixir.",
"The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics.": "El panel inferior compartido está disponible para tareas, salida, detalles de Git y diagnósticos específicos del editor.",
"Toggle assistant": "Alternar asistente",
"Toggle offline mode": "Alternar modo sin conexión",
"Toggle panel": "Alternar panel",
"Toggle sidebar": "Alternar barra lateral",
"Translation fill is not wired yet, but the command is now routed into Output instead of being ignored.": "El completado de traducciones aún no está conectado, pero el comando ahora se enruta a Salida en lugar de ignorarse.",
"Translations": "Traducciones",
"UI": "UI",
"Updated today": "Actualizado hoy",
"Updated yesterday": "Actualizado ayer",
"Upload Site": "Subir sitio",
"View": "Ver",
"Welcome to bDS2": "Bienvenido a bDS2",
"Workbench Notes": "Notas del área de trabajo",
"Working tree integration is not wired yet in the shell, but the tab is selectable and ready for command output.": "La integración del árbol de trabajo aún no está conectada en el shell, pero la pestaña es seleccionable y está lista para la salida de comandos."
} }

View File

@@ -44,5 +44,122 @@
"render.taxonomy.ariaLabel": "Taxonomie", "render.taxonomy.ariaLabel": "Taxonomie",
"render.video.vimeoTitle": "Vidéo Vimeo", "render.video.vimeoTitle": "Vidéo Vimeo",
"render.video.youtubeTitle": "Vidéo YouTube", "render.video.youtubeTitle": "Vidéo YouTube",
"sidebar.chat.yesterday": "Hier" "sidebar.chat.yesterday": "Hier",
"%{count} media": "%{count} médias",
"%{count} posts": "%{count} articles",
"2 langs": "2 langues",
"AI Assistant": "Assistant IA",
"Across draft, published, and archive": "Répartis entre brouillons, publications et archives",
"Activated %{name}": "%{name} activé",
"Archived": "Archivé",
"Archived Jan 12, 2026": "Archivé le 12 janv. 2026",
"Assistant": "Assistant",
"Automatic AI actions stay gated by airplane mode.": "Les actions IA automatiques restent bloquées par le mode avion.",
"Automation can boot the shell in a separate process and capture screenshots": "Lautomatisation peut démarrer le shell dans un processus séparé et capturer des captures décran",
"Blog": "Blog",
"Calendar regeneration is not wired yet, but the base shell now surfaces the command and keeps the Output tab selectable.": "La régénération du calendrier nest pas encore câblée, mais le shell de base expose maintenant la commande et garde longlet Sortie sélectionnable.",
"Chat": "Chat",
"Close %{title}": "Fermer %{title}",
"Close tab": "Fermer longlet",
"Command completed": "Commande terminée",
"Command failed": "La commande a échoué",
"Command failed with HTTP %{status}": "La commande a échoué avec HTTP %{status}",
"Create Project": "Créer un projet",
"Dashboard": "Tableau de bord",
"Desktop Runtime": "Exécution bureau",
"Desktop workbench content routed through the Elixir shell.": "Le contenu de latelier bureau est acheminé via le shell Elixir.",
"Desktop workbench shell wired through Elixir": "Shell datelier bureau câblé via Elixir",
"Diff Reports": "Rapports de diff",
"Diffs": "Différences",
"Documentation": "Documentation",
"Drafts": "Brouillons",
"Drafts, published entries, and archive history": "Brouillons, éléments publiés et historique darchives",
"Edit": "Édition",
"Extra": "Supplémentaire",
"Extra Pages": "Pages supplémentaires",
"File": "Fichier",
"Filesystem Sync": "Synchronisation du système de fichiers",
"Fill Missing Translations": "Compléter les traductions manquantes",
"Find Duplicates": "Trouver les doublons",
"Git": "Git",
"Git Log": "Journal Git",
"Help": "Aide",
"Idle": "Inactif",
"Images and documents indexed": "Images et documents indexés",
"Import": "Importer",
"Launch plan": "Plan de lancement",
"Main Language": "Langue principale",
"Media": "Médias",
"Menu": "Menu",
"Metadata": "Métadonnées",
"Metadata Diff": "Diff des métadonnées",
"Metadata flush, diffing, and rebuild hooks still need editor wiring.": "Lécriture des métadonnées, le diff et les hooks de reconstruction ont encore besoin du câblage de léditeur.",
"Missing": "Manquant",
"Missing Pages": "Pages manquantes",
"Missing Translations": "Traductions manquantes",
"Mode": "Mode",
"Native menu groups mirror the old application shell": "Les groupes de menus natifs reflètent lancien shell de lapplication",
"New Project": "Nouveau projet",
"New project name": "Nom du nouveau projet",
"No active background tasks": "Aucune tâche darrière-plan active",
"No background tasks running": "Aucune tâche darrière-plan en cours",
"No items": "Aucun élément",
"No missing pages": "Aucune page manquante",
"No orphan translation files": "Aucun fichier de traduction orphelin",
"No shell output yet": "Aucune sortie du shell pour linstant",
"Offline": "Hors ligne",
"Offline Gate": "Verrou hors ligne",
"Open": "Ouvrir",
"Open Data Folder": "Ouvrir le dossier de données",
"Open in Browser": "Ouvrir dans le navigateur",
"Opened URL": "URL ouverte",
"Orphan Files": "Fichiers orphelins",
"Orphan Reports": "Rapports dorphelins",
"Orphans": "Orphelins",
"Output": "Sortie",
"Pages": "Pages",
"Pairs": "Paires",
"Post": "Article",
"Posts": "Articles",
"Preview": "Aperçu",
"Projects": "Projets",
"Published": "Publié",
"Published Feb 10, 2026": "Publié le 10 févr. 2026",
"Queued": "En file",
"Regenerate Calendar": "Régénérer le calendrier",
"Retrospective": "Rétrospective",
"Roadmap": "Feuille de route",
"Running": "En cours",
"Script": "Script",
"Scripts": "Scripts",
"Select Project": "Sélectionner un projet",
"Settings": "Paramètres",
"Sidebar, tabs, panel, and assistant panes are inspectable DOM regions": "La barre latérale, les onglets, le panneau et lassistant sont des régions DOM inspectables",
"Site Validation": "Validation du site",
"Source Control": "Contrôle de source",
"Stale": "Obsolète",
"Stale Pages": "Pages obsolètes",
"Status": "Statut",
"Style": "Style",
"Switch project": "Changer de projet",
"Tags": "Tags",
"Tasks": "Tâches",
"Template": "Modèle",
"Templates": "Modèles",
"The app window is now served from the Elixir shell renderer.": "La fenêtre de lapplication est maintenant servie par le moteur de rendu shell Elixir.",
"The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics.": "Le panneau inférieur partagé est disponible pour les tâches, la sortie, les détails Git et les diagnostics spécifiques à léditeur.",
"Toggle assistant": "Afficher ou masquer lassistant",
"Toggle offline mode": "Basculer le mode hors ligne",
"Toggle panel": "Afficher ou masquer le panneau",
"Toggle sidebar": "Afficher ou masquer la barre latérale",
"Translation fill is not wired yet, but the command is now routed into Output instead of being ignored.": "Le remplissage des traductions nest pas encore câblé, mais la commande est maintenant envoyée vers Sortie au lieu dêtre ignorée.",
"Translations": "Traductions",
"UI": "UI",
"Updated today": "Mis à jour aujourdhui",
"Updated yesterday": "Mis à jour hier",
"Upload Site": "Téléverser le site",
"View": "Affichage",
"Welcome to bDS2": "Bienvenue dans bDS2",
"Workbench Notes": "Notes datelier",
"Working tree integration is not wired yet in the shell, but the tab is selectable and ready for command output.": "Lintégration de larbre de travail nest pas encore câblée dans le shell, mais longlet est sélectionnable et prêt pour la sortie des commandes."
} }

View File

@@ -44,5 +44,122 @@
"render.taxonomy.ariaLabel": "Tassonomia", "render.taxonomy.ariaLabel": "Tassonomia",
"render.video.vimeoTitle": "Video Vimeo", "render.video.vimeoTitle": "Video Vimeo",
"render.video.youtubeTitle": "Video YouTube", "render.video.youtubeTitle": "Video YouTube",
"sidebar.chat.yesterday": "Ieri" "sidebar.chat.yesterday": "Ieri",
"%{count} media": "%{count} media",
"%{count} posts": "%{count} post",
"2 langs": "2 lingue",
"AI Assistant": "Assistente IA",
"Across draft, published, and archive": "Tra bozze, pubblicati e archivio",
"Activated %{name}": "%{name} attivato",
"Archived": "Archiviato",
"Archived Jan 12, 2026": "Archiviato il 12 gen 2026",
"Assistant": "Assistente",
"Automatic AI actions stay gated by airplane mode.": "Le azioni IA automatiche restano bloccate dalla modalità aereo.",
"Automation can boot the shell in a separate process and capture screenshots": "Lautomazione può avviare la shell in un processo separato e catturare schermate",
"Blog": "Blog",
"Calendar regeneration is not wired yet, but the base shell now surfaces the command and keeps the Output tab selectable.": "La rigenerazione del calendario non è ancora collegata, ma la shell di base ora espone il comando e mantiene selezionabile la scheda Output.",
"Chat": "Chat",
"Close %{title}": "Chiudi %{title}",
"Close tab": "Chiudi scheda",
"Command completed": "Comando completato",
"Command failed": "Comando non riuscito",
"Command failed with HTTP %{status}": "Comando non riuscito con HTTP %{status}",
"Create Project": "Crea progetto",
"Dashboard": "Dashboard",
"Desktop Runtime": "Runtime desktop",
"Desktop workbench content routed through the Elixir shell.": "I contenuti del banco di lavoro desktop vengono instradati tramite la shell Elixir.",
"Desktop workbench shell wired through Elixir": "Shell del banco di lavoro desktop collegata tramite Elixir",
"Diff Reports": "Report diff",
"Diffs": "Differenze",
"Documentation": "Documentazione",
"Drafts": "Bozze",
"Drafts, published entries, and archive history": "Bozze, elementi pubblicati e cronologia archivio",
"Edit": "Modifica",
"Extra": "Extra",
"Extra Pages": "Pagine extra",
"File": "File",
"Filesystem Sync": "Sincronizzazione filesystem",
"Fill Missing Translations": "Completa traduzioni mancanti",
"Find Duplicates": "Trova duplicati",
"Git": "Git",
"Git Log": "Log Git",
"Help": "Aiuto",
"Idle": "Inattivo",
"Images and documents indexed": "Immagini e documenti indicizzati",
"Import": "Importa",
"Launch plan": "Piano di lancio",
"Main Language": "Lingua principale",
"Media": "Media",
"Menu": "Menu",
"Metadata": "Metadati",
"Metadata Diff": "Diff metadati",
"Metadata flush, diffing, and rebuild hooks still need editor wiring.": "Il salvataggio dei metadati, il diff e gli hook di ricostruzione hanno ancora bisogno del collegamento nelleditor.",
"Missing": "Mancante",
"Missing Pages": "Pagine mancanti",
"Missing Translations": "Traduzioni mancanti",
"Mode": "Modalità",
"Native menu groups mirror the old application shell": "I gruppi di menu nativi rispecchiano la vecchia shell dellapplicazione",
"New Project": "Nuovo progetto",
"New project name": "Nome nuovo progetto",
"No active background tasks": "Nessuna attività in background attiva",
"No background tasks running": "Nessuna attività in background in esecuzione",
"No items": "Nessun elemento",
"No missing pages": "Nessuna pagina mancante",
"No orphan translation files": "Nessun file di traduzione orfano",
"No shell output yet": "Nessun output della shell per ora",
"Offline": "Offline",
"Offline Gate": "Blocco offline",
"Open": "Apri",
"Open Data Folder": "Apri cartella dati",
"Open in Browser": "Apri nel browser",
"Opened URL": "URL aperto",
"Orphan Files": "File orfani",
"Orphan Reports": "Report orfani",
"Orphans": "Orfani",
"Output": "Output",
"Pages": "Pagine",
"Pairs": "Coppie",
"Post": "Post",
"Posts": "Post",
"Preview": "Anteprima",
"Projects": "Progetti",
"Published": "Pubblicato",
"Published Feb 10, 2026": "Pubblicato il 10 feb 2026",
"Queued": "In coda",
"Regenerate Calendar": "Rigenera calendario",
"Retrospective": "Retrospettiva",
"Roadmap": "Roadmap",
"Running": "In esecuzione",
"Script": "Script",
"Scripts": "Script",
"Select Project": "Seleziona progetto",
"Settings": "Impostazioni",
"Sidebar, tabs, panel, and assistant panes are inspectable DOM regions": "Barra laterale, schede, pannello e assistente sono regioni DOM ispezionabili",
"Site Validation": "Validazione sito",
"Source Control": "Controllo del codice sorgente",
"Stale": "Obsoleto",
"Stale Pages": "Pagine obsolete",
"Status": "Stato",
"Style": "Stile",
"Switch project": "Cambia progetto",
"Tags": "Tag",
"Tasks": "Attività",
"Template": "Template",
"Templates": "Template",
"The app window is now served from the Elixir shell renderer.": "La finestra dellapp è ora servita dal renderer shell Elixir.",
"The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics.": "Il pannello inferiore condiviso è disponibile per attività, output, dettagli Git e diagnostica specifica delleditor.",
"Toggle assistant": "Attiva/disattiva assistente",
"Toggle offline mode": "Attiva/disattiva modalità offline",
"Toggle panel": "Attiva/disattiva pannello",
"Toggle sidebar": "Attiva/disattiva barra laterale",
"Translation fill is not wired yet, but the command is now routed into Output instead of being ignored.": "Il completamento delle traduzioni non è ancora collegato, ma il comando ora viene instradato in Output invece di essere ignorato.",
"Translations": "Traduzioni",
"UI": "UI",
"Updated today": "Aggiornato oggi",
"Updated yesterday": "Aggiornato ieri",
"Upload Site": "Carica sito",
"View": "Vista",
"Welcome to bDS2": "Benvenuto in bDS2",
"Workbench Notes": "Note del banco di lavoro",
"Working tree integration is not wired yet in the shell, but the tab is selectable and ready for command output.": "Lintegrazione del working tree non è ancora collegata nella shell, ma la scheda è selezionabile e pronta per loutput dei comandi."
} }

View File

@@ -46,4 +46,39 @@ defmodule BDS.I18nTest do
test "supported locales do not silently fall back to english per key" do test "supported locales do not silently fall back to english per key" do
assert BDS.I18n.translate("de", "missing.key") == "missing.key" assert BDS.I18n.translate("de", "missing.key") == "missing.key"
end end
test "supported locale files expose the same translation keys" do
catalogs = locale_catalogs()
english_keys = catalogs["en"] |> Map.keys() |> Enum.sort()
for {locale, catalog} <- catalogs, locale != "en" do
assert Map.keys(catalog) |> Enum.sort() == english_keys
end
end
test "supported non-english locales translate representative keys differently from english" do
catalogs = locale_catalogs()
representative_keys = [
"activity.posts",
"common.settings",
"render.calendar.title",
"render.notFound.back",
"render.search.ariaLabel"
]
for locale <- ["de", "fr", "it", "es"], key <- representative_keys do
assert Map.fetch!(catalogs, locale)[key] != Map.fetch!(catalogs, "en")[key]
end
end
defp locale_catalogs do
locale_dir = Application.app_dir(:bds, "priv/i18n/locales")
Path.wildcard(Path.join(locale_dir, "*.json"))
|> Enum.sort()
|> Enum.into(%{}, fn path ->
{Path.basename(path, ".json"), Jason.decode!(File.read!(path))}
end)
end
end end