feat: vi-style command prompt in the TUI for menu shell commands (issue #26)

This commit is contained in:
2026-07-15 19:54:30 +02:00
parent 01b90e00a0
commit 824313f106
10 changed files with 739 additions and 232 deletions

View File

@@ -194,7 +194,9 @@ appears in every open shell.
### TUI keys
`↑/↓` or `j/k` navigate · `enter` open · `n` new post · `1-5` switch view
(posts/media/templates/scripts/tags) · `r` refresh · in the editor:
(posts/media/templates/scripts/tags) · `:` command prompt (metadata
diff, validate site, force render, rebuilds, …) · `?` command help ·
`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
(airplane-mode gated), `esc` back · `ctrl+q` quit.

View File

@@ -10,7 +10,9 @@ defmodule BDS.TUI do
## Keys
Sidebar focus: `↑/↓`/`j/k` navigate, `enter` open, `n` new post,
`1..5` switch view (posts/media/templates/scripts/tags), `r` refresh.
`1..5` switch view (posts/media/templates/scripts/tags), `r` refresh,
`:` vi-style command prompt over the Blog-menu shell commands, `?`
command help (commands whose report/apply UI is GUI-only are marked).
Editor focus: text keys edit, `ctrl+s` save, `ctrl+p` publish,
`ctrl+e` word-wrapped preview, `ctrl+t` edit title, `ctrl+l` cycle
language, `ctrl+g` AI suggestions, `esc` back to sidebar. `ctrl+q`
@@ -49,6 +51,10 @@ defmodule BDS.TUI do
# shuts the VM down instead of leaving a headless server behind.
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),
command: nil,
task_polling: false,
project_id: project_id,
view: "posts",
sidebar: nil,
@@ -79,6 +85,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, %{command: command} = state)
when command != nil,
do: command_key(key, state)
def handle_event(%ExRatatui.Event.Key{code: "esc"}, %{image: image} = state)
when image != nil,
do: {:noreply, %{state | image: nil}}
@@ -106,6 +116,12 @@ defmodule BDS.TUI do
defp sidebar_key(%{code: "r"}, state), do: {:noreply, load_sidebar(state)}
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
@@ -131,6 +147,52 @@ defmodule BDS.TUI do
defp sidebar_key(_key, state), do: {:noreply, state}
# ── Events: command prompt (vi-style) ────────────────────────────────────
defp command_key(%{code: "esc"}, state), do: {:noreply, %{state | command: nil}}
defp command_key(_key, %{command: %{help?: true}} = state),
do: {:noreply, %{state | command: nil}}
defp command_key(%{code: "enter"}, %{command: command} = state) do
case Enum.at(filtered_commands(command.input), command.selected) do
nil ->
{:noreply,
toast(%{state | command: nil}, ":" <> command.input, dgettext("ui", "Unknown command."))}
entry ->
{:noreply, run_command(%{state | command: nil}, entry)}
end
end
defp command_key(%{code: "down"}, %{command: command} = state) do
count = length(filtered_commands(command.input))
{:noreply, put_in(state.command.selected, min(command.selected + 1, max(count - 1, 0)))}
end
defp command_key(%{code: "up"}, %{command: command} = state),
do: {:noreply, put_in(state.command.selected, max(command.selected - 1, 0))}
defp command_key(%{code: "backspace"}, %{command: command} = state) do
{:noreply,
%{state | command: %{command | input: String.slice(command.input, 0..-2//1), selected: 0}}}
end
# `:?` — the vi way to reach help from the prompt.
defp command_key(%{code: "?"}, %{command: %{input: ""}} = state),
do: {:noreply, put_in(state.command.help?, true)}
defp command_key(%{code: code, modifiers: []}, %{command: command} = state)
when byte_size(code) >= 1 do
if String.length(code) == 1 do
{:noreply, %{state | command: %{command | input: command.input <> code, selected: 0}}}
else
{:noreply, state}
end
end
defp command_key(_key, state), do: {:noreply, state}
# ── Events: editor focus ─────────────────────────────────────────────────
defp editor_key(%{code: "esc"}, %{editor: %{editing_title?: true}} = state),
@@ -239,6 +301,20 @@ defmodule BDS.TUI do
{:noreply, toast(%{state | busy: false}, dgettext("ui", "AI Suggestions"), inspect(reason))}
end
def handle_info(:poll_tasks, %{task_polling: true} = state) do
case BDS.Tasks.status_snapshot() do
%{running_task_message: message} when is_binary(message) and message != "" ->
Process.send_after(self(), :poll_tasks, 1_000)
{:noreply, %{state | status: message}}
_idle ->
{:noreply,
%{state | task_polling: false}
|> load_sidebar()
|> toast(dgettext("ui", "Tasks"), dgettext("ui", "All tasks finished."))}
end
end
def handle_info(_message, state), do: {:noreply, state}
# ── Render ───────────────────────────────────────────────────────────────
@@ -261,7 +337,8 @@ defmodule BDS.TUI do
sidebar_widgets(state, sidebar_rect) ++
main_widgets(state, main_rect) ++
status_widgets(state, status_rect) ++
image_widgets(state, body_rect)
image_widgets(state, body_rect) ++
command_widgets(state, body_rect)
end
defp view_tabs(state, rect) do
@@ -390,11 +467,46 @@ defmodule BDS.TUI do
]
end
defp command_widgets(%{command: nil}, _rect), do: []
defp command_widgets(%{command: command}, rect) do
overlay = %Rect{
x: rect.x + 4,
y: rect.y + 1,
width: max(rect.width - 8, 20),
height: max(rect.height - 2, 6)
}
gui_marker = dgettext("ui", "[report/apply in GUI]")
items =
Enum.map(filtered_commands(command.input), fn entry ->
marker = if entry.gui, do: " " <> gui_marker, else: ""
"#{entry.action}#{entry.label}#{marker}"
end)
title =
if command.help? do
dgettext("ui", "Commands — esc to close")
else
":" <> command.input
end
[
{%List{
items: items,
selected: if(command.help?, do: nil, else: command.selected),
highlight_style: %Style{fg: :black, bg: :cyan},
block: %Block{title: title, borders: [:all]}
}, overlay}
]
end
defp default_status(%{focus: :sidebar}),
do:
dgettext(
"ui",
"enter open · n new post · 1-5 views · 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}),
@@ -605,6 +717,84 @@ defmodule BDS.TUI do
defp editor_title(editor),
do: Metadata.display_title(editor.title, editor.post.slug, editor.post.id)
# ── Shell commands (main-menu functionality) ─────────────────────────────
# 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.
defp commands do
[
%{action: "metadata_diff", label: dgettext("ui", "Metadata Diff"), gui: true},
%{action: "validate_site", label: dgettext("ui", "Validate Site"), gui: true},
%{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},
%{action: "reindex_text", label: dgettext("ui", "Reindex Text"), gui: false},
%{
action: "rebuild_embedding_index",
label: dgettext("ui", "Rebuild Embedding Index"),
gui: false
},
%{action: "regenerate_calendar", label: dgettext("ui", "Regenerate Calendar"), gui: false},
%{
action: "validate_translations",
label: dgettext("ui", "Validate Translations"),
gui: true
},
%{
action: "fill_missing_translations",
label: dgettext("ui", "Fill Missing Translations"),
gui: false
},
%{action: "find_duplicates", label: dgettext("ui", "Find Duplicate Posts"), gui: true},
%{action: "upload_site", label: dgettext("ui", "Upload Site"), gui: false},
%{action: "open_in_browser", label: dgettext("ui", "Open in Browser"), gui: false}
]
end
defp filtered_commands(""), do: commands()
defp filtered_commands(input) do
needle = String.downcase(input)
Enum.filter(commands(), fn entry ->
String.contains?(entry.action, needle) or String.contains?(String.downcase(entry.label), needle)
end)
end
defp run_command(state, entry) do
case state.command_executor.(entry.action) do
{:ok, %{kind: "task_queued", title: title, message: message}} ->
state
|> toast(title, message)
|> start_task_polling()
{:ok, %{kind: "open_url", title: title, url: url}} ->
toast(state, title, url)
{:ok, %{kind: kind, title: title, message: message}}
when kind in ["output", "open_editor"] ->
toast(state, title, message)
{:ok, _other} ->
toast(state, entry.label, dgettext("ui", "Command completed"))
{:error, %{message: message}} ->
toast(state, entry.label, message)
{:error, reason} ->
toast(state, entry.label, inspect(reason))
end
end
defp start_task_polling(%{task_polling: true} = state), do: state
defp start_task_polling(state) do
Process.send_after(self(), :poll_tasks, 1_000)
%{state | task_polling: true}
end
# ── Media preview ────────────────────────────────────────────────────────
defp open_media(state, media_id) do

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr "KI-Vorschlaege"
@@ -572,6 +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
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr "Befehl abgeschlossen"
@@ -589,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1029,6 +1030,7 @@ msgid "Filename"
msgstr "Dateiname"
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr "Fehlende Übersetzungen ergänzen"
@@ -1039,6 +1041,7 @@ msgid "Find"
msgstr "Suchen"
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr "Doppelte Beiträge finden"
@@ -1065,6 +1068,7 @@ msgid "Gallery"
msgstr "Galerie"
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr "Website generieren"
@@ -1385,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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1430,6 +1434,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1475,7 +1480,7 @@ msgstr "Neue Seite"
#: lib/bds/desktop/menu_bar.ex:214
#: lib/bds/desktop/shell_live/sidebar_create.ex:41
#: lib/bds/tui.ex:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr "Neuer Beitrag"
@@ -1764,6 +1769,7 @@ msgid "Open Settings"
msgstr "Einstellungen öffnen"
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr "Im Browser öffnen"
@@ -1911,8 +1917,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2036,12 +2042,14 @@ msgid "Ready to import:"
msgstr "Bereit zum Import:"
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr "Embedding-Index neu aufbauen"
@@ -2099,6 +2107,7 @@ msgid "Refresh Translation"
msgstr "Übersetzung aktualisieren"
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr "Kalender neu erzeugen"
@@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails"
msgstr "Fehlende Vorschaubilder neu erzeugen"
#: lib/bds/desktop/menu_bar.ex:249
#: lib/bds/tui.ex:731
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr "Text neu indizieren"
@@ -2294,7 +2304,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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2542,7 +2552,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2554,6 +2564,7 @@ msgstr "Tags"
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr "Aufgaben"
@@ -2598,7 +2609,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2821,6 +2832,7 @@ msgid "Updated URLs"
msgstr "Aktualisierte URLs"
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr "Website hochladen"
@@ -2848,11 +2860,13 @@ msgid "Validate"
msgstr "Validieren"
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr "Website validieren"
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr "Übersetzungen validieren"
@@ -3517,6 +3531,7 @@ msgid "Suggested tags"
msgstr "Vorgeschlagene Tags"
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr "Website vollständig neu generieren"
@@ -3613,87 +3628,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:576
#: lib/bds/tui.ex:687
#, 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:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format
msgid "Could not load this file."
msgstr "Diese Datei konnte nicht geladen werden."
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, 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:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr "Keine Vorschläge erhalten."
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr "Nur Bilder können in der Vorschau angezeigt werden."
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr "Beitrag nicht gefunden."
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, 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:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format
msgid "Published."
msgstr "Veröffentlicht."
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr "Speichern Sie vor dem Sprachwechsel."
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format
msgid "Saved."
msgstr "Gespeichert."
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, 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:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr "Vorschläge übernommen."
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr "Titel (Strg+T zum Bearbeiten)"
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr "Titel (Bearbeitung — Enter zum Bestätigen)"
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format
msgid "Working…"
msgstr "Wird bearbeitet…"
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr "Enter Öffnen · N Neuer Beitrag · 1-5 Ansichten · R Aktualisieren · Strg+Q Beenden"
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr "Esc zum Schließen"
@@ -3730,12 +3740,37 @@ 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:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr "Vorschau (ctrl+e zum Bearbeiten)"
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr "Alle Aufgaben abgeschlossen."
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr "Befehle — Esc zum Schließen"
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format
msgid "Unknown command."
msgstr "Unbekannter Befehl."
#: lib/bds/tui.ex:478
#, elixir-autogen, elixir-format
msgid "[report/apply in GUI]"
msgstr "[Bericht/Anwenden in der GUI]"
#: lib/bds/tui.ex:505
#, 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"

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr ""
@@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks"
msgstr ""
#: lib/bds/desktop/shell_live/overlay_manager.ex:422
#: lib/bds/tui.ex:779
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr ""
@@ -589,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1029,6 +1030,7 @@ msgid "Filename"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr ""
@@ -1039,6 +1041,7 @@ msgid "Find"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr ""
@@ -1065,6 +1068,7 @@ msgid "Gallery"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr ""
@@ -1385,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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1430,6 +1434,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1475,7 +1480,7 @@ msgstr ""
#: lib/bds/desktop/menu_bar.ex:214
#: lib/bds/desktop/shell_live/sidebar_create.ex:41
#: lib/bds/tui.ex:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr ""
@@ -1764,6 +1769,7 @@ msgid "Open Settings"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr ""
@@ -1911,8 +1917,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2036,12 +2042,14 @@ msgid "Ready to import:"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr ""
@@ -2099,6 +2107,7 @@ msgid "Refresh Translation"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr ""
@@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:249
#: lib/bds/tui.ex:731
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr ""
@@ -2294,7 +2304,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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2542,7 +2552,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2554,6 +2564,7 @@ msgstr ""
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr ""
@@ -2598,7 +2609,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2821,6 +2832,7 @@ msgid "Updated URLs"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr ""
@@ -2848,11 +2860,13 @@ msgid "Validate"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr ""
@@ -3517,6 +3531,7 @@ msgid "Suggested tags"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr ""
@@ -3613,87 +3628,82 @@ msgstr ""
msgid "The endpoint returned no models. You can still type a model name manually."
msgstr ""
#: lib/bds/tui.ex:576
#: lib/bds/tui.ex:687
#, elixir-autogen, elixir-format
msgid "AI is unavailable in airplane mode without a local endpoint."
msgstr ""
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format, fuzzy
msgid "Could not load this file."
msgstr ""
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, elixir-autogen, elixir-format
msgid "Editing this item is not available in the terminal UI yet."
msgstr ""
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr ""
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr ""
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr ""
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, elixir-autogen, elixir-format
msgid "Press enter to preview %{name}."
msgstr ""
#: lib/bds/tui.ex:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format, fuzzy
msgid "Published."
msgstr ""
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr ""
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format, fuzzy
msgid "Saved."
msgstr ""
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, elixir-autogen, elixir-format
msgid "Select an entry and press enter to open it."
msgstr ""
#: lib/bds/tui.ex:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr ""
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr ""
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr ""
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format, fuzzy
msgid "Working…"
msgstr ""
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr ""
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr ""
@@ -3730,12 +3740,37 @@ msgstr ""
msgid "Use the form user@host or user@host:port."
msgstr ""
#: lib/bds/tui.ex:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr ""
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr ""
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr ""
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format, fuzzy
msgid "Unknown command."
msgstr ""
#: lib/bds/tui.ex:478
#, 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"
msgstr ""

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr "Sugerencias de IA"
@@ -572,6 +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
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr "Comando completado"
@@ -589,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1029,6 +1030,7 @@ msgid "Filename"
msgstr "Nombre de archivo"
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr "Completar traducciones faltantes"
@@ -1039,6 +1041,7 @@ msgid "Find"
msgstr "Buscar"
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr "Buscar entradas duplicadas"
@@ -1065,6 +1068,7 @@ msgid "Gallery"
msgstr "Galeria"
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr "Generar sitio"
@@ -1385,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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1430,6 +1434,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1475,7 +1480,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:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr "Nueva entrada"
@@ -1764,6 +1769,7 @@ msgid "Open Settings"
msgstr "Abrir Ajustes"
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr "Abrir en el navegador"
@@ -1911,8 +1917,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2036,12 +2042,14 @@ msgid "Ready to import:"
msgstr "Listo para importar:"
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr "Reconstruir índice de embeddings"
@@ -2099,6 +2107,7 @@ msgid "Refresh Translation"
msgstr "Actualizar traducción"
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr "Regenerar calendario"
@@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails"
msgstr "Regenerar miniaturas faltantes"
#: lib/bds/desktop/menu_bar.ex:249
#: lib/bds/tui.ex:731
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr "Reindexar texto"
@@ -2294,7 +2304,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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2542,7 +2552,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2554,6 +2564,7 @@ msgstr "Etiquetas"
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr "Tareas"
@@ -2598,7 +2609,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2821,6 +2832,7 @@ msgid "Updated URLs"
msgstr "URLs actualizadas"
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr "Subir sitio"
@@ -2848,11 +2860,13 @@ msgid "Validate"
msgstr "Validar"
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr "Validar sitio"
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr "Validar traducciones"
@@ -3517,6 +3531,7 @@ msgid "Suggested tags"
msgstr "Etiquetas sugeridas"
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr "Forzar la regeneración del sitio"
@@ -3613,87 +3628,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:576
#: lib/bds/tui.ex:687
#, 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:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format
msgid "Could not load this file."
msgstr "No se pudo cargar este archivo."
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, 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:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr "No se recibieron sugerencias."
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr "Solo se pueden previsualizar imágenes."
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr "Entrada no encontrada."
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, elixir-autogen, elixir-format
msgid "Press enter to preview %{name}."
msgstr "Pulsa Intro para previsualizar %{name}."
#: lib/bds/tui.ex:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format
msgid "Published."
msgstr "Publicado."
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr "Guarda antes de cambiar de idioma."
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format
msgid "Saved."
msgstr "Guardado."
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, 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:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr "Sugerencias aplicadas."
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr "Título (ctrl+t para editar)"
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr "Título (edición — Intro para confirmar)"
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format
msgid "Working…"
msgstr "Procesando…"
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr "intro abrir · n nueva entrada · 1-5 vistas · r actualizar · ctrl+q salir"
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr "esc para cerrar"
@@ -3730,12 +3740,37 @@ 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:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr "Vista previa (ctrl+e para editar)"
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr "Todas las tareas han terminado."
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr "Comandos — esc para cerrar"
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format
msgid "Unknown command."
msgstr "Comando desconocido."
#: lib/bds/tui.ex:478
#, elixir-autogen, elixir-format
msgid "[report/apply in GUI]"
msgstr "[informe/aplicación en la GUI]"
#: lib/bds/tui.ex:505
#, 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"

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr "Suggestions IA"
@@ -572,6 +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
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr "Commande terminée"
@@ -589,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1029,6 +1030,7 @@ msgid "Filename"
msgstr "Nom de fichier"
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr "Compléter les traductions manquantes"
@@ -1039,6 +1041,7 @@ msgid "Find"
msgstr "Rechercher"
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr "Trouver les doublons"
@@ -1065,6 +1068,7 @@ msgid "Gallery"
msgstr "Galerie"
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr "Générer le site"
@@ -1385,9 +1389,9 @@ msgstr "Nombre maximal darticles 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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1430,6 +1434,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1475,7 +1480,7 @@ msgstr "Nouvelle page"
#: lib/bds/desktop/menu_bar.ex:214
#: lib/bds/desktop/shell_live/sidebar_create.ex:41
#: lib/bds/tui.ex:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr "Nouvel article"
@@ -1764,6 +1769,7 @@ msgid "Open Settings"
msgstr "Ouvrir les Réglages"
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr "Ouvrir dans le navigateur"
@@ -1911,8 +1917,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2036,12 +2042,14 @@ msgid "Ready to import:"
msgstr "Prêt à importer :"
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr "Reconstruire lindex dembeddings"
@@ -2099,6 +2107,7 @@ msgid "Refresh Translation"
msgstr "Actualiser la traduction"
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr "Régénérer le calendrier"
@@ -2109,6 +2118,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
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr "Réindexer le texte"
@@ -2294,7 +2304,7 @@ msgstr "Les capacités de script sont configurées au niveau de lapplication
#: 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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2542,7 +2552,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2554,6 +2564,7 @@ msgstr "Tags"
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr "Tâches"
@@ -2598,7 +2609,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2821,6 +2832,7 @@ msgid "Updated URLs"
msgstr "URLs mises à jour"
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr "Téléverser le site"
@@ -2848,11 +2860,13 @@ msgid "Validate"
msgstr "Valider"
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr "Valider le site"
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr "Valider les traductions"
@@ -3517,6 +3531,7 @@ msgid "Suggested tags"
msgstr "Tags suggérés"
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr "Forcer la régénération du site"
@@ -3613,87 +3628,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:576
#: lib/bds/tui.ex:687
#, 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:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format
msgid "Could not load this file."
msgstr "Impossible de charger ce fichier."
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, 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:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr "Aucune suggestion reçue."
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr "Seules les images peuvent être prévisualisées."
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr "Article introuvable."
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, elixir-autogen, elixir-format
msgid "Press enter to preview %{name}."
msgstr "Appuyez sur Entrée pour prévisualiser %{name}."
#: lib/bds/tui.ex:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format
msgid "Published."
msgstr "Publié."
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr "Enregistrez avant de changer de langue."
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format
msgid "Saved."
msgstr "Enregistré."
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, 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:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr "Suggestions appliquées."
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr "Titre (ctrl+t pour modifier)"
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr "Titre (édition — Entrée pour confirmer)"
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format
msgid "Working…"
msgstr "Traitement en cours…"
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr "entrée ouvrir · n nouvel article · 1-5 vues · r actualiser · ctrl+q quitter"
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr "échap pour fermer"
@@ -3730,12 +3740,37 @@ 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:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr "Aperçu (ctrl+e pour modifier)"
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr "Toutes les tâches sont terminées."
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr "Commandes — échap pour fermer"
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format
msgid "Unknown command."
msgstr "Commande inconnue."
#: lib/bds/tui.ex:478
#, elixir-autogen, elixir-format
msgid "[report/apply in GUI]"
msgstr "[rapport/application dans la GUI]"
#: lib/bds/tui.ex:505
#, 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"

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr "Suggerimenti IA"
@@ -572,6 +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
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr "Comando completato"
@@ -589,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1029,6 +1030,7 @@ msgid "Filename"
msgstr "Nome file"
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr "Completa traduzioni mancanti"
@@ -1039,6 +1041,7 @@ msgid "Find"
msgstr "Trova"
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr "Trova post duplicati"
@@ -1065,6 +1068,7 @@ msgid "Gallery"
msgstr "Galleria"
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr "Genera sito"
@@ -1385,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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1430,6 +1434,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1475,7 +1480,7 @@ msgstr "Nuova pagina"
#: lib/bds/desktop/menu_bar.ex:214
#: lib/bds/desktop/shell_live/sidebar_create.ex:41
#: lib/bds/tui.ex:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr "Nuovo post"
@@ -1764,6 +1769,7 @@ msgid "Open Settings"
msgstr "Apri Impostazioni"
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr "Apri nel browser"
@@ -1911,8 +1917,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2036,12 +2042,14 @@ msgid "Ready to import:"
msgstr "Pronto per importare:"
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr "Ricostruisci indice embeddings"
@@ -2099,6 +2107,7 @@ msgid "Refresh Translation"
msgstr "Aggiorna traduzione"
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr "Rigenera calendario"
@@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails"
msgstr "Rigenera miniature mancanti"
#: lib/bds/desktop/menu_bar.ex:249
#: lib/bds/tui.ex:731
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr "Reindicizza testo"
@@ -2294,7 +2304,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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2542,7 +2552,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2554,6 +2564,7 @@ msgstr "Tag"
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr "Attività"
@@ -2598,7 +2609,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2821,6 +2832,7 @@ msgid "Updated URLs"
msgstr "URL aggiornati"
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr "Carica sito"
@@ -2848,11 +2860,13 @@ msgid "Validate"
msgstr "Valida"
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr "Valida sito"
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr "Valida traduzioni"
@@ -3517,6 +3531,7 @@ msgid "Suggested tags"
msgstr "Tag suggeriti"
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr "Forza la rigenerazione del sito"
@@ -3613,87 +3628,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:576
#: lib/bds/tui.ex:687
#, 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:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format
msgid "Could not load this file."
msgstr "Impossibile caricare questo file."
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, 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:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr "Nessun suggerimento ricevuto."
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr "Solo le immagini possono essere visualizzate in anteprima."
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr "Post non trovato."
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, elixir-autogen, elixir-format
msgid "Press enter to preview %{name}."
msgstr "Premi Invio per l'anteprima di %{name}."
#: lib/bds/tui.ex:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format
msgid "Published."
msgstr "Pubblicato."
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr "Salva prima di cambiare lingua."
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format
msgid "Saved."
msgstr "Salvato."
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, 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:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr "Suggerimenti applicati."
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr "Titolo (ctrl+t per modificare)"
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr "Titolo (modifica — Invio per confermare)"
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format
msgid "Working…"
msgstr "Elaborazione…"
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr "invio apri · n nuovo post · 1-5 viste · r aggiorna · ctrl+q esci"
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr "esc per chiudere"
@@ -3730,12 +3740,37 @@ 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:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr "Anteprima (ctrl+e per modificare)"
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr "Tutte le attività sono terminate."
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr "Comandi — esc per chiudere"
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format
msgid "Unknown command."
msgstr "Comando sconosciuto."
#: lib/bds/tui.ex:478
#, elixir-autogen, elixir-format
msgid "[report/apply in GUI]"
msgstr "[report/applicazione nella GUI]"
#: lib/bds/tui.ex:505
#, 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"

View File

@@ -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:224
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:230
#: lib/bds/tui.ex:238
#: lib/bds/tui.ex:575
#: 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
#, elixir-autogen, elixir-format
msgid "AI Suggestions"
msgstr ""
@@ -585,6 +585,7 @@ msgid "Collapse unchanged diff hunks"
msgstr ""
#: lib/bds/desktop/shell_live/overlay_manager.ex:422
#: lib/bds/tui.ex:779
#, elixir-autogen, elixir-format
msgid "Command completed"
msgstr ""
@@ -602,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:348
#: lib/bds/tui.ex:424
#: lib/bds/ui/sidebar.ex:764
#, elixir-autogen, elixir-format
msgid "Content"
@@ -1042,6 +1043,7 @@ msgid "Filename"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:254
#: lib/bds/tui.ex:745
#, elixir-autogen, elixir-format
msgid "Fill Missing Translations"
msgstr ""
@@ -1052,6 +1054,7 @@ msgid "Find"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:255
#: lib/bds/tui.ex:748
#, elixir-autogen, elixir-format
msgid "Find Duplicate Posts"
msgstr ""
@@ -1078,6 +1081,7 @@ msgid "Gallery"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:256
#: lib/bds/tui.ex:729
#, elixir-autogen, elixir-format
msgid "Generate Site"
msgstr ""
@@ -1398,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:489
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:600
#: lib/bds/tui.ex:808
#: lib/bds/tui.ex:811
#: lib/bds/ui/registry.ex:30
#: lib/bds/ui/registry.ex:100
#: lib/bds/ui/sidebar.ex:558
@@ -1443,6 +1447,7 @@ 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/ui/registry.ex:111
#, elixir-autogen, elixir-format
msgid "Metadata Diff"
@@ -1488,7 +1493,7 @@ msgstr ""
#: lib/bds/desktop/menu_bar.ex:214
#: lib/bds/desktop/shell_live/sidebar_create.ex:41
#: lib/bds/tui.ex:115
#: lib/bds/tui.ex:130
#, elixir-autogen, elixir-format
msgid "New Post"
msgstr ""
@@ -1777,6 +1782,7 @@ msgid "Open Settings"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:217
#: lib/bds/tui.ex:750
#, elixir-autogen, elixir-format
msgid "Open in Browser"
msgstr ""
@@ -1924,8 +1930,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:488
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:599
#: lib/bds/tui.ex:610
#: lib/bds/ui/registry.ex:14
#: lib/bds/ui/sidebar.ex:271
#, elixir-autogen, elixir-format
@@ -2049,12 +2055,14 @@ msgid "Ready to import:"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:248
#: lib/bds/tui.ex:730
#, 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
#, elixir-autogen, elixir-format
msgid "Rebuild Embedding Index"
msgstr ""
@@ -2112,6 +2120,7 @@ msgid "Refresh Translation"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:252
#: lib/bds/tui.ex:737
#, elixir-autogen, elixir-format
msgid "Regenerate Calendar"
msgstr ""
@@ -2122,6 +2131,7 @@ msgid "Regenerate Missing Thumbnails"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:249
#: lib/bds/tui.ex:731
#, elixir-autogen, elixir-format
msgid "Reindex Text"
msgstr ""
@@ -2307,7 +2317,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:491
#: lib/bds/tui.ex:602
#: lib/bds/ui/registry.ex:38
#: lib/bds/ui/sidebar.ex:63
#: lib/bds/ui/sidebar.ex:115
@@ -2555,7 +2565,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:492
#: lib/bds/tui.ex:603
#: lib/bds/ui/registry.ex:54
#: lib/bds/ui/registry.ex:103
#: lib/bds/ui/sidebar.ex:289
@@ -2567,6 +2577,7 @@ msgstr ""
#: lib/bds/desktop/shell_live.ex:786
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
#: lib/bds/tui.ex:312
#, elixir-autogen, elixir-format
msgid "Tasks"
msgstr ""
@@ -2611,7 +2622,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:490
#: lib/bds/tui.ex:601
#: lib/bds/ui/registry.ex:46
#: lib/bds/ui/sidebar.ex:71
#: lib/bds/ui/sidebar.ex:122
@@ -2834,6 +2845,7 @@ msgid "Updated URLs"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:259
#: lib/bds/tui.ex:749
#, elixir-autogen, elixir-format
msgid "Upload Site"
msgstr ""
@@ -2861,11 +2873,13 @@ msgid "Validate"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:258
#: lib/bds/tui.ex:727
#, elixir-autogen, elixir-format
msgid "Validate Site"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:253
#: lib/bds/tui.ex:740
#, elixir-autogen, elixir-format
msgid "Validate Translations"
msgstr ""
@@ -3530,6 +3544,7 @@ msgid "Suggested tags"
msgstr ""
#: lib/bds/desktop/menu_bar.ex:257
#: lib/bds/tui.ex:728
#, elixir-autogen, elixir-format
msgid "Force Render Site"
msgstr ""
@@ -3626,87 +3641,82 @@ msgstr ""
msgid "The endpoint returned no models. You can still type a model name manually."
msgstr ""
#: lib/bds/tui.ex:576
#: lib/bds/tui.ex:687
#, elixir-autogen, elixir-format
msgid "AI is unavailable in airplane mode without a local endpoint."
msgstr ""
#: lib/bds/tui.ex:622
#: lib/bds/tui.ex:811
#, elixir-autogen, elixir-format
msgid "Could not load this file."
msgstr ""
#: lib/bds/tui.ex:123
#: lib/bds/tui.ex:138
#, elixir-autogen, elixir-format
msgid "Editing this item is not available in the terminal UI yet."
msgstr ""
#: lib/bds/tui.ex:227
#: lib/bds/tui.ex:288
#, elixir-autogen, elixir-format
msgid "No suggestions returned."
msgstr ""
#: lib/bds/tui.ex:619
#: lib/bds/tui.ex:808
#, elixir-autogen, elixir-format
msgid "Only images can be previewed."
msgstr ""
#: lib/bds/tui.ex:499
#: lib/bds/tui.ex:610
#, elixir-autogen, elixir-format
msgid "Post not found."
msgstr ""
#: lib/bds/tui.ex:303
#: lib/bds/tui.ex:379
#, elixir-autogen, elixir-format
msgid "Press enter to preview %{name}."
msgstr ""
#: lib/bds/tui.ex:546
#: lib/bds/tui.ex:657
#, elixir-autogen, elixir-format
msgid "Published."
msgstr ""
#: lib/bds/tui.ex:562
#: lib/bds/tui.ex:673
#, elixir-autogen, elixir-format
msgid "Save before switching languages."
msgstr ""
#: lib/bds/tui.ex:547
#: lib/bds/tui.ex:658
#, elixir-autogen, elixir-format
msgid "Saved."
msgstr ""
#: lib/bds/tui.ex:306
#: lib/bds/tui.ex:382
#, elixir-autogen, elixir-format
msgid "Select an entry and press enter to open it."
msgstr ""
#: lib/bds/tui.ex:224
#: lib/bds/tui.ex:285
#, elixir-autogen, elixir-format
msgid "Suggestions applied."
msgstr ""
#: lib/bds/tui.ex:318
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "Title (ctrl+t to edit)"
msgstr ""
#: lib/bds/tui.ex:317
#: lib/bds/tui.ex:393
#, elixir-autogen, elixir-format
msgid "Title (editing — enter to confirm)"
msgstr ""
#: lib/bds/tui.ex:365
#: lib/bds/tui.ex:441
#, elixir-autogen, elixir-format
msgid "Working…"
msgstr ""
#: lib/bds/tui.ex:394
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit"
msgstr ""
#: lib/bds/tui.ex:386
#: lib/bds/tui.ex:462
#, elixir-autogen, elixir-format
msgid "esc to close"
msgstr ""
@@ -3743,12 +3753,37 @@ msgstr ""
msgid "Use the form user@host or user@host:port."
msgstr ""
#: lib/bds/tui.ex:337
#: lib/bds/tui.ex:413
#, elixir-autogen, elixir-format
msgid "Preview (ctrl+e to edit)"
msgstr ""
#: lib/bds/tui.ex:401
#: lib/bds/tui.ex:512
#, 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
#, elixir-autogen, elixir-format
msgid "All tasks finished."
msgstr ""
#: lib/bds/tui.ex:488
#, elixir-autogen, elixir-format
msgid "Commands — esc to close"
msgstr ""
#: lib/bds/tui.ex:159
#, elixir-autogen, elixir-format
msgid "Unknown command."
msgstr ""
#: lib/bds/tui.ex:478
#, elixir-autogen, elixir-format
msgid "[report/apply in GUI]"
msgstr ""
#: lib/bds/tui.ex:505
#, elixir-autogen, elixir-format
msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit"
msgstr ""

View File

@@ -62,6 +62,19 @@ rule AiQuickAction {
ensures: AiSuggestionsRequestedOrRefused()
}
rule CommandPrompt {
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.
ensures: CommandListShownOrExecuted()
}
rule MultiClientSync {
when: TuiEventReceived(entity, entity_id, action)
-- Domain events refresh the sidebar; a post deleted elsewhere closes

View File

@@ -164,6 +164,98 @@ defmodule BDS.TUITest do
assert {:stop, _state} = BDS.TUI.handle_event(key("q", ["ctrl"]), mount!())
end
describe "command prompt" do
defp mount_with_executor! do
parent = self()
mount!(
command_executor: fn action ->
send(parent, {:executed, action})
{:ok, %{kind: "output", title: "T", message: "done"}}
end
)
end
test "':' opens the prompt and lists commands" do
state = mount_with_executor!() |> press(":")
assert state.command != nil
text = screen_text(state)
assert text =~ "metadata_diff"
assert text =~ "validate_site"
end
test "'?' opens the command help list with GUI markers" do
state = mount_with_executor!() |> press("?")
assert state.command.help?
text = screen_text(state)
assert text =~ "metadata_diff"
# Commands whose report/apply UI lives in the GUI are marked.
assert text =~ "GUI"
state = press(state, "esc")
assert state.command == nil
end
test "typing filters and enter runs the selected command" do
state =
mount_with_executor!()
|> press(":")
|> press("m")
|> press("e")
|> press("t")
|> press("a")
|> press("enter")
assert_receive {:executed, "metadata_diff"}
assert state.command == nil
assert state.status =~ "done"
end
test "up/down move the selection" do
state = mount_with_executor!() |> press(":") |> press("down") |> press("enter")
assert_receive {:executed, action}
assert is_binary(action)
end
test "no match reports an unknown command" do
state =
mount_with_executor!()
|> press(":")
|> press("z")
|> press("z")
|> press("enter")
refute_receive {:executed, _action}, 50
assert state.command == nil
assert state.status != nil
end
test "a queued task starts status polling and finishes with a toast" do
parent = self()
state =
mount!(
command_executor: fn action ->
send(parent, {:executed, action})
{:ok, %{kind: "task_queued", title: "Rebuild", message: "queued"}}
end
)
|> press(":")
|> press("enter")
assert_receive {:executed, _action}
assert state.task_polling
# No tasks are actually running in this test, so the first poll ends it.
{:noreply, state} = BDS.TUI.handle_info(:poll_tasks, state)
refute state.task_polling
assert state.status != 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)