From 4bee8cf1db454acdd91201630c130f44cf19cbbd Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Sun, 3 May 2026 19:31:26 +0200 Subject: [PATCH] fix: proper menu translation --- lib/bds/desktop/menu_bar.ex | 123 +++++++++++++++++++--------------- lib/bds/desktop/shell_live.ex | 15 ++++- priv/i18n/locales/de.json | 53 +++++++++++++++ priv/i18n/locales/en.json | 53 +++++++++++++++ priv/i18n/locales/es.json | 53 +++++++++++++++ priv/i18n/locales/fr.json | 53 +++++++++++++++ priv/i18n/locales/it.json | 53 +++++++++++++++ 7 files changed, 347 insertions(+), 56 deletions(-) diff --git a/lib/bds/desktop/menu_bar.ex b/lib/bds/desktop/menu_bar.ex index 8b0b4eb..dea3e61 100644 --- a/lib/bds/desktop/menu_bar.ex +++ b/lib/bds/desktop/menu_bar.ex @@ -2,7 +2,7 @@ defmodule BDS.Desktop.MenuBar do @moduledoc false use BDS.Desktop.MenuCompat - alias BDS.Desktop.Shutdown + alias BDS.Desktop.{ShellData, Shutdown, UILocale} alias BDS.UI.Commands alias BDS.UI.MenuBar, as: ShellMenuBar alias Desktop.OS @@ -22,6 +22,8 @@ defmodule BDS.Desktop.MenuBar do @impl true def mount(menu) do + UILocale.put(ShellData.ui_language()) + {:ok, Desktop.Menu.assign( menu, @@ -85,6 +87,17 @@ defmodule BDS.Desktop.MenuBar do end @impl true + def handle_info({:set_ui_locale, locale}, menu) do + UILocale.put(locale) + + {:noreply, + Desktop.Menu.assign( + menu, + :groups, + groups(dev_mode?: Application.get_env(:bds, :dev_routes, false)) + )} + end + def handle_info(_, menu) do {:noreply, menu} end @@ -127,58 +140,60 @@ defmodule BDS.Desktop.MenuBar do defp native_label(label, nil), do: label defp native_label(label, shortcut), do: label <> "\t" <> shortcut - defp group_label(:file), do: "File" - defp group_label(:edit), do: "Edit" - defp group_label(:view), do: "View" - defp group_label(:blog), do: "Blog" - defp group_label(:help), do: "Help" + defp group_label(:file), do: translate("menuBar.file") + defp group_label(:edit), do: translate("menuBar.edit") + defp group_label(:view), do: translate("menuBar.view") + defp group_label(:blog), do: translate("menuBar.blog") + defp group_label(:help), do: translate("menuBar.help") - defp item_label(:new_post), do: "New Post" - defp item_label(:import_media), do: "Import Media" - defp item_label(:save), do: "Save" - defp item_label(:open_in_browser), do: "Open in Browser" - defp item_label(:open_data_folder), do: "Open Data Folder" - defp item_label(:close_tab), do: "Close Tab" - defp item_label(:quit), do: "Quit" - defp item_label(:undo), do: "Undo" - defp item_label(:redo), do: "Redo" - defp item_label(:cut), do: "Cut" - defp item_label(:copy), do: "Copy" - defp item_label(:paste), do: "Paste" - defp item_label(:delete), do: "Delete" - defp item_label(:select_all), do: "Select All" - defp item_label(:find), do: "Find" - defp item_label(:replace), do: "Replace" - defp item_label(:edit_preferences), do: "Preferences" - defp item_label(:view_posts), do: "Posts" - defp item_label(:view_media), do: "Media" - defp item_label(:toggle_sidebar), do: "Toggle Sidebar" - defp item_label(:toggle_panel), do: "Toggle Panel" - defp item_label(:toggle_assistant_sidebar), do: "Toggle Assistant Sidebar" - defp item_label(:toggle_dev_tools), do: "Toggle Dev Tools" - defp item_label(:reload), do: "Reload" - defp item_label(:force_reload), do: "Force Reload" - defp item_label(:reset_zoom), do: "Reset Zoom" - defp item_label(:zoom_in), do: "Zoom In" - defp item_label(:zoom_out), do: "Zoom Out" - defp item_label(:toggle_full_screen), do: "Toggle Full Screen" - defp item_label(:publish_selected), do: "Publish Selected" - defp item_label(:preview_post), do: "Preview Post" - defp item_label(:edit_menu), do: "Edit Menu" - defp item_label(:rebuild_database), do: "Rebuild Database" - defp item_label(:reindex_text), do: "Reindex Text" - defp item_label(:rebuild_embedding_index), do: "Rebuild Embedding Index" - defp item_label(:metadata_diff), do: "Metadata Diff" - defp item_label(:regenerate_calendar), do: "Regenerate Calendar" - defp item_label(:validate_translations), do: "Validate Translations" - defp item_label(:fill_missing_translations), do: "Fill Missing Translations" - defp item_label(:find_duplicates), do: "Find Duplicate Posts" - defp item_label(:generate_sitemap), do: "Generate Site" - defp item_label(:validate_site), do: "Validate Site" - defp item_label(:upload_site), do: "Upload Site" - defp item_label(:about), do: "About" - defp item_label(:documentation), do: "Documentation" - defp item_label(:api_documentation), do: "API Documentation" - defp item_label(:view_on_github), do: "View on GitHub" - defp item_label(:report_issue), do: "Report Issue" + defp item_label(:new_post), do: translate("menuBar.newPost") + defp item_label(:import_media), do: translate("menuBar.importMedia") + defp item_label(:save), do: translate("menuBar.save") + defp item_label(:open_in_browser), do: translate("menuBar.openInBrowser") + defp item_label(:open_data_folder), do: translate("menuBar.openDataFolder") + defp item_label(:close_tab), do: translate("menuBar.closeTab") + defp item_label(:quit), do: translate("menuBar.quit") + defp item_label(:undo), do: translate("menuBar.undo") + defp item_label(:redo), do: translate("menuBar.redo") + defp item_label(:cut), do: translate("menuBar.cut") + defp item_label(:copy), do: translate("menuBar.copy") + defp item_label(:paste), do: translate("menuBar.paste") + defp item_label(:delete), do: translate("menuBar.delete") + defp item_label(:select_all), do: translate("menuBar.selectAll") + defp item_label(:find), do: translate("menuBar.find") + defp item_label(:replace), do: translate("menuBar.replace") + defp item_label(:edit_preferences), do: translate("menuBar.preferences") + defp item_label(:view_posts), do: translate("menuBar.viewPosts") + defp item_label(:view_media), do: translate("menuBar.viewMedia") + defp item_label(:toggle_sidebar), do: translate("menuBar.toggleSidebar") + defp item_label(:toggle_panel), do: translate("menuBar.togglePanel") + defp item_label(:toggle_assistant_sidebar), do: translate("menuBar.toggleAssistantSidebar") + defp item_label(:toggle_dev_tools), do: translate("menuBar.toggleDevTools") + defp item_label(:reload), do: translate("menuBar.reload") + defp item_label(:force_reload), do: translate("menuBar.forceReload") + defp item_label(:reset_zoom), do: translate("menuBar.resetZoom") + defp item_label(:zoom_in), do: translate("menuBar.zoomIn") + defp item_label(:zoom_out), do: translate("menuBar.zoomOut") + defp item_label(:toggle_full_screen), do: translate("menuBar.toggleFullScreen") + defp item_label(:publish_selected), do: translate("menuBar.publishSelected") + defp item_label(:preview_post), do: translate("menuBar.previewPost") + defp item_label(:edit_menu), do: translate("menuBar.editMenu") + defp item_label(:rebuild_database), do: translate("menuBar.rebuildDatabase") + defp item_label(:reindex_text), do: translate("menuBar.reindexText") + defp item_label(:rebuild_embedding_index), do: translate("menuBar.rebuildEmbeddingIndex") + defp item_label(:metadata_diff), do: translate("menuBar.metadataDiff") + defp item_label(:regenerate_calendar), do: translate("menuBar.regenerateCalendar") + defp item_label(:validate_translations), do: translate("menuBar.validateTranslations") + defp item_label(:fill_missing_translations), do: translate("menuBar.fillMissingTranslations") + defp item_label(:find_duplicates), do: translate("menuBar.findDuplicates") + defp item_label(:generate_sitemap), do: translate("menuBar.generateSite") + defp item_label(:validate_site), do: translate("menuBar.validateSite") + defp item_label(:upload_site), do: translate("menuBar.uploadSite") + defp item_label(:about), do: translate("menuBar.about") + defp item_label(:documentation), do: translate("menuBar.documentation") + defp item_label(:api_documentation), do: translate("menuBar.apiDocumentation") + defp item_label(:view_on_github), do: translate("menuBar.viewOnGithub") + defp item_label(:report_issue), do: translate("menuBar.reportIssue") + + defp translate(text), do: ShellData.translate(text, %{}, UILocale.current()) end diff --git a/lib/bds/desktop/shell_live.ex b/lib/bds/desktop/shell_live.ex index 3660fa1..c043444 100644 --- a/lib/bds/desktop/shell_live.ex +++ b/lib/bds/desktop/shell_live.ex @@ -161,8 +161,9 @@ defmodule BDS.Desktop.ShellLive do |> assign(:sidebar_filter_panels, %{}) |> assign(:chat_editor_request_refs, %{}) |> assign(:shell_overlay, nil) - |> assign(:output_entries, []) - |> reload_shell(workbench)} + |> assign(:output_entries, []) + |> reload_shell(workbench) + |> tap(&sync_menu_bar_locale/1)} end @impl true @@ -682,6 +683,7 @@ defmodule BDS.Desktop.ShellLive do socket |> assign(:page_language, normalized) |> reload_shell(socket.assigns.workbench) + |> tap(&sync_menu_bar_locale/1) end end @@ -861,4 +863,13 @@ defmodule BDS.Desktop.ShellLive do apply_shell_command_result: &apply_shell_command_result/2 } + defp sync_menu_bar_locale(socket) do + locale = socket.assigns.page_language + + case Process.whereis(BDS.Desktop.MenuBar) do + nil -> :ok + pid -> send(pid, {:set_ui_locale, locale}) + end + end + end diff --git a/priv/i18n/locales/de.json b/priv/i18n/locales/de.json index 54aabd6..2f8dac5 100644 --- a/priv/i18n/locales/de.json +++ b/priv/i18n/locales/de.json @@ -64,6 +64,59 @@ "translationValidation.revalidate": "Erneut validieren", "translationValidation.fix": "Probleme beheben", "translationValidation.toast.fixSuccess": "%{dbRows} DB-Zeilen und %{files} Dateien gelöscht, %{flushed} Übersetzungen auf Datenträger geschrieben", + "menuBar.about": "Über", + "menuBar.apiDocumentation": "API-Dokumentation", + "menuBar.blog": "Blog", + "menuBar.closeTab": "Tab schließen", + "menuBar.copy": "Kopieren", + "menuBar.cut": "Ausschneiden", + "menuBar.delete": "Löschen", + "menuBar.documentation": "Dokumentation", + "menuBar.edit": "Bearbeiten", + "menuBar.editMenu": "Menü bearbeiten", + "menuBar.file": "Datei", + "menuBar.fillMissingTranslations": "Fehlende Übersetzungen ergänzen", + "menuBar.find": "Suchen", + "menuBar.findDuplicates": "Doppelte Beiträge finden", + "menuBar.forceReload": "Erzwungenes Neuladen", + "menuBar.generateSite": "Website generieren", + "menuBar.help": "Hilfe", + "menuBar.importMedia": "Medien importieren", + "menuBar.metadataDiff": "Metadaten-Diff", + "menuBar.newPost": "Neuer Beitrag", + "menuBar.openDataFolder": "Datenordner öffnen", + "menuBar.openInBrowser": "Im Browser öffnen", + "menuBar.paste": "Einfügen", + "menuBar.preferences": "Einstellungen", + "menuBar.previewPost": "Beitragsvorschau", + "menuBar.publishSelected": "Ausgewähltes veröffentlichen", + "menuBar.quit": "Beenden", + "menuBar.redo": "Wiederholen", + "menuBar.regenerateCalendar": "Kalender neu erzeugen", + "menuBar.reload": "Neu laden", + "menuBar.replace": "Ersetzen", + "menuBar.reportIssue": "Problem melden", + "menuBar.rebuildDatabase": "Datenbank neu aufbauen", + "menuBar.rebuildEmbeddingIndex": "Embedding-Index neu aufbauen", + "menuBar.reindexText": "Text neu indizieren", + "menuBar.resetZoom": "Zoom zurücksetzen", + "menuBar.save": "Speichern", + "menuBar.selectAll": "Alles auswählen", + "menuBar.toggleAssistantSidebar": "Assistenten-Seitenleiste umschalten", + "menuBar.toggleDevTools": "Entwicklertools umschalten", + "menuBar.toggleFullScreen": "Vollbild umschalten", + "menuBar.togglePanel": "Panel umschalten", + "menuBar.toggleSidebar": "Seitenleiste umschalten", + "menuBar.undo": "Rückgängig", + "menuBar.uploadSite": "Website hochladen", + "menuBar.validateSite": "Website validieren", + "menuBar.validateTranslations": "Übersetzungen validieren", + "menuBar.view": "Ansicht", + "menuBar.viewMedia": "Medien", + "menuBar.viewOnGithub": "Auf GitHub ansehen", + "menuBar.viewPosts": "Beiträge", + "menuBar.zoomIn": "Heranzoomen", + "menuBar.zoomOut": "Herauszoomen", "menuEditor.tabTitle": "Blog-Menü", "menuEditor.title": "Blog-Menü-Editor", "menuEditor.description": "Verwalte die zentrale Blog-Navigationsstruktur und speichere sie in meta/menu.opml.", diff --git a/priv/i18n/locales/en.json b/priv/i18n/locales/en.json index 7eb2bda..d24891c 100644 --- a/priv/i18n/locales/en.json +++ b/priv/i18n/locales/en.json @@ -64,6 +64,59 @@ "translationValidation.revalidate": "Revalidate", "translationValidation.fix": "Fix Issues", "translationValidation.toast.fixSuccess": "Deleted %{dbRows} DB rows and %{files} files, flushed %{flushed} translations to disk", + "menuBar.about": "About", + "menuBar.apiDocumentation": "API Documentation", + "menuBar.blog": "Blog", + "menuBar.closeTab": "Close Tab", + "menuBar.copy": "Copy", + "menuBar.cut": "Cut", + "menuBar.delete": "Delete", + "menuBar.documentation": "Documentation", + "menuBar.edit": "Edit", + "menuBar.editMenu": "Edit Menu", + "menuBar.file": "File", + "menuBar.fillMissingTranslations": "Fill Missing Translations", + "menuBar.find": "Find", + "menuBar.findDuplicates": "Find Duplicate Posts", + "menuBar.forceReload": "Force Reload", + "menuBar.generateSite": "Generate Site", + "menuBar.help": "Help", + "menuBar.importMedia": "Import Media", + "menuBar.metadataDiff": "Metadata Diff", + "menuBar.newPost": "New Post", + "menuBar.openDataFolder": "Open Data Folder", + "menuBar.openInBrowser": "Open in Browser", + "menuBar.paste": "Paste", + "menuBar.preferences": "Preferences", + "menuBar.previewPost": "Preview Post", + "menuBar.publishSelected": "Publish Selected", + "menuBar.quit": "Quit", + "menuBar.redo": "Redo", + "menuBar.regenerateCalendar": "Regenerate Calendar", + "menuBar.reload": "Reload", + "menuBar.replace": "Replace", + "menuBar.reportIssue": "Report Issue", + "menuBar.rebuildDatabase": "Rebuild Database", + "menuBar.rebuildEmbeddingIndex": "Rebuild Embedding Index", + "menuBar.reindexText": "Reindex Text", + "menuBar.resetZoom": "Reset Zoom", + "menuBar.save": "Save", + "menuBar.selectAll": "Select All", + "menuBar.toggleAssistantSidebar": "Toggle Assistant Sidebar", + "menuBar.toggleDevTools": "Toggle Dev Tools", + "menuBar.toggleFullScreen": "Toggle Full Screen", + "menuBar.togglePanel": "Toggle Panel", + "menuBar.toggleSidebar": "Toggle Sidebar", + "menuBar.undo": "Undo", + "menuBar.uploadSite": "Upload Site", + "menuBar.validateSite": "Validate Site", + "menuBar.validateTranslations": "Validate Translations", + "menuBar.view": "View", + "menuBar.viewMedia": "Media", + "menuBar.viewOnGithub": "View on GitHub", + "menuBar.viewPosts": "Posts", + "menuBar.zoomIn": "Zoom In", + "menuBar.zoomOut": "Zoom Out", "menuEditor.tabTitle": "Blog Menu", "menuEditor.title": "Blog Menu Editor", "menuEditor.description": "Manage the central blog navigation outline and save it to meta/menu.opml.", diff --git a/priv/i18n/locales/es.json b/priv/i18n/locales/es.json index 2c95163..5000db1 100644 --- a/priv/i18n/locales/es.json +++ b/priv/i18n/locales/es.json @@ -64,6 +64,59 @@ "translationValidation.revalidate": "Revalidar", "translationValidation.fix": "Corregir problemas", "translationValidation.toast.fixSuccess": "%{dbRows} filas de BD y %{files} archivos eliminados, %{flushed} traducciones escritas a disco", + "menuBar.about": "Acerca de", + "menuBar.apiDocumentation": "Documentación de API", + "menuBar.blog": "Blog", + "menuBar.closeTab": "Cerrar pestaña", + "menuBar.copy": "Copiar", + "menuBar.cut": "Cortar", + "menuBar.delete": "Eliminar", + "menuBar.documentation": "Documentación", + "menuBar.edit": "Editar", + "menuBar.editMenu": "Editar menú", + "menuBar.file": "Archivo", + "menuBar.fillMissingTranslations": "Completar traducciones faltantes", + "menuBar.find": "Buscar", + "menuBar.findDuplicates": "Buscar entradas duplicadas", + "menuBar.forceReload": "Recarga forzada", + "menuBar.generateSite": "Generar sitio", + "menuBar.help": "Ayuda", + "menuBar.importMedia": "Importar medios", + "menuBar.metadataDiff": "Diff de metadatos", + "menuBar.newPost": "Nueva entrada", + "menuBar.openDataFolder": "Abrir carpeta de datos", + "menuBar.openInBrowser": "Abrir en navegador", + "menuBar.paste": "Pegar", + "menuBar.preferences": "Preferencias", + "menuBar.previewPost": "Vista previa de entrada", + "menuBar.publishSelected": "Publicar seleccionados", + "menuBar.quit": "Salir", + "menuBar.redo": "Rehacer", + "menuBar.regenerateCalendar": "Regenerar calendario", + "menuBar.reload": "Recargar", + "menuBar.replace": "Reemplazar", + "menuBar.reportIssue": "Informar de problema", + "menuBar.rebuildDatabase": "Reconstruir base de datos", + "menuBar.rebuildEmbeddingIndex": "Reconstruir índice de embeddings", + "menuBar.reindexText": "Reindexar texto", + "menuBar.resetZoom": "Restablecer zoom", + "menuBar.save": "Guardar", + "menuBar.selectAll": "Seleccionar todo", + "menuBar.toggleAssistantSidebar": "Alternar asistente", + "menuBar.toggleDevTools": "Alternar herramientas de desarrollo", + "menuBar.toggleFullScreen": "Pantalla completa", + "menuBar.togglePanel": "Alternar panel", + "menuBar.toggleSidebar": "Alternar barra lateral", + "menuBar.undo": "Deshacer", + "menuBar.uploadSite": "Subir sitio", + "menuBar.validateSite": "Validar sitio", + "menuBar.validateTranslations": "Validar traducciones", + "menuBar.view": "Ver", + "menuBar.viewMedia": "Medios", + "menuBar.viewOnGithub": "Ver en GitHub", + "menuBar.viewPosts": "Entradas", + "menuBar.zoomIn": "Acercar", + "menuBar.zoomOut": "Alejar", "menuEditor.tabTitle": "Menú del blog", "menuEditor.title": "Editor del menú del blog", "menuEditor.description": "Gestiona la estructura central de navegación del blog y guárdala en meta/menu.opml.", diff --git a/priv/i18n/locales/fr.json b/priv/i18n/locales/fr.json index e798315..4707bba 100644 --- a/priv/i18n/locales/fr.json +++ b/priv/i18n/locales/fr.json @@ -64,6 +64,59 @@ "translationValidation.revalidate": "Revalider", "translationValidation.fix": "Corriger les problèmes", "translationValidation.toast.fixSuccess": "%{dbRows} lignes DB et %{files} fichiers supprimés, %{flushed} traductions écrites sur disque", + "menuBar.about": "À propos", + "menuBar.apiDocumentation": "Documentation API", + "menuBar.blog": "Blog", + "menuBar.closeTab": "Fermer l’onglet", + "menuBar.copy": "Copier", + "menuBar.cut": "Couper", + "menuBar.delete": "Supprimer", + "menuBar.documentation": "Documentation", + "menuBar.edit": "Édition", + "menuBar.editMenu": "Modifier le menu", + "menuBar.file": "Fichier", + "menuBar.fillMissingTranslations": "Compléter les traductions manquantes", + "menuBar.find": "Rechercher", + "menuBar.findDuplicates": "Trouver les doublons", + "menuBar.forceReload": "Recharger de force", + "menuBar.generateSite": "Générer le site", + "menuBar.help": "Aide", + "menuBar.importMedia": "Importer des médias", + "menuBar.metadataDiff": "Diff des métadonnées", + "menuBar.newPost": "Nouvel article", + "menuBar.openDataFolder": "Ouvrir le dossier de données", + "menuBar.openInBrowser": "Ouvrir dans le navigateur", + "menuBar.paste": "Coller", + "menuBar.preferences": "Préférences", + "menuBar.previewPost": "Aperçu de l’article", + "menuBar.publishSelected": "Publier la sélection", + "menuBar.quit": "Quitter", + "menuBar.redo": "Rétablir", + "menuBar.regenerateCalendar": "Régénérer le calendrier", + "menuBar.reload": "Recharger", + "menuBar.replace": "Remplacer", + "menuBar.reportIssue": "Signaler un problème", + "menuBar.rebuildDatabase": "Reconstruire la base de données", + "menuBar.rebuildEmbeddingIndex": "Reconstruire l’index d’embeddings", + "menuBar.reindexText": "Réindexer le texte", + "menuBar.resetZoom": "Réinitialiser le zoom", + "menuBar.save": "Enregistrer", + "menuBar.selectAll": "Tout sélectionner", + "menuBar.toggleAssistantSidebar": "Afficher/masquer l’assistant", + "menuBar.toggleDevTools": "Afficher/masquer les outils de développement", + "menuBar.toggleFullScreen": "Plein écran", + "menuBar.togglePanel": "Afficher/masquer le panneau", + "menuBar.toggleSidebar": "Afficher/masquer la barre latérale", + "menuBar.undo": "Annuler", + "menuBar.uploadSite": "Téléverser le site", + "menuBar.validateSite": "Valider le site", + "menuBar.validateTranslations": "Valider les traductions", + "menuBar.view": "Affichage", + "menuBar.viewMedia": "Médias", + "menuBar.viewOnGithub": "Voir sur GitHub", + "menuBar.viewPosts": "Articles", + "menuBar.zoomIn": "Zoom avant", + "menuBar.zoomOut": "Zoom arrière", "menuEditor.tabTitle": "Menu du blog", "menuEditor.title": "Éditeur du menu du blog", "menuEditor.description": "Gérez la structure centrale de navigation du blog et enregistrez-la dans meta/menu.opml.", diff --git a/priv/i18n/locales/it.json b/priv/i18n/locales/it.json index 381d718..999e27b 100644 --- a/priv/i18n/locales/it.json +++ b/priv/i18n/locales/it.json @@ -64,6 +64,59 @@ "translationValidation.revalidate": "Rivalidare", "translationValidation.fix": "Correggi problemi", "translationValidation.toast.fixSuccess": "%{dbRows} righe DB e %{files} file eliminati, %{flushed} traduzioni scritte su disco", + "menuBar.about": "Informazioni", + "menuBar.apiDocumentation": "Documentazione API", + "menuBar.blog": "Blog", + "menuBar.closeTab": "Chiudi scheda", + "menuBar.copy": "Copia", + "menuBar.cut": "Taglia", + "menuBar.delete": "Elimina", + "menuBar.documentation": "Documentazione", + "menuBar.edit": "Modifica", + "menuBar.editMenu": "Modifica menu", + "menuBar.file": "File", + "menuBar.fillMissingTranslations": "Completa traduzioni mancanti", + "menuBar.find": "Trova", + "menuBar.findDuplicates": "Trova post duplicati", + "menuBar.forceReload": "Ricarica forzata", + "menuBar.generateSite": "Genera sito", + "menuBar.help": "Aiuto", + "menuBar.importMedia": "Importa media", + "menuBar.metadataDiff": "Diff metadati", + "menuBar.newPost": "Nuovo post", + "menuBar.openDataFolder": "Apri cartella dati", + "menuBar.openInBrowser": "Apri nel browser", + "menuBar.paste": "Incolla", + "menuBar.preferences": "Preferenze", + "menuBar.previewPost": "Anteprima post", + "menuBar.publishSelected": "Pubblica selezionati", + "menuBar.quit": "Esci", + "menuBar.redo": "Ripeti", + "menuBar.regenerateCalendar": "Rigenera calendario", + "menuBar.reload": "Ricarica", + "menuBar.replace": "Sostituisci", + "menuBar.reportIssue": "Segnala problema", + "menuBar.rebuildDatabase": "Ricostruisci database", + "menuBar.rebuildEmbeddingIndex": "Ricostruisci indice embeddings", + "menuBar.reindexText": "Reindicizza testo", + "menuBar.resetZoom": "Reimposta zoom", + "menuBar.save": "Salva", + "menuBar.selectAll": "Seleziona tutto", + "menuBar.toggleAssistantSidebar": "Attiva/disattiva assistente", + "menuBar.toggleDevTools": "Attiva/disattiva strumenti sviluppo", + "menuBar.toggleFullScreen": "Schermo intero", + "menuBar.togglePanel": "Attiva/disattiva pannello", + "menuBar.toggleSidebar": "Attiva/disattiva barra laterale", + "menuBar.undo": "Annulla", + "menuBar.uploadSite": "Carica sito", + "menuBar.validateSite": "Valida sito", + "menuBar.validateTranslations": "Valida traduzioni", + "menuBar.view": "Vista", + "menuBar.viewMedia": "Media", + "menuBar.viewOnGithub": "Visualizza su GitHub", + "menuBar.viewPosts": "Post", + "menuBar.zoomIn": "Aumenta zoom", + "menuBar.zoomOut": "Riduci zoom", "menuEditor.tabTitle": "Menu del blog", "menuEditor.title": "Editor del menu del blog", "menuEditor.description": "Gestisci la struttura centrale di navigazione del blog e salvala in meta/menu.opml.",