diff --git a/README.md b/README.md index d52bccd..847ea1c 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,9 @@ appears in every open shell. `↑/↓` or `j/k` navigate · `enter` open · `n` new post · `1-5` switch view (posts/media/templates/scripts/tags) · `:` command prompt (metadata -diff, validate site, force render, rebuilds, …) · `?` command help · +diff, validate site, force render, rebuilds, …; `:?` lists all) · +metadata-diff/site-validation reports open as panels — `enter` applies +the whole report (repair from files / incremental apply), `esc` cancels · `r` refresh · in the editor: `ctrl+s` save, `ctrl+p` publish, `ctrl+e` word-wrapped preview, `ctrl+t` title, `ctrl+l` language, `ctrl+g` AI suggestions diff --git a/lib/bds/tui.ex b/lib/bds/tui.ex index c3217b0..2bf71f8 100644 --- a/lib/bds/tui.ex +++ b/lib/bds/tui.ex @@ -33,7 +33,7 @@ defmodule BDS.TUI do alias ExRatatui.Layout alias ExRatatui.Layout.Rect alias ExRatatui.Style - alias ExRatatui.Widgets.{Block, List, Markdown, Paragraph, Tabs, Textarea} + alias ExRatatui.Widgets.{Block, Clear, List, Markdown, Paragraph, Tabs, Textarea} @views ~w(posts media templates scripts tags) @@ -52,8 +52,11 @@ defmodule BDS.TUI do stop_vm_on_exit: Keyword.get(opts, :stop_vm_on_exit, false), stop_fun: Keyword.get(opts, :stop_fun, &System.stop/0), command_executor: - Keyword.get(opts, :command_executor, &BDS.Desktop.ShellCommands.execute/1), + Keyword.get(opts, :command_executor, &BDS.Desktop.ShellCommands.execute/2), + task_snapshot_fun: Keyword.get(opts, :task_snapshot_fun, &BDS.Tasks.status_snapshot/0), command: nil, + report: nil, + handled_task_ids: nil, task_polling: false, project_id: project_id, view: "posts", @@ -68,9 +71,23 @@ defmodule BDS.TUI do status: nil } + # Tasks completed before this session started must never pop their + # report panels here — another client already consumed them. + initial_snapshot = + Keyword.get_lazy(opts, :initial_task_snapshot, state.task_snapshot_fun) + + state = %{state | handled_task_ids: completed_task_ids(initial_snapshot)} + {:ok, load_sidebar(state)} end + defp completed_task_ids(snapshot) do + snapshot + |> Map.get(:tasks, []) + |> Enum.filter(&(&1.status == :completed)) + |> MapSet.new(& &1.id) + end + @impl true def terminate(_reason, %{stop_vm_on_exit: true, stop_fun: stop_fun}) do stop_fun.() @@ -85,6 +102,10 @@ defmodule BDS.TUI do def handle_event(%ExRatatui.Event.Key{code: "q", modifiers: ["ctrl"]}, state), do: {:stop, state} + def handle_event(%ExRatatui.Event.Key{kind: "press"} = key, %{report: report} = state) + when report != nil, + do: report_key(key, state) + def handle_event(%ExRatatui.Event.Key{kind: "press"} = key, %{command: command} = state) when command != nil, do: command_key(key, state) @@ -119,9 +140,6 @@ defmodule BDS.TUI do defp sidebar_key(%{code: ":"}, state), do: {:noreply, %{state | command: %{input: "", selected: 0, help?: false}}} - defp sidebar_key(%{code: "?"}, state), - do: {:noreply, %{state | command: %{input: "", selected: 0, help?: true}}} - defp sidebar_key(%{code: "n"}, %{project_id: project_id} = state) when is_binary(project_id) do case Posts.create_post(%{project_id: project_id, title: "", content: ""}) do @@ -147,6 +165,74 @@ defmodule BDS.TUI do defp sidebar_key(_key, state), do: {:noreply, state} + # ── Events: report panels (metadata diff / site validation) ────────────── + + defp report_key(%{code: "esc"}, state), do: {:noreply, %{state | report: nil}} + + defp report_key(%{code: "enter"}, %{report: report} = state), + do: {:noreply, apply_report(%{state | report: nil}, report)} + + defp report_key(%{code: code}, %{report: report} = state) when code in ["down", "j"] do + max_scroll = max(length(report_lines(report)) - 1, 0) + {:noreply, put_in(state.report.scroll, min(report.scroll + 1, max_scroll))} + end + + defp report_key(%{code: code}, %{report: report} = state) when code in ["up", "k"], + do: {:noreply, put_in(state.report.scroll, max(report.scroll - 1, 0))} + + defp report_key(_key, state), do: {:noreply, state} + + # Whole-report application, mirroring the GUI defaults: metadata diffs are + # repaired from the filesystem (file → db, all items, orphans imported); + # site validation applies the full report incrementally. + defp apply_report(state, %{route: "metadata_diff", payload: payload}) do + items = BDS.MapUtils.attr(payload, :diff_reports, []) + orphans = BDS.MapUtils.attr(payload, :orphan_reports, []) + + if items == [] and orphans == [] do + toast(state, dgettext("ui", "Metadata Diff"), dgettext("ui", "Nothing to repair.")) + else + state = + if items == [] do + state + else + execute_action(state, dgettext("ui", "Metadata Diff"), "repair_metadata_diff", %{ + items: items, + direction: "file_to_db" + }) + end + + if orphans == [] do + state + else + execute_action( + state, + dgettext("ui", "Metadata Diff"), + "import_metadata_diff_orphans", + %{orphans: orphans} + ) + end + end + end + + defp apply_report(state, %{route: "site_validation", payload: payload}) do + nothing_to_apply? = + BDS.MapUtils.attr(payload, :missing_url_paths, []) == [] and + BDS.MapUtils.attr(payload, :extra_url_paths, []) == [] and + BDS.MapUtils.attr(payload, :updated_post_url_paths, []) == [] and + not BDS.MapUtils.attr(payload, :sitemap_changed, false) + + if nothing_to_apply? do + toast(state, dgettext("ui", "Site Validation"), dgettext("ui", "Nothing to apply.")) + else + execute_action(state, dgettext("ui", "Site Validation"), "apply_site_validation", %{ + report: payload + }) + end + end + + defp apply_report(state, _report), do: state + # ── Events: command prompt (vi-style) ──────────────────────────────────── defp command_key(%{code: "esc"}, state), do: {:noreply, %{state | command: nil}} @@ -302,7 +388,10 @@ defmodule BDS.TUI do end def handle_info(:poll_tasks, %{task_polling: true} = state) do - case BDS.Tasks.status_snapshot() do + snapshot = state.task_snapshot_fun.() + state = open_completed_reports(state, snapshot) + + case snapshot do %{running_task_message: message} when is_binary(message) and message != "" -> Process.send_after(self(), :poll_tasks, 1_000) {:noreply, %{state | status: message}} @@ -317,6 +406,40 @@ defmodule BDS.TUI do def handle_info(_message, state), do: {:noreply, state} + # A finished metadata diff / site validation task carries its report as + # the task result; unseen ones open the report panel. + defp open_completed_reports(state, snapshot) do + completed = Map.get(snapshot, :tasks, []) |> Enum.filter(&(&1.status == :completed)) + + report_task = + Enum.find(completed, fn task -> + is_map(task.result) and + Map.get(task.result, :kind) == "open_editor" and + Map.get(task.result, :route) in ["metadata_diff", "site_validation"] and + not MapSet.member?(state.handled_task_ids, task.id) + end) + + state = %{ + state + | handled_task_ids: MapSet.union(state.handled_task_ids, MapSet.new(completed, & &1.id)) + } + + case report_task do + nil -> + state + + task -> + %{ + state + | report: %{ + route: task.result.route, + payload: Map.get(task.result, :payload, %{}), + scroll: 0 + } + } + end + end + # ── Render ─────────────────────────────────────────────────────────────── @impl true @@ -338,6 +461,7 @@ defmodule BDS.TUI do main_widgets(state, main_rect) ++ status_widgets(state, status_rect) ++ image_widgets(state, body_rect) ++ + report_widgets(state, body_rect) ++ command_widgets(state, body_rect) end @@ -461,6 +585,7 @@ defmodule BDS.TUI do [inner] = Layout.split(overlay, :vertical, [{:min, 3}]) [ + {%Clear{}, overlay}, {%Block{title: title <> " — " <> dgettext("ui", "esc to close"), borders: [:all]}, overlay}, {widget, %Rect{x: inner.x + 1, y: inner.y + 1, width: inner.width - 2, height: inner.height - 2}} @@ -493,6 +618,7 @@ defmodule BDS.TUI do end [ + {%Clear{}, overlay}, {%List{ items: items, selected: if(command.help?, do: nil, else: command.selected), @@ -502,11 +628,119 @@ defmodule BDS.TUI do ] end + defp report_widgets(%{report: nil}, _rect), do: [] + + defp report_widgets(%{report: report}, rect) do + overlay = %Rect{ + x: rect.x + 2, + y: rect.y + 1, + width: max(rect.width - 4, 30), + height: max(rect.height - 2, 8) + } + + [ + {%Clear{}, overlay}, + {%List{ + items: report_lines(report), + selected: report.scroll, + scroll_padding: 2, + highlight_style: %Style{modifiers: [:bold]}, + block: %Block{title: report_title(report), borders: [:all]} + }, overlay} + ] + end + + defp report_title(%{route: "metadata_diff"}) do + dgettext("ui", "Metadata Diff") <> + " — " <> dgettext("ui", "enter repair all from files · esc close") + end + + defp report_title(%{route: "site_validation"}) do + dgettext("ui", "Site Validation") <> + " — " <> dgettext("ui", "enter apply changes · esc close") + end + + defp report_title(_report), do: "" + + defp report_lines(%{route: "metadata_diff", payload: payload}) do + diffs = BDS.MapUtils.attr(payload, :diff_reports, []) + orphans = BDS.MapUtils.attr(payload, :orphan_reports, []) + + summary = + dgettext("ui", "%{diffs} differences · %{orphans} orphan files", + diffs: length(diffs), + orphans: length(orphans) + ) + + diff_lines = + Enum.flat_map(diffs, fn item -> + entity = + "#{BDS.MapUtils.attr(item, :entity_type)} #{BDS.MapUtils.attr(item, :entity_id)}" + + differences = + item + |> BDS.MapUtils.attr(:differences, []) + |> Enum.map(fn diff -> + " #{BDS.MapUtils.attr(diff, :name)}: db=#{format_value(BDS.MapUtils.attr(diff, :db_value))} → file=#{format_value(BDS.MapUtils.attr(diff, :file_value))}" + end) + + [" " <> entity | differences] + end) + + orphan_lines = + case orphans do + [] -> [] + _some -> ["", dgettext("ui", "Orphan files (not in database):")] ++ + Enum.map(orphans, &(" " <> to_string(BDS.MapUtils.attr(&1, :file_path)))) + end + + [summary, ""] ++ diff_lines ++ orphan_lines + end + + defp report_lines(%{route: "site_validation", payload: payload}) do + summary = + dgettext("ui", "Expected %{expected} · Existing %{existing}", + expected: BDS.MapUtils.attr(payload, :expected_url_count, 0), + existing: BDS.MapUtils.attr(payload, :existing_html_url_count, 0) + ) + + sitemap = + if BDS.MapUtils.attr(payload, :sitemap_changed, false), + do: [dgettext("ui", "Sitemap changed.")], + else: [] + + [summary, ""] ++ + sitemap ++ + path_section( + dgettext("ui", "Missing pages (will be rendered):"), + BDS.MapUtils.attr(payload, :missing_url_paths, []) + ) ++ + path_section( + dgettext("ui", "Extra files (will be removed):"), + BDS.MapUtils.attr(payload, :extra_url_paths, []) + ) ++ + path_section( + dgettext("ui", "Updated posts (will be re-rendered):"), + BDS.MapUtils.attr(payload, :updated_post_url_paths, []) + ) + end + + defp report_lines(_report), do: [] + + defp path_section(_title, []), do: [] + defp path_section(title, paths), do: [title | Enum.map(paths, &(" " <> to_string(&1)))] ++ [""] + + defp format_value(value) when is_binary(value), do: truncate(value) + defp format_value(value), do: truncate(inspect(value)) + + defp truncate(text) when byte_size(text) > 40, do: String.slice(text, 0, 40) <> "…" + defp truncate(text), do: text + defp default_status(%{focus: :sidebar}), do: dgettext( "ui", - "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" + "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" ) defp default_status(%{focus: :editor}), @@ -721,12 +955,13 @@ defmodule BDS.TUI do # The parameterless Blog-menu commands. `gui: true` marks commands whose # report/apply follow-up UI exists only in the GUI shell for now — the - # command still runs here, but reviewing and applying its report (repair, - # orphan import, validation apply) needs the desktop app. + # command still runs here, but acting on its report needs the desktop + # app. Metadata diff and site validation have TUI report panels with + # whole-report apply, so they are not marked. defp commands do [ - %{action: "metadata_diff", label: dgettext("ui", "Metadata Diff"), gui: true}, - %{action: "validate_site", label: dgettext("ui", "Validate Site"), gui: true}, + %{action: "metadata_diff", label: dgettext("ui", "Metadata Diff"), gui: false}, + %{action: "validate_site", label: dgettext("ui", "Validate Site"), gui: false}, %{action: "force_render_site", label: dgettext("ui", "Force Render Site"), gui: false}, %{action: "generate_sitemap", label: dgettext("ui", "Generate Site"), gui: false}, %{action: "rebuild_database", label: dgettext("ui", "Rebuild Database"), gui: false}, @@ -763,8 +998,10 @@ defmodule BDS.TUI do end) end - defp run_command(state, entry) do - case state.command_executor.(entry.action) do + defp run_command(state, entry), do: execute_action(state, entry.label, entry.action, %{}) + + defp execute_action(state, label, action, params) do + case state.command_executor.(action, params) do {:ok, %{kind: "task_queued", title: title, message: message}} -> state |> toast(title, message) @@ -778,13 +1015,13 @@ defmodule BDS.TUI do toast(state, title, message) {:ok, _other} -> - toast(state, entry.label, dgettext("ui", "Command completed")) + toast(state, label, dgettext("ui", "Command completed")) {:error, %{message: message}} -> - toast(state, entry.label, message) + toast(state, label, message) {:error, reason} -> - toast(state, entry.label, inspect(reason)) + toast(state, label, inspect(reason)) end end diff --git a/priv/gettext/de/LC_MESSAGES/ui.po b/priv/gettext/de/LC_MESSAGES/ui.po index 5fb01cf..e8eeeaa 100644 --- a/priv/gettext/de/LC_MESSAGES/ui.po +++ b/priv/gettext/de/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "KI-Einstellungen" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "KI-Vorschlaege" @@ -572,7 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Unveränderte Diff-Blöcke einklappen" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Befehl abgeschlossen" @@ -590,7 +590,7 @@ msgstr "Bestaetigen" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1030,7 +1030,7 @@ msgid "Filename" msgstr "Dateiname" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Fehlende Übersetzungen ergänzen" @@ -1041,7 +1041,7 @@ msgid "Find" msgstr "Suchen" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Doppelte Beiträge finden" @@ -1068,7 +1068,7 @@ msgid "Gallery" msgstr "Galerie" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Website generieren" @@ -1389,9 +1389,9 @@ msgstr "Maximale Beiträge pro Seite" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1434,7 +1434,11 @@ msgstr "Metadaten" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1480,7 +1484,7 @@ msgstr "Neue Seite" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Neuer Beitrag" @@ -1769,7 +1773,7 @@ msgid "Open Settings" msgstr "Einstellungen öffnen" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Im Browser öffnen" @@ -1917,8 +1921,8 @@ msgstr "Beitrag gespeichert" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2042,14 +2046,14 @@ msgid "Ready to import:" msgstr "Bereit zum Import:" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Datenbank neu aufbauen" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Embedding-Index neu aufbauen" @@ -2107,7 +2111,7 @@ msgid "Refresh Translation" msgstr "Übersetzung aktualisieren" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Kalender neu erzeugen" @@ -2118,7 +2122,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Fehlende Vorschaubilder neu erzeugen" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Text neu indizieren" @@ -2304,7 +2308,7 @@ msgstr "Scripting-Funktionen werden in der Neufassung auf Anwendungsebene konfig #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2432,6 +2436,9 @@ msgid "Site" msgstr "Website" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2552,7 +2559,7 @@ msgstr "Schlagwortname" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2564,7 +2571,7 @@ msgstr "Tags" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Aufgaben" @@ -2609,7 +2616,7 @@ msgstr "Template-Syntax ist gültig" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2832,7 +2839,7 @@ msgid "Updated URLs" msgstr "Aktualisierte URLs" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Website hochladen" @@ -2860,13 +2867,13 @@ msgid "Validate" msgstr "Validieren" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Website validieren" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Übersetzungen validieren" @@ -3531,7 +3538,7 @@ msgid "Suggested tags" msgstr "Vorgeschlagene Tags" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Website vollständig neu generieren" @@ -3628,82 +3635,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "Der Endpunkt hat keine Modelle zurückgegeben. Sie können einen Modellnamen weiterhin manuell eingeben." -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "KI ist im Flugmodus ohne lokalen Endpunkt nicht verfügbar." -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Diese Datei konnte nicht geladen werden." -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "Die Bearbeitung dieses Eintrags ist in der Terminal-Oberfläche noch nicht verfügbar." -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Keine Vorschläge erhalten." -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Nur Bilder können in der Vorschau angezeigt werden." -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Beitrag nicht gefunden." -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Drücken Sie Enter, um %{name} in der Vorschau anzuzeigen." -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format msgid "Published." msgstr "Veröffentlicht." -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Speichern Sie vor dem Sprachwechsel." -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Gespeichert." -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Wählen Sie einen Eintrag aus und öffnen Sie ihn mit Enter." -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Vorschläge übernommen." -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titel (Strg+T zum Bearbeiten)" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titel (Bearbeitung — Enter zum Bestätigen)" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Wird bearbeitet…" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "Esc zum Schließen" @@ -3740,37 +3747,92 @@ msgstr "Serveradresse (user@host oder user@host:port), Public-Key-Authentifizier msgid "Use the form user@host or user@host:port." msgstr "Verwenden Sie das Format user@host oder user@host:port." -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Vorschau (ctrl+e zum Bearbeiten)" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "Strg+S Speichern · Strg+P Veröffentlichen · Strg+E Vorschau · Strg+T Titel · Strg+L Sprache · Strg+G KI · Esc Zurück" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "Alle Aufgaben abgeschlossen." -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "Befehle — Esc zum Schließen" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format msgid "Unknown command." msgstr "Unbekannter Befehl." -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "[Bericht/Anwenden in der GUI]" -#: lib/bds/tui.ex:505 +#: lib/bds/tui.ex:670 #, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" -msgstr "Enter Öffnen · N Neuer Beitrag · 1-5 Ansichten · : Befehle · ? Hilfe · R Aktualisieren · Strg+Q Beenden" +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "%{diffs} Unterschiede · %{orphans} verwaiste Dateien" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "Erwartet %{expected} · Vorhanden %{existing}" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "Überzählige Dateien (werden entfernt):" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "Fehlende Seiten (werden gerendert):" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format +msgid "Nothing to apply." +msgstr "Nichts anzuwenden." + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format +msgid "Nothing to repair." +msgstr "Nichts zu reparieren." + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "Verwaiste Dateien (nicht in der Datenbank):" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "Sitemap geändert." + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "Aktualisierte Beiträge (werden neu gerendert):" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "Enter Änderungen anwenden · Esc Schließen" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "Enter Öffnen · N Neuer Beitrag · 1-5 Ansichten · : Befehle (:? Hilfe) · R Aktualisieren · Strg+Q Beenden" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" +msgstr "Enter alles aus Dateien reparieren · Esc Schließen" diff --git a/priv/gettext/en/LC_MESSAGES/ui.po b/priv/gettext/en/LC_MESSAGES/ui.po index 487a446..2ffc31d 100644 --- a/priv/gettext/en/LC_MESSAGES/ui.po +++ b/priv/gettext/en/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "" @@ -572,7 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "" @@ -590,7 +590,7 @@ msgstr "" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1030,7 +1030,7 @@ msgid "Filename" msgstr "" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "" @@ -1041,7 +1041,7 @@ msgid "Find" msgstr "" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "" @@ -1068,7 +1068,7 @@ msgid "Gallery" msgstr "" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "" @@ -1389,9 +1389,9 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1434,7 +1434,11 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1480,7 +1484,7 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "" @@ -1769,7 +1773,7 @@ msgid "Open Settings" msgstr "" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "" @@ -1917,8 +1921,8 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2042,14 +2046,14 @@ msgid "Ready to import:" msgstr "" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "" @@ -2107,7 +2111,7 @@ msgid "Refresh Translation" msgstr "" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "" @@ -2118,7 +2122,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "" @@ -2304,7 +2308,7 @@ msgstr "" #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2432,6 +2436,9 @@ msgid "Site" msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2552,7 +2559,7 @@ msgstr "" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2564,7 +2571,7 @@ msgstr "" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "" @@ -2609,7 +2616,7 @@ msgstr "" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2832,7 +2839,7 @@ msgid "Updated URLs" msgstr "" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "" @@ -2860,13 +2867,13 @@ msgid "Validate" msgstr "" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "" @@ -3531,7 +3538,7 @@ msgid "Suggested tags" msgstr "" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "" @@ -3628,82 +3635,82 @@ msgstr "" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "" -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "" -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format, fuzzy msgid "Could not load this file." msgstr "" -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "" -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "" -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "" -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "" -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "" -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format, fuzzy msgid "Published." msgstr "" -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "" -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format, fuzzy msgid "Saved." msgstr "" -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "" -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "" -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format, fuzzy msgid "Working…" msgstr "" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "" @@ -3740,37 +3747,92 @@ msgstr "" msgid "Use the form user@host or user@host:port." msgstr "" -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format, fuzzy msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "" -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format, fuzzy msgid "Unknown command." msgstr "" -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "" -#: lib/bds/tui.ex:505 -#, elixir-autogen, elixir-format, fuzzy -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +#: lib/bds/tui.ex:670 +#, elixir-autogen, elixir-format +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format, fuzzy +msgid "Nothing to apply." +msgstr "" + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format, fuzzy +msgid "Nothing to repair." +msgstr "" + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "" + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format, fuzzy +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/ui.po b/priv/gettext/es/LC_MESSAGES/ui.po index 778be1e..c21e7ad 100644 --- a/priv/gettext/es/LC_MESSAGES/ui.po +++ b/priv/gettext/es/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Configuración de IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Sugerencias de IA" @@ -572,7 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Contraer bloques de diff sin cambios" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Comando completado" @@ -590,7 +590,7 @@ msgstr "Confirmar" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1030,7 +1030,7 @@ msgid "Filename" msgstr "Nombre de archivo" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Completar traducciones faltantes" @@ -1041,7 +1041,7 @@ msgid "Find" msgstr "Buscar" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Buscar entradas duplicadas" @@ -1068,7 +1068,7 @@ msgid "Gallery" msgstr "Galeria" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Generar sitio" @@ -1389,9 +1389,9 @@ msgstr "Máximo de publicaciones por página" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1434,7 +1434,11 @@ msgstr "Metadatos" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1480,7 +1484,7 @@ msgstr "Nueva página" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nueva entrada" @@ -1769,7 +1773,7 @@ msgid "Open Settings" msgstr "Abrir Ajustes" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Abrir en el navegador" @@ -1917,8 +1921,8 @@ msgstr "Artículo guardado" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2042,14 +2046,14 @@ msgid "Ready to import:" msgstr "Listo para importar:" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Reconstruir base de datos" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Reconstruir índice de embeddings" @@ -2107,7 +2111,7 @@ msgid "Refresh Translation" msgstr "Actualizar traducción" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Regenerar calendario" @@ -2118,7 +2122,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Regenerar miniaturas faltantes" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Reindexar texto" @@ -2304,7 +2308,7 @@ msgstr "Las capacidades de scripts se configuran en la capa de aplicación en la #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2432,6 +2436,9 @@ msgid "Site" msgstr "Sitio" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2552,7 +2559,7 @@ msgstr "Nombre de la etiqueta" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2564,7 +2571,7 @@ msgstr "Etiquetas" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Tareas" @@ -2609,7 +2616,7 @@ msgstr "La sintaxis de la plantilla es válida" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2832,7 +2839,7 @@ msgid "Updated URLs" msgstr "URLs actualizadas" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Subir sitio" @@ -2860,13 +2867,13 @@ msgid "Validate" msgstr "Validar" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Validar sitio" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Validar traducciones" @@ -3531,7 +3538,7 @@ msgid "Suggested tags" msgstr "Etiquetas sugeridas" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forzar la regeneración del sitio" @@ -3628,82 +3635,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "El endpoint no devolvió ningún modelo. Aún puedes escribir el nombre de un modelo manualmente." -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "La IA no está disponible en modo avión sin un punto de conexión local." -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "No se pudo cargar este archivo." -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La edición de este elemento aún no está disponible en la interfaz de terminal." -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "No se recibieron sugerencias." -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Solo se pueden previsualizar imágenes." -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Entrada no encontrada." -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Pulsa Intro para previsualizar %{name}." -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format msgid "Published." msgstr "Publicado." -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Guarda antes de cambiar de idioma." -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Guardado." -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Selecciona una entrada y pulsa Intro para abrirla." -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Sugerencias aplicadas." -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Título (ctrl+t para editar)" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Título (edición — Intro para confirmar)" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Procesando…" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "esc para cerrar" @@ -3740,37 +3747,92 @@ msgstr "Dirección del servidor (user@host o user@host:port), autenticación de msgid "Use the form user@host or user@host:port." msgstr "Usa el formato user@host o user@host:port." -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Vista previa (ctrl+e para editar)" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s guardar · ctrl+p publicar · ctrl+e vista previa · ctrl+t título · ctrl+l idioma · ctrl+g IA · esc volver" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "Todas las tareas han terminado." -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "Comandos — esc para cerrar" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format msgid "Unknown command." msgstr "Comando desconocido." -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "[informe/aplicación en la GUI]" -#: lib/bds/tui.ex:505 +#: lib/bds/tui.ex:670 #, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" -msgstr "intro abrir · n nueva entrada · 1-5 vistas · : comandos · ? ayuda · r actualizar · ctrl+q salir" +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "%{diffs} diferencias · %{orphans} archivos huérfanos" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "Esperados %{expected} · Existentes %{existing}" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "Archivos sobrantes (se eliminarán):" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "Páginas faltantes (se generarán):" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format +msgid "Nothing to apply." +msgstr "Nada que aplicar." + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format +msgid "Nothing to repair." +msgstr "Nada que reparar." + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "Archivos huérfanos (no están en la base de datos):" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "Sitemap modificado." + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "Entradas actualizadas (se volverán a generar):" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "intro aplicar cambios · esc cerrar" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "intro abrir · n nueva entrada · 1-5 vistas · : comandos (:? ayuda) · r actualizar · ctrl+q salir" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" +msgstr "intro reparar todo desde archivos · esc cerrar" diff --git a/priv/gettext/fr/LC_MESSAGES/ui.po b/priv/gettext/fr/LC_MESSAGES/ui.po index 88a6f5b..88f1dcf 100644 --- a/priv/gettext/fr/LC_MESSAGES/ui.po +++ b/priv/gettext/fr/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Paramètres IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Suggestions IA" @@ -572,7 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Réduire les blocs de diff inchangés" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Commande terminée" @@ -590,7 +590,7 @@ msgstr "Confirmer" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1030,7 +1030,7 @@ msgid "Filename" msgstr "Nom de fichier" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Compléter les traductions manquantes" @@ -1041,7 +1041,7 @@ msgid "Find" msgstr "Rechercher" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Trouver les doublons" @@ -1068,7 +1068,7 @@ msgid "Gallery" msgstr "Galerie" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Générer le site" @@ -1389,9 +1389,9 @@ msgstr "Nombre maximal d’articles par page" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1434,7 +1434,11 @@ msgstr "Métadonnées" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1480,7 +1484,7 @@ msgstr "Nouvelle page" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nouvel article" @@ -1769,7 +1773,7 @@ msgid "Open Settings" msgstr "Ouvrir les Réglages" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Ouvrir dans le navigateur" @@ -1917,8 +1921,8 @@ msgstr "Article enregistré" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2042,14 +2046,14 @@ msgid "Ready to import:" msgstr "Prêt à importer :" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Reconstruire la base de données" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Reconstruire l’index d’embeddings" @@ -2107,7 +2111,7 @@ msgid "Refresh Translation" msgstr "Actualiser la traduction" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Régénérer le calendrier" @@ -2118,7 +2122,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Régénérer les vignettes manquantes" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Réindexer le texte" @@ -2304,7 +2308,7 @@ msgstr "Les capacités de script sont configurées au niveau de l’application #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2432,6 +2436,9 @@ msgid "Site" msgstr "Site" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2552,7 +2559,7 @@ msgstr "Nom du mot-clé" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2564,7 +2571,7 @@ msgstr "Tags" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Tâches" @@ -2609,7 +2616,7 @@ msgstr "La syntaxe du template est valide" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2832,7 +2839,7 @@ msgid "Updated URLs" msgstr "URLs mises à jour" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Téléverser le site" @@ -2860,13 +2867,13 @@ msgid "Validate" msgstr "Valider" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Valider le site" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Valider les traductions" @@ -3531,7 +3538,7 @@ msgid "Suggested tags" msgstr "Tags suggérés" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forcer la régénération du site" @@ -3628,82 +3635,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "Le point de terminaison n'a renvoyé aucun modèle. Vous pouvez toujours saisir un nom de modèle manuellement." -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "L'IA n'est pas disponible en mode avion sans point de terminaison local." -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Impossible de charger ce fichier." -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La modification de cet élément n'est pas encore disponible dans l'interface du terminal." -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Aucune suggestion reçue." -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Seules les images peuvent être prévisualisées." -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Article introuvable." -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Appuyez sur Entrée pour prévisualiser %{name}." -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format msgid "Published." msgstr "Publié." -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Enregistrez avant de changer de langue." -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Enregistré." -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Sélectionnez une entrée et appuyez sur Entrée pour l'ouvrir." -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Suggestions appliquées." -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titre (ctrl+t pour modifier)" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titre (édition — Entrée pour confirmer)" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Traitement en cours…" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "échap pour fermer" @@ -3740,37 +3747,92 @@ msgstr "Adresse du serveur (user@host ou user@host:port), authentification par c msgid "Use the form user@host or user@host:port." msgstr "Utilisez le format user@host ou user@host:port." -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Aperçu (ctrl+e pour modifier)" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s enregistrer · ctrl+p publier · ctrl+e aperçu · ctrl+t titre · ctrl+l langue · ctrl+g IA · échap retour" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "Toutes les tâches sont terminées." -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "Commandes — échap pour fermer" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format msgid "Unknown command." msgstr "Commande inconnue." -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "[rapport/application dans la GUI]" -#: lib/bds/tui.ex:505 +#: lib/bds/tui.ex:670 #, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" -msgstr "entrée ouvrir · n nouvel article · 1-5 vues · : commandes · ? aide · r actualiser · ctrl+q quitter" +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "%{diffs} différences · %{orphans} fichiers orphelins" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "Attendu %{expected} · Existant %{existing}" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "Fichiers en trop (seront supprimés) :" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "Pages manquantes (seront rendues) :" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format +msgid "Nothing to apply." +msgstr "Rien à appliquer." + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format +msgid "Nothing to repair." +msgstr "Rien à réparer." + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "Fichiers orphelins (absents de la base de données) :" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "Sitemap modifié." + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "Articles mis à jour (seront rendus à nouveau) :" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "entrée appliquer les modifications · échap fermer" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "entrée ouvrir · n nouvel article · 1-5 vues · : commandes (:? aide) · r actualiser · ctrl+q quitter" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" +msgstr "entrée tout réparer depuis les fichiers · échap fermer" diff --git a/priv/gettext/it/LC_MESSAGES/ui.po b/priv/gettext/it/LC_MESSAGES/ui.po index 2917539..f9eac8d 100644 --- a/priv/gettext/it/LC_MESSAGES/ui.po +++ b/priv/gettext/it/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Impostazioni IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Suggerimenti IA" @@ -572,7 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Comprimi i blocchi diff invariati" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Comando completato" @@ -590,7 +590,7 @@ msgstr "Conferma" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1030,7 +1030,7 @@ msgid "Filename" msgstr "Nome file" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Completa traduzioni mancanti" @@ -1041,7 +1041,7 @@ msgid "Find" msgstr "Trova" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Trova post duplicati" @@ -1068,7 +1068,7 @@ msgid "Gallery" msgstr "Galleria" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Genera sito" @@ -1389,9 +1389,9 @@ msgstr "Numero massimo di post per pagina" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1434,7 +1434,11 @@ msgstr "Metadati" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1480,7 +1484,7 @@ msgstr "Nuova pagina" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nuovo post" @@ -1769,7 +1773,7 @@ msgid "Open Settings" msgstr "Apri Impostazioni" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Apri nel browser" @@ -1917,8 +1921,8 @@ msgstr "Articolo salvato" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2042,14 +2046,14 @@ msgid "Ready to import:" msgstr "Pronto per importare:" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Ricostruisci database" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Ricostruisci indice embeddings" @@ -2107,7 +2111,7 @@ msgid "Refresh Translation" msgstr "Aggiorna traduzione" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Rigenera calendario" @@ -2118,7 +2122,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Rigenera miniature mancanti" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Reindicizza testo" @@ -2304,7 +2308,7 @@ msgstr "Le capacità di scripting sono configurate a livello applicativo nella r #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2432,6 +2436,9 @@ msgid "Site" msgstr "Sito" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2552,7 +2559,7 @@ msgstr "Nome del tag" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2564,7 +2571,7 @@ msgstr "Tag" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Attività" @@ -2609,7 +2616,7 @@ msgstr "La sintassi del template è valida" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2832,7 +2839,7 @@ msgid "Updated URLs" msgstr "URL aggiornati" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Carica sito" @@ -2860,13 +2867,13 @@ msgid "Validate" msgstr "Valida" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Valida sito" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Valida traduzioni" @@ -3531,7 +3538,7 @@ msgid "Suggested tags" msgstr "Tag suggeriti" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forza la rigenerazione del sito" @@ -3628,82 +3635,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "L'endpoint non ha restituito alcun modello. Puoi comunque digitare manualmente il nome di un modello." -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "L'IA non è disponibile in modalità aereo senza un endpoint locale." -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Impossibile caricare questo file." -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La modifica di questo elemento non è ancora disponibile nell'interfaccia del terminale." -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Nessun suggerimento ricevuto." -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Solo le immagini possono essere visualizzate in anteprima." -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Post non trovato." -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Premi Invio per l'anteprima di %{name}." -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format msgid "Published." msgstr "Pubblicato." -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Salva prima di cambiare lingua." -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Salvato." -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Seleziona una voce e premi Invio per aprirla." -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Suggerimenti applicati." -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titolo (ctrl+t per modificare)" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titolo (modifica — Invio per confermare)" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Elaborazione…" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "esc per chiudere" @@ -3740,37 +3747,92 @@ msgstr "Indirizzo del server (user@host o user@host:port), autenticazione a chia msgid "Use the form user@host or user@host:port." msgstr "Usa il formato user@host o user@host:port." -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Anteprima (ctrl+e per modificare)" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s salva · ctrl+p pubblica · ctrl+e anteprima · ctrl+t titolo · ctrl+l lingua · ctrl+g IA · esc indietro" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "Tutte le attività sono terminate." -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "Comandi — esc per chiudere" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format msgid "Unknown command." msgstr "Comando sconosciuto." -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "[report/applicazione nella GUI]" -#: lib/bds/tui.ex:505 +#: lib/bds/tui.ex:670 #, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" -msgstr "invio apri · n nuovo post · 1-5 viste · : comandi · ? aiuto · r aggiorna · ctrl+q esci" +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "%{diffs} differenze · %{orphans} file orfani" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "Attesi %{expected} · Esistenti %{existing}" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "File in eccesso (verranno rimossi):" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "Pagine mancanti (verranno generate):" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format +msgid "Nothing to apply." +msgstr "Niente da applicare." + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format +msgid "Nothing to repair." +msgstr "Niente da riparare." + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "File orfani (non presenti nel database):" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "Sitemap modificata." + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "Post aggiornati (verranno rigenerati):" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "invio applica le modifiche · esc chiudi" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "invio apri · n nuovo post · 1-5 viste · : comandi (:? aiuto) · r aggiorna · ctrl+q esci" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" +msgstr "invio ripara tutto dai file · esc chiudi" diff --git a/priv/gettext/ui.pot b/priv/gettext/ui.pot index 30ada55..c27983e 100644 --- a/priv/gettext/ui.pot +++ b/priv/gettext/ui.pot @@ -94,11 +94,11 @@ msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:285 -#: lib/bds/tui.ex:288 -#: lib/bds/tui.ex:291 -#: lib/bds/tui.ex:299 -#: lib/bds/tui.ex:686 +#: lib/bds/tui.ex:373 +#: lib/bds/tui.ex:376 +#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:387 +#: lib/bds/tui.ex:922 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "" @@ -585,7 +585,7 @@ msgid "Collapse unchanged diff hunks" msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 -#: lib/bds/tui.ex:779 +#: lib/bds/tui.ex:1017 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "" @@ -603,7 +603,7 @@ msgstr "" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:424 +#: lib/bds/tui.ex:550 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1043,7 +1043,7 @@ msgid "Filename" msgstr "" #: lib/bds/desktop/menu_bar.ex:254 -#: lib/bds/tui.ex:745 +#: lib/bds/tui.ex:981 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "" @@ -1054,7 +1054,7 @@ msgid "Find" msgstr "" #: lib/bds/desktop/menu_bar.ex:255 -#: lib/bds/tui.ex:748 +#: lib/bds/tui.ex:984 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "" @@ -1081,7 +1081,7 @@ msgid "Gallery" msgstr "" #: lib/bds/desktop/menu_bar.ex:256 -#: lib/bds/tui.ex:729 +#: lib/bds/tui.ex:965 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "" @@ -1402,9 +1402,9 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:600 -#: lib/bds/tui.ex:808 -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:836 +#: lib/bds/tui.ex:1046 +#: lib/bds/tui.ex:1049 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1447,7 +1447,11 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 -#: lib/bds/tui.ex:726 +#: lib/bds/tui.ex:193 +#: lib/bds/tui.ex:199 +#: lib/bds/tui.ex:210 +#: lib/bds/tui.ex:654 +#: lib/bds/tui.ex:962 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1493,7 +1497,7 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:130 +#: lib/bds/tui.ex:150 #, elixir-autogen, elixir-format msgid "New Post" msgstr "" @@ -1782,7 +1786,7 @@ msgid "Open Settings" msgstr "" #: lib/bds/desktop/menu_bar.ex:217 -#: lib/bds/tui.ex:750 +#: lib/bds/tui.ex:986 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "" @@ -1930,8 +1934,8 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:599 -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:835 +#: lib/bds/tui.ex:846 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2055,14 +2059,14 @@ msgid "Ready to import:" msgstr "" #: lib/bds/desktop/menu_bar.ex:248 -#: lib/bds/tui.ex:730 +#: lib/bds/tui.ex:966 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 -#: lib/bds/tui.ex:734 +#: lib/bds/tui.ex:970 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "" @@ -2120,7 +2124,7 @@ msgid "Refresh Translation" msgstr "" #: lib/bds/desktop/menu_bar.ex:252 -#: lib/bds/tui.ex:737 +#: lib/bds/tui.ex:973 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "" @@ -2131,7 +2135,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "" #: lib/bds/desktop/menu_bar.ex:249 -#: lib/bds/tui.ex:731 +#: lib/bds/tui.ex:967 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "" @@ -2317,7 +2321,7 @@ msgstr "" #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:602 +#: lib/bds/tui.ex:838 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2445,6 +2449,9 @@ msgid "Site" msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:412 +#: lib/bds/tui.ex:226 +#: lib/bds/tui.ex:228 +#: lib/bds/tui.ex:659 #: lib/bds/ui/registry.ex:125 #, elixir-autogen, elixir-format msgid "Site Validation" @@ -2565,7 +2572,7 @@ msgstr "" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:603 +#: lib/bds/tui.ex:839 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2577,7 +2584,7 @@ msgstr "" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "" @@ -2622,7 +2629,7 @@ msgstr "" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:601 +#: lib/bds/tui.ex:837 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2845,7 +2852,7 @@ msgid "Updated URLs" msgstr "" #: lib/bds/desktop/menu_bar.ex:259 -#: lib/bds/tui.ex:749 +#: lib/bds/tui.ex:985 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "" @@ -2873,13 +2880,13 @@ msgid "Validate" msgstr "" #: lib/bds/desktop/menu_bar.ex:258 -#: lib/bds/tui.ex:727 +#: lib/bds/tui.ex:963 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "" #: lib/bds/desktop/menu_bar.ex:253 -#: lib/bds/tui.ex:740 +#: lib/bds/tui.ex:976 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "" @@ -3544,7 +3551,7 @@ msgid "Suggested tags" msgstr "" #: lib/bds/desktop/menu_bar.ex:257 -#: lib/bds/tui.ex:728 +#: lib/bds/tui.ex:964 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "" @@ -3641,82 +3648,82 @@ msgstr "" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "" -#: lib/bds/tui.ex:687 +#: lib/bds/tui.ex:923 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "" -#: lib/bds/tui.ex:811 +#: lib/bds/tui.ex:1049 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "" -#: lib/bds/tui.ex:138 +#: lib/bds/tui.ex:158 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "" -#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:376 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "" -#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:1046 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "" -#: lib/bds/tui.ex:610 +#: lib/bds/tui.ex:846 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "" -#: lib/bds/tui.ex:379 +#: lib/bds/tui.ex:505 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "" -#: lib/bds/tui.ex:657 +#: lib/bds/tui.ex:893 #, elixir-autogen, elixir-format msgid "Published." msgstr "" -#: lib/bds/tui.ex:673 +#: lib/bds/tui.ex:909 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "" -#: lib/bds/tui.ex:658 +#: lib/bds/tui.ex:894 #, elixir-autogen, elixir-format msgid "Saved." msgstr "" -#: lib/bds/tui.ex:382 +#: lib/bds/tui.ex:508 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "" -#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:373 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "" -#: lib/bds/tui.ex:394 +#: lib/bds/tui.ex:520 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "" -#: lib/bds/tui.ex:393 +#: lib/bds/tui.ex:519 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "" -#: lib/bds/tui.ex:441 +#: lib/bds/tui.ex:567 #, elixir-autogen, elixir-format msgid "Working…" msgstr "" -#: lib/bds/tui.ex:462 +#: lib/bds/tui.ex:589 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "" @@ -3753,37 +3760,92 @@ msgstr "" msgid "Use the form user@host or user@host:port." msgstr "" -#: lib/bds/tui.ex:413 +#: lib/bds/tui.ex:539 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "" -#: lib/bds/tui.ex:512 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "" -#: lib/bds/tui.ex:312 +#: lib/bds/tui.ex:403 #, elixir-autogen, elixir-format msgid "All tasks finished." msgstr "" -#: lib/bds/tui.ex:488 +#: lib/bds/tui.ex:615 #, elixir-autogen, elixir-format msgid "Commands — esc to close" msgstr "" -#: lib/bds/tui.ex:159 +#: lib/bds/tui.ex:247 #, elixir-autogen, elixir-format msgid "Unknown command." msgstr "" -#: lib/bds/tui.ex:478 +#: lib/bds/tui.ex:605 #, elixir-autogen, elixir-format msgid "[report/apply in GUI]" msgstr "" -#: lib/bds/tui.ex:505 +#: lib/bds/tui.ex:670 #, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgid "%{diffs} differences · %{orphans} orphan files" +msgstr "" + +#: lib/bds/tui.ex:702 +#, elixir-autogen, elixir-format +msgid "Expected %{expected} · Existing %{existing}" +msgstr "" + +#: lib/bds/tui.ex:719 +#, elixir-autogen, elixir-format +msgid "Extra files (will be removed):" +msgstr "" + +#: lib/bds/tui.ex:715 +#, elixir-autogen, elixir-format +msgid "Missing pages (will be rendered):" +msgstr "" + +#: lib/bds/tui.ex:226 +#, elixir-autogen, elixir-format +msgid "Nothing to apply." +msgstr "" + +#: lib/bds/tui.ex:193 +#, elixir-autogen, elixir-format +msgid "Nothing to repair." +msgstr "" + +#: lib/bds/tui.ex:693 +#, elixir-autogen, elixir-format +msgid "Orphan files (not in database):" +msgstr "" + +#: lib/bds/tui.ex:709 +#, elixir-autogen, elixir-format +msgid "Sitemap changed." +msgstr "" + +#: lib/bds/tui.ex:723 +#, elixir-autogen, elixir-format +msgid "Updated posts (will be re-rendered):" +msgstr "" + +#: lib/bds/tui.ex:660 +#, elixir-autogen, elixir-format +msgid "enter apply changes · esc close" +msgstr "" + +#: lib/bds/tui.ex:741 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands (:? help) · r refresh · ctrl+q quit" +msgstr "" + +#: lib/bds/tui.ex:655 +#, elixir-autogen, elixir-format +msgid "enter repair all from files · esc close" msgstr "" diff --git a/specs/tui.allium b/specs/tui.allium index d7c4561..a6a7d64 100644 --- a/specs/tui.allium +++ b/specs/tui.allium @@ -20,6 +20,7 @@ surface TuiSurface { TuiKeyPressed(code, modifiers) TuiEventReceived(entity, entity_id, action) TuiSettingsChanged(key) + ShellTaskCompleted(route) } rule SidebarNavigation { @@ -63,18 +64,32 @@ rule AiQuickAction { } rule CommandPrompt { - when: TuiKeyPressed(code: ":" | "?") + when: TuiKeyPressed(code: ":") -- Vi-style prompt: ":" opens a filterable list of the parameterless -- Blog-menu shell commands (metadata diff, validate site, force -- render, rebuilds, reindex, translations, duplicates, upload, -- browser preview URL) and runs the selection through the same - -- BDS.Desktop.ShellCommands backend as the GUI menu; "?" (or ":?") - -- shows the same list as help. Commands whose report/apply follow-up - -- UI exists only in the GUI are marked so the user knows. Queued - -- tasks report progress in the status line until all tasks finish. + -- BDS.Desktop.ShellCommands backend as the GUI menu; typing ":?" + -- shows the full list as help. Overlays clear the cells beneath + -- them. Commands whose follow-up UI is GUI-only (validate + -- translations, find duplicates) are marked. Queued tasks report + -- progress in the status line until all tasks finish. ensures: CommandListShownOrExecuted() } +rule ReportPanels { + when: ShellTaskCompleted(route: "metadata_diff" | "site_validation") + -- Completed metadata diff and site validation tasks open a + -- scrollable report panel showing the differences. Enter applies + -- the whole report — metadata diff repairs all items from the + -- filesystem (file → db) and imports orphan files; site validation + -- applies the full report incrementally (render missing, remove + -- extra, re-render updated), matching the GUI defaults. Esc closes + -- the report without applying. Reports completed before this + -- session started never pop up. + ensures: ReportShownThenAppliedOrCancelled() +} + rule MultiClientSync { when: TuiEventReceived(entity, entity_id, action) -- Domain events refresh the sidebar; a post deleted elsewhere closes diff --git a/test/bds/tui_test.exs b/test/bds/tui_test.exs index 28acfaf..b24cf7b 100644 --- a/test/bds/tui_test.exs +++ b/test/bds/tui_test.exs @@ -169,8 +169,8 @@ defmodule BDS.TUITest do parent = self() mount!( - command_executor: fn action -> - send(parent, {:executed, action}) + command_executor: fn action, params -> + send(parent, {:executed, action, params}) {:ok, %{kind: "output", title: "T", message: "done"}} end ) @@ -185,9 +185,19 @@ defmodule BDS.TUITest do assert text =~ "validate_site" end - test "'?' opens the command help list with GUI markers" do - state = mount_with_executor!() |> press("?") + test "the palette clears the background underneath" do + state = mount_with_executor!() + assert screen_text(state) =~ "Select an entry" + state = press(state, ":") + refute screen_text(state) =~ "Select an entry" + end + + test "'?' alone does nothing; ':?' opens the command help with GUI markers" do + state = mount_with_executor!() |> press("?") + assert state.command == nil + + state = state |> press(":") |> press("?") assert state.command.help? text = screen_text(state) assert text =~ "metadata_diff" @@ -208,7 +218,7 @@ defmodule BDS.TUITest do |> press("a") |> press("enter") - assert_receive {:executed, "metadata_diff"} + assert_receive {:executed, "metadata_diff", %{}} assert state.command == nil assert state.status =~ "done" end @@ -216,7 +226,7 @@ defmodule BDS.TUITest do test "up/down move the selection" do state = mount_with_executor!() |> press(":") |> press("down") |> press("enter") - assert_receive {:executed, action} + assert_receive {:executed, action, %{}} assert is_binary(action) end @@ -228,7 +238,7 @@ defmodule BDS.TUITest do |> press("z") |> press("enter") - refute_receive {:executed, _action}, 50 + refute_receive {:executed, _action, _params}, 50 assert state.command == nil assert state.status != nil end @@ -238,7 +248,7 @@ defmodule BDS.TUITest do state = mount!( - command_executor: fn action -> + command_executor: fn action, _params -> send(parent, {:executed, action}) {:ok, %{kind: "task_queued", title: "Rebuild", message: "queued"}} end @@ -256,6 +266,147 @@ defmodule BDS.TUITest do end end + describe "report panels" do + defp diff_snapshot do + %{ + running_task_message: nil, + tasks: [ + %{ + id: "task-diff", + status: :completed, + result: %{ + kind: "open_editor", + route: "metadata_diff", + title: "Metadata Diff", + payload: %{ + summary: %{diff_count: 1, orphan_count: 1}, + diff_reports: [ + %{ + "entity_type" => "post", + "entity_id" => "p1", + "differences" => [ + %{"name" => "title", "db_value" => "Old", "file_value" => "New"} + ] + } + ], + orphan_reports: [%{"file_path" => "posts/2026/07/lost.md"}] + } + } + } + ] + } + end + + defp validation_snapshot do + %{ + running_task_message: nil, + tasks: [ + %{ + id: "task-validate", + status: :completed, + result: %{ + kind: "open_editor", + route: "site_validation", + title: "Site Validation", + payload: %{ + sitemap_path: "sitemap.xml", + sitemap_changed: true, + summary: %{ + expected_count: 10, + existing_count: 8, + missing_count: 2, + extra_count: 1, + updated_count: 1 + }, + missing_url_paths: ["/2026/07/a/", "/2026/07/b/"], + extra_url_paths: ["/stale/"], + updated_post_url_paths: ["/2026/07/c/"], + expected_url_count: 10, + existing_html_url_count: 8 + } + } + } + ] + } + end + + defp mount_for_report!(snapshot) do + parent = self() + + state = + mount!( + command_executor: fn action, params -> + send(parent, {:executed, action, params}) + {:ok, %{kind: "task_queued", title: "T", message: "queued"}} + end, + task_snapshot_fun: fn -> snapshot end, + # Pre-existing completed tasks must not pop up reports, so the + # tests hand the snapshot in only after mount via this switch. + initial_task_snapshot: %{running_task_message: nil, tasks: []} + ) + + {:noreply, state} = BDS.TUI.handle_info(:poll_tasks, %{state | task_polling: true}) + state + end + + test "a completed metadata diff task opens the report panel" do + state = mount_for_report!(diff_snapshot()) + + assert state.report.route == "metadata_diff" + text = screen_text(state) + assert text =~ "post p1" + assert text =~ "title" + assert text =~ "lost.md" + end + + test "esc closes the report without applying" do + state = mount_for_report!(diff_snapshot()) |> press("esc") + + assert state.report == nil + refute_receive {:executed, _action, _params}, 50 + end + + test "enter repairs all metadata diffs from files and imports orphans" do + state = mount_for_report!(diff_snapshot()) |> press("enter") + + assert state.report == nil + + assert_receive {:executed, "repair_metadata_diff", %{items: items, direction: "file_to_db"}} + assert [%{"entity_type" => "post", "entity_id" => "p1"} | _] = items + + assert_receive {:executed, "import_metadata_diff_orphans", %{orphans: orphans}} + assert [%{"file_path" => "posts/2026/07/lost.md"}] = orphans + end + + test "a completed site validation task opens the report and enter applies it" do + state = mount_for_report!(validation_snapshot()) + + assert state.report.route == "site_validation" + text = screen_text(state) + assert text =~ "/2026/07/a/" + assert text =~ "/stale/" + + state = press(state, "enter") + assert state.report == nil + + assert_receive {:executed, "apply_site_validation", %{report: report}} + assert report.missing_url_paths == ["/2026/07/a/", "/2026/07/b/"] + end + + test "completed tasks from before mount never open a report" do + parent = self() + + state = + mount!( + command_executor: fn action, params -> send(parent, {:executed, action, params}) end, + task_snapshot_fun: fn -> diff_snapshot() end + ) + + {:noreply, state} = BDS.TUI.handle_info(:poll_tasks, %{state | task_polling: true}) + assert state.report == nil + end + end + test "local tui mode stops the VM when the app exits" do parent = self() state = mount!(stop_vm_on_exit: true, stop_fun: fn -> send(parent, :vm_stopped) end)