Compare commits
7 Commits
2fd132e827
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 655069a28a | |||
| 593f1646a1 | |||
| c77450d497 | |||
| 23f05b72f7 | |||
| dd53ca3fbc | |||
| 6c9dd9605b | |||
| 46c239df56 |
@@ -30,6 +30,7 @@ This document provides context and best practices for GitHub Copilot when workin
|
|||||||
- you MUST run tests with command line tools at least once to capture compile errors in tests, do not use the integrated testing of vscode, as that blocks on compile errors
|
- you MUST run tests with command line tools at least once to capture compile errors in tests, do not use the integrated testing of vscode, as that blocks on compile errors
|
||||||
- you MUST run build, test, credo, deps.audit and check dialyzer messages and you MUST treet warnings as errors and fix them. we want clean builds, clean tests, clean credo, clean dependency audits and clean dialyzer results
|
- you MUST run build, test, credo, deps.audit and check dialyzer messages and you MUST treet warnings as errors and fix them. we want clean builds, clean tests, clean credo, clean dependency audits and clean dialyzer results
|
||||||
- on a headless Linux machine, you have to run tests with this command (if mix test complains about DISPLAX): xvfb-run mix test
|
- on a headless Linux machine, you have to run tests with this command (if mix test complains about DISPLAX): xvfb-run mix test
|
||||||
|
- CSS precedence: Tailwind utilities and the ui-* kit (utilities.css) are in @layer and ALWAYS lose to the unlayered hand-written files (shell.css, panel.css, ...). Convention: hand-written CSS owns appearance, Tailwind utilities in templates own layout — never put display/flex-direction/size rules in hand-written CSS for elements whose layout the template controls, and define each selector in exactly one file.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
25
API.md
25
API.md
@@ -40,6 +40,7 @@ local meta = bds.meta.get_project_metadata()
|
|||||||
- [app.get_default_project_path](#appget_default_project_path)
|
- [app.get_default_project_path](#appget_default_project_path)
|
||||||
- [app.get_system_language](#appget_system_language)
|
- [app.get_system_language](#appget_system_language)
|
||||||
- [app.get_title_bar_metrics](#appget_title_bar_metrics)
|
- [app.get_title_bar_metrics](#appget_title_bar_metrics)
|
||||||
|
- [app.log](#applog)
|
||||||
- [app.notify_renderer_ready](#appnotify_renderer_ready)
|
- [app.notify_renderer_ready](#appnotify_renderer_ready)
|
||||||
- [app.open_folder](#appopen_folder)
|
- [app.open_folder](#appopen_folder)
|
||||||
- [app.read_project_metadata](#appread_project_metadata)
|
- [app.read_project_metadata](#appread_project_metadata)
|
||||||
@@ -202,6 +203,30 @@ nil -- or
|
|||||||
local result = bds.app.get_title_bar_metrics()
|
local result = bds.app.get_title_bar_metrics()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### app.log
|
||||||
|
|
||||||
|
Append a line to the script output stream. Multiple arguments are joined with spaces. Output appears in the desktop app's Output panel (and on stdout in the CLI); Lua's global `print` is routed the same way.
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- text (string, required)
|
||||||
|
|
||||||
|
**Response specification**
|
||||||
|
|
||||||
|
- Return type: `boolean`
|
||||||
|
|
||||||
|
**Example response**
|
||||||
|
|
||||||
|
```lua
|
||||||
|
true
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example call**
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local result = bds.app.log("value")
|
||||||
|
```
|
||||||
|
|
||||||
### app.notify_renderer_ready
|
### app.notify_renderer_ready
|
||||||
|
|
||||||
Notify the host application that the renderer is ready.
|
Notify the host application that the renderer is ready.
|
||||||
|
|||||||
223
TUI_EDITOR.md
Normal file
223
TUI_EDITOR.md
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
# TUI Editor — Implementation Plan (Issue #32)
|
||||||
|
|
||||||
|
Tracking issue: **#32** — "markdown, liquid and lua code editor with syntax
|
||||||
|
highlighting in the TUI".
|
||||||
|
Spec under change: `specs/tui.allium`.
|
||||||
|
|
||||||
|
Goal: a syntax-highlighted, word-wrapping TUI editor for posts (markdown
|
||||||
|
with `[[macro]]` syntax), templates (HTML + Liquid), and scripts (Lua),
|
||||||
|
replacing the current plain `ExRatatui.Widgets.Textarea` body.
|
||||||
|
|
||||||
|
## Decision: pure Elixir — no new Rust
|
||||||
|
|
||||||
|
`ExRatatui` already ships everything we need:
|
||||||
|
|
||||||
|
- `ExRatatui.CodeBlock.highlight/3` (`deps/ex_ratatui/lib/ex_ratatui/code_block.ex:103`)
|
||||||
|
returns `[%ExRatatui.Text.Line{}]` of styled spans via the bundled
|
||||||
|
syntect NIF. Supports Lua, Markdown, HTML, … out of the box.
|
||||||
|
- `ExRatatui.Widgets.CodeBlock` is read-only; we do **not** use it
|
||||||
|
directly for editing.
|
||||||
|
- `ExRatatui.Widget` protocol (`deps/ex_ratatui/lib/ex_ratatui/widget.ex:1`)
|
||||||
|
lets us implement a custom widget in pure Elixir that composes
|
||||||
|
primitives every frame. This is the seam we use.
|
||||||
|
- The editing engine stays Rust-owned
|
||||||
|
(`ExRatatui.textarea_new/0`, `textarea_handle_key/3`, `textarea_get_value/1`,
|
||||||
|
`textarea_cursor/1`, `textarea_line_count/1`). The custom widget only
|
||||||
|
re-renders the buffer through a styling + wrap pipeline.
|
||||||
|
- `ExRatatui.Widgets.Paragraph` accepts `[%Text.Line{}]` of styled spans
|
||||||
|
with `wrap: true` and a `scroll: {vertical, horizontal}` offset —
|
||||||
|
exactly the output shape we need.
|
||||||
|
|
||||||
|
The existing comment at `lib/bds/tui.ex:1451-1454` already pre-announces
|
||||||
|
this approach as "the planned MarkdownEditor custom widget".
|
||||||
|
|
||||||
|
Languages supported (matches GUI Monaco registrations in
|
||||||
|
`assets/js/monaco/languages.js`):
|
||||||
|
|
||||||
|
| Entity | Base lexer (NIF) | Elixir overlay |
|
||||||
|
|-----------------------|------------------|---------------------------------|
|
||||||
|
| post body | `markdown` | `[[macro …]]` recoloured |
|
||||||
|
| script body | `lua` | none |
|
||||||
|
| template body | `html` | `{{ … }}` and `{% … %}` recoloured |
|
||||||
|
|
||||||
|
Liquid is always HTML+Liquid in this codebase (no markdown+Liquid
|
||||||
|
templates exist). Plain text falls back to syntect's plain renderer.
|
||||||
|
|
||||||
|
## GUI styling parity (from `assets/js/monaco/theme.js` + `languages.js`)
|
||||||
|
|
||||||
|
- **macro** `[[ … ]]` → `keyword.macro` = `#C586C0`, **bold**.
|
||||||
|
- inside macro: `attribute.name` (e.g. `names`) → `#9CDCFE`,
|
||||||
|
`attribute.value` (e.g. `"x"`) → `#CE9178`.
|
||||||
|
- Liquid uses base vs-dark tokens; terminal approximation uses the same
|
||||||
|
base theme accent colours. No custom Liquid token colours overridden.
|
||||||
|
|
||||||
|
Use `{:rgb,197,134,192}` etc. via `ExRatatui.Style` (already supported
|
||||||
|
by `ExRatatui.CodeBlock.from_native/1`).
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
state.editor.textarea (unchanged, Rust-owned buffer/cursor/undo)
|
||||||
|
state.editor.language (:markdown_macros | :liquid | :lua | :text)
|
||||||
|
state.editor.preview? (unchanged ctrl+e toggle — default false for posts)
|
||||||
|
|
||||||
|
body_widget/3 edit branch: %BDS.UI.CodeEditor{textarea:, language:, theme:, wrap:, cursor_style:, line_highlight_style:, block:}
|
||||||
|
↳ impl ExRatatui.Widget.render:
|
||||||
|
1. content = ExRatatui.textarea_get_value(textarea)
|
||||||
|
2. {row, col} = ExRatatui.textarea_cursor(textarea)
|
||||||
|
3. lines = BDS.UI.CodeEditor.Highlight.highlight(content, language, theme)
|
||||||
|
4. apply current-line bg style into every span on lines[row]
|
||||||
|
5. cut the span at byte col on lines[row], splice cursor-style cell
|
||||||
|
6. top = vertical-scroll offset so cursor visual row stays in window (Latin-width count)
|
||||||
|
7. return [{%Paragraph{text: lines, wrap: true, scroll: {top,0}, block: block}, rect}]
|
||||||
|
```
|
||||||
|
|
||||||
|
`editor_key/1` in `lib/bds/tui.ex` keeps calling
|
||||||
|
`ExRatatui.textarea_handle_key/3` — no edit-model rewrite, the
|
||||||
|
textarea's own undo/redo/clipboard keeps working.
|
||||||
|
|
||||||
|
## Phases (test-first, per AGENTS.md)
|
||||||
|
|
||||||
|
### Phase 0 — Spec
|
||||||
|
|
||||||
|
Edit `specs/tui.allium`:
|
||||||
|
|
||||||
|
- `OpenEntry`: posts open in the **editor** (wrap on, highlighting on)
|
||||||
|
by default — not the rendered Markdown preview. New empty posts still
|
||||||
|
open in the editor (unchanged).
|
||||||
|
- Rename `WrappedPreview` → `EditorMode`: `ctrl+e` toggles editor ↔
|
||||||
|
read-only rendered-Markdown preview (via `ExRatatui.Widgets.Markdown`).
|
||||||
|
Drop the "textarea cannot wrap" caveat.
|
||||||
|
- Add `CodeEditorWrapping` rule: syntax highlighting + auto wrap +
|
||||||
|
highlighted current line. Explicitly **no line-number gutter**.
|
||||||
|
- Validate with `allium check specs/tui.allium`.
|
||||||
|
|
||||||
|
### Phase 1 — Red tests
|
||||||
|
|
||||||
|
New file `test/bds/ui/code_editor_test.exs`:
|
||||||
|
|
||||||
|
- `BDS.UI.CodeEditor.Highlight.highlight/3` for `:lua` colours a
|
||||||
|
`function … end` keyword with the theme's keyword colour.
|
||||||
|
- `:markdown_macros` recolours `[[gallery names="x"]]`:
|
||||||
|
- `[[`, `]]` and macro name → `{:rgb,197,134,192}` bold
|
||||||
|
- `names` → `{:rgb,156,220,254}`
|
||||||
|
- `"x"` → `{:rgb,206,145,120}`
|
||||||
|
- surrounding markdown still base-styled.
|
||||||
|
- `:liquid` recolours `{{ x }}` and `{% if x %}` over an HTML base;
|
||||||
|
`if` keyword distinct from identifiers.
|
||||||
|
- Widget emits a `%Paragraph{wrap: true, scroll:}`, never a bare `%Textarea`,
|
||||||
|
when language is one of the highlighted set.
|
||||||
|
|
||||||
|
Extended `test/bds/tui_test.exs`:
|
||||||
|
|
||||||
|
- Opening an existing post lands in the **editor** (`preview? == false`),
|
||||||
|
not the rendered preview. Replace the assertion in
|
||||||
|
`test "opening a post lands in the markdown preview, not the editor"`.
|
||||||
|
Test name/logic flips.
|
||||||
|
- Long line wraps across N visual rows in a 40-wide viewport
|
||||||
|
(assert via `CellSession.take_cells/1`).
|
||||||
|
- Cursor at the last visual row stays visible when scrolling a small
|
||||||
|
viewport (assert cursor-style cell appears in snapshot cells).
|
||||||
|
- Current line's cells have a distinct `bg` from non-current rows on
|
||||||
|
the same buffer.
|
||||||
|
- `ctrl+e` flips to preview and back; preview still rendered Markdown.
|
||||||
|
- `ctrl+s` persists textarea bytes unchanged regardless of highlight/wrap
|
||||||
|
(existing assertion still covers this — keep it green).
|
||||||
|
|
||||||
|
### Phase 2 — `lib/bds/ui/code_editor/highlight.ex` + `overlay.ex`
|
||||||
|
|
||||||
|
- `BDS.UI.CodeEditor.Highlight.highlight(content, language, theme)` →
|
||||||
|
`[%ExRatatui.Text.Line{}]`:
|
||||||
|
- `:lua`, `:text` → pass straight through to
|
||||||
|
`ExRatatui.CodeBlock.highlight/3`.
|
||||||
|
- `:markdown_macros` → base highlight as `"markdown"`, then apply
|
||||||
|
`Overlay.markdown_macros/1` per source line.
|
||||||
|
- `:liquid` → base highlight as `"html"`, then apply
|
||||||
|
`Overlay.liquid/1` per source line.
|
||||||
|
- `BDS.UI.CodeEditor.Overlay`:
|
||||||
|
- `apply_ranges(line, ranges_with_styles)` — re-splits a `Line`'s
|
||||||
|
spans into a new span list, preserving the base styling outside
|
||||||
|
each range.
|
||||||
|
- `markdown_macro_ranges/1` — `~r/\[\[\s*[a-zA-Z][\w-]*[^]]*\]\]/s`.
|
||||||
|
- `macro_inner_ranges/1` — break `attr=` (attr-name) and quoted value
|
||||||
|
into separate styled sub-ranges inside a macro.
|
||||||
|
- `liquid_ranges/1` — `~r/(\{\{.*?\}\}|\{%-?\s*(\w+).*?-?%\})/s`,
|
||||||
|
with a sub-range for the tag keyword (`if`, `for`, `assign`, …).
|
||||||
|
- Cache results by `{content_hash, language, theme}` if profiling shows
|
||||||
|
re-tokenisation overhead on keystroke (Phase 2 stretch goal —
|
||||||
|
skip until a test says otherwise).
|
||||||
|
|
||||||
|
### Phase 3 — `lib/bds/ui/code_editor/widget.ex`
|
||||||
|
|
||||||
|
- `%BDS.UI.CodeEditor{}` struct fields: `textarea`, `language`,
|
||||||
|
`theme` (default `:base16_ocean_dark`, readable in dark terminals),
|
||||||
|
`wrap: true`, `cursor_style`, `line_highlight_style`, `block`, `scroll`.
|
||||||
|
- `defimpl ExRatatui.Widget` per the pipeline above.
|
||||||
|
- Cursor cell: re-style the single codepoint at `col` on source line
|
||||||
|
`row` into `cursor_style`. Paragraph wraps the same line; the styled
|
||||||
|
cell rides the wrap.
|
||||||
|
- Scroll math: count display rows by wrapping each source line into
|
||||||
|
`width` columns (Latin-width assumption — 1 char = 1 cell). Note the
|
||||||
|
limitation explicitly; CJK width is a follow-up if/when needed.
|
||||||
|
- Line highlight: apply `line_highlight_style` (a `bg:` colour) to
|
||||||
|
every span on the cursor's source line before cursor cut-in.
|
||||||
|
|
||||||
|
### Phase 4 — Wire into `lib/bds/tui.ex`
|
||||||
|
|
||||||
|
- `build_editor/4` (around `lib/bds/tui.ex:1968`): default
|
||||||
|
`preview? = false` for existing posts. New posts already open in
|
||||||
|
editor — unchanged.
|
||||||
|
- `body_widget/3` edit branch (`lib/bds/tui.ex:1466`): emit
|
||||||
|
`%BDS.UI.CodeEditor{}` instead of `%ExRatatui.Widgets.Textarea{}` for
|
||||||
|
entities that have a syntax highlighter (`:lua`, `:markdown_macros`,
|
||||||
|
`:liquid`). Plain text can keep `%Textarea{}` or feed `:text` through
|
||||||
|
the new widget — pick whichever keeps the test surface smaller.
|
||||||
|
- Remove the "wrap limitation" comment block at
|
||||||
|
`lib/bds/tui.ex:1451-1454`.
|
||||||
|
- `cycle_language/1` continues per post; cycle through the active
|
||||||
|
set (`:markdown_macros`, `:liquid`, `:lua`, `:text`) matching the
|
||||||
|
existing GUI editor language options.
|
||||||
|
- Preview branch (`body_widget/3` preview arm at `lib/bds/tui.ex:1455`)
|
||||||
|
stays on `ExRatatui.Widgets.Markdown` — unchanged.
|
||||||
|
- No new user-facing strings: the existing body title already flows
|
||||||
|
through `dgettext("ui", …)`. If a new toolbar/hint is added later,
|
||||||
|
it MUST go through gettext and provide de/fr/it/es translations.
|
||||||
|
|
||||||
|
### Phase 5 — Verify
|
||||||
|
|
||||||
|
- `mix test` (write to `/tmp/test_run.log` first, grep for failures —
|
||||||
|
per AGENTS.md).
|
||||||
|
- `mix credo --strict`
|
||||||
|
- `mix deps.audit --ignore-file .mix_audit.ignore`
|
||||||
|
- `mix dialyzer` — treat warnings as errors.
|
||||||
|
|
||||||
|
No bundle rebuild, no asset change, no NIF rebuild. Monaco still drives
|
||||||
|
the GUI editor; this change is TUI-only.
|
||||||
|
|
||||||
|
## Risks / limits
|
||||||
|
|
||||||
|
- **Per-frame NIF cost:** re-tokenises the whole buffer on every
|
||||||
|
keystroke. For typical post sizes (<50 KB) syntect is sub-ms. Add the
|
||||||
|
`{content_hash, language, theme}` cache only if a test shows it.
|
||||||
|
- **CJK cell width:** wrap math assumes 1 char = 1 cell. Fine for
|
||||||
|
de/fr/it/es. Note as TODO; not in scope for this phase.
|
||||||
|
- **Liquid mis-lexing inside HTML** is cosmetically possible (an HTML
|
||||||
|
attribute containing `{{`). Overlay wins after the base lexer; the
|
||||||
|
result is visually tolerable. A custom `.sublime-syntax` in the
|
||||||
|
dep would be the real fix — out of scope here per "stay on Elixir".
|
||||||
|
- **Cursor in a wrapped paragraph** rides the styled cell. Equivalent
|
||||||
|
to a cell-caret; GUI uses a real caret — acceptable TUI parity.
|
||||||
|
|
||||||
|
## Files touched (expected)
|
||||||
|
|
||||||
|
- `specs/tui.allium` — edited.
|
||||||
|
- `lib/bds/ui/code_editor/highlight.ex` — new.
|
||||||
|
- `lib/bds/ui/code_editor/overlay.ex` — new.
|
||||||
|
- `lib/bds/ui/code_editor/widget.ex` — new.
|
||||||
|
- `lib/bds/tui.ex` — edited (`build_editor`, `body_widget`, comment
|
||||||
|
removal, default `preview?`).
|
||||||
|
- `test/bds/ui/code_editor_test.exs` — new.
|
||||||
|
- `test/bds/tui_test.exs` — edited (flip the "opens in preview"
|
||||||
|
assertion, add wrap/cursor/current-line tests).
|
||||||
|
|
||||||
|
No changes to `mix.exs`, no new deps, no Rust, no assets.
|
||||||
@@ -49,8 +49,7 @@
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editor-toolbar-button:hover,
|
.editor-toolbar-button:hover {
|
||||||
.panel-tab:hover {
|
|
||||||
background: var(--vscode-toolbar-hoverBackground);
|
background: var(--vscode-toolbar-hoverBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -377,6 +377,76 @@
|
|||||||
font: inherit;
|
font: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.insert-modal-results {
|
||||||
|
overflow: auto;
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-result-item {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
padding: 10px 20px;
|
||||||
|
text-align: left;
|
||||||
|
cursor: pointer;
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-result-item:hover {
|
||||||
|
background: #252526;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-result-title {
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-result-meta {
|
||||||
|
color: #9d9d9d;
|
||||||
|
font-size: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-status {
|
||||||
|
padding: 16px 20px;
|
||||||
|
color: #9d9d9d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-external {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-external .insert-modal-input {
|
||||||
|
padding: 8px 10px;
|
||||||
|
border: 1px solid #3c3c3c;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #252526;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-field {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-label {
|
||||||
|
color: #9d9d9d;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.insert-modal-submit {
|
||||||
|
align-self: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Alert modal (errors) — reuses .confirm-delete-modal with a tone accent. */
|
/* Alert modal (errors) — reuses .confirm-delete-modal with a tone accent. */
|
||||||
.alert-modal-error {
|
.alert-modal-error {
|
||||||
|
|||||||
@@ -8,14 +8,11 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-tabs {
|
|
||||||
display: flex;
|
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-tabs {
|
.panel-tabs {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
|
align-items: stretch;
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-tab {
|
.panel-tab {
|
||||||
@@ -246,6 +243,12 @@
|
|||||||
background-color: var(--vscode-sideBar-background);
|
background-color: var(--vscode-sideBar-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* .panel-entry (shell.css) forces flex-direction: column and, being unlayered,
|
||||||
|
beats the Tailwind row utilities on this button — force the row here. */
|
||||||
|
.task-group-toggle {
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
.output-entry {
|
.output-entry {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
|
|||||||
@@ -402,24 +402,6 @@
|
|||||||
border-bottom: 1px solid var(--vscode-panel-border);
|
border-bottom: 1px solid var(--vscode-panel-border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-tabs {
|
|
||||||
display: flex;
|
|
||||||
align-items: stretch;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-tab {
|
|
||||||
border: none;
|
|
||||||
background: transparent;
|
|
||||||
color: var(--vscode-descriptionForeground);
|
|
||||||
padding: 0 12px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-tab.active {
|
|
||||||
color: var(--vscode-tab-activeForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-close {
|
.panel-close {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -778,11 +760,6 @@
|
|||||||
padding-left: 18px;
|
padding-left: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editor-toolbar {
|
|
||||||
display: flex;
|
|
||||||
gap: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-meta {
|
.editor-meta {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -794,13 +771,3 @@
|
|||||||
padding: 16px;
|
padding: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar-header,
|
|
||||||
.assistant-header,
|
|
||||||
.panel-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 12px;
|
|
||||||
padding: 16px 18px;
|
|
||||||
border-bottom: 1px solid var(--line);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import {
|
|||||||
} from "../utils/shortcuts.js";
|
} from "../utils/shortcuts.js";
|
||||||
import { syncTitlebarOverlayInsets } from "../bridges/titlebar_overlay.js";
|
import { syncTitlebarOverlayInsets } from "../bridges/titlebar_overlay.js";
|
||||||
import { runMenuRuntimeCommand } from "../bridges/menu_runtime.js";
|
import { runMenuRuntimeCommand } from "../bridges/menu_runtime.js";
|
||||||
|
import { copyTextToClipboard } from "../utils/clipboard.js";
|
||||||
|
|
||||||
export const AppShell = {
|
export const AppShell = {
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -179,6 +180,10 @@ export const AppShell = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.handleEvent("clipboard", ({ text }) => {
|
||||||
|
copyTextToClipboard(text || "");
|
||||||
|
});
|
||||||
|
|
||||||
window.addEventListener("bds:native-menu-action", this.handleNativeMenuAction);
|
window.addEventListener("bds:native-menu-action", this.handleNativeMenuAction);
|
||||||
window.addEventListener("keydown", this.handleShortcutKeyDown, true);
|
window.addEventListener("keydown", this.handleShortcutKeyDown, true);
|
||||||
this.el.addEventListener("load", this.handleThumbnailLoad, true);
|
this.el.addEventListener("load", this.handleThumbnailLoad, true);
|
||||||
|
|||||||
27
assets/js/utils/clipboard.js
Normal file
27
assets/js/utils/clipboard.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// Copies text to the system clipboard, mirroring the old app's behavior:
|
||||||
|
// navigator.clipboard when available, with a hidden-textarea fallback for
|
||||||
|
// webviews that lack the async clipboard API.
|
||||||
|
export const copyTextToClipboard = async (text) => {
|
||||||
|
if (typeof navigator !== "undefined" && navigator.clipboard && typeof navigator.clipboard.writeText === "function") {
|
||||||
|
await navigator.clipboard.writeText(text);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof document === "undefined" || typeof document.createElement !== "function") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const textArea = document.createElement("textarea");
|
||||||
|
textArea.value = text;
|
||||||
|
textArea.setAttribute("readonly", "");
|
||||||
|
textArea.style.position = "absolute";
|
||||||
|
textArea.style.left = "-9999px";
|
||||||
|
document.body.appendChild(textArea);
|
||||||
|
textArea.select();
|
||||||
|
|
||||||
|
if (typeof document.execCommand === "function") {
|
||||||
|
document.execCommand("copy");
|
||||||
|
}
|
||||||
|
|
||||||
|
document.body.removeChild(textArea);
|
||||||
|
};
|
||||||
@@ -555,7 +555,8 @@ defmodule BDS.CLI.Commands do
|
|||||||
script.entrypoint || "main",
|
script.entrypoint || "main",
|
||||||
args,
|
args,
|
||||||
timeout: Keyword.get(scripting_config, :job_timeout, :infinity),
|
timeout: Keyword.get(scripting_config, :job_timeout, :infinity),
|
||||||
max_reductions: Keyword.get(scripting_config, :job_max_reductions, :none)
|
max_reductions: Keyword.get(scripting_config, :job_max_reductions, :none),
|
||||||
|
on_output: fn text -> IO.puts(text) end
|
||||||
) do
|
) do
|
||||||
{:ok, nil} -> {:ok, "Script finished"}
|
{:ok, nil} -> {:ok, "Script finished"}
|
||||||
{:ok, result} -> {:ok, "Script finished: #{format_reason(result)}"}
|
{:ok, result} -> {:ok, "Script finished: #{format_reason(result)}"}
|
||||||
|
|||||||
@@ -182,6 +182,7 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
|> assign(:shell_overlay, nil)
|
|> assign(:shell_overlay, nil)
|
||||||
|> assign(:git_run, nil)
|
|> assign(:git_run, nil)
|
||||||
|> assign(:output_entries, [])
|
|> assign(:output_entries, [])
|
||||||
|
|> assign(:collapsed_task_groups, MapSet.new())
|
||||||
|> assign(:panel_post_links, %{backlinks: [], outlinks: []})
|
|> assign(:panel_post_links, %{backlinks: [], outlinks: []})
|
||||||
|> assign(:panel_git_entries, [])
|
|> assign(:panel_git_entries, [])
|
||||||
|> assign(:auto_save_timers, %{})
|
|> assign(:auto_save_timers, %{})
|
||||||
@@ -226,6 +227,38 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
{:noreply, refresh_layout(socket, workbench)}
|
{:noreply, refresh_layout(socket, workbench)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Copy-all for the Output panel: entries are stored newest-first, so flip
|
||||||
|
# them back to chronological order before joining (old-app behavior).
|
||||||
|
def handle_event("copy_output", _params, socket) do
|
||||||
|
text =
|
||||||
|
socket.assigns.output_entries
|
||||||
|
|> Enum.reverse()
|
||||||
|
|> Enum.map_join("\n\n", & &1.message)
|
||||||
|
|
||||||
|
{:noreply, push_event(socket, "clipboard", %{text: text})}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("toggle_task_group", %{"group" => group_id}, socket) do
|
||||||
|
collapsed = socket.assigns[:collapsed_task_groups] || MapSet.new()
|
||||||
|
|
||||||
|
collapsed =
|
||||||
|
if MapSet.member?(collapsed, group_id),
|
||||||
|
do: MapSet.delete(collapsed, group_id),
|
||||||
|
else: MapSet.put(collapsed, group_id)
|
||||||
|
|
||||||
|
{:noreply, assign(socket, :collapsed_task_groups, collapsed)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("cancel_task", %{"id" => task_id}, socket) do
|
||||||
|
_ = BDS.Tasks.cancel_task(task_id)
|
||||||
|
|
||||||
|
task_status =
|
||||||
|
BDS.Tasks.status_snapshot()
|
||||||
|
|> BDS.Desktop.ShellLive.TaskLocalization.localize_task_status(socket.assigns.page_language)
|
||||||
|
|
||||||
|
{:noreply, assign(socket, :task_status, task_status)}
|
||||||
|
end
|
||||||
|
|
||||||
def handle_event("open_sidebar_item", %{"route" => _route, "id" => _id} = params, socket) do
|
def handle_event("open_sidebar_item", %{"route" => _route, "id" => _id} = params, socket) do
|
||||||
{:noreply, open_sidebar_item(socket, params, :preview)}
|
{:noreply, open_sidebar_item(socket, params, :preview)}
|
||||||
end
|
end
|
||||||
@@ -860,8 +893,17 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp import_blogmark(socket, project_id, url, title) do
|
defp import_blogmark(socket, project_id, url, title) do
|
||||||
case Blogmark.receive_deep_link(project_id, url) do
|
# Transform scripts run in the sandbox process; collect anything they
|
||||||
|
# print/log so it lands in the Output panel like in the old app.
|
||||||
|
{:ok, output_sink} = Agent.start_link(fn -> [] end)
|
||||||
|
|
||||||
|
sink = fn text -> Agent.update(output_sink, fn lines -> [text | lines] end) end
|
||||||
|
|
||||||
|
try do
|
||||||
|
case Blogmark.receive_deep_link(project_id, url, on_output: sink) do
|
||||||
{:ok, %{post: post, toasts: toasts, errors: errors}} ->
|
{:ok, %{post: post, toasts: toasts, errors: errors}} ->
|
||||||
|
script_output = Agent.get(output_sink, &Enum.reverse/1)
|
||||||
|
|
||||||
socket
|
socket
|
||||||
|> reload_shell(socket.assigns.workbench)
|
|> reload_shell(socket.assigns.workbench)
|
||||||
|> open_sidebar_item(
|
|> open_sidebar_item(
|
||||||
@@ -873,12 +915,23 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
},
|
},
|
||||||
:pin
|
:pin
|
||||||
)
|
)
|
||||||
|
|> append_blogmark_script_output(title, script_output)
|
||||||
|> append_blogmark_toasts(title, toasts)
|
|> append_blogmark_toasts(title, toasts)
|
||||||
|> append_blogmark_errors(title, errors)
|
|> append_blogmark_errors(title, errors)
|
||||||
|
|> open_output_panel_when(script_output != [] or errors != [])
|
||||||
|
|
||||||
{:error, reason} ->
|
{:error, reason} ->
|
||||||
append_output_entry(socket, title, inspect(reason), url, "error")
|
append_output_entry(socket, title, inspect(reason), url, "error")
|
||||||
end
|
end
|
||||||
|
after
|
||||||
|
Agent.stop(output_sink)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp append_blogmark_script_output(socket, title, lines) do
|
||||||
|
Enum.reduce(lines, socket, fn line, acc ->
|
||||||
|
append_output_entry(acc, title, line, nil, "info")
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp append_blogmark_toasts(socket, title, toasts) do
|
defp append_blogmark_toasts(socket, title, toasts) do
|
||||||
@@ -887,6 +940,19 @@ defmodule BDS.Desktop.ShellLive do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Old-app parity: transform errors or streamed script output open the
|
||||||
|
# bottom panel on the Output tab so the user actually sees them.
|
||||||
|
defp open_output_panel_when(socket, true) do
|
||||||
|
workbench =
|
||||||
|
socket.assigns.workbench
|
||||||
|
|> Workbench.set_panel_visible(true)
|
||||||
|
|> Workbench.set_panel_tab(:output)
|
||||||
|
|
||||||
|
refresh_layout(socket, workbench)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp open_output_panel_when(socket, false), do: socket
|
||||||
|
|
||||||
defp append_blogmark_errors(socket, title, errors) do
|
defp append_blogmark_errors(socket, title, errors) do
|
||||||
Enum.reduce(errors, socket, fn %{slug: slug, reason: reason}, acc ->
|
Enum.reduce(errors, socket, fn %{slug: slug, reason: reason}, acc ->
|
||||||
append_output_entry(acc, title, inspect(reason), slug, "error")
|
append_output_entry(acc, title, inspect(reason), slug, "error")
|
||||||
|
|||||||
@@ -457,7 +457,7 @@
|
|||||||
<div class="panel-tabs flex min-w-0 items-center overflow-x-auto">
|
<div class="panel-tabs flex min-w-0 items-center overflow-x-auto">
|
||||||
<%= for tab <- @panel_tabs do %>
|
<%= for tab <- @panel_tabs do %>
|
||||||
<button
|
<button
|
||||||
class={["panel-tab", "ui-tab", if(@workbench.panel.active_tab == tab, do: "ui-tab-active"), "inline-flex h-9 items-center px-3 text-xs uppercase tracking-wide", if(@workbench.panel.active_tab == tab, do: "active")]}
|
class={["panel-tab", "ui-tab", if(@workbench.panel.active_tab == tab, do: "ui-tab-active"), "inline-flex items-center px-3 text-xs uppercase tracking-wide", if(@workbench.panel.active_tab == tab, do: "active")]}
|
||||||
type="button"
|
type="button"
|
||||||
phx-click="select_panel_tab"
|
phx-click="select_panel_tab"
|
||||||
phx-value-tab={tab}
|
phx-value-tab={tab}
|
||||||
|
|||||||
@@ -20,6 +20,17 @@ defmodule BDS.Desktop.ShellLive.Notify do
|
|||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Sends an output entry to a specific LiveView process. Needed when the
|
||||||
|
caller runs in a different process than the shell — e.g. script output
|
||||||
|
callbacks invoked inside the sandboxed script process.
|
||||||
|
"""
|
||||||
|
@spec output_to(pid(), String.t(), String.t(), String.t() | nil, String.t()) :: :ok
|
||||||
|
def output_to(pid, title, message, detail, level) when is_pid(pid) do
|
||||||
|
send(pid, {:editor_output, title, message, detail, level})
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
@spec alert(String.t(), String.t()) :: :ok
|
@spec alert(String.t(), String.t()) :: :ok
|
||||||
def alert(title, message) do
|
def alert(title, message) do
|
||||||
send(self(), {:shell_alert, title, message})
|
send(self(), {:shell_alert, title, message})
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
|
|||||||
alias BDS.PostLinks
|
alias BDS.PostLinks
|
||||||
alias BDS.Posts
|
alias BDS.Posts
|
||||||
alias BDS.Posts.Post
|
alias BDS.Posts.Post
|
||||||
|
alias BDS.UI.TaskGrouping
|
||||||
use Gettext, backend: BDS.Gettext
|
use Gettext, backend: BDS.Gettext
|
||||||
|
|
||||||
@doc "Render the active panel tab body."
|
@doc "Render the active panel tab body."
|
||||||
@@ -48,34 +49,122 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp render_task_entries(assigns) do
|
defp render_task_entries(assigns) do
|
||||||
|
entries = TaskGrouping.build_task_entries(Map.get(assigns.task_status, :tasks, []))
|
||||||
|
collapsed = Map.get(assigns, :collapsed_task_groups) || MapSet.new()
|
||||||
|
|
||||||
|
assigns =
|
||||||
|
assigns
|
||||||
|
|> assign(:task_entries, entries)
|
||||||
|
|> assign(:collapsed_task_groups, collapsed)
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<%= if Enum.empty?(Map.get(@task_status, :tasks, [])) do %>
|
<%= if Enum.empty?(@task_entries) do %>
|
||||||
<div class="panel-entry ui-panel-entry panel-empty-state ui-empty-state">
|
<div class="panel-entry ui-panel-entry panel-empty-state ui-empty-state">
|
||||||
<strong><%= dgettext("ui", "Tasks") %></strong>
|
<strong><%= dgettext("ui", "Tasks") %></strong>
|
||||||
<span><%= dgettext("ui", "No background tasks running") %></span>
|
<span><%= dgettext("ui", "No background tasks running") %></span>
|
||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
<div class="task-list flex flex-col gap-2">
|
<div class="task-list flex flex-col gap-2">
|
||||||
<%= for task <- Map.get(@task_status, :tasks, []) do %>
|
<%= for entry <- @task_entries do %>
|
||||||
<div class="panel-entry ui-panel-entry task-entry flex flex-col gap-2">
|
<%= case entry do %>
|
||||||
<div class="task-entry-header flex items-center justify-between gap-2">
|
<% {:single, task} -> %>
|
||||||
<strong><%= task.name %></strong>
|
{render_task_row(assigns, task, false)}
|
||||||
<span class={"task-status task-status-#{task.status}"}><%= Map.get(task, :status_label, task.status |> to_string() |> String.capitalize()) %></span>
|
<% {:group, group_id, group_name, tasks} -> %>
|
||||||
</div>
|
{render_task_group(assigns, group_id, group_name, tasks)}
|
||||||
<span><%= task.message || task.group_name || "" %></span>
|
|
||||||
<%= if is_number(task.progress) do %>
|
|
||||||
<div class="task-progress-row">
|
|
||||||
<progress max="1" value={task.progress}></progress>
|
|
||||||
<span><%= Map.get(task, :progress_label, progress_percent(task.progress)) %></span>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp render_task_group(assigns, group_id, group_name, tasks) do
|
||||||
|
summary = TaskGrouping.summarize_task_group(tasks)
|
||||||
|
expanded = not MapSet.member?(assigns.collapsed_task_groups, group_id)
|
||||||
|
|
||||||
|
assigns =
|
||||||
|
assigns
|
||||||
|
|> assign(:group_id, group_id)
|
||||||
|
|> assign(:group_name, group_name)
|
||||||
|
|> assign(:group_tasks, tasks)
|
||||||
|
|> assign(:group_expanded, expanded)
|
||||||
|
|> assign(:group_meta, task_group_meta(summary))
|
||||||
|
|
||||||
|
~H"""
|
||||||
|
<div class="task-group flex flex-col">
|
||||||
|
<button
|
||||||
|
class="panel-entry ui-panel-entry task-entry task-group-toggle flex w-full items-center gap-2 text-left"
|
||||||
|
type="button"
|
||||||
|
phx-click="toggle_task_group"
|
||||||
|
phx-value-group={@group_id}
|
||||||
|
aria-expanded={to_string(@group_expanded)}
|
||||||
|
>
|
||||||
|
<span class="task-group-chevron">{if @group_expanded, do: "▾", else: "▸"}</span>
|
||||||
|
<strong class="task-group-title"><%= @group_name %> (<%= length(@group_tasks) %>)</strong>
|
||||||
|
<span class="task-group-meta text-muted text-xs"><%= @group_meta %></span>
|
||||||
|
</button>
|
||||||
|
<%= if @group_expanded do %>
|
||||||
|
<%= for task <- @group_tasks do %>
|
||||||
|
{render_task_row(assigns, task, true)}
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
defp render_task_row(assigns, task, is_child) do
|
||||||
|
assigns =
|
||||||
|
assigns
|
||||||
|
|> assign(:task, task)
|
||||||
|
|> assign(:task_child?, is_child)
|
||||||
|
|
||||||
|
~H"""
|
||||||
|
<div class={["panel-entry", "ui-panel-entry", "task-entry", "flex flex-col gap-2", if(@task_child?, do: "ml-4")]}>
|
||||||
|
<div class="task-entry-header flex items-center justify-between gap-2">
|
||||||
|
<strong><%= @task.name %></strong>
|
||||||
|
<span class={"task-status task-status-#{@task.status}"}><%= Map.get(@task, :status_label, @task.status |> to_string() |> String.capitalize()) %></span>
|
||||||
|
</div>
|
||||||
|
<span><%= @task.message || @task.group_name || "" %></span>
|
||||||
|
<%= if is_number(@task.progress) do %>
|
||||||
|
<div class="task-progress-row">
|
||||||
|
<progress max="1" value={@task.progress}></progress>
|
||||||
|
<span><%= Map.get(@task, :progress_label, progress_percent(@task.progress)) %></span>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<%= if @task.status == :running do %>
|
||||||
|
<div class="task-entry-actions flex justify-end">
|
||||||
|
<button
|
||||||
|
class="ui-button ui-button-secondary inline-flex items-center px-2 py-1 text-xs"
|
||||||
|
data-testid="cancel-task-button"
|
||||||
|
type="button"
|
||||||
|
phx-click="cancel_task"
|
||||||
|
phx-value-id={@task.id}
|
||||||
|
>
|
||||||
|
<%= dgettext("ui", "Cancel") %>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
# "NN% · X Running · Y Pending" — the breakdown only lists non-zero counts,
|
||||||
|
# like the old app's summarizeTaskGroup rendering.
|
||||||
|
defp task_group_meta(summary) do
|
||||||
|
parts =
|
||||||
|
[]
|
||||||
|
|> maybe_append_breakdown(summary.running, dgettext("ui", "Running"))
|
||||||
|
|> maybe_append_breakdown(summary.pending, dgettext("ui", "Pending"))
|
||||||
|
|
||||||
|
suffix = if parts == [], do: "", else: " · " <> Enum.join(parts, " · ")
|
||||||
|
progress_percent(summary.progress) <> suffix
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_append_breakdown(parts, count, _label) when count <= 0, do: parts
|
||||||
|
|
||||||
|
defp maybe_append_breakdown(parts, count, label),
|
||||||
|
do: parts ++ ["#{count} #{label}"]
|
||||||
|
|
||||||
defp render_output_entries(assigns) do
|
defp render_output_entries(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<%= if Enum.empty?(@output_entries) do %>
|
<%= if Enum.empty?(@output_entries) do %>
|
||||||
@@ -84,6 +173,16 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
|
|||||||
<span><%= dgettext("ui", "No shell output yet") %></span>
|
<span><%= dgettext("ui", "No shell output yet") %></span>
|
||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
|
<div class="output-toolbar flex shrink-0 justify-end">
|
||||||
|
<button
|
||||||
|
class="ui-button ui-button-secondary inline-flex items-center px-2 py-1 text-xs"
|
||||||
|
data-testid="copy-output-button"
|
||||||
|
type="button"
|
||||||
|
phx-click="copy_output"
|
||||||
|
>
|
||||||
|
<%= dgettext("ui", "Copy") %>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<div class="output-list flex flex-col gap-2">
|
<div class="output-list flex flex-col gap-2">
|
||||||
<%= for entry <- @output_entries do %>
|
<%= for entry <- @output_entries do %>
|
||||||
<div class={[
|
<div class={[
|
||||||
|
|||||||
@@ -206,11 +206,17 @@ defmodule BDS.Desktop.ShellLive.ScriptEditor do
|
|||||||
%Script{} = script ->
|
%Script{} = script ->
|
||||||
draft = current_draft(socket.assigns, script)
|
draft = current_draft(socket.assigns, script)
|
||||||
|
|
||||||
|
# The sandbox runs in its own process, so streamed script output is
|
||||||
|
# routed back to this LiveView explicitly.
|
||||||
|
live_view = self()
|
||||||
|
title = dgettext("ui", "Scripts")
|
||||||
|
|
||||||
case Scripting.execute_project_script(
|
case Scripting.execute_project_script(
|
||||||
script.project_id,
|
script.project_id,
|
||||||
draft["content"] || "",
|
draft["content"] || "",
|
||||||
draft["entrypoint"] || "main",
|
draft["entrypoint"] || "main",
|
||||||
[]
|
[],
|
||||||
|
on_output: fn text -> Notify.output_to(live_view, title, text, nil, "info") end
|
||||||
) do
|
) do
|
||||||
{:ok, result} ->
|
{:ok, result} ->
|
||||||
notify_output(socket, dgettext("ui", "Scripts"), inspect(result))
|
notify_output(socket, dgettext("ui", "Scripts"), inspect(result))
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ defmodule BDS.Embeddings.Backends.Neural do
|
|||||||
* Everywhere else — and as a fallback when EMLX is unavailable or explicitly
|
* Everywhere else — and as a fallback when EMLX is unavailable or explicitly
|
||||||
disabled — it runs on optimised native CPU via XLA (`compiler: EXLA`).
|
disabled — it runs on optimised native CPU via XLA (`compiler: EXLA`).
|
||||||
|
|
||||||
|
Packaged releases contain only the backend that can run on their platform
|
||||||
|
(`runtime:` conditional deps in mix.exs): macOS releases ship EMLX and no
|
||||||
|
EXLA, Linux/Windows ship EXLA and no EMLX (MLX is Apple-only). The selected
|
||||||
|
backend is therefore started on demand here, never assumed at boot.
|
||||||
|
|
||||||
The accelerator can be pinned with `config :bds, :embeddings, accelerator:`
|
The accelerator can be pinned with `config :bds, :embeddings, accelerator:`
|
||||||
to `:auto` (default), `:emlx`, or `:exla`.
|
to `:auto` (default), `:emlx`, or `:exla`.
|
||||||
"""
|
"""
|
||||||
@@ -171,7 +176,20 @@ defmodule BDS.Embeddings.Backends.Neural do
|
|||||||
@doc false
|
@doc false
|
||||||
@spec current_accelerator() :: :emlx | :exla
|
@spec current_accelerator() :: :emlx | :exla
|
||||||
def current_accelerator do
|
def current_accelerator do
|
||||||
select_accelerator(configured_accelerator(), emlx_available?(), apple_silicon?())
|
case select_accelerator(
|
||||||
|
configured_accelerator(),
|
||||||
|
emlx_available?(),
|
||||||
|
exla_available?(),
|
||||||
|
apple_silicon?()
|
||||||
|
) do
|
||||||
|
:none ->
|
||||||
|
raise RuntimeError,
|
||||||
|
"no embeddings accelerator available: neither the EMLX (Apple GPU) nor the " <>
|
||||||
|
"EXLA (CPU) application could be started on this machine"
|
||||||
|
|
||||||
|
accelerator ->
|
||||||
|
accelerator
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
@@ -179,22 +197,43 @@ defmodule BDS.Embeddings.Backends.Neural do
|
|||||||
|
|
||||||
Prefer the Apple GPU (EMLX) under `:auto` only when it is both available and
|
Prefer the Apple GPU (EMLX) under `:auto` only when it is both available and
|
||||||
running on Apple Silicon; honour an explicit `:emlx`/`:exla` request, but
|
running on Apple Silicon; honour an explicit `:emlx`/`:exla` request, but
|
||||||
degrade a forced `:emlx` to EXLA when EMLX is not loaded so a misconfigured
|
degrade to the other backend when the requested one is not available so a
|
||||||
host still gets working CPU inference instead of crashing.
|
misconfigured host still gets working inference instead of crashing. Only
|
||||||
|
one backend ships per platform (macOS releases exclude EXLA, Linux/Windows
|
||||||
|
exclude EMLX), so the unavailable side is the norm in production, not an
|
||||||
|
edge case.
|
||||||
"""
|
"""
|
||||||
@spec select_accelerator(:auto | :emlx | :exla, boolean(), boolean()) :: :emlx | :exla
|
@spec select_accelerator(:auto | :emlx | :exla, boolean(), boolean(), boolean()) ::
|
||||||
def select_accelerator(:exla, _emlx_available?, _apple_silicon?), do: :exla
|
:emlx | :exla | :none
|
||||||
def select_accelerator(:emlx, true, _apple_silicon?), do: :emlx
|
def select_accelerator(_configured, false, false, _apple_silicon?), do: :none
|
||||||
def select_accelerator(:emlx, false, _apple_silicon?), do: :exla
|
def select_accelerator(:exla, _emlx?, true, _apple_silicon?), do: :exla
|
||||||
def select_accelerator(:auto, true, true), do: :emlx
|
def select_accelerator(:exla, true, false, _apple_silicon?), do: :emlx
|
||||||
def select_accelerator(:auto, _emlx_available?, _apple_silicon?), do: :exla
|
def select_accelerator(:emlx, true, _exla?, _apple_silicon?), do: :emlx
|
||||||
|
def select_accelerator(:emlx, false, true, _apple_silicon?), do: :exla
|
||||||
|
def select_accelerator(:auto, true, _exla?, true), do: :emlx
|
||||||
|
def select_accelerator(:auto, _emlx?, true, _apple_silicon?), do: :exla
|
||||||
|
def select_accelerator(:auto, true, false, _apple_silicon?), do: :emlx
|
||||||
|
|
||||||
defp configured_accelerator do
|
defp configured_accelerator do
|
||||||
config() |> Keyword.get(:accelerator, @default_accelerator)
|
config() |> Keyword.get(:accelerator, @default_accelerator)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# The backend apps are runtime: false deps on the platforms that can't run
|
||||||
|
# them, so releases exclude one of them entirely and neither is auto-started
|
||||||
|
# in dev/test. Availability therefore means "the app actually starts here":
|
||||||
|
# ensure_all_started errors when the app is absent (or its NIF can't load).
|
||||||
|
# Starting the app is also exactly what the chosen backend needs before
|
||||||
|
# building the serving.
|
||||||
defp emlx_available? do
|
defp emlx_available? do
|
||||||
Code.ensure_loaded?(EMLX) and Code.ensure_loaded?(EMLX.Backend)
|
started?(:emlx) and Code.ensure_loaded?(EMLX.Backend)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp exla_available? do
|
||||||
|
started?(:exla)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp started?(app) do
|
||||||
|
match?({:ok, _apps}, Application.ensure_all_started(app))
|
||||||
end
|
end
|
||||||
|
|
||||||
defp apple_silicon? do
|
defp apple_silicon? do
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ defmodule BDS.Generation do
|
|||||||
|
|
||||||
build_core_outputs(
|
build_core_outputs(
|
||||||
plan,
|
plan,
|
||||||
data.published_list_posts,
|
render_data.main_list_posts,
|
||||||
render_data.localized_list_posts_by_language,
|
render_data.localized_list_posts_by_language,
|
||||||
on_output
|
on_output
|
||||||
) ++
|
) ++
|
||||||
@@ -274,7 +274,7 @@ defmodule BDS.Generation do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp full_localized_archive_outputs(plan, render_data, builder) do
|
defp full_localized_archive_outputs(plan, render_data, builder) do
|
||||||
main_outputs = builder.(plan, render_data.data.post_index, [plan.language])
|
main_outputs = builder.(plan, render_data.main_post_index, [plan.language])
|
||||||
|
|
||||||
language_outputs =
|
language_outputs =
|
||||||
Enum.flat_map(additional_languages(plan), fn language ->
|
Enum.flat_map(additional_languages(plan), fn language ->
|
||||||
@@ -286,11 +286,8 @@ defmodule BDS.Generation do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp core_sitemap_outputs(plan, data) do
|
defp core_sitemap_outputs(plan, data) do
|
||||||
published_route_posts =
|
|
||||||
suppress_subtree_translation_variants(data.published_route_posts, additional_languages(plan))
|
|
||||||
|
|
||||||
{_sitemap_content, sitemap_to_write, _expected_paths, _timestamp_checks} =
|
{_sitemap_content, sitemap_to_write, _expected_paths, _timestamp_checks} =
|
||||||
build_validation_sitemap_artifacts(plan, data, published_route_posts, %{}, nil)
|
build_validation_sitemap_artifacts(plan, data, data.published_posts, %{}, nil)
|
||||||
|
|
||||||
[{"sitemap.xml", sitemap_to_write}]
|
[{"sitemap.xml", sitemap_to_write}]
|
||||||
end
|
end
|
||||||
@@ -321,17 +318,13 @@ defmodule BDS.Generation do
|
|||||||
|
|
||||||
{:ok, generated_files_list} = list_generated_files(project_id)
|
{:ok, generated_files_list} = list_generated_files(project_id)
|
||||||
generated_file_updated_at = generated_file_updated_at_map(generated_files_list)
|
generated_file_updated_at = generated_file_updated_at_map(generated_files_list)
|
||||||
additional_languages = additional_languages(plan)
|
|
||||||
|
|
||||||
published_route_posts =
|
|
||||||
suppress_subtree_translation_variants(data.published_route_posts, additional_languages)
|
|
||||||
|
|
||||||
{sitemap_content, sitemap_to_write, additional_expected_paths,
|
{sitemap_content, sitemap_to_write, additional_expected_paths,
|
||||||
additional_post_timestamp_checks} =
|
additional_post_timestamp_checks} =
|
||||||
build_validation_sitemap_artifacts(
|
build_validation_sitemap_artifacts(
|
||||||
plan,
|
plan,
|
||||||
data,
|
data,
|
||||||
published_route_posts,
|
data.published_posts,
|
||||||
generated_file_updated_at,
|
generated_file_updated_at,
|
||||||
on_progress
|
on_progress
|
||||||
)
|
)
|
||||||
@@ -350,7 +343,7 @@ defmodule BDS.Generation do
|
|||||||
post_timestamp_checks:
|
post_timestamp_checks:
|
||||||
build_post_timestamp_checks(
|
build_post_timestamp_checks(
|
||||||
data.project_data_dir,
|
data.project_data_dir,
|
||||||
published_route_posts,
|
data.published_posts,
|
||||||
generated_file_updated_at
|
generated_file_updated_at
|
||||||
) ++ additional_post_timestamp_checks,
|
) ++ additional_post_timestamp_checks,
|
||||||
additional_expected_paths: additional_expected_paths
|
additional_expected_paths: additional_expected_paths
|
||||||
@@ -647,53 +640,15 @@ defmodule BDS.Generation do
|
|||||||
|
|
||||||
defp build_outputs(plan, on_output \\ nil) do
|
defp build_outputs(plan, on_output \\ nil) do
|
||||||
plan = with_render_context(plan)
|
plan = with_render_context(plan)
|
||||||
data = generation_data(plan)
|
render_data = validation_render_data(plan)
|
||||||
published_translations = flattened_generation_translations(data.translations_by_post)
|
data = render_data.data
|
||||||
translations_by_post_language = translation_lookup_map(published_translations)
|
|
||||||
|
|
||||||
translatable_published_posts =
|
|
||||||
Enum.reject(data.published_posts, &truthy_flag?(Map.get(&1, :do_not_translate)))
|
|
||||||
|
|
||||||
translatable_published_list_posts =
|
|
||||||
Enum.reject(data.published_list_posts, &truthy_flag?(Map.get(&1, :do_not_translate)))
|
|
||||||
|
|
||||||
localized_posts_by_language =
|
|
||||||
additional_languages(plan)
|
|
||||||
|> Enum.map(fn language ->
|
|
||||||
{language,
|
|
||||||
resolve_posts_for_language(
|
|
||||||
translatable_published_posts,
|
|
||||||
language,
|
|
||||||
translations_by_post_language,
|
|
||||||
plan.language
|
|
||||||
)}
|
|
||||||
end)
|
|
||||||
|> Map.new()
|
|
||||||
|
|
||||||
localized_list_posts_by_language =
|
|
||||||
additional_languages(plan)
|
|
||||||
|> Enum.map(fn language ->
|
|
||||||
{language,
|
|
||||||
resolve_posts_for_language(
|
|
||||||
translatable_published_list_posts,
|
|
||||||
language,
|
|
||||||
translations_by_post_language,
|
|
||||||
plan.language
|
|
||||||
)}
|
|
||||||
end)
|
|
||||||
|> Map.new()
|
|
||||||
|
|
||||||
localized_post_indexes =
|
|
||||||
localized_list_posts_by_language
|
|
||||||
|> Enum.map(fn {language, posts} -> {language, build_generation_post_index(posts)} end)
|
|
||||||
|> Map.new()
|
|
||||||
|
|
||||||
core_outputs =
|
core_outputs =
|
||||||
if :core in plan.sections do
|
if :core in plan.sections do
|
||||||
build_core_outputs(
|
build_core_outputs(
|
||||||
plan,
|
plan,
|
||||||
data.published_list_posts,
|
render_data.main_list_posts,
|
||||||
localized_list_posts_by_language,
|
render_data.localized_list_posts_by_language,
|
||||||
on_output
|
on_output
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
@@ -706,8 +661,8 @@ defmodule BDS.Generation do
|
|||||||
plan_render_target(plan),
|
plan_render_target(plan),
|
||||||
plan.language,
|
plan.language,
|
||||||
data.published_posts,
|
data.published_posts,
|
||||||
translations_by_post_language,
|
render_data.translations_by_post_language,
|
||||||
localized_posts_by_language,
|
render_data.localized_posts_by_language,
|
||||||
on_output
|
on_output
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
@@ -720,8 +675,8 @@ defmodule BDS.Generation do
|
|||||||
plan_render_target(plan),
|
plan_render_target(plan),
|
||||||
plan.language,
|
plan.language,
|
||||||
data.published_posts,
|
data.published_posts,
|
||||||
translations_by_post_language,
|
render_data.translations_by_post_language,
|
||||||
localized_posts_by_language,
|
render_data.localized_posts_by_language,
|
||||||
on_output
|
on_output
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
@@ -729,7 +684,12 @@ defmodule BDS.Generation do
|
|||||||
end
|
end
|
||||||
|
|
||||||
archive_outputs =
|
archive_outputs =
|
||||||
build_archive_outputs(plan, data.post_index, localized_post_indexes, on_output)
|
build_archive_outputs(
|
||||||
|
plan,
|
||||||
|
render_data.main_post_index,
|
||||||
|
render_data.localized_post_indexes,
|
||||||
|
on_output
|
||||||
|
)
|
||||||
|
|
||||||
urls =
|
urls =
|
||||||
(core_outputs ++ page_outputs ++ single_outputs ++ archive_outputs)
|
(core_outputs ++ page_outputs ++ single_outputs ++ archive_outputs)
|
||||||
@@ -770,14 +730,14 @@ defmodule BDS.Generation do
|
|||||||
defp build_validation_sitemap_artifacts(
|
defp build_validation_sitemap_artifacts(
|
||||||
plan,
|
plan,
|
||||||
data,
|
data,
|
||||||
published_route_posts,
|
published_posts,
|
||||||
generated_file_updated_at,
|
generated_file_updated_at,
|
||||||
on_progress
|
on_progress
|
||||||
) do
|
) do
|
||||||
main_paths =
|
main_paths =
|
||||||
build_validation_route_paths(
|
build_validation_route_paths(
|
||||||
plan,
|
plan,
|
||||||
published_route_posts,
|
published_posts,
|
||||||
data.published_list_posts,
|
data.published_list_posts,
|
||||||
data.post_index,
|
data.post_index,
|
||||||
nil
|
nil
|
||||||
@@ -1111,12 +1071,26 @@ defmodule BDS.Generation do
|
|||||||
{language, build_generation_post_index(posts)}
|
{language, build_generation_post_index(posts)}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
# Main-language lists must show the main-language translation of a
|
||||||
|
# foreign-language post when one exists, mirroring the canonical variant
|
||||||
|
# lookup single-page renders do. Resolved here (not in generation_data)
|
||||||
|
# because subtree resolution above needs the raw posts' ids intact.
|
||||||
|
main_list_posts =
|
||||||
|
resolve_posts_for_language(
|
||||||
|
data.published_list_posts,
|
||||||
|
plan.language,
|
||||||
|
translations_by_post_language,
|
||||||
|
plan.language
|
||||||
|
)
|
||||||
|
|
||||||
%{
|
%{
|
||||||
data: data,
|
data: data,
|
||||||
translations_by_post_language: translations_by_post_language,
|
translations_by_post_language: translations_by_post_language,
|
||||||
localized_posts_by_language: localized_posts_by_language,
|
localized_posts_by_language: localized_posts_by_language,
|
||||||
localized_list_posts_by_language: localized_list_posts_by_language,
|
localized_list_posts_by_language: localized_list_posts_by_language,
|
||||||
localized_post_indexes: localized_post_indexes
|
localized_post_indexes: localized_post_indexes,
|
||||||
|
main_list_posts: main_list_posts,
|
||||||
|
main_post_index: build_generation_post_index(main_list_posts)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1125,7 +1099,7 @@ defmodule BDS.Generation do
|
|||||||
|
|
||||||
main_root =
|
main_root =
|
||||||
if targeted_plan.request_root_routes do
|
if targeted_plan.request_root_routes do
|
||||||
posts = build_list_posts(plan, data.published_list_posts, nil)
|
posts = build_list_posts(plan, render_data.main_list_posts, nil)
|
||||||
build_root_outputs(plan, plan.language, posts)
|
build_root_outputs(plan, plan.language, posts)
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
@@ -1228,7 +1202,7 @@ defmodule BDS.Generation do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp build_targeted_archive_outputs(plan, render_data, targeted_plan, builder) do
|
defp build_targeted_archive_outputs(plan, render_data, targeted_plan, builder) do
|
||||||
main_outputs = builder.(plan, render_data.data.post_index, targeted_plan, [plan.language])
|
main_outputs = builder.(plan, render_data.main_post_index, targeted_plan, [plan.language])
|
||||||
|
|
||||||
language_outputs =
|
language_outputs =
|
||||||
Enum.flat_map(additional_languages(plan), fn language ->
|
Enum.flat_map(additional_languages(plan), fn language ->
|
||||||
|
|||||||
@@ -74,8 +74,8 @@ defmodule BDS.Generation.Data do
|
|||||||
|> Enum.uniq_by(& &1.id)
|
|> Enum.uniq_by(& &1.id)
|
||||||
|> Enum.sort_by(&{-(&1.created_at || 0), -(&1.published_at || 0), to_string(&1.slug)})
|
|> Enum.sort_by(&{-(&1.created_at || 0), -(&1.published_at || 0), to_string(&1.slug)})
|
||||||
|
|
||||||
{published_route_posts, translations_by_post} =
|
translations_by_post =
|
||||||
build_generation_route_posts(
|
build_generation_translations(
|
||||||
plan.project_id,
|
plan.project_id,
|
||||||
project_data_dir,
|
project_data_dir,
|
||||||
published_posts,
|
published_posts,
|
||||||
@@ -87,7 +87,6 @@ defmodule BDS.Generation.Data do
|
|||||||
project_data_dir: project_data_dir,
|
project_data_dir: project_data_dir,
|
||||||
published_posts: published_posts,
|
published_posts: published_posts,
|
||||||
published_list_posts: published_list_posts,
|
published_list_posts: published_list_posts,
|
||||||
published_route_posts: published_route_posts,
|
|
||||||
translations_by_post: translations_by_post,
|
translations_by_post: translations_by_post,
|
||||||
post_index: build_generation_post_index(published_list_posts)
|
post_index: build_generation_post_index(published_list_posts)
|
||||||
}
|
}
|
||||||
@@ -121,14 +120,9 @@ defmodule BDS.Generation.Data do
|
|||||||
post_language = String.downcase(to_string(post.language || ""))
|
post_language = String.downcase(to_string(post.language || ""))
|
||||||
effective_language = if post_language == "", do: main, else: post_language
|
effective_language = if post_language == "", do: main, else: post_language
|
||||||
|
|
||||||
cond do
|
if effective_language == target do
|
||||||
is_binary(Map.get(post, :translation_source_slug)) ->
|
|
||||||
post
|
post
|
||||||
|
else
|
||||||
effective_language == target ->
|
|
||||||
post
|
|
||||||
|
|
||||||
true ->
|
|
||||||
case Map.get(translations_by_post_language, {post.id, target_language}) do
|
case Map.get(translations_by_post_language, {post.id, target_language}) do
|
||||||
nil -> post
|
nil -> post
|
||||||
translation -> build_localized_subtree_variant(post, translation)
|
translation -> build_localized_subtree_variant(post, translation)
|
||||||
@@ -231,7 +225,7 @@ defmodule BDS.Generation.Data do
|
|||||||
read_snapshot(full_path, fallback_post, &build_post_snapshot/2)
|
read_snapshot(full_path, fallback_post, &build_post_snapshot/2)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp build_generation_route_posts(
|
defp build_generation_translations(
|
||||||
project_id,
|
project_id,
|
||||||
project_data_dir,
|
project_data_dir,
|
||||||
published_posts,
|
published_posts,
|
||||||
@@ -268,17 +262,7 @@ defmodule BDS.Generation.Data do
|
|||||||
end)
|
end)
|
||||||
|> Map.new(fn {post_id, translations} -> {post_id, Enum.reverse(translations)} end)
|
|> Map.new(fn {post_id, translations} -> {post_id, Enum.reverse(translations)} end)
|
||||||
|
|
||||||
route_posts =
|
|
||||||
Enum.flat_map(published_posts, fn post ->
|
|
||||||
variants =
|
|
||||||
translations_by_post
|
translations_by_post
|
||||||
|> Map.get(post.id, [])
|
|
||||||
|> Enum.map(&build_published_translation_variant(post, &1))
|
|
||||||
|
|
||||||
[post | variants]
|
|
||||||
end)
|
|
||||||
|
|
||||||
{route_posts, translations_by_post}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp published_translation_snapshot(project_data_dir, %Translation{} = translation) do
|
defp published_translation_snapshot(project_data_dir, %Translation{} = translation) do
|
||||||
@@ -357,31 +341,6 @@ defmodule BDS.Generation.Data do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp build_published_translation_variant(post, translation) do
|
|
||||||
%{
|
|
||||||
id: translation.id,
|
|
||||||
project_id: post.project_id,
|
|
||||||
title: translation.title,
|
|
||||||
slug: "#{post.slug}.#{translation.language}",
|
|
||||||
excerpt: translation.excerpt,
|
|
||||||
content: nil,
|
|
||||||
status: :published,
|
|
||||||
author: post.author,
|
|
||||||
created_at: post.created_at,
|
|
||||||
updated_at: translation.updated_at,
|
|
||||||
published_at: translation.published_at || post.published_at,
|
|
||||||
file_path: translation.file_path,
|
|
||||||
tags: post.tags,
|
|
||||||
categories: post.categories,
|
|
||||||
template_slug: post.template_slug,
|
|
||||||
language: translation.language,
|
|
||||||
do_not_translate: post.do_not_translate,
|
|
||||||
translation_source_slug: post.slug,
|
|
||||||
translation_canonical_language: post.language,
|
|
||||||
translation_file_path: translation.file_path
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
defp build_localized_subtree_variant(post, translation) do
|
defp build_localized_subtree_variant(post, translation) do
|
||||||
%{
|
%{
|
||||||
post
|
post
|
||||||
|
|||||||
@@ -22,16 +22,6 @@ defmodule BDS.Generation.Outputs do
|
|||||||
def route_post_output_path(post, ""), do: post_output_path(post)
|
def route_post_output_path(post, ""), do: post_output_path(post)
|
||||||
def route_post_output_path(post, route_language), do: post_output_path(post, route_language)
|
def route_post_output_path(post, route_language), do: post_output_path(post, route_language)
|
||||||
|
|
||||||
@spec suppress_subtree_translation_variants([map()], [String.t()]) :: [map()]
|
|
||||||
def suppress_subtree_translation_variants(route_posts, additional_languages) do
|
|
||||||
subtree_languages = MapSet.new(additional_languages)
|
|
||||||
|
|
||||||
Enum.reject(route_posts, fn post ->
|
|
||||||
is_binary(Map.get(post, :translation_source_slug)) and
|
|
||||||
MapSet.member?(subtree_languages, to_string(post.language))
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec build_validation_route_paths(map(), [map()], [map()], map(), String.t() | nil) :: [
|
@spec build_validation_route_paths(map(), [map()], [map()], map(), String.t() | nil) :: [
|
||||||
String.t()
|
String.t()
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -28,15 +28,15 @@ defmodule BDS.Generation.Validation do
|
|||||||
@spec build_post_timestamp_checks(String.t(), [map()], map()) :: [map()]
|
@spec build_post_timestamp_checks(String.t(), [map()], map()) :: [map()]
|
||||||
def build_post_timestamp_checks(
|
def build_post_timestamp_checks(
|
||||||
project_data_dir,
|
project_data_dir,
|
||||||
published_route_posts,
|
published_posts,
|
||||||
generated_file_updated_at
|
generated_file_updated_at
|
||||||
) do
|
) do
|
||||||
build_timestamp_checks(
|
build_timestamp_checks(
|
||||||
project_data_dir,
|
project_data_dir,
|
||||||
published_route_posts,
|
published_posts,
|
||||||
generated_file_updated_at,
|
generated_file_updated_at,
|
||||||
&BDS.Generation.Paths.post_output_path/1,
|
&BDS.Generation.Paths.post_output_path/1,
|
||||||
fn post -> Map.get(post, :translation_file_path) || post.file_path end
|
& &1.file_path
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ defmodule BDS.MacBundle do
|
|||||||
frameworks = Path.join(contents, "Frameworks")
|
frameworks = Path.join(contents, "Frameworks")
|
||||||
rel = Path.join(resources, "rel")
|
rel = Path.join(resources, "rel")
|
||||||
|
|
||||||
|
# Validate before rm_rf! so a refused build leaves any previous bundle intact.
|
||||||
|
with :ok <- BDS.ReleasePackaging.validate_release_source(release_dir) do
|
||||||
File.rm_rf!(app)
|
File.rm_rf!(app)
|
||||||
Enum.each([macos, resources, frameworks], &File.mkdir_p!/1)
|
Enum.each([macos, resources, frameworks], &File.mkdir_p!/1)
|
||||||
|
|
||||||
@@ -83,6 +85,7 @@ defmodule BDS.MacBundle do
|
|||||||
{:ok, app}
|
{:ok, app}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# The main executable must be a real arm64 Mach-O, not a shell script — a
|
# The main executable must be a real arm64 Mach-O, not a shell script — a
|
||||||
# script has no Mach-O slices, so LaunchServices advertises x86_64 and offers
|
# script has no Mach-O slices, so LaunchServices advertises x86_64 and offers
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ defmodule BDS.ReleasePackaging do
|
|||||||
app_release_source = Keyword.fetch!(opts, :app_release_source)
|
app_release_source = Keyword.fetch!(opts, :app_release_source)
|
||||||
mcp_release_source = Keyword.fetch!(opts, :mcp_release_source)
|
mcp_release_source = Keyword.fetch!(opts, :mcp_release_source)
|
||||||
|
|
||||||
with :ok <- reset_output(metadata),
|
with :ok <- validate_release_source(app_release_source),
|
||||||
|
:ok <- reset_output(metadata),
|
||||||
:ok <- copy_release(app_release_source, metadata.app_root),
|
:ok <- copy_release(app_release_source, metadata.app_root),
|
||||||
:ok <- copy_release(mcp_release_source, metadata.resources_root),
|
:ok <- copy_release(mcp_release_source, metadata.resources_root),
|
||||||
:ok <- write_manifest(metadata),
|
:ok <- write_manifest(metadata),
|
||||||
@@ -65,6 +66,20 @@ defmodule BDS.ReleasePackaging do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Rejects half-assembled releases. A failed `mix release` run can leave `lib/`
|
||||||
|
copied but no `releases/<version>/` (no `env.sh`, no boot scripts) — packaging
|
||||||
|
that produces an app that dies on launch. Refuse it up front instead.
|
||||||
|
"""
|
||||||
|
def validate_release_source(release_dir) do
|
||||||
|
if release_dir |> Path.join("releases/*/env.sh") |> Path.wildcard() == [] do
|
||||||
|
{:error,
|
||||||
|
{:incomplete_release, "#{release_dir} has no releases/*/env.sh — did `mix release` fail?"}}
|
||||||
|
else
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp normalize_platform(platform) when platform in [:macos, :linux, :windows], do: platform
|
defp normalize_platform(platform) when platform in [:macos, :linux, :windows], do: platform
|
||||||
defp normalize_platform(:darwin), do: :macos
|
defp normalize_platform(:darwin), do: :macos
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,14 @@ defmodule BDS.Scripting.ApiDocs do
|
|||||||
params: [],
|
params: [],
|
||||||
returns: "table | nil"
|
returns: "table | nil"
|
||||||
},
|
},
|
||||||
|
%{
|
||||||
|
module: "app",
|
||||||
|
name: "log",
|
||||||
|
description:
|
||||||
|
"Append a line to the script output stream. Multiple arguments are joined with spaces. Output appears in the desktop app's Output panel (and on stdout in the CLI); Lua's global `print` is routed the same way.",
|
||||||
|
params: [%{name: "text", type: "string", required: true}],
|
||||||
|
returns: "boolean"
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
module: "app",
|
module: "app",
|
||||||
name: "notify_renderer_ready",
|
name: "notify_renderer_ready",
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ defmodule BDS.Scripting.Capabilities do
|
|||||||
get_system_language: zero_or_one_arg(fn _args -> I18n.current_ui_locale() end),
|
get_system_language: zero_or_one_arg(fn _args -> I18n.current_ui_locale() end),
|
||||||
get_default_project_path: zero_or_one_arg(fn _args -> project_path(project_id) end),
|
get_default_project_path: zero_or_one_arg(fn _args -> project_path(project_id) end),
|
||||||
get_title_bar_metrics: zero_or_one_arg(fn _args -> title_bar_metrics(opts) end),
|
get_title_bar_metrics: zero_or_one_arg(fn _args -> title_bar_metrics(opts) end),
|
||||||
|
log: BDS.Scripting.Lua.output_function(opts, [true]),
|
||||||
notify_renderer_ready: zero_or_one_arg(fn _args -> notify_renderer_ready(opts) end),
|
notify_renderer_ready: zero_or_one_arg(fn _args -> notify_renderer_ready(opts) end),
|
||||||
open_folder: one_arg(fn folder_path -> open_folder(folder_path, opts) end),
|
open_folder: one_arg(fn folder_path -> open_folder(folder_path, opts) end),
|
||||||
read_project_metadata: one_arg(fn folder_path -> read_project_metadata(folder_path) end),
|
read_project_metadata: one_arg(fn folder_path -> read_project_metadata(folder_path) end),
|
||||||
|
|||||||
@@ -6,16 +6,20 @@ defmodule BDS.Scripting.Lua do
|
|||||||
and opt-in.
|
and opt-in.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
@type source :: String.t()
|
@type source :: String.t()
|
||||||
@type entrypoint :: String.t()
|
@type entrypoint :: String.t()
|
||||||
@type args :: [term()]
|
@type args :: [term()]
|
||||||
@type progress_event :: map()
|
@type progress_event :: map()
|
||||||
@type progress_callback :: (progress_event() -> any())
|
@type progress_callback :: (progress_event() -> any())
|
||||||
|
@type output_callback :: (String.t() -> any())
|
||||||
@type execution_option ::
|
@type execution_option ::
|
||||||
{:timeout, non_neg_integer() | :infinity}
|
{:timeout, non_neg_integer() | :infinity}
|
||||||
| {:max_reductions, pos_integer() | :none}
|
| {:max_reductions, pos_integer() | :none}
|
||||||
| {:spawn_opts, [term()]}
|
| {:spawn_opts, [term()]}
|
||||||
| {:on_progress, progress_callback()}
|
| {:on_progress, progress_callback()}
|
||||||
|
| {:on_output, output_callback()}
|
||||||
| {:capabilities, map()}
|
| {:capabilities, map()}
|
||||||
|
|
||||||
@callback validate(source()) :: :ok | {:error, term()}
|
@callback validate(source()) :: :ok | {:error, term()}
|
||||||
@@ -48,12 +52,65 @@ defmodule BDS.Scripting.Lua do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns the sink script output (`print`, `bds.app.log`) is routed to: the
|
||||||
|
`:on_output` callback when given, otherwise a Logger-based default so script
|
||||||
|
output never leaks onto the console (where it would corrupt the TUI).
|
||||||
|
"""
|
||||||
|
@spec output_sink(keyword()) :: output_callback()
|
||||||
|
def output_sink(opts) when is_list(opts) do
|
||||||
|
case Keyword.get(opts, :on_output) do
|
||||||
|
callback when is_function(callback, 1) ->
|
||||||
|
callback
|
||||||
|
|
||||||
|
_other ->
|
||||||
|
fn text -> Logger.debug("script output: #{text}") end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Builds the Lua-callable function shared by the global `print` override and
|
||||||
|
the `bds.app.log` capability: joins all arguments with spaces and forwards
|
||||||
|
the line to the output sink.
|
||||||
|
"""
|
||||||
|
@spec output_function(keyword(), [term()]) :: (list(), lua_state() -> {list(), lua_state()})
|
||||||
|
def output_function(opts, return_values \\ []) when is_list(opts) and is_list(return_values) do
|
||||||
|
sink = output_sink(opts)
|
||||||
|
|
||||||
|
fn args, current_state ->
|
||||||
|
line =
|
||||||
|
args
|
||||||
|
|> :luerl.decode_list(current_state)
|
||||||
|
|> Enum.map_join(" ", &format_lua_value/1)
|
||||||
|
|
||||||
|
sink.(line)
|
||||||
|
:luerl.encode_list(return_values, current_state)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "Formats a decoded Lua value the way Lua's `tostring` would present it."
|
||||||
|
@spec format_lua_value(term()) :: String.t()
|
||||||
|
def format_lua_value(nil), do: "nil"
|
||||||
|
def format_lua_value(true), do: "true"
|
||||||
|
def format_lua_value(false), do: "false"
|
||||||
|
def format_lua_value(value) when is_binary(value), do: value
|
||||||
|
|
||||||
|
def format_lua_value(value) when is_float(value) do
|
||||||
|
if Float.round(value, 0) == value,
|
||||||
|
do: "#{trunc(value)}.0",
|
||||||
|
else: to_string(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
def format_lua_value(value) when is_integer(value), do: Integer.to_string(value)
|
||||||
|
def format_lua_value(value), do: inspect(value)
|
||||||
|
|
||||||
defp initial_state(opts) do
|
defp initial_state(opts) do
|
||||||
state = :luerl_sandbox.init()
|
state = :luerl_sandbox.init()
|
||||||
capabilities = Keyword.get(opts, :capabilities, %{})
|
capabilities = Keyword.get(opts, :capabilities, %{})
|
||||||
|
|
||||||
with {:ok, state} <- :luerl.set_table_keys_dec(["bds"], %{}, state),
|
with {:ok, state} <- :luerl.set_table_keys_dec(["bds"], %{}, state),
|
||||||
{:ok, state} <- install_progress_callback(state, Keyword.get(opts, :on_progress)),
|
{:ok, state} <- install_progress_callback(state, Keyword.get(opts, :on_progress)),
|
||||||
|
{:ok, state} <- install_print_override(state, opts),
|
||||||
{:ok, state} <- install_capabilities(state, capabilities) do
|
{:ok, state} <- install_capabilities(state, capabilities) do
|
||||||
{:ok, state}
|
{:ok, state}
|
||||||
end
|
end
|
||||||
@@ -85,6 +142,15 @@ defmodule BDS.Scripting.Lua do
|
|||||||
defp install_progress_callback(_state, callback),
|
defp install_progress_callback(_state, callback),
|
||||||
do: {:error, {:invalid_progress_callback, callback}}
|
do: {:error, {:invalid_progress_callback, callback}}
|
||||||
|
|
||||||
|
# Replaces the built-in `print` (which would write straight to the BEAM
|
||||||
|
# console) with a function routed to the output sink.
|
||||||
|
defp install_print_override(state, opts) do
|
||||||
|
case :luerl.set_table_keys_dec(["print"], output_function(opts), state) do
|
||||||
|
{:ok, next_state} -> {:ok, next_state}
|
||||||
|
error -> {:error, {:print_override_install_failed, error}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp install_capabilities(state, capabilities) when capabilities in [%{}, []], do: {:ok, state}
|
defp install_capabilities(state, capabilities) when capabilities in [%{}, []], do: {:ok, state}
|
||||||
|
|
||||||
defp install_capabilities(state, capabilities) when is_map(capabilities) do
|
defp install_capabilities(state, capabilities) when is_map(capabilities) do
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ defmodule BDS.TUI do
|
|||||||
`yyyy-mm-dd`; enter keeps the filter, esc clears it),
|
`yyyy-mm-dd`; enter keeps the filter, esc clears it),
|
||||||
`:` vi-style command prompt over the Blog-menu shell commands, `?`
|
`:` vi-style command prompt over the Blog-menu shell commands, `?`
|
||||||
command help (commands whose report/apply UI is GUI-only are marked).
|
command help (commands whose report/apply UI is GUI-only are marked).
|
||||||
Posts open in the rendered markdown preview (new empty posts open in
|
Posts open in the syntax-highlighted, word-wrapping editor. Editor
|
||||||
the editor). Editor focus: `ctrl+e` toggles preview/editor, text keys
|
focus: `ctrl+e` toggles editor/rendered-markdown preview, text keys
|
||||||
edit, `ctrl+s` save, `ctrl+p` publish, `ctrl+t` edit title, `ctrl+l`
|
edit, `ctrl+s` save, `ctrl+p` publish, `ctrl+t` edit title, `ctrl+l`
|
||||||
cycle language, `ctrl+g` AI suggestions, `esc` back to sidebar. `ctrl+q`
|
cycle language, `ctrl+g` AI suggestions, `esc` back to sidebar. `ctrl+q`
|
||||||
quits, `esc` also closes a media preview. The UI locale is the
|
quits, `esc` also closes a media preview. The UI locale is the
|
||||||
@@ -42,6 +42,7 @@ defmodule BDS.TUI do
|
|||||||
alias BDS.Git
|
alias BDS.Git
|
||||||
alias BDS.Posts
|
alias BDS.Posts
|
||||||
alias BDS.Projects
|
alias BDS.Projects
|
||||||
|
alias BDS.UI.CodeEditor
|
||||||
alias BDS.UI.PostEditor.{Draft, Metadata, Persistence}
|
alias BDS.UI.PostEditor.{Draft, Metadata, Persistence}
|
||||||
alias BDS.UI.SettingsForm
|
alias BDS.UI.SettingsForm
|
||||||
alias BDS.UI.Sidebar
|
alias BDS.UI.Sidebar
|
||||||
@@ -49,7 +50,7 @@ defmodule BDS.TUI do
|
|||||||
alias ExRatatui.Layout
|
alias ExRatatui.Layout
|
||||||
alias ExRatatui.Layout.Rect
|
alias ExRatatui.Layout.Rect
|
||||||
alias ExRatatui.Style
|
alias ExRatatui.Style
|
||||||
alias ExRatatui.Widgets.{Block, Clear, List, Markdown, Paragraph, Tabs, Textarea}
|
alias ExRatatui.Widgets.{Block, Clear, List, Markdown, Paragraph, Tabs}
|
||||||
|
|
||||||
@views ~w(posts media templates scripts tags settings git)
|
@views ~w(posts media templates scripts tags settings git)
|
||||||
@git_diff_scroll_step 10
|
@git_diff_scroll_step 10
|
||||||
@@ -230,8 +231,7 @@ defmodule BDS.TUI do
|
|||||||
when is_binary(project_id) do
|
when is_binary(project_id) do
|
||||||
case Posts.create_post(%{project_id: project_id, title: "", content: ""}) do
|
case Posts.create_post(%{project_id: project_id, title: "", content: ""}) do
|
||||||
{:ok, post} ->
|
{:ok, post} ->
|
||||||
# A fresh, empty post starts in the editor — there is nothing to
|
# A fresh, empty post starts in the editor — like every post.
|
||||||
# preview yet; existing posts open in the preview instead.
|
|
||||||
{:noreply, state |> load_sidebar() |> open_post(post.id, false)}
|
{:noreply, state |> load_sidebar() |> open_post(post.id, false)}
|
||||||
|
|
||||||
{:error, reason} ->
|
{:error, reason} ->
|
||||||
@@ -1448,10 +1448,9 @@ defmodule BDS.TUI do
|
|||||||
[title_widget, body_widget(state, editor, body_rect)]
|
[title_widget, body_widget(state, editor, body_rect)]
|
||||||
end
|
end
|
||||||
|
|
||||||
# The editing textarea cannot soft-wrap (upstream ratatui-textarea
|
# ctrl+e flips to a word-wrapped read-only Markdown preview of the
|
||||||
# limitation), so ctrl+e flips to a word-wrapped read-only Markdown
|
# current draft; the editor itself is a syntax-highlighted, wrapping
|
||||||
# preview of the current draft. Wrap moves into the editor itself with
|
# BDS.UI.CodeEditor over the same Rust-owned textarea.
|
||||||
# the planned MarkdownEditor custom widget.
|
|
||||||
defp body_widget(_state, %{preview?: true} = editor, body_rect) do
|
defp body_widget(_state, %{preview?: true} = editor, body_rect) do
|
||||||
preview_title =
|
preview_title =
|
||||||
"#{dgettext("ui", "Preview (ctrl+e to edit)")} [#{editor.language}]"
|
"#{dgettext("ui", "Preview (ctrl+e to edit)")} [#{editor.language}]"
|
||||||
@@ -1468,14 +1467,17 @@ defmodule BDS.TUI do
|
|||||||
"#{dgettext("ui", "Content")} [#{editor.language}]" <>
|
"#{dgettext("ui", "Content")} [#{editor.language}]" <>
|
||||||
if(editor.dirty, do: " •", else: "")
|
if(editor.dirty, do: " •", else: "")
|
||||||
|
|
||||||
{%Textarea{
|
focused? = state.focus == :editor and not editor.editing_title?
|
||||||
state: editor.textarea,
|
|
||||||
|
{%CodeEditor{
|
||||||
|
textarea: editor.textarea,
|
||||||
|
language: :markdown_macros,
|
||||||
block: %Block{title: body_title, borders: [:all]},
|
block: %Block{title: body_title, borders: [:all]},
|
||||||
cursor_style:
|
cursor_style: if(focused?, do: %Style{bg: :cyan}, else: %Style{}),
|
||||||
if(state.focus == :editor and not editor.editing_title?,
|
# base16-ocean's lighter-background grey — a fixed RGB so the
|
||||||
do: %Style{bg: :cyan},
|
# current-line marker stays dark (and readable) in any terminal
|
||||||
else: %Style{}
|
# palette, unlike the named :dark_gray colour.
|
||||||
)
|
line_highlight_style: if(focused?, do: %Style{bg: {:rgb, 52, 61, 70}}, else: %Style{})
|
||||||
}, body_rect}
|
}, body_rect}
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1945,9 +1947,9 @@ defmodule BDS.TUI do
|
|||||||
|
|
||||||
# ── Post editor ──────────────────────────────────────────────────────────
|
# ── Post editor ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Posts open in the rendered markdown preview by default — the editor is
|
# Posts open in the syntax-highlighted editor by default — the rendered
|
||||||
# one ctrl+e away. New (empty) posts pass preview?: false.
|
# markdown preview is one ctrl+e away.
|
||||||
defp open_post(state, post_id, preview? \\ true) do
|
defp open_post(state, post_id, preview? \\ false) do
|
||||||
case Posts.get_post(post_id) do
|
case Posts.get_post(post_id) do
|
||||||
nil ->
|
nil ->
|
||||||
toast(state, dgettext("ui", "Posts"), dgettext("ui", "Post not found."))
|
toast(state, dgettext("ui", "Posts"), dgettext("ui", "Post not found."))
|
||||||
|
|||||||
72
lib/bds/ui/code_editor/highlight.ex
Normal file
72
lib/bds/ui/code_editor/highlight.ex
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
defmodule BDS.UI.CodeEditor.Highlight do
|
||||||
|
@moduledoc """
|
||||||
|
Syntax highlighting for the TUI code editor (issue #32).
|
||||||
|
|
||||||
|
Wraps `ExRatatui.CodeBlock.highlight/3` with the editor's language
|
||||||
|
set: base lexing via syntect, plus pure-Elixir overlays for the
|
||||||
|
syntaxes syntect does not know — post macros (`[[gallery names="x"]]`)
|
||||||
|
over the markdown base and Liquid tags (`{{ … }}` / `{% … %}`) over
|
||||||
|
the HTML base. Mirrors the GUI Monaco language registrations in
|
||||||
|
`assets/js/monaco/languages.js`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias BDS.UI.CodeEditor.Overlay
|
||||||
|
alias ExRatatui.Text.Line
|
||||||
|
alias ExRatatui.Widgets.CodeBlock
|
||||||
|
|
||||||
|
@type language :: :markdown_macros | :liquid | :lua | :text
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Highlights `content` for `language` using `theme`, returning one
|
||||||
|
`%ExRatatui.Text.Line{}` per source line.
|
||||||
|
|
||||||
|
The returned line count always matches `String.split(content, "\\n")`
|
||||||
|
(syntect drops trailing empty lines, but the textarea's line count is
|
||||||
|
authoritative for the cursor row, so they are padded back). Span
|
||||||
|
contents never contain newline characters.
|
||||||
|
"""
|
||||||
|
@spec highlight(String.t(), language(), CodeBlock.theme()) :: [Line.t()]
|
||||||
|
def highlight(content, language, theme) when is_binary(content) do
|
||||||
|
content
|
||||||
|
|> base_highlight(language, theme)
|
||||||
|
|> sanitize_lines()
|
||||||
|
|> pad_lines(source_line_count(content))
|
||||||
|
|> apply_overlay(language)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp base_highlight(content, :markdown_macros, theme),
|
||||||
|
do: ExRatatui.CodeBlock.highlight(content, "markdown", theme)
|
||||||
|
|
||||||
|
defp base_highlight(content, :liquid, theme),
|
||||||
|
do: ExRatatui.CodeBlock.highlight(content, "html", theme)
|
||||||
|
|
||||||
|
defp base_highlight(content, :lua, theme),
|
||||||
|
do: ExRatatui.CodeBlock.highlight(content, "lua", theme)
|
||||||
|
|
||||||
|
defp base_highlight(content, :text, theme),
|
||||||
|
do: ExRatatui.CodeBlock.highlight(content, nil, theme)
|
||||||
|
|
||||||
|
# syntect appends the line terminator to the last span of a line;
|
||||||
|
# spans fed to `ExRatatui.Widgets.Paragraph` must not contain "\n".
|
||||||
|
defp sanitize_lines(lines) do
|
||||||
|
Enum.map(lines, fn %Line{spans: spans} = line ->
|
||||||
|
spans =
|
||||||
|
spans
|
||||||
|
|> Enum.map(&%{&1 | content: String.replace(&1.content, ~r/[\r\n]/, "")})
|
||||||
|
|> Enum.reject(&(&1.content == ""))
|
||||||
|
|
||||||
|
%{line | spans: spans}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp source_line_count(content), do: content |> String.split("\n") |> length()
|
||||||
|
|
||||||
|
defp pad_lines(lines, count) when length(lines) >= count, do: lines
|
||||||
|
|
||||||
|
defp pad_lines(lines, count),
|
||||||
|
do: lines ++ List.duplicate(%Line{}, count - length(lines))
|
||||||
|
|
||||||
|
defp apply_overlay(lines, :markdown_macros), do: Enum.map(lines, &Overlay.markdown_macros/1)
|
||||||
|
defp apply_overlay(lines, :liquid), do: Enum.map(lines, &Overlay.liquid/1)
|
||||||
|
defp apply_overlay(lines, _language), do: lines
|
||||||
|
end
|
||||||
225
lib/bds/ui/code_editor/overlay.ex
Normal file
225
lib/bds/ui/code_editor/overlay.ex
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
defmodule BDS.UI.CodeEditor.Overlay do
|
||||||
|
@moduledoc """
|
||||||
|
Re-styles `%ExRatatui.Text.Line{}` spans for the syntaxes the base
|
||||||
|
syntect lexer does not know: post macros (`[[gallery names="x"]]`) and
|
||||||
|
Liquid tags (`{{ … }}` / `{% … %}`).
|
||||||
|
|
||||||
|
Ranges are byte-based `{start, length, %Style{}}` triples applied with
|
||||||
|
patch semantics — the overlay's non-nil fields override the base span
|
||||||
|
style, so the theme background survives. Overlay colours mirror the
|
||||||
|
GUI Monaco theme (`assets/js/monaco/theme.js`): macro accents are the
|
||||||
|
custom `keyword.macro` / `attribute.name` / `attribute.value` rules,
|
||||||
|
Liquid accents are the vs-dark keyword/string/number base tokens.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias ExRatatui.Style
|
||||||
|
alias ExRatatui.Text.Line
|
||||||
|
alias ExRatatui.Text.Span
|
||||||
|
|
||||||
|
@type styled_range :: {non_neg_integer(), non_neg_integer(), Style.t()}
|
||||||
|
|
||||||
|
@macro_style %Style{fg: {:rgb, 197, 134, 192}, modifiers: [:bold]}
|
||||||
|
@macro_attr_style %Style{fg: {:rgb, 156, 220, 254}}
|
||||||
|
@macro_value_style %Style{fg: {:rgb, 206, 145, 120}}
|
||||||
|
|
||||||
|
@liquid_keyword_style %Style{fg: {:rgb, 86, 156, 214}}
|
||||||
|
@liquid_string_style %Style{fg: {:rgb, 206, 145, 120}}
|
||||||
|
@liquid_number_style %Style{fg: {:rgb, 181, 206, 168}}
|
||||||
|
|
||||||
|
@macro_pattern ~r/\[\[\s*[a-zA-Z][\w-]*[^]]*\]\]/
|
||||||
|
@macro_opener ~r/\A\[\[\s*[a-zA-Z][\w-]*/
|
||||||
|
@macro_attr_name ~r/[a-zA-Z][\w-]*(?=\s*=)/
|
||||||
|
@macro_quoted_value ~r/"[^"]*"/
|
||||||
|
@macro_bare_value ~r/[^\s=\[\]"]++(?!\s*=)/
|
||||||
|
|
||||||
|
@liquid_tag ~r/\{\{-?.*?-?\}\}|\{%-?.*?-?%\}/
|
||||||
|
@liquid_open ~r/\A\{[\{%]-?/
|
||||||
|
@liquid_close ~r/-?[\}%][\}%]\z/
|
||||||
|
@liquid_keywords ~r/\b(?:assign|capture|case|comment|cycle|decrement|echo|elsif|else|endcase|endcapture|endif|endfor|endunless|endcomment|for|if|include|increment|liquid|paginate|raw|render|tablerow|unless|when|true|false|nil|blank|empty|contains)\b/
|
||||||
|
@liquid_filter ~r/\|\s*[a-zA-Z_][\w-]*/
|
||||||
|
@liquid_string ~r/"[^"]*"|'[^']*'/
|
||||||
|
@liquid_number ~r/\b\d+(?:\.\d+)?\b/
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Recolours every `[[macro]]` on the line, preserving the base styling
|
||||||
|
of the surrounding markdown.
|
||||||
|
"""
|
||||||
|
@spec markdown_macros(Line.t()) :: Line.t()
|
||||||
|
def markdown_macros(%Line{} = line) do
|
||||||
|
apply_ranges(line, markdown_macro_ranges(line_text(line)))
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Recolours every Liquid output/tag expression on the line, preserving
|
||||||
|
the base styling of the surrounding HTML.
|
||||||
|
"""
|
||||||
|
@spec liquid(Line.t()) :: Line.t()
|
||||||
|
def liquid(%Line{} = line) do
|
||||||
|
apply_ranges(line, liquid_ranges(line_text(line)))
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Byte ranges of every macro on `text`: `[[` + name and `]]` in the
|
||||||
|
macro style, attribute names and values in their accent styles.
|
||||||
|
"""
|
||||||
|
@spec markdown_macro_ranges(String.t()) :: [styled_range()]
|
||||||
|
def markdown_macro_ranges(text) do
|
||||||
|
text
|
||||||
|
|> scan(@macro_pattern)
|
||||||
|
|> Enum.flat_map(fn {start, len} ->
|
||||||
|
macro = binary_part(text, start, len)
|
||||||
|
|
||||||
|
macro
|
||||||
|
|> macro_inner_ranges()
|
||||||
|
|> Enum.map(fn {inner_start, inner_len, style} ->
|
||||||
|
{start + inner_start, inner_len, style}
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Byte ranges (relative to the start of `macro`, including its `[[` and
|
||||||
|
`]]`) of the styled sub-parts of a single macro match. Quoted values
|
||||||
|
are masked before scanning for attribute names and bare values so
|
||||||
|
nothing matches inside a quoted string.
|
||||||
|
"""
|
||||||
|
@spec macro_inner_ranges(String.t()) :: [styled_range()]
|
||||||
|
def macro_inner_ranges(macro) do
|
||||||
|
[{0, opener_len}] = Regex.run(@macro_opener, macro, return: :index)
|
||||||
|
inner = binary_part(macro, opener_len, byte_size(macro) - opener_len - 2)
|
||||||
|
quoted = scan(inner, @macro_quoted_value)
|
||||||
|
masked = mask(inner, quoted)
|
||||||
|
|
||||||
|
inner_ranges =
|
||||||
|
with_style(quoted, @macro_value_style) ++
|
||||||
|
(masked |> scan(@macro_attr_name) |> with_style(@macro_attr_style)) ++
|
||||||
|
(masked |> scan(@macro_bare_value) |> with_style(@macro_value_style))
|
||||||
|
|
||||||
|
[{0, opener_len, @macro_style}, {byte_size(macro) - 2, 2, @macro_style}] ++
|
||||||
|
offset_ranges(inner_ranges, opener_len)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Byte ranges of every Liquid expression on `text`: the `{{`/`}}` and
|
||||||
|
`{%`/`%}` delimiters, tag keywords and filters in the keyword style,
|
||||||
|
strings and numbers in their accent styles. Strings are masked before
|
||||||
|
scanning so keywords/numbers inside them keep the string style.
|
||||||
|
"""
|
||||||
|
@spec liquid_ranges(String.t()) :: [styled_range()]
|
||||||
|
def liquid_ranges(text) do
|
||||||
|
text
|
||||||
|
|> scan(@liquid_tag)
|
||||||
|
|> Enum.flat_map(fn {start, len} ->
|
||||||
|
tag = binary_part(text, start, len)
|
||||||
|
[{0, open_len}] = Regex.run(@liquid_open, tag, return: :index)
|
||||||
|
[{close_start, close_len}] = Regex.run(@liquid_close, tag, return: :index)
|
||||||
|
inner = binary_part(tag, open_len, close_start - open_len)
|
||||||
|
strings = scan(inner, @liquid_string)
|
||||||
|
masked = mask(inner, strings)
|
||||||
|
|
||||||
|
inner_ranges =
|
||||||
|
with_style(strings, @liquid_string_style) ++
|
||||||
|
(masked |> scan(@liquid_keywords) |> with_style(@liquid_keyword_style)) ++
|
||||||
|
(masked |> scan(@liquid_filter) |> with_style(@liquid_keyword_style)) ++
|
||||||
|
(masked |> scan(@liquid_number) |> with_style(@liquid_number_style))
|
||||||
|
|
||||||
|
[{start, open_len, @liquid_keyword_style}, {start + close_start, close_len, @liquid_keyword_style}] ++
|
||||||
|
offset_ranges(inner_ranges, start + open_len)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Re-splits a line's spans at the given byte ranges, patch-merging each
|
||||||
|
range's style over the base span style it covers. Overlapping ranges
|
||||||
|
resolve to the one starting earliest (strings/quotes therefore win
|
||||||
|
over keywords matched inside them).
|
||||||
|
"""
|
||||||
|
@spec apply_ranges(Line.t(), [styled_range()]) :: Line.t()
|
||||||
|
def apply_ranges(%Line{} = line, []), do: line
|
||||||
|
|
||||||
|
def apply_ranges(%Line{spans: spans} = line, ranges) do
|
||||||
|
ranges = Enum.sort_by(ranges, &elem(&1, 0))
|
||||||
|
|
||||||
|
{new_spans, _offset} =
|
||||||
|
Enum.map_reduce(spans, 0, fn span, offset ->
|
||||||
|
{split_span(span, offset, ranges), offset + byte_size(span.content)}
|
||||||
|
end)
|
||||||
|
|
||||||
|
%{line | spans: new_spans |> List.flatten() |> Enum.reject(&(&1.content == ""))}
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Patch-merges `patch` over `base`: non-nil colours override, modifiers
|
||||||
|
union. Used for overlay accents, the cursor cell and the current-line
|
||||||
|
highlight so the theme background/foreground survives underneath.
|
||||||
|
"""
|
||||||
|
@spec merge_style(Style.t(), Style.t()) :: Style.t()
|
||||||
|
def merge_style(%Style{} = base, %Style{} = patch) do
|
||||||
|
%Style{
|
||||||
|
fg: patch.fg || base.fg,
|
||||||
|
bg: patch.bg || base.bg,
|
||||||
|
underline_color: patch.underline_color || base.underline_color,
|
||||||
|
modifiers: Enum.uniq(base.modifiers ++ patch.modifiers)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp split_span(%Span{} = span, span_start, ranges) do
|
||||||
|
span_end = span_start + byte_size(span.content)
|
||||||
|
|
||||||
|
cuts =
|
||||||
|
ranges
|
||||||
|
|> Enum.flat_map(fn {range_start, range_len, _style} ->
|
||||||
|
range_end = range_start + range_len
|
||||||
|
|
||||||
|
if range_end > span_start and range_start < span_end do
|
||||||
|
[max(range_start, span_start), min(range_end, span_end)]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Enum.filter(&(&1 > span_start and &1 < span_end))
|
||||||
|
|> Enum.uniq()
|
||||||
|
|> Enum.sort()
|
||||||
|
|
||||||
|
[span_start | cuts ++ [span_end]]
|
||||||
|
|> Enum.chunk_every(2, 1, :discard)
|
||||||
|
|> Enum.map(fn [segment_start, segment_end] ->
|
||||||
|
content = binary_part(span.content, segment_start - span_start, segment_end - segment_start)
|
||||||
|
|
||||||
|
style =
|
||||||
|
case Enum.find(ranges, &covers?(&1, segment_start, segment_end)) do
|
||||||
|
nil -> span.style
|
||||||
|
{_start, _len, patch} -> merge_style(span.style, patch)
|
||||||
|
end
|
||||||
|
|
||||||
|
%Span{content: content, style: style}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp covers?({range_start, range_len, _style}, segment_start, segment_end) do
|
||||||
|
segment_start >= range_start and segment_end <= range_start + range_len
|
||||||
|
end
|
||||||
|
|
||||||
|
defp line_text(line), do: Enum.map_join(line.spans, & &1.content)
|
||||||
|
|
||||||
|
defp scan(text, pattern) do
|
||||||
|
pattern
|
||||||
|
|> Regex.scan(text, return: :index)
|
||||||
|
|> Enum.map(fn [{start, len}] -> {start, len} end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp with_style(ranges, style), do: Enum.map(ranges, fn {start, len} -> {start, len, style} end)
|
||||||
|
|
||||||
|
defp offset_ranges(ranges, offset),
|
||||||
|
do: Enum.map(ranges, fn {start, len, style} -> {start + offset, len, style} end)
|
||||||
|
|
||||||
|
# Blanks out the given byte ranges with spaces so later scans cannot
|
||||||
|
# match inside them (offsets stay intact).
|
||||||
|
defp mask(text, ranges) do
|
||||||
|
Enum.reduce(ranges, text, fn {start, len}, acc ->
|
||||||
|
binary_part(acc, 0, start) <>
|
||||||
|
String.duplicate(" ", len) <>
|
||||||
|
binary_part(acc, start + len, byte_size(acc) - start - len)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
205
lib/bds/ui/code_editor/widget.ex
Normal file
205
lib/bds/ui/code_editor/widget.ex
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
defmodule BDS.UI.CodeEditor do
|
||||||
|
@moduledoc """
|
||||||
|
Syntax-highlighted, word-wrapping code editor widget (issue #32).
|
||||||
|
|
||||||
|
The editing engine stays Rust-owned (`ExRatatui.textarea_*` — buffer,
|
||||||
|
cursor, undo/redo, clipboard); this widget only re-renders the buffer
|
||||||
|
every frame through a styling + wrap pipeline:
|
||||||
|
|
||||||
|
1. read the buffer and cursor off the textarea reference
|
||||||
|
2. highlight with `BDS.UI.CodeEditor.Highlight`
|
||||||
|
3. patch the current-line background into the cursor's source line
|
||||||
|
4. cut the span at the cursor column and splice in a cursor-styled
|
||||||
|
cell (the cell-caret rides the paragraph's wrapping)
|
||||||
|
5. compute the vertical scroll offset so the cursor's visual row
|
||||||
|
stays inside the window
|
||||||
|
6. emit a wrapping `ExRatatui.Widgets.Paragraph`
|
||||||
|
|
||||||
|
Fields:
|
||||||
|
|
||||||
|
* `:textarea` — the Rust textarea reference (required)
|
||||||
|
* `:language` — `:markdown_macros | :liquid | :lua | :text`
|
||||||
|
* `:theme` — syntect theme, default `:base16_ocean_dark`
|
||||||
|
* `:wrap` — soft-wrap long lines, default `true`
|
||||||
|
* `:cursor_style` — patch style for the cell under the cursor
|
||||||
|
* `:line_highlight_style` — patch style for the cursor's source line
|
||||||
|
* `:block` — optional `%ExRatatui.Widgets.Block{}` container
|
||||||
|
* `:scroll` — previous `{vertical, horizontal}` offset; the render
|
||||||
|
adjusts it minimally so the cursor stays visible
|
||||||
|
|
||||||
|
There is deliberately no line-number gutter. The wrap math assumes
|
||||||
|
Latin cell widths (1 char = 1 cell) — wide graphemes (CJK, emoji)
|
||||||
|
can scroll slightly off; noted as a TODO, out of scope for now.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias ExRatatui.Style
|
||||||
|
alias ExRatatui.Widgets.Block
|
||||||
|
alias ExRatatui.Widgets.CodeBlock
|
||||||
|
|
||||||
|
@type language :: BDS.UI.CodeEditor.Highlight.language()
|
||||||
|
|
||||||
|
@type t :: %__MODULE__{
|
||||||
|
textarea: reference() | nil,
|
||||||
|
language: language(),
|
||||||
|
theme: CodeBlock.theme(),
|
||||||
|
wrap: boolean(),
|
||||||
|
cursor_style: Style.t(),
|
||||||
|
line_highlight_style: Style.t(),
|
||||||
|
block: Block.t() | nil,
|
||||||
|
scroll: {non_neg_integer(), non_neg_integer()}
|
||||||
|
}
|
||||||
|
|
||||||
|
defstruct textarea: nil,
|
||||||
|
language: :text,
|
||||||
|
theme: :base16_ocean_dark,
|
||||||
|
wrap: true,
|
||||||
|
cursor_style: %Style{bg: :cyan},
|
||||||
|
line_highlight_style: %Style{},
|
||||||
|
block: nil,
|
||||||
|
scroll: {0, 0}
|
||||||
|
end
|
||||||
|
|
||||||
|
defimpl ExRatatui.Widget, for: BDS.UI.CodeEditor do
|
||||||
|
alias BDS.UI.CodeEditor
|
||||||
|
alias BDS.UI.CodeEditor.Highlight
|
||||||
|
alias BDS.UI.CodeEditor.Overlay
|
||||||
|
alias ExRatatui.Layout.Rect
|
||||||
|
alias ExRatatui.Style
|
||||||
|
alias ExRatatui.Text.Line
|
||||||
|
alias ExRatatui.Text.Span
|
||||||
|
alias ExRatatui.Widgets.Block
|
||||||
|
alias ExRatatui.Widgets.Paragraph
|
||||||
|
|
||||||
|
def render(%CodeEditor{textarea: nil} = editor, %Rect{} = rect) do
|
||||||
|
[{%Paragraph{text: "", wrap: editor.wrap, block: editor.block}, rect}]
|
||||||
|
end
|
||||||
|
|
||||||
|
def render(%CodeEditor{} = editor, %Rect{} = rect) do
|
||||||
|
content = ExRatatui.textarea_get_value(editor.textarea)
|
||||||
|
{row, col} = ExRatatui.textarea_cursor(editor.textarea)
|
||||||
|
source_lines = String.split(content, "\n")
|
||||||
|
|
||||||
|
inner = inner_rect(rect, editor.block)
|
||||||
|
width = max(inner.width, 1)
|
||||||
|
height = max(inner.height, 1)
|
||||||
|
|
||||||
|
lines =
|
||||||
|
content
|
||||||
|
|> Highlight.highlight(editor.language, editor.theme)
|
||||||
|
|> highlight_current_line(row, editor.line_highlight_style)
|
||||||
|
|> splice_cursor(source_lines, row, col, editor)
|
||||||
|
|
||||||
|
top = scroll_top(source_lines, row, col, width, height, elem(editor.scroll, 0))
|
||||||
|
|
||||||
|
[
|
||||||
|
{%Paragraph{
|
||||||
|
text: lines,
|
||||||
|
wrap: editor.wrap,
|
||||||
|
scroll: {top, 0},
|
||||||
|
block: editor.block
|
||||||
|
}, rect}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp inner_rect(rect, nil), do: rect
|
||||||
|
|
||||||
|
defp inner_rect(rect, %Block{borders: borders}) do
|
||||||
|
left = if border?(borders, :left), do: 1, else: 0
|
||||||
|
right = if border?(borders, :right), do: 1, else: 0
|
||||||
|
top = if border?(borders, :top), do: 1, else: 0
|
||||||
|
bottom = if border?(borders, :bottom), do: 1, else: 0
|
||||||
|
|
||||||
|
%Rect{
|
||||||
|
x: rect.x + left,
|
||||||
|
y: rect.y + top,
|
||||||
|
width: max(rect.width - left - right, 1),
|
||||||
|
height: max(rect.height - top - bottom, 1)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp border?(borders, side), do: :all in borders or side in borders
|
||||||
|
|
||||||
|
defp highlight_current_line(lines, row, %Style{} = style) do
|
||||||
|
if style == %Style{} do
|
||||||
|
lines
|
||||||
|
else
|
||||||
|
List.update_at(lines, row, fn %Line{} = line ->
|
||||||
|
%{line | spans: Enum.map(line.spans, &%{&1 | style: Overlay.merge_style(&1.style, style)})}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp splice_cursor(lines, source_lines, row, col, editor) do
|
||||||
|
List.update_at(lines, row, fn %Line{} = line ->
|
||||||
|
if col >= cursor_line_length(source_lines, row) do
|
||||||
|
append_cursor_cell(line, editor)
|
||||||
|
else
|
||||||
|
splice_cursor_cell(line, col, editor.cursor_style)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp cursor_line_length(source_lines, row) do
|
||||||
|
source_lines |> Enum.at(row, "") |> String.length()
|
||||||
|
end
|
||||||
|
|
||||||
|
# Past the last character there is no span to cut into — append a
|
||||||
|
# cursor cell instead. The line highlight bleeds through when the
|
||||||
|
# cursor style leaves the background alone.
|
||||||
|
defp append_cursor_cell(%Line{} = line, editor) do
|
||||||
|
style = Overlay.merge_style(editor.line_highlight_style, editor.cursor_style)
|
||||||
|
%{line | spans: line.spans ++ [%Span{content: " ", style: style}]}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp splice_cursor_cell(%Line{} = line, col, cursor_style) do
|
||||||
|
{new_spans, _offset} =
|
||||||
|
Enum.map_reduce(line.spans, 0, fn span, offset ->
|
||||||
|
len = String.length(span.content)
|
||||||
|
|
||||||
|
if col >= offset and col < offset + len do
|
||||||
|
{cut_span(span, col - offset, cursor_style), offset + len}
|
||||||
|
else
|
||||||
|
{[span], offset + len}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
%{line | spans: List.flatten(new_spans)}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp cut_span(span, at, cursor_style) do
|
||||||
|
[
|
||||||
|
%Span{content: String.slice(span.content, 0, at), style: span.style},
|
||||||
|
%Span{
|
||||||
|
content: String.slice(span.content, at, 1),
|
||||||
|
style: Overlay.merge_style(span.style, cursor_style)
|
||||||
|
},
|
||||||
|
%Span{content: String.slice(span.content, at + 1, String.length(span.content)), style: span.style}
|
||||||
|
]
|
||||||
|
|> Enum.reject(&(&1.content == ""))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Latin-width assumption (1 char = 1 cell): wide graphemes wrap
|
||||||
|
# differently than counted here. TODO: CJK/emoji cell widths.
|
||||||
|
defp scroll_top(source_lines, row, col, width, height, prev_top) do
|
||||||
|
visual_row =
|
||||||
|
source_lines
|
||||||
|
|> Enum.take(row)
|
||||||
|
|> Enum.map(&visual_rows(&1, width))
|
||||||
|
|> Enum.sum()
|
||||||
|
|> Kernel.+(div(col, width))
|
||||||
|
|
||||||
|
cond do
|
||||||
|
visual_row < prev_top -> visual_row
|
||||||
|
visual_row >= prev_top + height -> visual_row - height + 1
|
||||||
|
true -> prev_top
|
||||||
|
end
|
||||||
|
|> max(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp visual_rows(line, width) do
|
||||||
|
line
|
||||||
|
|> String.length()
|
||||||
|
|> max(1)
|
||||||
|
|> then(&div(&1 + width - 1, width))
|
||||||
|
end
|
||||||
|
end
|
||||||
91
lib/bds/ui/task_grouping.ex
Normal file
91
lib/bds/ui/task_grouping.ex
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
defmodule BDS.UI.TaskGrouping do
|
||||||
|
@moduledoc """
|
||||||
|
Groups task snapshot entries for the bottom panel's Tasks tab, mirroring the
|
||||||
|
old app's `taskGrouping.ts`: tasks sharing a `group_id` collapse into one
|
||||||
|
group entry (ordered by first appearance), everything else stays a single
|
||||||
|
entry. Groups summarize to per-status counts plus an aggregate progress in
|
||||||
|
the 0.0..1.0 range.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@type task :: map()
|
||||||
|
@type entry :: {:single, task()} | {:group, String.t(), String.t(), [task()]}
|
||||||
|
@type summary :: %{
|
||||||
|
total: non_neg_integer(),
|
||||||
|
running: non_neg_integer(),
|
||||||
|
pending: non_neg_integer(),
|
||||||
|
completed: non_neg_integer(),
|
||||||
|
failed: non_neg_integer(),
|
||||||
|
cancelled: non_neg_integer(),
|
||||||
|
progress: float()
|
||||||
|
}
|
||||||
|
|
||||||
|
@spec build_task_entries([task()]) :: [entry()]
|
||||||
|
def build_task_entries(tasks) when is_list(tasks) do
|
||||||
|
{singles, groups} =
|
||||||
|
tasks
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.reduce({[], %{}}, fn {task, index}, {singles, groups} ->
|
||||||
|
case Map.get(task, :group_id) do
|
||||||
|
nil ->
|
||||||
|
{[{index, task} | singles], groups}
|
||||||
|
|
||||||
|
group_id ->
|
||||||
|
groups =
|
||||||
|
Map.update(groups, group_id, {index, Map.get(task, :group_name) || group_id, [task]}, fn {first_index, name, grouped} ->
|
||||||
|
{first_index, name, [task | grouped]}
|
||||||
|
end)
|
||||||
|
|
||||||
|
{singles, groups}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
single_entries = Enum.map(singles, fn {index, task} -> {index, {:single, task}} end)
|
||||||
|
|
||||||
|
group_entries =
|
||||||
|
Enum.map(groups, fn {group_id, {index, name, grouped}} ->
|
||||||
|
{index, {:group, group_id, name, Enum.reverse(grouped)}}
|
||||||
|
end)
|
||||||
|
|
||||||
|
(single_entries ++ group_entries)
|
||||||
|
|> Enum.sort_by(fn {index, _entry} -> index end)
|
||||||
|
|> Enum.map(fn {_index, entry} -> entry end)
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec summarize_task_group([task()]) :: summary()
|
||||||
|
def summarize_task_group(tasks) when is_list(tasks) do
|
||||||
|
base = %{total: 0, running: 0, pending: 0, completed: 0, failed: 0, cancelled: 0, progress: 0.0}
|
||||||
|
|
||||||
|
summary =
|
||||||
|
Enum.reduce(tasks, base, fn task, acc ->
|
||||||
|
status = Map.get(task, :status)
|
||||||
|
|
||||||
|
acc
|
||||||
|
|> Map.update!(:total, &(&1 + 1))
|
||||||
|
|> count_status(status)
|
||||||
|
|> Map.update!(:progress, &(&1 + progress_contribution(task)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
if summary.total > 0 do
|
||||||
|
%{summary | progress: summary.progress / summary.total}
|
||||||
|
else
|
||||||
|
summary
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp count_status(acc, status) when status in [:running, :pending, :completed, :failed, :cancelled],
|
||||||
|
do: Map.update!(acc, status, &(&1 + 1))
|
||||||
|
|
||||||
|
defp count_status(acc, _status), do: acc
|
||||||
|
|
||||||
|
# Finished tasks count as fully done no matter their outcome, pending tasks
|
||||||
|
# contribute nothing yet (old-app getProgressContribution).
|
||||||
|
defp progress_contribution(%{status: status}) when status in [:completed, :failed, :cancelled],
|
||||||
|
do: 1.0
|
||||||
|
|
||||||
|
defp progress_contribution(%{status: :pending}), do: 0.0
|
||||||
|
|
||||||
|
defp progress_contribution(%{progress: progress}) when is_number(progress),
|
||||||
|
do: progress |> max(0.0) |> min(1.0)
|
||||||
|
|
||||||
|
defp progress_contribution(_task), do: 0.0
|
||||||
|
end
|
||||||
18
mix.exs
18
mix.exs
@@ -62,11 +62,21 @@ defmodule BDS.MixProject do
|
|||||||
{:ex_ratatui, "~> 0.11"},
|
{:ex_ratatui, "~> 0.11"},
|
||||||
{:image, "~> 0.67"},
|
{:image, "~> 0.67"},
|
||||||
{:nx, "~> 0.10"},
|
{:nx, "~> 0.10"},
|
||||||
{:exla, "~> 0.10"},
|
# Only one ML inference backend ships per platform; NIF releases are
|
||||||
|
# host-built, so the build OS is the target OS. EXLA (283 MB XLA CPU
|
||||||
|
# payload) never runs in the macOS app — EMLX always wins on Apple
|
||||||
|
# Silicon — but `runtime: false` alone can't exclude it there because
|
||||||
|
# the `image` dep declares exla as an optional application, which drags
|
||||||
|
# it into the release whenever it exists in the prod dep tree. Scoping
|
||||||
|
# it to dev/test on macOS keeps it fully out of macOS releases while
|
||||||
|
# Linux/Windows ship it as their production inference backend.
|
||||||
|
{:exla, "~> 0.10", if(macos?(), do: [only: [:dev, :test]], else: [])},
|
||||||
# Apple Silicon GPU (Metal) acceleration for embedding inference. Ships
|
# Apple Silicon GPU (Metal) acceleration for embedding inference. Ships
|
||||||
# precompiled MLX binaries; the Neural backend prefers it on arm64 macOS
|
# precompiled MLX binaries; the Neural backend prefers it on arm64 macOS
|
||||||
# and falls back to EXLA-CPU elsewhere (SPECGAPS A1-14c).
|
# and falls back to EXLA-CPU elsewhere (SPECGAPS A1-14c). Apple-only, so
|
||||||
{:emlx, "~> 0.2.0"},
|
# non-macOS releases exclude it (runtime: false deps stay out of
|
||||||
|
# releases — nothing pulls emlx in optionally, unlike exla above).
|
||||||
|
{:emlx, "~> 0.2.0", runtime: macos?()},
|
||||||
{:bumblebee, "~> 0.6.3"},
|
{:bumblebee, "~> 0.6.3"},
|
||||||
{:hnswlib, "~> 0.1.7"},
|
{:hnswlib, "~> 0.1.7"},
|
||||||
{:stemex, "~> 0.2.1"},
|
{:stemex, "~> 0.2.1"},
|
||||||
@@ -121,4 +131,6 @@ defmodule BDS.MixProject do
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp macos?, do: :os.type() == {:unix, :darwin}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ msgstr "KI-Einstellungen"
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr "KI-Vorschlaege"
|
msgstr "KI-Vorschlaege"
|
||||||
@@ -343,7 +343,7 @@ msgstr "Autor"
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr "Automatisch"
|
msgstr "Automatisch"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -368,7 +368,7 @@ msgstr "Automatisierungshilfen"
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr "Verfuegbare Sprachen"
|
msgstr "Verfuegbare Sprachen"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -441,6 +441,7 @@ msgstr "Die Bookmarklet-Kopierfunktion ist über die Desktop-Laufzeit und die ö
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
@@ -494,7 +495,7 @@ msgstr "Kategorie-Standards, Render-Flags und Template-Zuordnung"
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr "Kategoriename ist erforderlich"
|
msgstr "Kategoriename ist erforderlich"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -575,7 +576,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr "Unveränderte Diff-Blöcke einklappen"
|
msgstr "Unveränderte Diff-Blöcke einklappen"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr "Befehl abgeschlossen"
|
msgstr "Befehl abgeschlossen"
|
||||||
@@ -593,7 +594,7 @@ msgstr "Bestaetigen"
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -606,6 +607,7 @@ msgid "Content Categories"
|
|||||||
msgstr "Inhaltskategorien"
|
msgstr "Inhaltskategorien"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr "Kopieren"
|
msgstr "Kopieren"
|
||||||
@@ -1040,7 +1042,7 @@ msgid "Filename"
|
|||||||
msgstr "Dateiname"
|
msgstr "Dateiname"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr "Fehlende Übersetzungen ergänzen"
|
msgstr "Fehlende Übersetzungen ergänzen"
|
||||||
@@ -1051,7 +1053,7 @@ msgid "Find"
|
|||||||
msgstr "Suchen"
|
msgstr "Suchen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr "Doppelte Beiträge finden"
|
msgstr "Doppelte Beiträge finden"
|
||||||
@@ -1078,14 +1080,14 @@ msgid "Gallery"
|
|||||||
msgstr "Galerie"
|
msgstr "Galerie"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr "Website generieren"
|
msgstr "Website generieren"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1098,8 +1100,8 @@ msgid "Git Diff"
|
|||||||
msgstr "Git-Diff"
|
msgstr "Git-Diff"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr "Git-Protokoll"
|
msgstr "Git-Protokoll"
|
||||||
@@ -1222,9 +1224,9 @@ msgstr "Importdefinitionen"
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr "Import fehlgeschlagen: %{error}"
|
msgstr "Import fehlgeschlagen: %{error}"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1325,7 +1327,7 @@ msgstr "Verknüpfte Medien"
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr "Verknüpfte Beiträge"
|
msgstr "Verknüpfte Beiträge"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1404,9 +1406,9 @@ msgstr "Maximale Beiträge pro Seite"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1435,7 +1437,7 @@ msgid "Merge"
|
|||||||
msgstr "Zusammenführen"
|
msgstr "Zusammenführen"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1453,8 +1455,8 @@ msgstr "Metadaten"
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1532,12 +1534,12 @@ msgstr "Neue Vorlage"
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr "Kein Template"
|
msgstr "Kein Template"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr "Keine Hintergrundaufgaben aktiv"
|
msgstr "Keine Hintergrundaufgaben aktiv"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr "Kein Commit-Betreff"
|
msgstr "Kein Commit-Betreff"
|
||||||
@@ -1547,7 +1549,7 @@ msgstr "Kein Commit-Betreff"
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr "Kein Ordner ausgewählt"
|
msgstr "Kein Ordner ausgewählt"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr "Noch keine Git-Historie"
|
msgstr "Noch keine Git-Historie"
|
||||||
@@ -1607,7 +1609,7 @@ msgstr "Keine verwaisten Dateien ausgewählt"
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr "Noch keine Seiten"
|
msgstr "Noch keine Seiten"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr "Noch keine Beitragsverweise"
|
msgstr "Noch keine Beitragsverweise"
|
||||||
@@ -1632,7 +1634,7 @@ msgstr "Keine Reparaturaktion verfügbar"
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr "Keine Einstellungen entsprechen der aktuellen Suche"
|
msgstr "Keine Einstellungen entsprechen der aktuellen Suche"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr "Noch keine Shell-Ausgabe"
|
msgstr "Noch keine Shell-Ausgabe"
|
||||||
@@ -1801,7 +1803,7 @@ msgid "Open Settings"
|
|||||||
msgstr "Einstellungen öffnen"
|
msgstr "Einstellungen öffnen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr "Im Browser öffnen"
|
msgstr "Im Browser öffnen"
|
||||||
@@ -1832,8 +1834,8 @@ msgstr "Sonstige"
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr "Andere (%{count})"
|
msgstr "Andere (%{count})"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr "Ausgabe"
|
msgstr "Ausgabe"
|
||||||
@@ -1915,7 +1917,7 @@ msgid "Post"
|
|||||||
msgstr "Beitrag"
|
msgstr "Beitrag"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1950,8 +1952,8 @@ msgstr "Beitrag gespeichert"
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2081,14 +2083,14 @@ msgstr "Bereit zum Import:"
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr "Datenbank neu aufbauen"
|
msgstr "Datenbank neu aufbauen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr "Embedding-Index neu aufbauen"
|
msgstr "Embedding-Index neu aufbauen"
|
||||||
@@ -2146,7 +2148,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr "Übersetzung aktualisieren"
|
msgstr "Übersetzung aktualisieren"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr "Kalender neu erzeugen"
|
msgstr "Kalender neu erzeugen"
|
||||||
@@ -2157,7 +2159,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr "Fehlende Vorschaubilder neu erzeugen"
|
msgstr "Fehlende Vorschaubilder neu erzeugen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr "Text neu indizieren"
|
msgstr "Text neu indizieren"
|
||||||
@@ -2342,10 +2344,11 @@ msgstr "Scripting-Funktionen werden in der Neufassung auf Anwendungsebene konfig
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2452,7 +2455,7 @@ msgstr "Semantische Ähnlichkeit"
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2478,7 +2481,7 @@ msgstr "Website"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2575,7 +2578,7 @@ msgid "System Prompt"
|
|||||||
msgstr "System-Prompt"
|
msgstr "System-Prompt"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2602,8 +2605,8 @@ msgstr "Schlagwortname"
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2613,8 +2616,8 @@ msgstr "Schlagwortname"
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr "Tags"
|
msgstr "Tags"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2661,7 +2664,7 @@ msgstr "Template-Syntax ist gültig"
|
|||||||
#: lib/bds/desktop/shell_live/template_editor.ex:171
|
#: 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:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2670,7 +2673,7 @@ msgstr "Template-Syntax ist gültig"
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr "Vorlagen"
|
msgstr "Vorlagen"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr "Das gemeinsame untere Panel steht für Aufgaben, Ausgabe, Git-Details und editorbezogene Diagnosen bereit."
|
msgstr "Das gemeinsame untere Panel steht für Aufgaben, Ausgabe, Git-Details und editorbezogene Diagnosen bereit."
|
||||||
@@ -2885,7 +2888,7 @@ msgid "Updated URLs"
|
|||||||
msgstr "Aktualisierte URLs"
|
msgstr "Aktualisierte URLs"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr "Website hochladen"
|
msgstr "Website hochladen"
|
||||||
@@ -2913,13 +2916,13 @@ msgid "Validate"
|
|||||||
msgstr "Validieren"
|
msgstr "Validieren"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr "Website validieren"
|
msgstr "Website validieren"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr "Übersetzungen validieren"
|
msgstr "Übersetzungen validieren"
|
||||||
@@ -3301,12 +3304,12 @@ msgstr "Willkommen beim KI-Assistenten"
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr "Vergleicht Datenbank- und Dateisystem-Metadaten"
|
msgstr "Vergleicht Datenbank- und Dateisystem-Metadaten"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr "%{count} Bilder zum Beitrag hinzugefügt"
|
msgstr "%{count} Bilder zum Beitrag hinzugefügt"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr "%{title} hinzugefügt"
|
msgstr "%{title} hinzugefügt"
|
||||||
@@ -3327,18 +3330,18 @@ msgstr "Endbenutzer-Anleitung für redaktionelle Arbeitsabläufe, Medien, Vorlag
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr "Gleichzeitige Bildimporte"
|
msgstr "Gleichzeitige Bildimporte"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr "Galerie-Bilder hinzufügen"
|
msgstr "Galerie-Bilder hinzufügen"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr "%{path} konnte nicht verarbeitet werden: %{reason}"
|
msgstr "%{path} konnte nicht verarbeitet werden: %{reason}"
|
||||||
@@ -3400,7 +3403,7 @@ msgid "Commit"
|
|||||||
msgstr "Commit"
|
msgstr "Commit"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr "Commit-Nachricht"
|
msgstr "Commit-Nachricht"
|
||||||
@@ -3536,12 +3539,12 @@ msgstr "umbenannt"
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr "nicht verfolgt"
|
msgstr "nicht verfolgt"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr "Blogmark"
|
msgstr "Blogmark"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr "Öffnen Sie ein Projekt, bevor Sie ein Blogmark importieren."
|
msgstr "Öffnen Sie ein Projekt, bevor Sie ein Blogmark importieren."
|
||||||
@@ -3582,7 +3585,7 @@ msgstr "Tag löschen"
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr "Bookmarklet konnte nicht in die Zwischenablage kopiert werden"
|
msgstr "Bookmarklet konnte nicht in die Zwischenablage kopiert werden"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr "Das Projekt, auf das dieses Blogmark verweist, existiert hier nicht."
|
msgstr "Das Projekt, auf das dieses Blogmark verweist, existiert hier nicht."
|
||||||
@@ -3593,7 +3596,7 @@ msgid "Suggested tags"
|
|||||||
msgstr "Vorgeschlagene Tags"
|
msgstr "Vorgeschlagene Tags"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr "Website vollständig neu generieren"
|
msgstr "Website vollständig neu generieren"
|
||||||
@@ -3690,12 +3693,12 @@ msgstr "OK"
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
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."
|
msgstr "Der Endpunkt hat keine Modelle zurückgegeben. Sie können einen Modellnamen weiterhin manuell eingeben."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
msgid "AI is unavailable in airplane mode without a local endpoint."
|
||||||
msgstr "KI ist im Flugmodus ohne lokalen Endpunkt nicht verfügbar."
|
msgstr "KI ist im Flugmodus ohne lokalen Endpunkt nicht verfügbar."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr "Diese Datei konnte nicht geladen werden."
|
msgstr "Diese Datei konnte nicht geladen werden."
|
||||||
@@ -3710,12 +3713,12 @@ msgstr "Die Bearbeitung dieses Eintrags ist in der Terminal-Oberfläche noch nic
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr "Keine Vorschläge erhalten."
|
msgstr "Keine Vorschläge erhalten."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr "Nur Bilder können in der Vorschau angezeigt werden."
|
msgstr "Nur Bilder können in der Vorschau angezeigt werden."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr "Beitrag nicht gefunden."
|
msgstr "Beitrag nicht gefunden."
|
||||||
@@ -3725,18 +3728,18 @@ msgstr "Beitrag nicht gefunden."
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr "Drücken Sie Enter, um %{name} in der Vorschau anzuzeigen."
|
msgstr "Drücken Sie Enter, um %{name} in der Vorschau anzuzeigen."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr "Veröffentlicht."
|
msgstr "Veröffentlicht."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr "Speichern Sie vor dem Sprachwechsel."
|
msgstr "Speichern Sie vor dem Sprachwechsel."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr "Gespeichert."
|
msgstr "Gespeichert."
|
||||||
@@ -3761,18 +3764,18 @@ msgstr "Titel (Strg+T zum Bearbeiten)"
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr "Titel (Bearbeitung — Enter zum Bestätigen)"
|
msgstr "Titel (Bearbeitung — Enter zum Bestätigen)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr "Wird bearbeitet…"
|
msgstr "Wird bearbeitet…"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr "Esc zum Schließen"
|
msgstr "Esc zum Schließen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr "Mit Server verbinden"
|
msgstr "Mit Server verbinden"
|
||||||
@@ -3793,7 +3796,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr "Verbindung zum Server trennen"
|
msgstr "Verbindung zum Server trennen"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr "Serveradresse (user@host oder user@host:port), Public-Key-Authentifizierung:"
|
msgstr "Serveradresse (user@host oder user@host:port), Public-Key-Authentifizierung:"
|
||||||
@@ -3803,12 +3806,12 @@ msgstr "Serveradresse (user@host oder user@host:port), Public-Key-Authentifizier
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr "Verwenden Sie das Format user@host oder user@host:port."
|
msgstr "Verwenden Sie das Format user@host oder user@host:port."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr "Vorschau (ctrl+e zum Bearbeiten)"
|
msgstr "Vorschau (ctrl+e zum Bearbeiten)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format
|
#, 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"
|
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"
|
msgstr "Strg+S Speichern · Strg+P Veröffentlichen · Strg+E Vorschau · Strg+T Titel · Strg+L Sprache · Strg+G KI · Esc Zurück"
|
||||||
@@ -3818,7 +3821,7 @@ msgstr "Strg+S Speichern · Strg+P Veröffentlichen · Strg+E Vorschau · Strg+T
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr "Alle Aufgaben abgeschlossen."
|
msgstr "Alle Aufgaben abgeschlossen."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr "Befehle — Esc zum Schließen"
|
msgstr "Befehle — Esc zum Schließen"
|
||||||
@@ -3828,27 +3831,27 @@ msgstr "Befehle — Esc zum Schließen"
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr "Unbekannter Befehl."
|
msgstr "Unbekannter Befehl."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr "[Bericht/Anwenden in der GUI]"
|
msgstr "[Bericht/Anwenden in der GUI]"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr "%{diffs} Unterschiede · %{orphans} verwaiste Dateien"
|
msgstr "%{diffs} Unterschiede · %{orphans} verwaiste Dateien"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr "Erwartet %{expected} · Vorhanden %{existing}"
|
msgstr "Erwartet %{expected} · Vorhanden %{existing}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr "Überzählige Dateien (werden entfernt):"
|
msgstr "Überzählige Dateien (werden entfernt):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr "Fehlende Seiten (werden gerendert):"
|
msgstr "Fehlende Seiten (werden gerendert):"
|
||||||
@@ -3863,27 +3866,27 @@ msgstr "Nichts anzuwenden."
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr "Nichts zu reparieren."
|
msgstr "Nichts zu reparieren."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr "Verwaiste Dateien (nicht in der Datenbank):"
|
msgstr "Verwaiste Dateien (nicht in der Datenbank):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr "Sitemap geändert."
|
msgstr "Sitemap geändert."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr "Aktualisierte Beiträge (werden neu gerendert):"
|
msgstr "Aktualisierte Beiträge (werden neu gerendert):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr "Enter Änderungen anwenden · Esc Schließen"
|
msgstr "Enter Änderungen anwenden · Esc Schließen"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr "Enter alles aus Dateien reparieren · Esc Schließen"
|
msgstr "Enter alles aus Dateien reparieren · Esc Schließen"
|
||||||
@@ -3898,7 +3901,7 @@ msgstr "Importierter Blog"
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr "Kein Ordner: %{path}"
|
msgstr "Kein Ordner: %{path}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr "Projekte — Enter Wechseln · O Bestehenden öffnen · Esc Schließen"
|
msgstr "Projekte — Enter Wechseln · O Bestehenden öffnen · Esc Schließen"
|
||||||
@@ -3908,12 +3911,12 @@ msgstr "Projekte — Enter Wechseln · O Bestehenden öffnen · Esc Schließen"
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr "Zu %{name} gewechselt."
|
msgstr "Zu %{name} gewechselt."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr "Passende Ordner"
|
msgstr "Passende Ordner"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr "Bestehenden Blog öffnen — Ordnerpfad eingeben · Tab Vervollständigen · Enter Öffnen · Esc Zurück"
|
msgstr "Bestehenden Blog öffnen — Ordnerpfad eingeben · Tab Vervollständigen · Enter Öffnen · Esc Zurück"
|
||||||
@@ -3933,7 +3936,7 @@ msgstr "Commit erstellt."
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr "Diff (Bild↑/Bild↓ blättern)"
|
msgstr "Diff (Bild↑/Bild↓ blättern)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr "Keine Änderungen."
|
msgstr "Keine Änderungen."
|
||||||
@@ -4044,7 +4047,7 @@ msgstr "Theme"
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr "Enter Bearbeiten · Strg+S Speichern · Esc Schließen"
|
msgstr "Enter Bearbeiten · Strg+S Speichern · Esc Schließen"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr "Enter Bearbeiten/Umschalten/Wechseln · Strg+S Speichern · Esc Schließen · Strg+Q Beenden"
|
msgstr "Enter Bearbeiten/Umschalten/Wechseln · Strg+S Speichern · Esc Schließen · Strg+Q Beenden"
|
||||||
@@ -4054,12 +4057,12 @@ msgstr "Enter Bearbeiten/Umschalten/Wechseln · Strg+S Speichern · Esc Schließ
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr "noch nicht unterstützt"
|
msgstr "noch nicht unterstützt"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr "C Commit · U Pull · S Push · Enter Zur Datei springen · Bild↑/Bild↓ Diff blättern · 1-7 Ansichten · Strg+Q Beenden"
|
msgstr "C Commit · U Pull · S Push · Enter Zur Datei springen · Bild↑/Bild↓ Diff blättern · 1-7 Ansichten · Strg+Q Beenden"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr "Enter Öffnen · N Neuer Beitrag · 1-7 Ansichten · P Projekte · / Suche · : Befehle (:? Hilfe) · R Aktualisieren · Strg+Q Beenden"
|
msgstr "Enter Öffnen · N Neuer Beitrag · 1-7 Ansichten · P Projekte · / Suche · : Befehle (:? Hilfe) · R Aktualisieren · Strg+Q Beenden"
|
||||||
@@ -4191,12 +4194,12 @@ msgstr "Das Ziel der Zusammenführung muss eines der markierten Schlagwörter se
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr "Standard"
|
msgstr "Standard"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr "Esc schließen"
|
msgstr "Esc schließen"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr "n neu · Enter umbenennen · c Farbe · t Vorlage · d löschen · s synchronisieren · Esc schließen"
|
msgstr "n neu · Enter umbenennen · c Farbe · t Vorlage · d löschen · s synchronisieren · Esc schließen"
|
||||||
@@ -4206,7 +4209,17 @@ msgstr "n neu · Enter umbenennen · c Farbe · t Vorlage · d löschen · s syn
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr "keine"
|
msgstr "keine"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr "Leertaste markieren · m in Auswahl zusammenführen · Esc schließen"
|
msgstr "Leertaste markieren · m in Auswahl zusammenführen · Esc schließen"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr "Ausstehend"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Running"
|
||||||
|
msgstr "Läuft"
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ msgstr ""
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -343,7 +343,7 @@ msgstr ""
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -368,7 +368,7 @@ msgstr ""
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -441,6 +441,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -494,7 +495,7 @@ msgstr ""
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -575,7 +576,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -593,7 +594,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -606,6 +607,7 @@ msgid "Content Categories"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1040,7 +1042,7 @@ msgid "Filename"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1051,7 +1053,7 @@ msgid "Find"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1078,14 +1080,14 @@ msgid "Gallery"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1098,8 +1100,8 @@ msgid "Git Diff"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1222,9 +1224,9 @@ msgstr ""
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1325,7 +1327,7 @@ msgstr ""
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1404,9 +1406,9 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1435,7 +1437,7 @@ msgid "Merge"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1453,8 +1455,8 @@ msgstr ""
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1532,12 +1534,12 @@ msgstr ""
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1547,7 +1549,7 @@ msgstr ""
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1607,7 +1609,7 @@ msgstr ""
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1632,7 +1634,7 @@ msgstr ""
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1801,7 +1803,7 @@ msgid "Open Settings"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1832,8 +1834,8 @@ msgstr ""
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1915,7 +1917,7 @@ msgid "Post"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1950,8 +1952,8 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2081,14 +2083,14 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2146,7 +2148,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2157,7 +2159,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2342,10 +2344,11 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2452,7 +2455,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2478,7 +2481,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2575,7 +2578,7 @@ msgid "System Prompt"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2602,8 +2605,8 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2613,8 +2616,8 @@ msgstr ""
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2661,7 +2664,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/template_editor.ex:171
|
#: 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:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2670,7 +2673,7 @@ msgstr ""
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2885,7 +2888,7 @@ msgid "Updated URLs"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2913,13 +2916,13 @@ msgid "Validate"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3301,12 +3304,12 @@ msgstr ""
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr "Comparing database and filesystem metadata"
|
msgstr "Comparing database and filesystem metadata"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr "Added %{count} images to post"
|
msgstr "Added %{count} images to post"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr "Added %{title}"
|
msgstr "Added %{title}"
|
||||||
@@ -3327,18 +3330,18 @@ msgstr ""
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr "Image Import Concurrency"
|
msgstr "Image Import Concurrency"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr "Add Gallery Images"
|
msgstr "Add Gallery Images"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr "Failed to process %{path}: %{reason}"
|
msgstr "Failed to process %{path}: %{reason}"
|
||||||
@@ -3400,7 +3403,7 @@ msgid "Commit"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3536,12 +3539,12 @@ msgstr ""
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr "Blogmark"
|
msgstr "Blogmark"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3582,7 +3585,7 @@ msgstr ""
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3593,7 +3596,7 @@ msgid "Suggested tags"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3690,12 +3693,12 @@ msgstr ""
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
msgid "The endpoint returned no models. You can still type a model name manually."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
msgid "AI is unavailable in airplane mode without a local endpoint."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3710,12 +3713,12 @@ msgstr ""
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3725,18 +3728,18 @@ msgstr ""
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3761,18 +3764,18 @@ msgstr ""
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3793,7 +3796,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3803,12 +3806,12 @@ msgstr ""
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, 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"
|
msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3818,7 +3821,7 @@ msgstr ""
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3828,27 +3831,27 @@ msgstr ""
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3863,27 +3866,27 @@ msgstr ""
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3898,7 +3901,7 @@ msgstr ""
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3908,12 +3911,12 @@ msgstr ""
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3933,7 +3936,7 @@ msgstr ""
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4044,7 +4047,7 @@ msgstr ""
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4054,12 +4057,12 @@ msgstr ""
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4191,12 +4194,12 @@ msgstr ""
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4206,7 +4209,17 @@ msgstr ""
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
|
msgid "Running"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ msgstr "Configuración de IA"
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr "Sugerencias de IA"
|
msgstr "Sugerencias de IA"
|
||||||
@@ -343,7 +343,7 @@ msgstr "Autor"
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr "Automático"
|
msgstr "Automático"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -368,7 +368,7 @@ msgstr "Ayudas de automatización"
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr "Idiomas disponibles"
|
msgstr "Idiomas disponibles"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -441,6 +441,7 @@ msgstr "La copia del bookmarklet está conectada mediante el entorno de escritor
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
@@ -494,7 +495,7 @@ msgstr "Valores predeterminados de categoría, opciones de renderizado y conexi
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr "El nombre de la categoría es obligatorio"
|
msgstr "El nombre de la categoría es obligatorio"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -575,7 +576,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr "Contraer bloques de diff sin cambios"
|
msgstr "Contraer bloques de diff sin cambios"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr "Comando completado"
|
msgstr "Comando completado"
|
||||||
@@ -593,7 +594,7 @@ msgstr "Confirmar"
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -606,6 +607,7 @@ msgid "Content Categories"
|
|||||||
msgstr "Categorías de contenido"
|
msgstr "Categorías de contenido"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr "Copiar"
|
msgstr "Copiar"
|
||||||
@@ -1040,7 +1042,7 @@ msgid "Filename"
|
|||||||
msgstr "Nombre de archivo"
|
msgstr "Nombre de archivo"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr "Completar traducciones faltantes"
|
msgstr "Completar traducciones faltantes"
|
||||||
@@ -1051,7 +1053,7 @@ msgid "Find"
|
|||||||
msgstr "Buscar"
|
msgstr "Buscar"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr "Buscar entradas duplicadas"
|
msgstr "Buscar entradas duplicadas"
|
||||||
@@ -1078,14 +1080,14 @@ msgid "Gallery"
|
|||||||
msgstr "Galeria"
|
msgstr "Galeria"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr "Generar sitio"
|
msgstr "Generar sitio"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1098,8 +1100,8 @@ msgid "Git Diff"
|
|||||||
msgstr "Diff de Git"
|
msgstr "Diff de Git"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr "Registro Git"
|
msgstr "Registro Git"
|
||||||
@@ -1222,9 +1224,9 @@ msgstr "Definiciones de importación"
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr "La importación falló: %{error}"
|
msgstr "La importación falló: %{error}"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1325,7 +1327,7 @@ msgstr "Medios vinculados"
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr "Publicaciones enlazadas"
|
msgstr "Publicaciones enlazadas"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1404,9 +1406,9 @@ msgstr "Máximo de publicaciones por página"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1435,7 +1437,7 @@ msgid "Merge"
|
|||||||
msgstr "Fusionar"
|
msgstr "Fusionar"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1453,8 +1455,8 @@ msgstr "Metadatos"
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1532,12 +1534,12 @@ msgstr "Nueva plantilla"
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr "Sin plantilla"
|
msgstr "Sin plantilla"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr "No hay tareas en segundo plano en ejecución"
|
msgstr "No hay tareas en segundo plano en ejecución"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr "Sin asunto de commit"
|
msgstr "Sin asunto de commit"
|
||||||
@@ -1547,7 +1549,7 @@ msgstr "Sin asunto de commit"
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr "Ninguna carpeta seleccionada"
|
msgstr "Ninguna carpeta seleccionada"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr "Aún no hay historial de Git"
|
msgstr "Aún no hay historial de Git"
|
||||||
@@ -1607,7 +1609,7 @@ msgstr "No hay archivos huérfanos seleccionados"
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr "Aún no hay páginas"
|
msgstr "Aún no hay páginas"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr "Aún no hay enlaces a artículos"
|
msgstr "Aún no hay enlaces a artículos"
|
||||||
@@ -1632,7 +1634,7 @@ msgstr "No hay ninguna acción de reparación disponible"
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr "Ninguna configuración coincide con la búsqueda actual"
|
msgstr "Ninguna configuración coincide con la búsqueda actual"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr "Aún no hay salida del shell"
|
msgstr "Aún no hay salida del shell"
|
||||||
@@ -1801,7 +1803,7 @@ msgid "Open Settings"
|
|||||||
msgstr "Abrir Ajustes"
|
msgstr "Abrir Ajustes"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr "Abrir en el navegador"
|
msgstr "Abrir en el navegador"
|
||||||
@@ -1832,8 +1834,8 @@ msgstr "Otros"
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr "Otros (%{count})"
|
msgstr "Otros (%{count})"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr "Salida"
|
msgstr "Salida"
|
||||||
@@ -1915,7 +1917,7 @@ msgid "Post"
|
|||||||
msgstr "Publicación"
|
msgstr "Publicación"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1950,8 +1952,8 @@ msgstr "Artículo guardado"
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2081,14 +2083,14 @@ msgstr "Listo para importar:"
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr "Reconstruir base de datos"
|
msgstr "Reconstruir base de datos"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr "Reconstruir índice de embeddings"
|
msgstr "Reconstruir índice de embeddings"
|
||||||
@@ -2146,7 +2148,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr "Actualizar traducción"
|
msgstr "Actualizar traducción"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr "Regenerar calendario"
|
msgstr "Regenerar calendario"
|
||||||
@@ -2157,7 +2159,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr "Regenerar miniaturas faltantes"
|
msgstr "Regenerar miniaturas faltantes"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr "Reindexar texto"
|
msgstr "Reindexar texto"
|
||||||
@@ -2342,10 +2344,11 @@ msgstr "Las capacidades de scripts se configuran en la capa de aplicación en la
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2452,7 +2455,7 @@ msgstr "Similitud semántica"
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2478,7 +2481,7 @@ msgstr "Sitio"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2575,7 +2578,7 @@ msgid "System Prompt"
|
|||||||
msgstr "Prompt del sistema"
|
msgstr "Prompt del sistema"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2602,8 +2605,8 @@ msgstr "Nombre de la etiqueta"
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2613,8 +2616,8 @@ msgstr "Nombre de la etiqueta"
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr "Etiquetas"
|
msgstr "Etiquetas"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2661,7 +2664,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:171
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:176
|
#: lib/bds/desktop/shell_live/template_editor.ex:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2670,7 +2673,7 @@ msgstr "La sintaxis de la plantilla es válida"
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr "Plantillas"
|
msgstr "Plantillas"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr "El panel inferior compartido está disponible para tareas, salida, detalles de Git y diagnósticos específicos del editor."
|
msgstr "El panel inferior compartido está disponible para tareas, salida, detalles de Git y diagnósticos específicos del editor."
|
||||||
@@ -2885,7 +2888,7 @@ msgid "Updated URLs"
|
|||||||
msgstr "URLs actualizadas"
|
msgstr "URLs actualizadas"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr "Subir sitio"
|
msgstr "Subir sitio"
|
||||||
@@ -2913,13 +2916,13 @@ msgid "Validate"
|
|||||||
msgstr "Validar"
|
msgstr "Validar"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr "Validar sitio"
|
msgstr "Validar sitio"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr "Validar traducciones"
|
msgstr "Validar traducciones"
|
||||||
@@ -3301,12 +3304,12 @@ msgstr "Bienvenido al asistente de IA"
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr "Comparando metadatos de la base de datos y del sistema de archivos"
|
msgstr "Comparando metadatos de la base de datos y del sistema de archivos"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr "%{count} imágenes añadidas a la publicación"
|
msgstr "%{count} imágenes añadidas a la publicación"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr "%{title} añadido"
|
msgstr "%{title} añadido"
|
||||||
@@ -3327,18 +3330,18 @@ msgstr "Guía del usuario para flujos editoriales, medios, plantillas, traducci
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr "Importación simultánea de imágenes"
|
msgstr "Importación simultánea de imágenes"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr "Añadir imágenes a la galería"
|
msgstr "Añadir imágenes a la galería"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr "No se pudo procesar %{path}: %{reason}"
|
msgstr "No se pudo procesar %{path}: %{reason}"
|
||||||
@@ -3400,7 +3403,7 @@ msgid "Commit"
|
|||||||
msgstr "Commit"
|
msgstr "Commit"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr "Mensaje de commit"
|
msgstr "Mensaje de commit"
|
||||||
@@ -3536,12 +3539,12 @@ msgstr "renombrado"
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr "sin seguimiento"
|
msgstr "sin seguimiento"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr "Blogmark"
|
msgstr "Blogmark"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr "Abre un proyecto antes de importar un blogmark."
|
msgstr "Abre un proyecto antes de importar un blogmark."
|
||||||
@@ -3582,7 +3585,7 @@ msgstr "Eliminar etiqueta"
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr "Error al copiar el bookmarklet al portapapeles"
|
msgstr "Error al copiar el bookmarklet al portapapeles"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr "El proyecto al que apunta este blogmark no existe aquí."
|
msgstr "El proyecto al que apunta este blogmark no existe aquí."
|
||||||
@@ -3593,7 +3596,7 @@ msgid "Suggested tags"
|
|||||||
msgstr "Etiquetas sugeridas"
|
msgstr "Etiquetas sugeridas"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr "Forzar la regeneración del sitio"
|
msgstr "Forzar la regeneración del sitio"
|
||||||
@@ -3690,12 +3693,12 @@ msgstr "OK"
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
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."
|
msgstr "El endpoint no devolvió ningún modelo. Aún puedes escribir el nombre de un modelo manualmente."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
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."
|
msgstr "La IA no está disponible en modo avión sin un punto de conexión local."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr "No se pudo cargar este archivo."
|
msgstr "No se pudo cargar este archivo."
|
||||||
@@ -3710,12 +3713,12 @@ msgstr "La edición de este elemento aún no está disponible en la interfaz de
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr "No se recibieron sugerencias."
|
msgstr "No se recibieron sugerencias."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr "Solo se pueden previsualizar imágenes."
|
msgstr "Solo se pueden previsualizar imágenes."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr "Entrada no encontrada."
|
msgstr "Entrada no encontrada."
|
||||||
@@ -3725,18 +3728,18 @@ msgstr "Entrada no encontrada."
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr "Pulsa Intro para previsualizar %{name}."
|
msgstr "Pulsa Intro para previsualizar %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr "Publicado."
|
msgstr "Publicado."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr "Guarda antes de cambiar de idioma."
|
msgstr "Guarda antes de cambiar de idioma."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr "Guardado."
|
msgstr "Guardado."
|
||||||
@@ -3761,18 +3764,18 @@ msgstr "Título (ctrl+t para editar)"
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr "Título (edición — Intro para confirmar)"
|
msgstr "Título (edición — Intro para confirmar)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr "Procesando…"
|
msgstr "Procesando…"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr "esc para cerrar"
|
msgstr "esc para cerrar"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr "Conectar al servidor"
|
msgstr "Conectar al servidor"
|
||||||
@@ -3793,7 +3796,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr "Desconectar del servidor"
|
msgstr "Desconectar del servidor"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr "Dirección del servidor (user@host o user@host:port), autenticación de clave pública:"
|
msgstr "Dirección del servidor (user@host o user@host:port), autenticación de clave pública:"
|
||||||
@@ -3803,12 +3806,12 @@ msgstr "Dirección del servidor (user@host o user@host:port), autenticación de
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr "Usa el formato user@host o user@host:port."
|
msgstr "Usa el formato user@host o user@host:port."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr "Vista previa (ctrl+e para editar)"
|
msgstr "Vista previa (ctrl+e para editar)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format
|
#, 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"
|
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"
|
msgstr "ctrl+s guardar · ctrl+p publicar · ctrl+e vista previa · ctrl+t título · ctrl+l idioma · ctrl+g IA · esc volver"
|
||||||
@@ -3818,7 +3821,7 @@ msgstr "ctrl+s guardar · ctrl+p publicar · ctrl+e vista previa · ctrl+t títu
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr "Todas las tareas han terminado."
|
msgstr "Todas las tareas han terminado."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr "Comandos — esc para cerrar"
|
msgstr "Comandos — esc para cerrar"
|
||||||
@@ -3828,27 +3831,27 @@ msgstr "Comandos — esc para cerrar"
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr "Comando desconocido."
|
msgstr "Comando desconocido."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr "[informe/aplicación en la GUI]"
|
msgstr "[informe/aplicación en la GUI]"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr "%{diffs} diferencias · %{orphans} archivos huérfanos"
|
msgstr "%{diffs} diferencias · %{orphans} archivos huérfanos"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr "Esperados %{expected} · Existentes %{existing}"
|
msgstr "Esperados %{expected} · Existentes %{existing}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr "Archivos sobrantes (se eliminarán):"
|
msgstr "Archivos sobrantes (se eliminarán):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr "Páginas faltantes (se generarán):"
|
msgstr "Páginas faltantes (se generarán):"
|
||||||
@@ -3863,27 +3866,27 @@ msgstr "Nada que aplicar."
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr "Nada que reparar."
|
msgstr "Nada que reparar."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr "Archivos huérfanos (no están en la base de datos):"
|
msgstr "Archivos huérfanos (no están en la base de datos):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr "Sitemap modificado."
|
msgstr "Sitemap modificado."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr "Entradas actualizadas (se volverán a generar):"
|
msgstr "Entradas actualizadas (se volverán a generar):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr "intro aplicar cambios · esc cerrar"
|
msgstr "intro aplicar cambios · esc cerrar"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr "intro reparar todo desde archivos · esc cerrar"
|
msgstr "intro reparar todo desde archivos · esc cerrar"
|
||||||
@@ -3898,7 +3901,7 @@ msgstr "Blog importado"
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr "No es una carpeta: %{path}"
|
msgstr "No es una carpeta: %{path}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr "Proyectos — intro cambiar · o abrir existente · esc cerrar"
|
msgstr "Proyectos — intro cambiar · o abrir existente · esc cerrar"
|
||||||
@@ -3908,12 +3911,12 @@ msgstr "Proyectos — intro cambiar · o abrir existente · esc cerrar"
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr "Cambiado a %{name}."
|
msgstr "Cambiado a %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr "Carpetas coincidentes"
|
msgstr "Carpetas coincidentes"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr "Abrir blog existente — escribe la ruta de una carpeta · tab completar · intro abrir · esc volver"
|
msgstr "Abrir blog existente — escribe la ruta de una carpeta · tab completar · intro abrir · esc volver"
|
||||||
@@ -3933,7 +3936,7 @@ msgstr "Commit realizado."
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr "Diff (pgup/pgdn para desplazar)"
|
msgstr "Diff (pgup/pgdn para desplazar)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr "Sin cambios."
|
msgstr "Sin cambios."
|
||||||
@@ -4044,7 +4047,7 @@ msgstr "Tema"
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr "intro editar · ctrl+s guardar · esc cerrar"
|
msgstr "intro editar · ctrl+s guardar · esc cerrar"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr "intro editar/alternar/ciclar · ctrl+s guardar · esc cerrar · ctrl+q salir"
|
msgstr "intro editar/alternar/ciclar · ctrl+s guardar · esc cerrar · ctrl+q salir"
|
||||||
@@ -4054,12 +4057,12 @@ msgstr "intro editar/alternar/ciclar · ctrl+s guardar · esc cerrar · ctrl+q s
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr "aún no compatible"
|
msgstr "aún no compatible"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr "c commit · u pull · s push · intro ir al archivo · pgup/pgdn desplazar el diff · 1-7 vistas · ctrl+q salir"
|
msgstr "c commit · u pull · s push · intro ir al archivo · pgup/pgdn desplazar el diff · 1-7 vistas · ctrl+q salir"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr "intro abrir · n nueva entrada · 1-7 vistas · p proyectos · / buscar · : comandos (:? ayuda) · r actualizar · ctrl+q salir"
|
msgstr "intro abrir · n nueva entrada · 1-7 vistas · p proyectos · / buscar · : comandos (:? ayuda) · r actualizar · ctrl+q salir"
|
||||||
@@ -4191,12 +4194,12 @@ msgstr "El destino de la combinación debe ser una de las etiquetas marcadas"
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr "predeterminado"
|
msgstr "predeterminado"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr "esc cerrar"
|
msgstr "esc cerrar"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr "n nuevo · intro renombrar · c color · t plantilla · d eliminar · s sincronizar · esc cerrar"
|
msgstr "n nuevo · intro renombrar · c color · t plantilla · d eliminar · s sincronizar · esc cerrar"
|
||||||
@@ -4206,7 +4209,17 @@ msgstr "n nuevo · intro renombrar · c color · t plantilla · d eliminar · s
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr "ninguno"
|
msgstr "ninguno"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr "espacio marcar · m combinar en la selección · esc cerrar"
|
msgstr "espacio marcar · m combinar en la selección · esc cerrar"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr "Pendiente"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Running"
|
||||||
|
msgstr "En curso"
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ msgstr "Paramètres IA"
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr "Suggestions IA"
|
msgstr "Suggestions IA"
|
||||||
@@ -343,7 +343,7 @@ msgstr "Auteur"
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr "Automatique"
|
msgstr "Automatique"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -368,7 +368,7 @@ msgstr "Aides d’automatisation"
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr "Langues disponibles"
|
msgstr "Langues disponibles"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -441,6 +441,7 @@ msgstr "La copie du bookmarklet est reliée via l’environnement desktop et l
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
@@ -494,7 +495,7 @@ msgstr "Valeurs par défaut des catégories, options de rendu et liaison des mod
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr "Le nom de la catégorie est requis"
|
msgstr "Le nom de la catégorie est requis"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -575,7 +576,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr "Réduire les blocs de diff inchangés"
|
msgstr "Réduire les blocs de diff inchangés"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr "Commande terminée"
|
msgstr "Commande terminée"
|
||||||
@@ -593,7 +594,7 @@ msgstr "Confirmer"
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -606,6 +607,7 @@ msgid "Content Categories"
|
|||||||
msgstr "Catégories de contenu"
|
msgstr "Catégories de contenu"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr "Copier"
|
msgstr "Copier"
|
||||||
@@ -1040,7 +1042,7 @@ msgid "Filename"
|
|||||||
msgstr "Nom de fichier"
|
msgstr "Nom de fichier"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr "Compléter les traductions manquantes"
|
msgstr "Compléter les traductions manquantes"
|
||||||
@@ -1051,7 +1053,7 @@ msgid "Find"
|
|||||||
msgstr "Rechercher"
|
msgstr "Rechercher"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr "Trouver les doublons"
|
msgstr "Trouver les doublons"
|
||||||
@@ -1078,14 +1080,14 @@ msgid "Gallery"
|
|||||||
msgstr "Galerie"
|
msgstr "Galerie"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr "Générer le site"
|
msgstr "Générer le site"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1098,8 +1100,8 @@ msgid "Git Diff"
|
|||||||
msgstr "Diff Git"
|
msgstr "Diff Git"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr "Journal Git"
|
msgstr "Journal Git"
|
||||||
@@ -1222,9 +1224,9 @@ msgstr "Définitions d’import"
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr "Échec de l’import : %{error}"
|
msgstr "Échec de l’import : %{error}"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1325,7 +1327,7 @@ msgstr "Médias liés"
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr "Articles liés"
|
msgstr "Articles liés"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1404,9 +1406,9 @@ msgstr "Nombre maximal d’articles par page"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1435,7 +1437,7 @@ msgid "Merge"
|
|||||||
msgstr "Fusionner"
|
msgstr "Fusionner"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1453,8 +1455,8 @@ msgstr "Métadonnées"
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1532,12 +1534,12 @@ msgstr "Nouveau modèle"
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr "Aucun template"
|
msgstr "Aucun template"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr "Aucune tâche d’arrière-plan en cours"
|
msgstr "Aucune tâche d’arrière-plan en cours"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr "Pas de sujet de commit"
|
msgstr "Pas de sujet de commit"
|
||||||
@@ -1547,7 +1549,7 @@ msgstr "Pas de sujet de commit"
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr "Aucun dossier sélectionné"
|
msgstr "Aucun dossier sélectionné"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr "Pas encore d'historique Git"
|
msgstr "Pas encore d'historique Git"
|
||||||
@@ -1607,7 +1609,7 @@ msgstr "Aucun fichier orphelin sélectionné"
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr "Aucune page pour le moment"
|
msgstr "Aucune page pour le moment"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr "Pas encore de liens vers des articles"
|
msgstr "Pas encore de liens vers des articles"
|
||||||
@@ -1632,7 +1634,7 @@ msgstr "Aucune action de réparation disponible"
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr "Aucun paramètre ne correspond à la recherche actuelle"
|
msgstr "Aucun paramètre ne correspond à la recherche actuelle"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr "Aucune sortie du shell pour l’instant"
|
msgstr "Aucune sortie du shell pour l’instant"
|
||||||
@@ -1801,7 +1803,7 @@ msgid "Open Settings"
|
|||||||
msgstr "Ouvrir les Réglages"
|
msgstr "Ouvrir les Réglages"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr "Ouvrir dans le navigateur"
|
msgstr "Ouvrir dans le navigateur"
|
||||||
@@ -1832,8 +1834,8 @@ msgstr "Autre"
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr "Autres (%{count})"
|
msgstr "Autres (%{count})"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr "Sortie"
|
msgstr "Sortie"
|
||||||
@@ -1915,7 +1917,7 @@ msgid "Post"
|
|||||||
msgstr "Article"
|
msgstr "Article"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1950,8 +1952,8 @@ msgstr "Article enregistré"
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2081,14 +2083,14 @@ msgstr "Prêt à importer :"
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr "Reconstruire la base de données"
|
msgstr "Reconstruire la base de données"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr "Reconstruire l’index d’embeddings"
|
msgstr "Reconstruire l’index d’embeddings"
|
||||||
@@ -2146,7 +2148,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr "Actualiser la traduction"
|
msgstr "Actualiser la traduction"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr "Régénérer le calendrier"
|
msgstr "Régénérer le calendrier"
|
||||||
@@ -2157,7 +2159,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr "Régénérer les vignettes manquantes"
|
msgstr "Régénérer les vignettes manquantes"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr "Réindexer le texte"
|
msgstr "Réindexer le texte"
|
||||||
@@ -2342,10 +2344,11 @@ msgstr "Les capacités de script sont configurées au niveau de l’application
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2452,7 +2455,7 @@ msgstr "Similarité sémantique"
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2478,7 +2481,7 @@ msgstr "Site"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2575,7 +2578,7 @@ msgid "System Prompt"
|
|||||||
msgstr "Prompt système"
|
msgstr "Prompt système"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2602,8 +2605,8 @@ msgstr "Nom du mot-clé"
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2613,8 +2616,8 @@ msgstr "Nom du mot-clé"
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr "Tags"
|
msgstr "Tags"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2661,7 +2664,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:171
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:176
|
#: lib/bds/desktop/shell_live/template_editor.ex:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2670,7 +2673,7 @@ msgstr "La syntaxe du template est valide"
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr "Modèles"
|
msgstr "Modèles"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr "Le panneau inférieur partagé est disponible pour les tâches, la sortie, les détails Git et les diagnostics spécifiques à l’éditeur."
|
msgstr "Le panneau inférieur partagé est disponible pour les tâches, la sortie, les détails Git et les diagnostics spécifiques à l’éditeur."
|
||||||
@@ -2885,7 +2888,7 @@ msgid "Updated URLs"
|
|||||||
msgstr "URLs mises à jour"
|
msgstr "URLs mises à jour"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr "Téléverser le site"
|
msgstr "Téléverser le site"
|
||||||
@@ -2913,13 +2916,13 @@ msgid "Validate"
|
|||||||
msgstr "Valider"
|
msgstr "Valider"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr "Valider le site"
|
msgstr "Valider le site"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr "Valider les traductions"
|
msgstr "Valider les traductions"
|
||||||
@@ -3301,12 +3304,12 @@ msgstr "Bienvenue dans l’assistant IA"
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr "Comparaison des métadonnées entre la base et le système de fichiers"
|
msgstr "Comparaison des métadonnées entre la base et le système de fichiers"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr "%{count} images ajoutées à l'article"
|
msgstr "%{count} images ajoutées à l'article"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr "%{title} ajouté"
|
msgstr "%{title} ajouté"
|
||||||
@@ -3327,18 +3330,18 @@ msgstr "Guide utilisateur pour les flux éditoriaux, médias, modèles, traducti
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr "Importation simultanée d'images"
|
msgstr "Importation simultanée d'images"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr "Ajouter des images à la galerie"
|
msgstr "Ajouter des images à la galerie"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr "Impossible de traiter %{path} : %{reason}"
|
msgstr "Impossible de traiter %{path} : %{reason}"
|
||||||
@@ -3400,7 +3403,7 @@ msgid "Commit"
|
|||||||
msgstr "Commit"
|
msgstr "Commit"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr "Message de commit"
|
msgstr "Message de commit"
|
||||||
@@ -3536,12 +3539,12 @@ msgstr "renommé"
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr "non suivi"
|
msgstr "non suivi"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr "Blogmark"
|
msgstr "Blogmark"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr "Ouvrez un projet avant d’importer un blogmark."
|
msgstr "Ouvrez un projet avant d’importer un blogmark."
|
||||||
@@ -3582,7 +3585,7 @@ msgstr "Supprimer le tag"
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr "Échec de la copie du bookmarklet dans le presse-papiers"
|
msgstr "Échec de la copie du bookmarklet dans le presse-papiers"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr "Le projet ciblé par ce blogmark n'existe pas ici."
|
msgstr "Le projet ciblé par ce blogmark n'existe pas ici."
|
||||||
@@ -3593,7 +3596,7 @@ msgid "Suggested tags"
|
|||||||
msgstr "Tags suggérés"
|
msgstr "Tags suggérés"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr "Forcer la régénération du site"
|
msgstr "Forcer la régénération du site"
|
||||||
@@ -3690,12 +3693,12 @@ msgstr "OK"
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
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."
|
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:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
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."
|
msgstr "L'IA n'est pas disponible en mode avion sans point de terminaison local."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr "Impossible de charger ce fichier."
|
msgstr "Impossible de charger ce fichier."
|
||||||
@@ -3710,12 +3713,12 @@ msgstr "La modification de cet élément n'est pas encore disponible dans l'inte
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr "Aucune suggestion reçue."
|
msgstr "Aucune suggestion reçue."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr "Seules les images peuvent être prévisualisées."
|
msgstr "Seules les images peuvent être prévisualisées."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr "Article introuvable."
|
msgstr "Article introuvable."
|
||||||
@@ -3725,18 +3728,18 @@ msgstr "Article introuvable."
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr "Appuyez sur Entrée pour prévisualiser %{name}."
|
msgstr "Appuyez sur Entrée pour prévisualiser %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr "Publié."
|
msgstr "Publié."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr "Enregistrez avant de changer de langue."
|
msgstr "Enregistrez avant de changer de langue."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr "Enregistré."
|
msgstr "Enregistré."
|
||||||
@@ -3761,18 +3764,18 @@ msgstr "Titre (ctrl+t pour modifier)"
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr "Titre (édition — Entrée pour confirmer)"
|
msgstr "Titre (édition — Entrée pour confirmer)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr "Traitement en cours…"
|
msgstr "Traitement en cours…"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr "échap pour fermer"
|
msgstr "échap pour fermer"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr "Se connecter au serveur"
|
msgstr "Se connecter au serveur"
|
||||||
@@ -3793,7 +3796,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr "Se déconnecter du serveur"
|
msgstr "Se déconnecter du serveur"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr "Adresse du serveur (user@host ou user@host:port), authentification par clé publique :"
|
msgstr "Adresse du serveur (user@host ou user@host:port), authentification par clé publique :"
|
||||||
@@ -3803,12 +3806,12 @@ msgstr "Adresse du serveur (user@host ou user@host:port), authentification par c
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr "Utilisez le format user@host ou user@host:port."
|
msgstr "Utilisez le format user@host ou user@host:port."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr "Aperçu (ctrl+e pour modifier)"
|
msgstr "Aperçu (ctrl+e pour modifier)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format
|
#, 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"
|
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"
|
msgstr "ctrl+s enregistrer · ctrl+p publier · ctrl+e aperçu · ctrl+t titre · ctrl+l langue · ctrl+g IA · échap retour"
|
||||||
@@ -3818,7 +3821,7 @@ msgstr "ctrl+s enregistrer · ctrl+p publier · ctrl+e aperçu · ctrl+t titre
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr "Toutes les tâches sont terminées."
|
msgstr "Toutes les tâches sont terminées."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr "Commandes — échap pour fermer"
|
msgstr "Commandes — échap pour fermer"
|
||||||
@@ -3828,27 +3831,27 @@ msgstr "Commandes — échap pour fermer"
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr "Commande inconnue."
|
msgstr "Commande inconnue."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr "[rapport/application dans la GUI]"
|
msgstr "[rapport/application dans la GUI]"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr "%{diffs} différences · %{orphans} fichiers orphelins"
|
msgstr "%{diffs} différences · %{orphans} fichiers orphelins"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr "Attendu %{expected} · Existant %{existing}"
|
msgstr "Attendu %{expected} · Existant %{existing}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr "Fichiers en trop (seront supprimés) :"
|
msgstr "Fichiers en trop (seront supprimés) :"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr "Pages manquantes (seront rendues) :"
|
msgstr "Pages manquantes (seront rendues) :"
|
||||||
@@ -3863,27 +3866,27 @@ msgstr "Rien à appliquer."
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr "Rien à réparer."
|
msgstr "Rien à réparer."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr "Fichiers orphelins (absents de la base de données) :"
|
msgstr "Fichiers orphelins (absents de la base de données) :"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr "Sitemap modifié."
|
msgstr "Sitemap modifié."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr "Articles mis à jour (seront rendus à nouveau) :"
|
msgstr "Articles mis à jour (seront rendus à nouveau) :"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr "entrée appliquer les modifications · échap fermer"
|
msgstr "entrée appliquer les modifications · échap fermer"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr "entrée tout réparer depuis les fichiers · échap fermer"
|
msgstr "entrée tout réparer depuis les fichiers · échap fermer"
|
||||||
@@ -3898,7 +3901,7 @@ msgstr "Blog importé"
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr "Pas un dossier : %{path}"
|
msgstr "Pas un dossier : %{path}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr "Projets — entrée changer · o ouvrir existant · échap fermer"
|
msgstr "Projets — entrée changer · o ouvrir existant · échap fermer"
|
||||||
@@ -3908,12 +3911,12 @@ msgstr "Projets — entrée changer · o ouvrir existant · échap fermer"
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr "Passage à %{name}."
|
msgstr "Passage à %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr "Dossiers correspondants"
|
msgstr "Dossiers correspondants"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr "Ouvrir un blog existant — saisir le chemin d'un dossier · tab compléter · entrée ouvrir · échap retour"
|
msgstr "Ouvrir un blog existant — saisir le chemin d'un dossier · tab compléter · entrée ouvrir · échap retour"
|
||||||
@@ -3933,7 +3936,7 @@ msgstr "Commit effectué."
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr "Diff (pgup/pgdn pour défiler)"
|
msgstr "Diff (pgup/pgdn pour défiler)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr "Aucune modification."
|
msgstr "Aucune modification."
|
||||||
@@ -4044,7 +4047,7 @@ msgstr "Thème"
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr "entrée modifier · ctrl+s enregistrer · échap fermer"
|
msgstr "entrée modifier · ctrl+s enregistrer · échap fermer"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr "entrée modifier/basculer/parcourir · ctrl+s enregistrer · échap fermer · ctrl+q quitter"
|
msgstr "entrée modifier/basculer/parcourir · ctrl+s enregistrer · échap fermer · ctrl+q quitter"
|
||||||
@@ -4054,12 +4057,12 @@ msgstr "entrée modifier/basculer/parcourir · ctrl+s enregistrer · échap ferm
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr "pas encore pris en charge"
|
msgstr "pas encore pris en charge"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr "c commit · u pull · s push · entrée aller au fichier · pgup/pgdn défiler le diff · 1-7 vues · ctrl+q quitter"
|
msgstr "c commit · u pull · s push · entrée aller au fichier · pgup/pgdn défiler le diff · 1-7 vues · ctrl+q quitter"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr "entrée ouvrir · n nouvel article · 1-7 vues · p projets · / rechercher · : commandes (:? aide) · r actualiser · ctrl+q quitter"
|
msgstr "entrée ouvrir · n nouvel article · 1-7 vues · p projets · / rechercher · : commandes (:? aide) · r actualiser · ctrl+q quitter"
|
||||||
@@ -4191,12 +4194,12 @@ msgstr "La cible de la fusion doit être l'un des mots-clés marqués"
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr "par défaut"
|
msgstr "par défaut"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr "échap fermer"
|
msgstr "échap fermer"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr "n nouveau · entrée renommer · c couleur · t modèle · d supprimer · s synchroniser · échap fermer"
|
msgstr "n nouveau · entrée renommer · c couleur · t modèle · d supprimer · s synchroniser · échap fermer"
|
||||||
@@ -4206,7 +4209,17 @@ msgstr "n nouveau · entrée renommer · c couleur · t modèle · d supprimer
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr "aucune"
|
msgstr "aucune"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr "espace marquer · m fusionner dans la sélection · échap fermer"
|
msgstr "espace marquer · m fusionner dans la sélection · échap fermer"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr "En attente"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Running"
|
||||||
|
msgstr "En cours"
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ msgstr "Impostazioni IA"
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr "Suggerimenti IA"
|
msgstr "Suggerimenti IA"
|
||||||
@@ -343,7 +343,7 @@ msgstr "Autore"
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr "Automatico"
|
msgstr "Automatico"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -368,7 +368,7 @@ msgstr "Strumenti di automazione"
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr "Lingue disponibili"
|
msgstr "Lingue disponibili"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -441,6 +441,7 @@ msgstr "La copia del bookmarklet è collegata tramite il runtime desktop e l’U
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
@@ -494,7 +495,7 @@ msgstr "Valori predefiniti delle categorie, opzioni di rendering e collegamento
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr "Il nome della categoria è obbligatorio"
|
msgstr "Il nome della categoria è obbligatorio"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -575,7 +576,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr "Comprimi i blocchi diff invariati"
|
msgstr "Comprimi i blocchi diff invariati"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr "Comando completato"
|
msgstr "Comando completato"
|
||||||
@@ -593,7 +594,7 @@ msgstr "Conferma"
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -606,6 +607,7 @@ msgid "Content Categories"
|
|||||||
msgstr "Categorie di contenuto"
|
msgstr "Categorie di contenuto"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr "Copia"
|
msgstr "Copia"
|
||||||
@@ -1040,7 +1042,7 @@ msgid "Filename"
|
|||||||
msgstr "Nome file"
|
msgstr "Nome file"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr "Completa traduzioni mancanti"
|
msgstr "Completa traduzioni mancanti"
|
||||||
@@ -1051,7 +1053,7 @@ msgid "Find"
|
|||||||
msgstr "Trova"
|
msgstr "Trova"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr "Trova post duplicati"
|
msgstr "Trova post duplicati"
|
||||||
@@ -1078,14 +1080,14 @@ msgid "Gallery"
|
|||||||
msgstr "Galleria"
|
msgstr "Galleria"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr "Genera sito"
|
msgstr "Genera sito"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1098,8 +1100,8 @@ msgid "Git Diff"
|
|||||||
msgstr "Diff Git"
|
msgstr "Diff Git"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr "Log Git"
|
msgstr "Log Git"
|
||||||
@@ -1222,9 +1224,9 @@ msgstr "Definizioni di importazione"
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr "Importazione non riuscita: %{error}"
|
msgstr "Importazione non riuscita: %{error}"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1325,7 +1327,7 @@ msgstr "Media collegati"
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr "Post collegati"
|
msgstr "Post collegati"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1404,9 +1406,9 @@ msgstr "Numero massimo di post per pagina"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1435,7 +1437,7 @@ msgid "Merge"
|
|||||||
msgstr "Unisci"
|
msgstr "Unisci"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1453,8 +1455,8 @@ msgstr "Metadati"
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1532,12 +1534,12 @@ msgstr "Nuovo modello"
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr "Nessun template"
|
msgstr "Nessun template"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr "Nessuna attività in background in esecuzione"
|
msgstr "Nessuna attività in background in esecuzione"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr "Nessun oggetto del commit"
|
msgstr "Nessun oggetto del commit"
|
||||||
@@ -1547,7 +1549,7 @@ msgstr "Nessun oggetto del commit"
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr "Nessuna cartella selezionata"
|
msgstr "Nessuna cartella selezionata"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr "Nessuna cronologia Git"
|
msgstr "Nessuna cronologia Git"
|
||||||
@@ -1607,7 +1609,7 @@ msgstr "Nessun file orfano selezionato"
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr "Nessuna pagina"
|
msgstr "Nessuna pagina"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr "Nessun collegamento ad articoli"
|
msgstr "Nessun collegamento ad articoli"
|
||||||
@@ -1632,7 +1634,7 @@ msgstr "Nessuna azione di riparazione disponibile"
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr "Nessuna impostazione corrisponde alla ricerca corrente"
|
msgstr "Nessuna impostazione corrisponde alla ricerca corrente"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr "Nessun output della shell per ora"
|
msgstr "Nessun output della shell per ora"
|
||||||
@@ -1801,7 +1803,7 @@ msgid "Open Settings"
|
|||||||
msgstr "Apri Impostazioni"
|
msgstr "Apri Impostazioni"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr "Apri nel browser"
|
msgstr "Apri nel browser"
|
||||||
@@ -1832,8 +1834,8 @@ msgstr "Altro"
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr "Altro (%{count})"
|
msgstr "Altro (%{count})"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr "Output"
|
msgstr "Output"
|
||||||
@@ -1915,7 +1917,7 @@ msgid "Post"
|
|||||||
msgstr "Post"
|
msgstr "Post"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1950,8 +1952,8 @@ msgstr "Articolo salvato"
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2081,14 +2083,14 @@ msgstr "Pronto per importare:"
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr "Ricostruisci database"
|
msgstr "Ricostruisci database"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr "Ricostruisci indice embeddings"
|
msgstr "Ricostruisci indice embeddings"
|
||||||
@@ -2146,7 +2148,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr "Aggiorna traduzione"
|
msgstr "Aggiorna traduzione"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr "Rigenera calendario"
|
msgstr "Rigenera calendario"
|
||||||
@@ -2157,7 +2159,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr "Rigenera miniature mancanti"
|
msgstr "Rigenera miniature mancanti"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr "Reindicizza testo"
|
msgstr "Reindicizza testo"
|
||||||
@@ -2342,10 +2344,11 @@ msgstr "Le capacità di scripting sono configurate a livello applicativo nella r
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2452,7 +2455,7 @@ msgstr "Somiglianza semantica"
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2478,7 +2481,7 @@ msgstr "Sito"
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2575,7 +2578,7 @@ msgid "System Prompt"
|
|||||||
msgstr "Prompt di sistema"
|
msgstr "Prompt di sistema"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2602,8 +2605,8 @@ msgstr "Nome del tag"
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2613,8 +2616,8 @@ msgstr "Nome del tag"
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr "Tag"
|
msgstr "Tag"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2661,7 +2664,7 @@ msgstr "La sintassi del template è valida"
|
|||||||
#: lib/bds/desktop/shell_live/template_editor.ex:171
|
#: 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:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2670,7 +2673,7 @@ msgstr "La sintassi del template è valida"
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr "Template"
|
msgstr "Template"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr "Il pannello inferiore condiviso è disponibile per attività, output, dettagli Git e diagnostica specifica dell’editor."
|
msgstr "Il pannello inferiore condiviso è disponibile per attività, output, dettagli Git e diagnostica specifica dell’editor."
|
||||||
@@ -2885,7 +2888,7 @@ msgid "Updated URLs"
|
|||||||
msgstr "URL aggiornati"
|
msgstr "URL aggiornati"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr "Carica sito"
|
msgstr "Carica sito"
|
||||||
@@ -2913,13 +2916,13 @@ msgid "Validate"
|
|||||||
msgstr "Valida"
|
msgstr "Valida"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr "Valida sito"
|
msgstr "Valida sito"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr "Valida traduzioni"
|
msgstr "Valida traduzioni"
|
||||||
@@ -3301,12 +3304,12 @@ msgstr "Benvenuto nell’assistente IA"
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr "Confronto tra i metadati del database e del filesystem"
|
msgstr "Confronto tra i metadati del database e del filesystem"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr "%{count} immagini aggiunte al post"
|
msgstr "%{count} immagini aggiunte al post"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr "%{title} aggiunto"
|
msgstr "%{title} aggiunto"
|
||||||
@@ -3327,18 +3330,18 @@ msgstr "Guida per l'utente finale per flussi editoriali, media, modelli, traduzi
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr "Importazione simultanea immagini"
|
msgstr "Importazione simultanea immagini"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr "Aggiungi immagini alla galleria"
|
msgstr "Aggiungi immagini alla galleria"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr "Impossibile elaborare %{path}: %{reason}"
|
msgstr "Impossibile elaborare %{path}: %{reason}"
|
||||||
@@ -3400,7 +3403,7 @@ msgid "Commit"
|
|||||||
msgstr "Commit"
|
msgstr "Commit"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr "Messaggio di commit"
|
msgstr "Messaggio di commit"
|
||||||
@@ -3536,12 +3539,12 @@ msgstr "rinominato"
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr "non tracciato"
|
msgstr "non tracciato"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr "Blogmark"
|
msgstr "Blogmark"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr "Apri un progetto prima di importare un blogmark."
|
msgstr "Apri un progetto prima di importare un blogmark."
|
||||||
@@ -3582,7 +3585,7 @@ msgstr "Elimina tag"
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr "Impossibile copiare il bookmarklet negli appunti"
|
msgstr "Impossibile copiare il bookmarklet negli appunti"
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr "Il progetto a cui punta questo blogmark non esiste qui."
|
msgstr "Il progetto a cui punta questo blogmark non esiste qui."
|
||||||
@@ -3593,7 +3596,7 @@ msgid "Suggested tags"
|
|||||||
msgstr "Tag suggeriti"
|
msgstr "Tag suggeriti"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr "Forza la rigenerazione del sito"
|
msgstr "Forza la rigenerazione del sito"
|
||||||
@@ -3690,12 +3693,12 @@ msgstr "OK"
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
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."
|
msgstr "L'endpoint non ha restituito alcun modello. Puoi comunque digitare manualmente il nome di un modello."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
msgid "AI is unavailable in airplane mode without a local endpoint."
|
||||||
msgstr "L'IA non è disponibile in modalità aereo senza un endpoint locale."
|
msgstr "L'IA non è disponibile in modalità aereo senza un endpoint locale."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr "Impossibile caricare questo file."
|
msgstr "Impossibile caricare questo file."
|
||||||
@@ -3710,12 +3713,12 @@ msgstr "La modifica di questo elemento non è ancora disponibile nell'interfacci
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr "Nessun suggerimento ricevuto."
|
msgstr "Nessun suggerimento ricevuto."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr "Solo le immagini possono essere visualizzate in anteprima."
|
msgstr "Solo le immagini possono essere visualizzate in anteprima."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr "Post non trovato."
|
msgstr "Post non trovato."
|
||||||
@@ -3725,18 +3728,18 @@ msgstr "Post non trovato."
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr "Premi Invio per l'anteprima di %{name}."
|
msgstr "Premi Invio per l'anteprima di %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr "Pubblicato."
|
msgstr "Pubblicato."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr "Salva prima di cambiare lingua."
|
msgstr "Salva prima di cambiare lingua."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr "Salvato."
|
msgstr "Salvato."
|
||||||
@@ -3761,18 +3764,18 @@ msgstr "Titolo (ctrl+t per modificare)"
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr "Titolo (modifica — Invio per confermare)"
|
msgstr "Titolo (modifica — Invio per confermare)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr "Elaborazione…"
|
msgstr "Elaborazione…"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr "esc per chiudere"
|
msgstr "esc per chiudere"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr "Connetti al server"
|
msgstr "Connetti al server"
|
||||||
@@ -3793,7 +3796,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr "Disconnetti dal server"
|
msgstr "Disconnetti dal server"
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr "Indirizzo del server (user@host o user@host:port), autenticazione a chiave pubblica:"
|
msgstr "Indirizzo del server (user@host o user@host:port), autenticazione a chiave pubblica:"
|
||||||
@@ -3803,12 +3806,12 @@ msgstr "Indirizzo del server (user@host o user@host:port), autenticazione a chia
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr "Usa il formato user@host o user@host:port."
|
msgstr "Usa il formato user@host o user@host:port."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr "Anteprima (ctrl+e per modificare)"
|
msgstr "Anteprima (ctrl+e per modificare)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format
|
#, 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"
|
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"
|
msgstr "ctrl+s salva · ctrl+p pubblica · ctrl+e anteprima · ctrl+t titolo · ctrl+l lingua · ctrl+g IA · esc indietro"
|
||||||
@@ -3818,7 +3821,7 @@ msgstr "ctrl+s salva · ctrl+p pubblica · ctrl+e anteprima · ctrl+t titolo ·
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr "Tutte le attività sono terminate."
|
msgstr "Tutte le attività sono terminate."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr "Comandi — esc per chiudere"
|
msgstr "Comandi — esc per chiudere"
|
||||||
@@ -3828,27 +3831,27 @@ msgstr "Comandi — esc per chiudere"
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr "Comando sconosciuto."
|
msgstr "Comando sconosciuto."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr "[report/applicazione nella GUI]"
|
msgstr "[report/applicazione nella GUI]"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr "%{diffs} differenze · %{orphans} file orfani"
|
msgstr "%{diffs} differenze · %{orphans} file orfani"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr "Attesi %{expected} · Esistenti %{existing}"
|
msgstr "Attesi %{expected} · Esistenti %{existing}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr "File in eccesso (verranno rimossi):"
|
msgstr "File in eccesso (verranno rimossi):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr "Pagine mancanti (verranno generate):"
|
msgstr "Pagine mancanti (verranno generate):"
|
||||||
@@ -3863,27 +3866,27 @@ msgstr "Niente da applicare."
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr "Niente da riparare."
|
msgstr "Niente da riparare."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr "File orfani (non presenti nel database):"
|
msgstr "File orfani (non presenti nel database):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr "Sitemap modificata."
|
msgstr "Sitemap modificata."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr "Post aggiornati (verranno rigenerati):"
|
msgstr "Post aggiornati (verranno rigenerati):"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr "invio applica le modifiche · esc chiudi"
|
msgstr "invio applica le modifiche · esc chiudi"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr "invio ripara tutto dai file · esc chiudi"
|
msgstr "invio ripara tutto dai file · esc chiudi"
|
||||||
@@ -3898,7 +3901,7 @@ msgstr "Blog importato"
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr "Non è una cartella: %{path}"
|
msgstr "Non è una cartella: %{path}"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr "Progetti — invio cambia · o apri esistente · esc chiudi"
|
msgstr "Progetti — invio cambia · o apri esistente · esc chiudi"
|
||||||
@@ -3908,12 +3911,12 @@ msgstr "Progetti — invio cambia · o apri esistente · esc chiudi"
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr "Passato a %{name}."
|
msgstr "Passato a %{name}."
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr "Cartelle corrispondenti"
|
msgstr "Cartelle corrispondenti"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr "Apri blog esistente — digita il percorso di una cartella · tab completa · invio apri · esc indietro"
|
msgstr "Apri blog esistente — digita il percorso di una cartella · tab completa · invio apri · esc indietro"
|
||||||
@@ -3933,7 +3936,7 @@ msgstr "Commit eseguito."
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr "Diff (pgup/pgdn per scorrere)"
|
msgstr "Diff (pgup/pgdn per scorrere)"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr "Nessuna modifica."
|
msgstr "Nessuna modifica."
|
||||||
@@ -4044,7 +4047,7 @@ msgstr "Tema"
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr "invio modifica · ctrl+s salva · esc chiudi"
|
msgstr "invio modifica · ctrl+s salva · esc chiudi"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr "invio modifica/attiva/cicla · ctrl+s salva · esc chiudi · ctrl+q esci"
|
msgstr "invio modifica/attiva/cicla · ctrl+s salva · esc chiudi · ctrl+q esci"
|
||||||
@@ -4054,12 +4057,12 @@ msgstr "invio modifica/attiva/cicla · ctrl+s salva · esc chiudi · ctrl+q esci
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr "non ancora supportato"
|
msgstr "non ancora supportato"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr "c commit · u pull · s push · invio vai al file · pgup/pgdn scorri il diff · 1-7 viste · ctrl+q esci"
|
msgstr "c commit · u pull · s push · invio vai al file · pgup/pgdn scorri il diff · 1-7 viste · ctrl+q esci"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr "invio apri · n nuovo post · 1-7 viste · p progetti · / cerca · : comandi (:? aiuto) · r aggiorna · ctrl+q esci"
|
msgstr "invio apri · n nuovo post · 1-7 viste · p progetti · / cerca · : comandi (:? aiuto) · r aggiorna · ctrl+q esci"
|
||||||
@@ -4191,12 +4194,12 @@ msgstr "La destinazione dell'unione deve essere uno dei tag contrassegnati"
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr "predefinito"
|
msgstr "predefinito"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr "esc chiudi"
|
msgstr "esc chiudi"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr "n nuovo · invio rinomina · c colore · t template · d elimina · s sincronizza · esc chiudi"
|
msgstr "n nuovo · invio rinomina · c colore · t template · d elimina · s sincronizza · esc chiudi"
|
||||||
@@ -4206,7 +4209,17 @@ msgstr "n nuovo · invio rinomina · c colore · t template · d elimina · s si
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr "nessuno"
|
msgstr "nessuno"
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr "spazio contrassegna · m unisci nel selezionato · esc chiudi"
|
msgstr "spazio contrassegna · m unisci nel selezionato · esc chiudi"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr "In attesa"
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Running"
|
||||||
|
msgstr "In corso"
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ msgstr ""
|
|||||||
#: lib/bds/tui.ex:1175
|
#: lib/bds/tui.ex:1175
|
||||||
#: lib/bds/tui.ex:1178
|
#: lib/bds/tui.ex:1178
|
||||||
#: lib/bds/tui.ex:1186
|
#: lib/bds/tui.ex:1186
|
||||||
#: lib/bds/tui.ex:2035
|
#: lib/bds/tui.ex:2037
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI Suggestions"
|
msgid "AI Suggestions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -356,7 +356,7 @@ msgstr ""
|
|||||||
msgid "Auto"
|
msgid "Auto"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:445
|
#: lib/bds/desktop/shell_live.ex:478
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
#: lib/bds/desktop/shell_live/chat_editor.ex:234
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
#: lib/bds/desktop/shell_live/media_editor.ex:171
|
||||||
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
#: lib/bds/desktop/shell_live/media_editor.ex:364
|
||||||
@@ -381,7 +381,7 @@ msgstr ""
|
|||||||
msgid "Available languages"
|
msgid "Available languages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:124
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:223
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:313
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Backlinks"
|
msgid "Backlinks"
|
||||||
@@ -454,6 +454,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:183
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:208
|
||||||
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
#: lib/bds/desktop/shell_live/overlay_html/shell_overlay.html.heex:225
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:143
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -507,7 +508,7 @@ msgstr ""
|
|||||||
msgid "Category name is required"
|
msgid "Category name is required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:791
|
#: lib/bds/desktop/shell_live.ex:824
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
#: lib/bds/desktop/shell_live/chat_editor.ex:87
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
#: lib/bds/desktop/shell_live/chat_editor.ex:233
|
||||||
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
#: lib/bds/desktop/shell_live/chat_editor.ex:323
|
||||||
@@ -588,7 +589,7 @@ msgid "Collapse unchanged diff hunks"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
#: lib/bds/desktop/shell_live/overlay_manager.ex:423
|
||||||
#: lib/bds/tui.ex:2131
|
#: lib/bds/tui.ex:2133
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Command completed"
|
msgid "Command completed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -606,7 +607,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375
|
#: 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/script_editor_html/script_editor.html.heex:34
|
||||||
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
#: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32
|
||||||
#: lib/bds/tui.ex:1468
|
#: lib/bds/tui.ex:1467
|
||||||
#: lib/bds/ui/settings_form.ex:137
|
#: lib/bds/ui/settings_form.ex:137
|
||||||
#: lib/bds/ui/sidebar.ex:801
|
#: lib/bds/ui/sidebar.ex:801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -619,6 +620,7 @@ msgid "Content Categories"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:226
|
#: lib/bds/desktop/menu_bar.ex:226
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:183
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy"
|
msgid "Copy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1053,7 +1055,7 @@ msgid "Filename"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:254
|
#: lib/bds/desktop/menu_bar.ex:254
|
||||||
#: lib/bds/tui.ex:2095
|
#: lib/bds/tui.ex:2097
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Fill Missing Translations"
|
msgid "Fill Missing Translations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1064,7 +1066,7 @@ msgid "Find"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:255
|
#: lib/bds/desktop/menu_bar.ex:255
|
||||||
#: lib/bds/tui.ex:2098
|
#: lib/bds/tui.ex:2100
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Find Duplicate Posts"
|
msgid "Find Duplicate Posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1091,14 +1093,14 @@ msgid "Gallery"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:256
|
#: lib/bds/desktop/menu_bar.ex:256
|
||||||
#: lib/bds/tui.ex:2079
|
#: lib/bds/tui.ex:2081
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Generate Site"
|
msgid "Generate Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:792
|
#: lib/bds/desktop/shell_live.ex:825
|
||||||
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
#: lib/bds/desktop/shell_live/socket_state.ex:109
|
||||||
#: lib/bds/tui.ex:1944
|
#: lib/bds/tui.ex:1946
|
||||||
#: lib/bds/ui/sidebar.ex:826
|
#: lib/bds/ui/sidebar.ex:826
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git"
|
msgid "Git"
|
||||||
@@ -1111,8 +1113,8 @@ msgid "Git Diff"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:228
|
#: lib/bds/desktop/shell_data.ex:228
|
||||||
#: lib/bds/desktop/shell_live.ex:788
|
#: lib/bds/desktop/shell_live.ex:821
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:171
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Git Log"
|
msgid "Git Log"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1235,9 +1237,9 @@ msgstr ""
|
|||||||
msgid "Import failed: %{error}"
|
msgid "Import failed: %{error}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:608
|
#: lib/bds/desktop/shell_live.ex:641
|
||||||
#: lib/bds/desktop/shell_live.ex:904
|
#: lib/bds/desktop/shell_live.ex:970
|
||||||
#: lib/bds/desktop/shell_live.ex:910
|
#: lib/bds/desktop/shell_live.ex:976
|
||||||
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
#: lib/bds/desktop/shell_live/sidebar_create.ex:47
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import media"
|
msgid "Import media"
|
||||||
@@ -1338,7 +1340,7 @@ msgstr ""
|
|||||||
msgid "Linked Posts"
|
msgid "Linked Posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:142
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:241
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:325
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Links To"
|
msgid "Links To"
|
||||||
@@ -1417,9 +1419,9 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
#: lib/bds/desktop/shell_live/misc_editor.ex:762
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:654
|
||||||
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
#: lib/bds/desktop/shell_live/sidebar_delete.ex:175
|
||||||
#: lib/bds/tui.ex:1939
|
#: lib/bds/tui.ex:1941
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#: lib/bds/ui/registry.ex:30
|
#: lib/bds/ui/registry.ex:30
|
||||||
#: lib/bds/ui/registry.ex:100
|
#: lib/bds/ui/registry.ex:100
|
||||||
#: lib/bds/ui/sidebar.ex:578
|
#: lib/bds/ui/sidebar.ex:578
|
||||||
@@ -1448,7 +1450,7 @@ msgid "Merge"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:78
|
||||||
#: lib/bds/tui.ex:1926
|
#: lib/bds/tui.ex:1928
|
||||||
#: lib/bds/ui/sidebar.ex:787
|
#: lib/bds/ui/sidebar.ex:787
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Merge Tags"
|
msgid "Merge Tags"
|
||||||
@@ -1466,8 +1468,8 @@ msgstr ""
|
|||||||
#: lib/bds/tui.ex:285
|
#: lib/bds/tui.ex:285
|
||||||
#: lib/bds/tui.ex:291
|
#: lib/bds/tui.ex:291
|
||||||
#: lib/bds/tui.ex:302
|
#: lib/bds/tui.ex:302
|
||||||
#: lib/bds/tui.ex:1663
|
#: lib/bds/tui.ex:1665
|
||||||
#: lib/bds/tui.ex:2076
|
#: lib/bds/tui.ex:2078
|
||||||
#: lib/bds/ui/registry.ex:111
|
#: lib/bds/ui/registry.ex:111
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Metadata Diff"
|
msgid "Metadata Diff"
|
||||||
@@ -1545,12 +1547,12 @@ msgstr ""
|
|||||||
msgid "No Template"
|
msgid "No Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:55
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No background tasks running"
|
msgid "No background tasks running"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:179
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:278
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No commit subject"
|
msgid "No commit subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1560,7 +1562,7 @@ msgstr ""
|
|||||||
msgid "No folder selected"
|
msgid "No folder selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No git history yet"
|
msgid "No git history yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1620,7 +1622,7 @@ msgstr ""
|
|||||||
msgid "No pages yet"
|
msgid "No pages yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:119
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:218
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No post links yet"
|
msgid "No post links yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1645,7 +1647,7 @@ msgstr ""
|
|||||||
msgid "No settings match the current search"
|
msgid "No settings match the current search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:84
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:173
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No shell output yet"
|
msgid "No shell output yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1814,7 +1816,7 @@ msgid "Open Settings"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:217
|
#: lib/bds/desktop/menu_bar.ex:217
|
||||||
#: lib/bds/tui.ex:2100
|
#: lib/bds/tui.ex:2102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open in Browser"
|
msgid "Open in Browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1845,8 +1847,8 @@ msgstr ""
|
|||||||
msgid "Other (%{count})"
|
msgid "Other (%{count})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:787
|
#: lib/bds/desktop/shell_live.ex:820
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:83
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:172
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Output"
|
msgid "Output"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1928,7 +1930,7 @@ msgid "Post"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_data.ex:231
|
#: lib/bds/desktop/shell_data.ex:231
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:118
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:217
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:310
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post Links"
|
msgid "Post Links"
|
||||||
@@ -1963,8 +1965,8 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/menu_bar.ex:233
|
#: lib/bds/desktop/menu_bar.ex:233
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
#: lib/bds/desktop/shell_live/misc_editor.ex:664
|
||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
#: lib/bds/desktop/shell_live/misc_editor.ex:761
|
||||||
#: lib/bds/tui.ex:1938
|
#: lib/bds/tui.ex:1940
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#: lib/bds/ui/registry.ex:14
|
#: lib/bds/ui/registry.ex:14
|
||||||
#: lib/bds/ui/sidebar.ex:271
|
#: lib/bds/ui/sidebar.ex:271
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
@@ -2094,14 +2096,14 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:248
|
#: lib/bds/desktop/menu_bar.ex:248
|
||||||
#: lib/bds/tui.ex:1016
|
#: lib/bds/tui.ex:1016
|
||||||
#: lib/bds/tui.ex:2080
|
#: lib/bds/tui.ex:2082
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Database"
|
msgid "Rebuild Database"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:250
|
#: lib/bds/desktop/menu_bar.ex:250
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381
|
||||||
#: lib/bds/tui.ex:2084
|
#: lib/bds/tui.ex:2086
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Rebuild Embedding Index"
|
msgid "Rebuild Embedding Index"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2159,7 +2161,7 @@ msgid "Refresh Translation"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:252
|
#: lib/bds/desktop/menu_bar.ex:252
|
||||||
#: lib/bds/tui.ex:2087
|
#: lib/bds/tui.ex:2089
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Regenerate Calendar"
|
msgid "Regenerate Calendar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2170,7 +2172,7 @@ msgid "Regenerate Missing Thumbnails"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:249
|
#: lib/bds/desktop/menu_bar.ex:249
|
||||||
#: lib/bds/tui.ex:2081
|
#: lib/bds/tui.ex:2083
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Reindex Text"
|
msgid "Reindex Text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2355,10 +2357,11 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
#: lib/bds/desktop/shell_live/script_editor.ex:175
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
#: lib/bds/desktop/shell_live/script_editor.ex:191
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
#: lib/bds/desktop/shell_live/script_editor.ex:194
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:216
|
#: lib/bds/desktop/shell_live/script_editor.ex:212
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:219
|
#: lib/bds/desktop/shell_live/script_editor.ex:222
|
||||||
#: lib/bds/desktop/shell_live/script_editor.ex:234
|
#: lib/bds/desktop/shell_live/script_editor.ex:225
|
||||||
#: lib/bds/tui.ex:1941
|
#: lib/bds/desktop/shell_live/script_editor.ex:240
|
||||||
|
#: lib/bds/tui.ex:1943
|
||||||
#: lib/bds/ui/registry.ex:38
|
#: lib/bds/ui/registry.ex:38
|
||||||
#: lib/bds/ui/sidebar.ex:63
|
#: lib/bds/ui/sidebar.ex:63
|
||||||
#: lib/bds/ui/sidebar.ex:115
|
#: lib/bds/ui/sidebar.ex:115
|
||||||
@@ -2465,7 +2468,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
#: lib/bds/desktop/shell_live/settings_editor/project_settings.ex:60
|
||||||
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1943
|
#: lib/bds/tui.ex:1945
|
||||||
#: lib/bds/ui/registry.ex:86
|
#: lib/bds/ui/registry.ex:86
|
||||||
#: lib/bds/ui/registry.ex:101
|
#: lib/bds/ui/registry.ex:101
|
||||||
#: lib/bds/ui/sidebar.ex:795
|
#: lib/bds/ui/sidebar.ex:795
|
||||||
@@ -2491,7 +2494,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
#: lib/bds/desktop/shell_live/misc_editor.ex:412
|
||||||
#: lib/bds/tui.ex:318
|
#: lib/bds/tui.ex:318
|
||||||
#: lib/bds/tui.ex:320
|
#: lib/bds/tui.ex:320
|
||||||
#: lib/bds/tui.ex:1668
|
#: lib/bds/tui.ex:1670
|
||||||
#: lib/bds/ui/registry.ex:125
|
#: lib/bds/ui/registry.ex:125
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Site Validation"
|
msgid "Site Validation"
|
||||||
@@ -2588,7 +2591,7 @@ msgid "System Prompt"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:16
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#: lib/bds/ui/sidebar.ex:785
|
#: lib/bds/ui/sidebar.ex:785
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tag Cloud"
|
msgid "Tag Cloud"
|
||||||
@@ -2615,8 +2618,8 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
#: lib/bds/desktop/shell_live/tags_editor.ex:217
|
||||||
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
#: lib/bds/desktop/shell_live/tags_editor.ex:248
|
||||||
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
#: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11
|
||||||
#: lib/bds/tui.ex:1920
|
#: lib/bds/tui.ex:1922
|
||||||
#: lib/bds/tui.ex:1942
|
#: lib/bds/tui.ex:1944
|
||||||
#: lib/bds/ui/registry.ex:54
|
#: lib/bds/ui/registry.ex:54
|
||||||
#: lib/bds/ui/registry.ex:103
|
#: lib/bds/ui/registry.ex:103
|
||||||
#: lib/bds/ui/sidebar.ex:289
|
#: lib/bds/ui/sidebar.ex:289
|
||||||
@@ -2626,8 +2629,8 @@ msgstr ""
|
|||||||
msgid "Tags"
|
msgid "Tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:786
|
#: lib/bds/desktop/shell_live.ex:819
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:54
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:63
|
||||||
#: lib/bds/tui.ex:1220
|
#: lib/bds/tui.ex:1220
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tasks"
|
msgid "Tasks"
|
||||||
@@ -2674,7 +2677,7 @@ msgstr ""
|
|||||||
#: lib/bds/desktop/shell_live/template_editor.ex:171
|
#: 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:176
|
||||||
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
#: lib/bds/desktop/shell_live/template_editor.ex:191
|
||||||
#: lib/bds/tui.ex:1940
|
#: lib/bds/tui.ex:1942
|
||||||
#: lib/bds/ui/registry.ex:46
|
#: lib/bds/ui/registry.ex:46
|
||||||
#: lib/bds/ui/sidebar.ex:71
|
#: lib/bds/ui/sidebar.ex:71
|
||||||
#: lib/bds/ui/sidebar.ex:122
|
#: lib/bds/ui/sidebar.ex:122
|
||||||
@@ -2683,7 +2686,7 @@ msgstr ""
|
|||||||
msgid "Templates"
|
msgid "Templates"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/panel_renderer.ex:194
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:293
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
msgid "The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2898,7 +2901,7 @@ msgid "Updated URLs"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:259
|
#: lib/bds/desktop/menu_bar.ex:259
|
||||||
#: lib/bds/tui.ex:2099
|
#: lib/bds/tui.ex:2101
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Upload Site"
|
msgid "Upload Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2926,13 +2929,13 @@ msgid "Validate"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:258
|
#: lib/bds/desktop/menu_bar.ex:258
|
||||||
#: lib/bds/tui.ex:2077
|
#: lib/bds/tui.ex:2079
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Site"
|
msgid "Validate Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:253
|
#: lib/bds/desktop/menu_bar.ex:253
|
||||||
#: lib/bds/tui.ex:2090
|
#: lib/bds/tui.ex:2092
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Validate Translations"
|
msgid "Validate Translations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3314,12 +3317,12 @@ msgstr ""
|
|||||||
msgid "Comparing database and filesystem metadata"
|
msgid "Comparing database and filesystem metadata"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:684
|
#: lib/bds/desktop/shell_live.ex:717
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{count} images to post"
|
msgid "Added %{count} images to post"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:652
|
#: lib/bds/desktop/shell_live.ex:685
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{title}"
|
msgid "Added %{title}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3340,18 +3343,18 @@ msgstr ""
|
|||||||
msgid "Image Import Concurrency"
|
msgid "Image Import Concurrency"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:444
|
#: lib/bds/desktop/shell_live.ex:477
|
||||||
#: lib/bds/desktop/shell_live.ex:457
|
#: lib/bds/desktop/shell_live.ex:490
|
||||||
#: lib/bds/desktop/shell_live.ex:651
|
#: lib/bds/desktop/shell_live.ex:684
|
||||||
#: lib/bds/desktop/shell_live.ex:683
|
#: lib/bds/desktop/shell_live.ex:716
|
||||||
#: lib/bds/desktop/shell_live.ex:694
|
#: lib/bds/desktop/shell_live.ex:727
|
||||||
#: lib/bds/desktop/shell_live.ex:705
|
#: lib/bds/desktop/shell_live.ex:738
|
||||||
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
#: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:420
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Add Gallery Images"
|
msgid "Add Gallery Images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:706
|
#: lib/bds/desktop/shell_live.ex:739
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to process %{path}: %{reason}"
|
msgid "Failed to process %{path}: %{reason}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3413,7 +3416,7 @@ msgid "Commit"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
#: lib/bds/desktop/shell_live/sidebar_components.ex:555
|
||||||
#: lib/bds/tui.ex:1490
|
#: lib/bds/tui.ex:1492
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commit message"
|
msgid "Commit message"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3549,12 +3552,12 @@ msgstr ""
|
|||||||
msgid "untracked"
|
msgid "untracked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:812
|
#: lib/bds/desktop/shell_live.ex:845
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Blogmark"
|
msgid "Blogmark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:855
|
#: lib/bds/desktop/shell_live.ex:888
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open a project before importing a blogmark."
|
msgid "Open a project before importing a blogmark."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3595,7 +3598,7 @@ msgstr ""
|
|||||||
msgid "Failed to copy bookmarklet to clipboard"
|
msgid "Failed to copy bookmarklet to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/shell_live.ex:824
|
#: lib/bds/desktop/shell_live.ex:857
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "The project this blogmark targets does not exist here."
|
msgid "The project this blogmark targets does not exist here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3606,7 +3609,7 @@ msgid "Suggested tags"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:257
|
#: lib/bds/desktop/menu_bar.ex:257
|
||||||
#: lib/bds/tui.ex:2078
|
#: lib/bds/tui.ex:2080
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Force Render Site"
|
msgid "Force Render Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3703,12 +3706,12 @@ msgstr ""
|
|||||||
msgid "The endpoint returned no models. You can still type a model name manually."
|
msgid "The endpoint returned no models. You can still type a model name manually."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2036
|
#: lib/bds/tui.ex:2038
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "AI is unavailable in airplane mode without a local endpoint."
|
msgid "AI is unavailable in airplane mode without a local endpoint."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2163
|
#: lib/bds/tui.ex:2165
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Could not load this file."
|
msgid "Could not load this file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3723,12 +3726,12 @@ msgstr ""
|
|||||||
msgid "No suggestions returned."
|
msgid "No suggestions returned."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2160
|
#: lib/bds/tui.ex:2162
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Only images can be previewed."
|
msgid "Only images can be previewed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1953
|
#: lib/bds/tui.ex:1955
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Post not found."
|
msgid "Post not found."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3738,18 +3741,18 @@ msgstr ""
|
|||||||
msgid "Press enter to preview %{name}."
|
msgid "Press enter to preview %{name}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2006
|
#: lib/bds/tui.ex:2008
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published."
|
msgid "Published."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:2022
|
#: lib/bds/tui.ex:2024
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save before switching languages."
|
msgid "Save before switching languages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:540
|
#: lib/bds/tui.ex:540
|
||||||
#: lib/bds/tui.ex:2007
|
#: lib/bds/tui.ex:2009
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saved."
|
msgid "Saved."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3774,18 +3777,18 @@ msgstr ""
|
|||||||
msgid "Title (editing — enter to confirm)"
|
msgid "Title (editing — enter to confirm)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1492
|
#: lib/bds/tui.ex:1494
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Working…"
|
msgid "Working…"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1514
|
#: lib/bds/tui.ex:1516
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc to close"
|
msgid "esc to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:83
|
#: lib/bds/desktop/menu_bar.ex:83
|
||||||
#: lib/bds/desktop/shell_live.ex:1110
|
#: lib/bds/desktop/shell_live.ex:1176
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Connect to Server"
|
msgid "Connect to Server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3806,7 +3809,7 @@ msgid "Disconnect from Server"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/desktop/menu_bar.ex:72
|
#: lib/bds/desktop/menu_bar.ex:72
|
||||||
#: lib/bds/desktop/shell_live.ex:1097
|
#: lib/bds/desktop/shell_live.ex:1163
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Server address (user@host or user@host:port), public-key auth:"
|
msgid "Server address (user@host or user@host:port), public-key auth:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3816,12 +3819,12 @@ msgstr ""
|
|||||||
msgid "Use the form user@host or user@host:port."
|
msgid "Use the form user@host or user@host:port."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1457
|
#: lib/bds/tui.ex:1456
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Preview (ctrl+e to edit)"
|
msgid "Preview (ctrl+e to edit)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1771
|
#: lib/bds/tui.ex:1773
|
||||||
#, elixir-autogen, elixir-format
|
#, 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"
|
msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3831,7 +3834,7 @@ msgstr ""
|
|||||||
msgid "All tasks finished."
|
msgid "All tasks finished."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1540
|
#: lib/bds/tui.ex:1542
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Commands — esc to close"
|
msgid "Commands — esc to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3841,27 +3844,27 @@ msgstr ""
|
|||||||
msgid "Unknown command."
|
msgid "Unknown command."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1530
|
#: lib/bds/tui.ex:1532
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "[report/apply in GUI]"
|
msgid "[report/apply in GUI]"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1679
|
#: lib/bds/tui.ex:1681
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{diffs} differences · %{orphans} orphan files"
|
msgid "%{diffs} differences · %{orphans} orphan files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1711
|
#: lib/bds/tui.ex:1713
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Expected %{expected} · Existing %{existing}"
|
msgid "Expected %{expected} · Existing %{existing}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1728
|
#: lib/bds/tui.ex:1730
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Extra files (will be removed):"
|
msgid "Extra files (will be removed):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1724
|
#: lib/bds/tui.ex:1726
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Missing pages (will be rendered):"
|
msgid "Missing pages (will be rendered):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3876,27 +3879,27 @@ msgstr ""
|
|||||||
msgid "Nothing to repair."
|
msgid "Nothing to repair."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1702
|
#: lib/bds/tui.ex:1704
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Orphan files (not in database):"
|
msgid "Orphan files (not in database):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1718
|
#: lib/bds/tui.ex:1720
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Sitemap changed."
|
msgid "Sitemap changed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1732
|
#: lib/bds/tui.ex:1734
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated posts (will be re-rendered):"
|
msgid "Updated posts (will be re-rendered):"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1669
|
#: lib/bds/tui.ex:1671
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter apply changes · esc close"
|
msgid "enter apply changes · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1664
|
#: lib/bds/tui.ex:1666
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter repair all from files · esc close"
|
msgid "enter repair all from files · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3911,7 +3914,7 @@ msgstr ""
|
|||||||
msgid "Not a folder: %{path}"
|
msgid "Not a folder: %{path}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1606
|
#: lib/bds/tui.ex:1608
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Projects — enter switch · o open existing · esc close"
|
msgid "Projects — enter switch · o open existing · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3921,12 +3924,12 @@ msgstr ""
|
|||||||
msgid "Switched to %{name}."
|
msgid "Switched to %{name}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1634
|
#: lib/bds/tui.ex:1636
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Matching folders"
|
msgid "Matching folders"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1572
|
#: lib/bds/tui.ex:1574
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
msgid "Open Existing Blog — type a folder path · tab complete · enter open · esc back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -3946,7 +3949,7 @@ msgstr ""
|
|||||||
msgid "Diff (pgup/pgdn scroll)"
|
msgid "Diff (pgup/pgdn scroll)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1799
|
#: lib/bds/tui.ex:1801
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No changes."
|
msgid "No changes."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4057,7 +4060,7 @@ msgstr ""
|
|||||||
msgid "enter edit · ctrl+s save · esc close"
|
msgid "enter edit · ctrl+s save · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1750
|
#: lib/bds/tui.ex:1752
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
msgid "enter edit/toggle/cycle · ctrl+s save · esc close · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4067,12 +4070,12 @@ msgstr ""
|
|||||||
msgid "not supported yet"
|
msgid "not supported yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1757
|
#: lib/bds/tui.ex:1759
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
msgid "c commit · u pull · s push · enter jump to file · pgup/pgdn scroll diff · 1-7 views · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1764
|
#: lib/bds/tui.ex:1766
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
msgid "enter open · n new post · 1-7 views · p projects · / search · : commands (:? help) · r refresh · ctrl+q quit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4204,12 +4207,12 @@ msgstr ""
|
|||||||
msgid "default"
|
msgid "default"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1917
|
#: lib/bds/tui.ex:1919
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "esc close"
|
msgid "esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1922
|
#: lib/bds/tui.ex:1924
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
msgid "n new · enter rename · c colour · t template · d delete · s sync · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4219,7 +4222,17 @@ msgstr ""
|
|||||||
msgid "none"
|
msgid "none"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/bds/tui.ex:1927
|
#: lib/bds/tui.ex:1929
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "space mark · m merge into selected · esc close"
|
msgid "space mark · m merge into selected · esc close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:157
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/bds/desktop/shell_live/panel_renderer.ex:156
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Running"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
18
priv/static/assets/app.js
vendored
18
priv/static/assets/app.js
vendored
File diff suppressed because one or more lines are too long
@@ -47,6 +47,9 @@ for await (const line of rl) {
|
|||||||
assistant_visible: !hasClass("[data-testid='assistant-shell']", "is-hidden"),
|
assistant_visible: !hasClass("[data-testid='assistant-shell']", "is-hidden"),
|
||||||
assistant_width: document.querySelector("[data-testid='assistant-shell']")?.getBoundingClientRect().width ?? 0,
|
assistant_width: document.querySelector("[data-testid='assistant-shell']")?.getBoundingClientRect().width ?? 0,
|
||||||
panel_visible: !hasClass(".panel-shell", "is-hidden"),
|
panel_visible: !hasClass(".panel-shell", "is-hidden"),
|
||||||
|
panel_tabs_height: document.querySelector(".panel-tabs")?.getBoundingClientRect().height ?? 0,
|
||||||
|
panel_tab_labels: texts(".panel-tab", (node) => node.textContent.trim()),
|
||||||
|
panel_active_tab: text(".panel-tab.active"),
|
||||||
editor_title: text("[data-testid='editor-title']"),
|
editor_title: text("[data-testid='editor-title']"),
|
||||||
activity_labels: texts("[data-testid='activity-button']", (node) => node.getAttribute("aria-label")),
|
activity_labels: texts("[data-testid='activity-button']", (node) => node.getAttribute("aria-label")),
|
||||||
sidebar_sections: texts("[data-testid='sidebar-section-title']", (node) => node.textContent.trim()),
|
sidebar_sections: texts("[data-testid='sidebar-section-title']", (node) => node.textContent.trim()),
|
||||||
|
|||||||
@@ -241,7 +241,12 @@ invariant NativeAcceleratedExecution {
|
|||||||
-- On Apple Silicon the model runs on the Apple GPU via EMLX (MLX/Metal,
|
-- On Apple Silicon the model runs on the Apple GPU via EMLX (MLX/Metal,
|
||||||
-- params placed on the EMLX.Backend GPU device); everywhere else, and as a
|
-- params placed on the EMLX.Backend GPU device); everywhere else, and as a
|
||||||
-- fallback when EMLX is unavailable, it runs on optimised native CPU via
|
-- fallback when EMLX is unavailable, it runs on optimised native CPU via
|
||||||
-- EXLA. Selection is `accelerator: :auto | :emlx | :exla` (default :auto).
|
-- EXLA. Selection is `accelerator: :auto | :emlx | :exla` (default :auto);
|
||||||
|
-- a request for an unavailable backend degrades to the other one.
|
||||||
|
-- Packaged releases ship only the backend their platform can run (runtime:
|
||||||
|
-- conditional deps): macOS releases exclude EXLA, Linux/Windows releases
|
||||||
|
-- exclude the Apple-only EMLX. The selected backend is started on demand
|
||||||
|
-- by the Neural backend, never assumed started at boot.
|
||||||
-- Neighbour search is HNSW (hnswlib).
|
-- Neighbour search is HNSW (hnswlib).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,17 @@ invariant MultiLanguageRoutes {
|
|||||||
-- Each language subtree gets its own feeds and archives
|
-- Each language subtree gets its own feeds and archives
|
||||||
}
|
}
|
||||||
|
|
||||||
|
invariant LanguageVariantSelection {
|
||||||
|
-- Every language tree renders each post in its own language when a
|
||||||
|
-- matching variant exists, falling back to the post's original language.
|
||||||
|
-- This applies uniformly to single pages, list pages (home/pagination,
|
||||||
|
-- category/tag/date archives), and feeds:
|
||||||
|
-- Main tree: a post whose language differs from main_language renders
|
||||||
|
-- its main_language translation when one exists (canonical variant).
|
||||||
|
-- Additional-language trees: posts resolve to that language's
|
||||||
|
-- translation; do_not_translate posts are excluded from those trees.
|
||||||
|
}
|
||||||
|
|
||||||
invariant CanonicalBaseUrlConfigured {
|
invariant CanonicalBaseUrlConfigured {
|
||||||
for generation in SiteGenerations:
|
for generation in SiteGenerations:
|
||||||
generation.base_url != ""
|
generation.base_url != ""
|
||||||
|
|||||||
@@ -249,6 +249,8 @@ invariant PanelTabFallback {
|
|||||||
-- Tasks tab: last 10 tasks, newest first, with progress/cancel.
|
-- Tasks tab: last 10 tasks, newest first, with progress/cancel.
|
||||||
-- Tasks with shared group_id are collapsible groups showing aggregate progress.
|
-- Tasks with shared group_id are collapsible groups showing aggregate progress.
|
||||||
-- Output tab: log entries with copy-all button.
|
-- Output tab: log entries with copy-all button.
|
||||||
|
-- The panel opens on Output automatically when a blogmark transform fails
|
||||||
|
-- or a transform script writes output.
|
||||||
-- Post Links tab: backlinks (posts linking here) + outlinks (posts linked from here).
|
-- Post Links tab: backlinks (posts linking here) + outlinks (posts linked from here).
|
||||||
-- Each entry clickable, opens linked post as pinned tab.
|
-- Each entry clickable, opens linked post as pinned tab.
|
||||||
-- Git Log tab: file-level git history for active post/media (up to 50 entries).
|
-- Git Log tab: file-level git history for active post/media (up to 50 entries).
|
||||||
|
|||||||
@@ -110,6 +110,12 @@ surface ScriptRuntimeSurface {
|
|||||||
-- Progress reporting is cooperative and flows through the supplied
|
-- Progress reporting is cooperative and flows through the supplied
|
||||||
-- progress sink rather than ambient global side effects.
|
-- progress sink rather than ambient global side effects.
|
||||||
|
|
||||||
|
@guarantee ScriptOutputRouting
|
||||||
|
-- print(…) calls and the explicit bds.app.log(…) API append lines to a
|
||||||
|
-- host-routed script output stream: the desktop app's Output panel,
|
||||||
|
-- stdout in the CLI, and the host logger when no sink is attached —
|
||||||
|
-- never the ambient console.
|
||||||
|
|
||||||
@guarantee BatchCancellation
|
@guarantee BatchCancellation
|
||||||
-- Managed utility and transform jobs can be cancelled by the host
|
-- Managed utility and transform jobs can be cancelled by the host
|
||||||
-- operator boundary.
|
-- operator boundary.
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ rule SidebarNavigation {
|
|||||||
|
|
||||||
rule OpenEntry {
|
rule OpenEntry {
|
||||||
when: TuiKeyPressed(code: "enter")
|
when: TuiKeyPressed(code: "enter")
|
||||||
-- Posts open in the rendered markdown preview by default (title +
|
-- Posts open in the editor by default (title + textarea seeded from
|
||||||
-- textarea still seeded from the persisted form; ctrl+e switches to
|
-- the persisted form; syntax highlighting and word wrap on; ctrl+e
|
||||||
-- editing). New empty posts created with "n" open in the editor
|
-- switches to the rendered preview). New empty posts created with
|
||||||
-- instead — there is nothing to preview yet. Images open in the
|
-- "n" open in the editor as well. Images open in the terminal image
|
||||||
-- terminal image preview. Other entities report that terminal
|
-- preview. Other entities report that terminal editing is not
|
||||||
-- editing is not available yet.
|
-- available yet.
|
||||||
ensures: TuiState.editing_post.updated()
|
ensures: TuiState.editing_post.updated()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,17 +50,27 @@ rule SaveAndPublish {
|
|||||||
ensures: PostPersisted()
|
ensures: PostPersisted()
|
||||||
}
|
}
|
||||||
|
|
||||||
rule WrappedPreview {
|
rule EditorMode {
|
||||||
when: TuiKeyPressed(code: "e", modifiers: "ctrl")
|
when: TuiKeyPressed(code: "e", modifiers: "ctrl")
|
||||||
-- ctrl+e toggles between the read-only word-wrapped Markdown
|
-- ctrl+e toggles between the syntax-highlighted editor (the default
|
||||||
-- preview (the default mode when opening a post — rendered through
|
-- mode when opening a post) and the read-only rendered-Markdown
|
||||||
-- tui-markdown so headings/emphasis/lists are styled) and the
|
-- preview (rendered through tui-markdown so headings/emphasis/lists
|
||||||
-- editing textarea (which cannot soft-wrap, an upstream
|
-- are styled); keys in preview never edit content, and esc returns
|
||||||
-- ratatui-textarea limitation); keys in preview never edit content,
|
-- to the sidebar from either mode.
|
||||||
-- and esc returns to the sidebar from either mode.
|
|
||||||
ensures: PreviewToggled()
|
ensures: PreviewToggled()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rule CodeEditorWrapping {
|
||||||
|
when: TuiState.editing_post.updated()
|
||||||
|
-- The post editor renders the buffer with syntax highlighting
|
||||||
|
-- (markdown with [[macro]] accents for posts, HTML+Liquid for
|
||||||
|
-- templates, Lua for scripts), soft-wraps long lines to the
|
||||||
|
-- viewport width, keeps the cursor's visual row visible while
|
||||||
|
-- scrolling, and highlights the cursor's source line. There is no
|
||||||
|
-- line-number gutter.
|
||||||
|
ensures: TuiState.updated()
|
||||||
|
}
|
||||||
|
|
||||||
rule AiQuickAction {
|
rule AiQuickAction {
|
||||||
when: TuiKeyPressed(code: "g", modifiers: "ctrl")
|
when: TuiKeyPressed(code: "g", modifiers: "ctrl")
|
||||||
-- One-shot AI post analysis (title/excerpt suggestions). Gated by
|
-- One-shot AI post analysis (title/excerpt suggestions). Gated by
|
||||||
|
|||||||
@@ -129,6 +129,31 @@ defmodule BDS.Desktop.AutomationTest do
|
|||||||
assert automation_process_counts() == baseline
|
assert automation_process_counts() == baseline
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@tag timeout: 120_000
|
||||||
|
test "cmd-J panel tab strip is visible and switches between tasks and output (issue #20)" do
|
||||||
|
{:ok, session} = Automation.start_session()
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Automation.stop_session(session)
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert :ok = Automation.press(session, "Meta+J")
|
||||||
|
|
||||||
|
snapshot = await(session, & &1.panel_visible)
|
||||||
|
assert snapshot.panel_visible == true
|
||||||
|
|
||||||
|
# The tab strip must offer both tabs and be tall enough to actually see
|
||||||
|
# and hit them — issue #20 was the strip collapsing to an unusable sliver.
|
||||||
|
assert "Tasks" in snapshot.panel_tab_labels
|
||||||
|
assert "Output" in snapshot.panel_tab_labels
|
||||||
|
assert snapshot.panel_tabs_height >= 20
|
||||||
|
|
||||||
|
assert :ok = Automation.click(session, "button[phx-value-tab='output']")
|
||||||
|
|
||||||
|
snapshot = await(session, &(&1.panel_active_tab == "Output"))
|
||||||
|
assert snapshot.panel_active_tab == "Output"
|
||||||
|
end
|
||||||
|
|
||||||
@tag timeout: 120_000
|
@tag timeout: 120_000
|
||||||
test "automation dispatches native menu actions into the liveview shell" do
|
test "automation dispatches native menu actions into the liveview shell" do
|
||||||
{:ok, session} = Automation.start_session()
|
{:ok, session} = Automation.start_session()
|
||||||
|
|||||||
@@ -907,6 +907,120 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
assert html =~ ~s(data-tab-id="#{created_post.id}")
|
assert html =~ ~s(data-tab-id="#{created_post.id}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "tasks panel shows a cancel button for running tasks and cancels them" do
|
||||||
|
{:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
|
||||||
|
|
||||||
|
{:ok, task} =
|
||||||
|
BDS.Tasks.submit_task("Long Running Task", fn _report ->
|
||||||
|
receive do
|
||||||
|
:finish -> :ok
|
||||||
|
after
|
||||||
|
30_000 -> :ok
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
send(view.pid, :refresh_task_status)
|
||||||
|
|
||||||
|
html = render_click(view, "select_panel_tab", %{"tab" => "tasks"})
|
||||||
|
|
||||||
|
assert html =~ "Long Running Task"
|
||||||
|
assert html =~ ~s(data-testid="cancel-task-button")
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{[data-testid="cancel-task-button"]})
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
assert Enum.find(BDS.Tasks.list_tasks(), &(&1.id == task.id)).status == :cancelled
|
||||||
|
end
|
||||||
|
|
||||||
|
test "tasks panel groups tasks by group_id and toggles the group collapsed" do
|
||||||
|
{:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
|
||||||
|
|
||||||
|
blocking = fn _report ->
|
||||||
|
receive do
|
||||||
|
:finish -> :ok
|
||||||
|
after
|
||||||
|
30_000 -> :ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, _t1} = BDS.Tasks.submit_task("First Grouped", blocking, %{group_id: "grp", group_name: "Batch"})
|
||||||
|
{:ok, _t2} = BDS.Tasks.submit_task("Second Grouped", blocking, %{group_id: "grp", group_name: "Batch"})
|
||||||
|
|
||||||
|
send(view.pid, :refresh_task_status)
|
||||||
|
|
||||||
|
html = render_click(view, "select_panel_tab", %{"tab" => "tasks"})
|
||||||
|
|
||||||
|
# One group row for both tasks, expanded by default (task names also
|
||||||
|
# appear in the status bar, hence the <strong> row scoping)
|
||||||
|
assert html =~ "Batch (2)"
|
||||||
|
assert html =~ "<strong>First Grouped</strong>"
|
||||||
|
assert html =~ "<strong>Second Grouped</strong>"
|
||||||
|
|
||||||
|
html = render_click(view, "toggle_task_group", %{"group" => "grp"})
|
||||||
|
|
||||||
|
assert html =~ "Batch (2)"
|
||||||
|
refute html =~ "<strong>First Grouped</strong>"
|
||||||
|
refute html =~ "<strong>Second Grouped</strong>"
|
||||||
|
|
||||||
|
html = render_click(view, "toggle_task_group", %{"group" => "grp"})
|
||||||
|
|
||||||
|
assert html =~ "<strong>First Grouped</strong>"
|
||||||
|
assert html =~ "<strong>Second Grouped</strong>"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "output panel copy button pushes the full log text to the clipboard" do
|
||||||
|
{:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
|
||||||
|
|
||||||
|
send(view.pid, {:editor_output, "First", "line one", nil, "info"})
|
||||||
|
send(view.pid, {:editor_output, "Second", "line two", nil, "error"})
|
||||||
|
|
||||||
|
html = render_click(view, "select_panel_tab", %{"tab" => "output"})
|
||||||
|
|
||||||
|
assert html =~ ~s(data-testid="copy-output-button")
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{[data-testid="copy-output-button"]})
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
# Chronological order (oldest first), entries joined by a blank line.
|
||||||
|
assert_push_event(view, "clipboard", %{text: "line one\n\nline two"})
|
||||||
|
end
|
||||||
|
|
||||||
|
test "blogmark transform output lands in the output panel and auto-opens it", %{
|
||||||
|
project: project
|
||||||
|
} do
|
||||||
|
{:ok, _script} =
|
||||||
|
Scripts.create_and_publish_script(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "Logging Transform",
|
||||||
|
kind: :transform,
|
||||||
|
entrypoint: "main",
|
||||||
|
content:
|
||||||
|
"function main(data, ctx) bds.app.log('transform ran') print('still ran') return data end"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
|
||||||
|
|
||||||
|
url =
|
||||||
|
"bds2://new-post?title=" <>
|
||||||
|
URI.encode_www_form("Logged Blogmark") <>
|
||||||
|
"&url=" <> URI.encode_www_form("https://example.com/logged")
|
||||||
|
|
||||||
|
send(view.pid, {:blogmark_deep_link, url})
|
||||||
|
_html = render(view)
|
||||||
|
|
||||||
|
assigns = :sys.get_state(view.pid).socket.assigns
|
||||||
|
messages = Enum.map(assigns.output_entries, & &1.message)
|
||||||
|
|
||||||
|
assert "transform ran" in messages
|
||||||
|
assert "still ran" in messages
|
||||||
|
|
||||||
|
# Like the old app: noteworthy script output opens the panel on Output.
|
||||||
|
assert assigns.workbench.panel.visible == true
|
||||||
|
assert assigns.workbench.panel.active_tab == :output
|
||||||
|
end
|
||||||
|
|
||||||
test "blogmark deep link with a project_id switches to that project and imports there",
|
test "blogmark deep link with a project_id switches to that project and imports there",
|
||||||
%{project: active} do
|
%{project: active} do
|
||||||
{:ok, other} =
|
{:ok, other} =
|
||||||
@@ -6052,6 +6166,38 @@ defmodule BDS.Desktop.ShellLiveTest do
|
|||||||
assert reloaded.version == 1
|
assert reloaded.version == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "script editor run streams print and bds.app.log output to the output panel", %{
|
||||||
|
project: project
|
||||||
|
} do
|
||||||
|
{:ok, script} =
|
||||||
|
Scripts.create_script(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "Output Test",
|
||||||
|
kind: :utility,
|
||||||
|
content:
|
||||||
|
"function main() print('from-print') bds.app.log('from-log') return 'done' end"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive)
|
||||||
|
|
||||||
|
render_click(view, "pin_sidebar_item", %{
|
||||||
|
"route" => "scripts",
|
||||||
|
"id" => script.id,
|
||||||
|
"title" => script.title,
|
||||||
|
"subtitle" => "draft"
|
||||||
|
})
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(".scripts-run-button")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
entries = :sys.get_state(view.pid).socket.assigns.output_entries
|
||||||
|
messages = Enum.map(entries, & &1.message)
|
||||||
|
|
||||||
|
assert "from-print" in messages
|
||||||
|
assert "from-log" in messages
|
||||||
|
end
|
||||||
|
|
||||||
test "script editor check syntax validates lua content without saving", %{project: project} do
|
test "script editor check syntax validates lua content without saving", %{project: project} do
|
||||||
{:ok, script} =
|
{:ok, script} =
|
||||||
Scripts.create_script(%{
|
Scripts.create_script(%{
|
||||||
|
|||||||
@@ -38,29 +38,45 @@ defmodule BDS.Embeddings.Backends.NeuralTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe "accelerator selection (NativeAcceleratedExecution)" do
|
describe "accelerator selection (NativeAcceleratedExecution)" do
|
||||||
|
# select_accelerator(configured, emlx_available?, exla_available?, apple_silicon?)
|
||||||
test "auto prefers Apple GPU (EMLX) when available on Apple Silicon" do
|
test "auto prefers Apple GPU (EMLX) when available on Apple Silicon" do
|
||||||
assert Neural.select_accelerator(:auto, true, true) == :emlx
|
assert Neural.select_accelerator(:auto, true, true, true) == :emlx
|
||||||
end
|
end
|
||||||
|
|
||||||
test "auto falls back to EXLA-CPU off Apple Silicon" do
|
test "auto falls back to EXLA-CPU off Apple Silicon" do
|
||||||
assert Neural.select_accelerator(:auto, true, false) == :exla
|
assert Neural.select_accelerator(:auto, true, true, false) == :exla
|
||||||
end
|
end
|
||||||
|
|
||||||
test "auto falls back to EXLA-CPU when EMLX is unavailable" do
|
test "auto falls back to EXLA-CPU when EMLX is unavailable" do
|
||||||
assert Neural.select_accelerator(:auto, false, true) == :exla
|
assert Neural.select_accelerator(:auto, false, true, true) == :exla
|
||||||
|
end
|
||||||
|
|
||||||
|
test "auto uses EMLX when EXLA is not shipped (pruned macOS bundle)" do
|
||||||
|
assert Neural.select_accelerator(:auto, true, false, true) == :emlx
|
||||||
|
assert Neural.select_accelerator(:auto, true, false, false) == :emlx
|
||||||
end
|
end
|
||||||
|
|
||||||
test "explicit :exla is honoured even on Apple Silicon with EMLX present" do
|
test "explicit :exla is honoured even on Apple Silicon with EMLX present" do
|
||||||
assert Neural.select_accelerator(:exla, true, true) == :exla
|
assert Neural.select_accelerator(:exla, true, true, true) == :exla
|
||||||
|
end
|
||||||
|
|
||||||
|
test "explicit :exla degrades to EMLX when EXLA is unavailable" do
|
||||||
|
assert Neural.select_accelerator(:exla, true, false, true) == :emlx
|
||||||
end
|
end
|
||||||
|
|
||||||
test "explicit :emlx is honoured when available" do
|
test "explicit :emlx is honoured when available" do
|
||||||
assert Neural.select_accelerator(:emlx, true, true) == :emlx
|
assert Neural.select_accelerator(:emlx, true, true, true) == :emlx
|
||||||
assert Neural.select_accelerator(:emlx, true, false) == :emlx
|
assert Neural.select_accelerator(:emlx, true, true, false) == :emlx
|
||||||
end
|
end
|
||||||
|
|
||||||
test "explicit :emlx degrades to EXLA when EMLX is unavailable" do
|
test "explicit :emlx degrades to EXLA when EMLX is unavailable" do
|
||||||
assert Neural.select_accelerator(:emlx, false, true) == :exla
|
assert Neural.select_accelerator(:emlx, false, true, true) == :exla
|
||||||
|
end
|
||||||
|
|
||||||
|
test "no accelerator available selects :none" do
|
||||||
|
assert Neural.select_accelerator(:auto, false, false, true) == :none
|
||||||
|
assert Neural.select_accelerator(:exla, false, false, false) == :none
|
||||||
|
assert Neural.select_accelerator(:emlx, false, false, false) == :none
|
||||||
end
|
end
|
||||||
|
|
||||||
test "defn options map each accelerator to its native compiler" do
|
test "defn options map each accelerator to its native compiler" do
|
||||||
|
|||||||
@@ -1473,6 +1473,123 @@ defmodule BDS.GenerationTest do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "validate_site reports no missing pages for main-language translations of foreign-language posts",
|
||||||
|
%{project: project, temp_dir: temp_dir} do
|
||||||
|
assert {:ok, _metadata} =
|
||||||
|
Metadata.update_project_metadata(project.id, %{
|
||||||
|
public_url: "https://example.com/blog",
|
||||||
|
main_language: "de",
|
||||||
|
blog_languages: ["de", "en"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, post} =
|
||||||
|
Posts.create_post(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "English Original",
|
||||||
|
content: "English body",
|
||||||
|
language: "en"
|
||||||
|
})
|
||||||
|
|
||||||
|
created_at = DateTime.to_unix(~U[2026-04-15 12:00:00Z])
|
||||||
|
|
||||||
|
Repo.update_all(from(p in BDS.Posts.Post, where: p.id == ^post.id),
|
||||||
|
set: [created_at: created_at, updated_at: created_at]
|
||||||
|
)
|
||||||
|
|
||||||
|
assert {:ok, _translation} =
|
||||||
|
Posts.upsert_post_translation(post.id, "de", %{
|
||||||
|
title: "Deutsches Original",
|
||||||
|
content: "Deutscher Inhalt"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, published_post} = Posts.publish_post(post.id)
|
||||||
|
assert {:ok, _result} = BDS.Generation.generate_site(project.id, [:core, :single])
|
||||||
|
assert {:ok, report} = BDS.Generation.validate_site(project.id, [:core, :single])
|
||||||
|
|
||||||
|
assert report.missing_url_paths == []
|
||||||
|
assert report.extra_url_paths == []
|
||||||
|
assert report.updated_post_url_paths == []
|
||||||
|
|
||||||
|
canonical_html =
|
||||||
|
File.read!(
|
||||||
|
Path.join([temp_dir, "html", BDS.Generation.post_output_path(published_post)])
|
||||||
|
)
|
||||||
|
|
||||||
|
english_html =
|
||||||
|
File.read!(
|
||||||
|
Path.join([temp_dir, "html", BDS.Generation.post_output_path(published_post, "en")])
|
||||||
|
)
|
||||||
|
|
||||||
|
assert canonical_html =~ "Deutscher Inhalt"
|
||||||
|
assert english_html =~ "English body"
|
||||||
|
|
||||||
|
sitemap_xml = File.read!(Path.join([temp_dir, "html", "sitemap.xml"]))
|
||||||
|
|
||||||
|
refute sitemap_xml =~ "english-original.de"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "main-language list pages and feeds use main-language translations of foreign-language posts",
|
||||||
|
%{project: project, temp_dir: temp_dir} do
|
||||||
|
assert {:ok, _metadata} =
|
||||||
|
Metadata.update_project_metadata(project.id, %{
|
||||||
|
public_url: "https://example.com/blog",
|
||||||
|
main_language: "de",
|
||||||
|
blog_languages: ["de", "en"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, post} =
|
||||||
|
Posts.create_post(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "English List Original",
|
||||||
|
content: "English list body",
|
||||||
|
language: "en",
|
||||||
|
categories: ["notes"],
|
||||||
|
tags: ["Elixir"]
|
||||||
|
})
|
||||||
|
|
||||||
|
created_at = DateTime.to_unix(~U[2026-04-15 12:00:00Z])
|
||||||
|
|
||||||
|
Repo.update_all(from(p in BDS.Posts.Post, where: p.id == ^post.id),
|
||||||
|
set: [created_at: created_at, updated_at: created_at]
|
||||||
|
)
|
||||||
|
|
||||||
|
assert {:ok, _translation} =
|
||||||
|
Posts.upsert_post_translation(post.id, "de", %{
|
||||||
|
title: "Deutsche Listenfassung",
|
||||||
|
content: "Deutscher Listeninhalt"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, _published_post} = Posts.publish_post(post.id)
|
||||||
|
|
||||||
|
assert {:ok, _result} =
|
||||||
|
BDS.Generation.generate_site(project.id, [:core, :single, :category, :tag, :date])
|
||||||
|
|
||||||
|
read_output = fn segments -> File.read!(Path.join([temp_dir, "html" | segments])) end
|
||||||
|
|
||||||
|
for segments <- [
|
||||||
|
["index.html"],
|
||||||
|
["rss.xml"],
|
||||||
|
["atom.xml"],
|
||||||
|
["category", "notes", "index.html"],
|
||||||
|
["tag", "Elixir", "index.html"],
|
||||||
|
["2026", "index.html"]
|
||||||
|
] do
|
||||||
|
html = read_output.(segments)
|
||||||
|
assert html =~ "Deutsche Listenfassung", "expected translated title in #{Path.join(segments)}"
|
||||||
|
refute html =~ "English List Original", "unexpected original title in #{Path.join(segments)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
for segments <- [
|
||||||
|
["en", "index.html"],
|
||||||
|
["en", "rss.xml"],
|
||||||
|
["en", "category", "notes", "index.html"]
|
||||||
|
] do
|
||||||
|
html = read_output.(segments)
|
||||||
|
assert html =~ "English List Original", "expected original title in #{Path.join(segments)}"
|
||||||
|
refute html =~ "Deutsche Listenfassung", "unexpected translated title in #{Path.join(segments)}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
test "validate_site follows old language subtree expectations and combined sitemap output", %{
|
test "validate_site follows old language subtree expectations and combined sitemap output", %{
|
||||||
project: project,
|
project: project,
|
||||||
temp_dir: temp_dir
|
temp_dir: temp_dir
|
||||||
|
|||||||
@@ -436,6 +436,8 @@ defmodule BDS.MacBundleTest do
|
|||||||
File.write!(Path.join(release, "bin/bds"), "#!/bin/sh\necho fake release\n")
|
File.write!(Path.join(release, "bin/bds"), "#!/bin/sh\necho fake release\n")
|
||||||
File.mkdir_p!(Path.join(release, "lib/wx-2.4/priv"))
|
File.mkdir_p!(Path.join(release, "lib/wx-2.4/priv"))
|
||||||
File.write!(Path.join(release, "lib/wx-2.4/priv/wxe_driver.so"), "fake-nif")
|
File.write!(Path.join(release, "lib/wx-2.4/priv/wxe_driver.so"), "fake-nif")
|
||||||
|
File.mkdir_p!(Path.join(release, "releases/0.1.0"))
|
||||||
|
File.write!(Path.join(release, "releases/0.1.0/env.sh"), "# env")
|
||||||
|
|
||||||
icns = Path.join(tmp, "AppIcon.icns")
|
icns = Path.join(tmp, "AppIcon.icns")
|
||||||
File.write!(icns, "fake-icns")
|
File.write!(icns, "fake-icns")
|
||||||
@@ -489,5 +491,28 @@ defmodule BDS.MacBundleTest do
|
|||||||
assert File.exists?(Path.join(app, "Contents/Resources/rel/bin/bds"))
|
assert File.exists?(Path.join(app, "Contents/Resources/rel/bin/bds"))
|
||||||
assert File.exists?(Path.join(app, "Contents/Resources/AppIcon.icns"))
|
assert File.exists?(Path.join(app, "Contents/Resources/AppIcon.icns"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "refuses a half-assembled release and keeps the previous bundle", %{app: app} do
|
||||||
|
# A failed `mix release` leaves lib/ but no releases/<version>/env.sh.
|
||||||
|
tmp = Path.join(System.tmp_dir!(), "bds-macbundle-broken-#{System.unique_integer([:positive])}")
|
||||||
|
broken = Path.join(tmp, "rel")
|
||||||
|
File.mkdir_p!(Path.join(broken, "bin"))
|
||||||
|
File.mkdir_p!(Path.join(broken, "lib/wx-2.4/priv"))
|
||||||
|
on_exit(fn -> File.rm_rf!(tmp) end)
|
||||||
|
|
||||||
|
assert {:error, {:incomplete_release, message}} =
|
||||||
|
MacBundle.assemble(
|
||||||
|
release_dir: broken,
|
||||||
|
output_dir: Path.dirname(app),
|
||||||
|
icns_path: Path.join(tmp, "missing.icns"),
|
||||||
|
version: "0.1.0",
|
||||||
|
skip_dylibs: true,
|
||||||
|
skip_codesign: true
|
||||||
|
)
|
||||||
|
|
||||||
|
assert message =~ "mix release"
|
||||||
|
# the refused build must not have wiped the existing bundle
|
||||||
|
assert File.exists?(Path.join(app, "Contents/Resources/rel/bin/bds"))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ defmodule BDS.ReleasePackagingTest do
|
|||||||
File.mkdir_p!(Path.join(mcp_release, "mcp/bin"))
|
File.mkdir_p!(Path.join(mcp_release, "mcp/bin"))
|
||||||
File.write!(Path.join(app_release, "bin/bds"), "app-release")
|
File.write!(Path.join(app_release, "bin/bds"), "app-release")
|
||||||
File.write!(Path.join(mcp_release, "mcp/bin/bds-mcp"), "mcp-release")
|
File.write!(Path.join(mcp_release, "mcp/bin/bds-mcp"), "mcp-release")
|
||||||
|
File.mkdir_p!(Path.join(app_release, "releases/0.1.0"))
|
||||||
|
File.write!(Path.join(app_release, "releases/0.1.0/env.sh"), "# env")
|
||||||
|
|
||||||
on_exit(fn -> File.rm_rf(base_dir) end)
|
on_exit(fn -> File.rm_rf(base_dir) end)
|
||||||
|
|
||||||
@@ -66,6 +68,23 @@ defmodule BDS.ReleasePackagingTest do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "package refuses a half-assembled release (no releases/*/env.sh)", context do
|
||||||
|
# A failed `mix release` can leave lib/ copied but no releases/<version>/;
|
||||||
|
# packaging that produces an app that dies on launch.
|
||||||
|
File.rm_rf!(Path.join(context.app_release, "releases"))
|
||||||
|
|
||||||
|
assert {:error, {:incomplete_release, message}} =
|
||||||
|
ReleasePackaging.package(
|
||||||
|
platform: :macos,
|
||||||
|
version: "0.1.0",
|
||||||
|
output_dir: context.output_dir,
|
||||||
|
app_release_source: context.app_release,
|
||||||
|
mcp_release_source: context.mcp_release
|
||||||
|
)
|
||||||
|
|
||||||
|
assert message =~ "mix release"
|
||||||
|
end
|
||||||
|
|
||||||
test "package creates a platform archive for redistribution", context do
|
test "package creates a platform archive for redistribution", context do
|
||||||
assert {:ok, metadata} =
|
assert {:ok, metadata} =
|
||||||
ReleasePackaging.package(
|
ReleasePackaging.package(
|
||||||
|
|||||||
@@ -34,6 +34,57 @@ defmodule BDS.Scripting.LuaTest do
|
|||||||
assert_receive {:progress, %{"phase" => "write", "current" => 2, "total" => 2}}
|
assert_receive {:progress, %{"phase" => "write", "current" => 2, "total" => 2}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "streams bds.app.log output through the on_output callback" do
|
||||||
|
parent = self()
|
||||||
|
|
||||||
|
source = """
|
||||||
|
function main()
|
||||||
|
bds.app.log('fetching')
|
||||||
|
bds.app.log('done', 42)
|
||||||
|
return 'ok'
|
||||||
|
end
|
||||||
|
"""
|
||||||
|
|
||||||
|
callback = fn text -> send(parent, {:script_output, text}) end
|
||||||
|
|
||||||
|
assert {:ok, "ok"} =
|
||||||
|
BDS.Scripting.execute_project_script("project-id", source, "main", [],
|
||||||
|
on_output: callback
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_receive {:script_output, "fetching"}
|
||||||
|
assert_receive {:script_output, "done 42"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "routes print calls through the on_output callback" do
|
||||||
|
parent = self()
|
||||||
|
|
||||||
|
source = """
|
||||||
|
function main()
|
||||||
|
print('hello', 'world')
|
||||||
|
return 'ok'
|
||||||
|
end
|
||||||
|
"""
|
||||||
|
|
||||||
|
callback = fn text -> send(parent, {:script_output, text}) end
|
||||||
|
|
||||||
|
assert {:ok, "ok"} = BDS.Scripting.execute(source, "main", [], on_output: callback)
|
||||||
|
|
||||||
|
assert_receive {:script_output, "hello world"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "log and print fall back to a silent sink without an on_output callback" do
|
||||||
|
source = """
|
||||||
|
function main()
|
||||||
|
bds.app.log('note')
|
||||||
|
print('hello')
|
||||||
|
return 'ok'
|
||||||
|
end
|
||||||
|
"""
|
||||||
|
|
||||||
|
assert {:ok, "ok"} = BDS.Scripting.execute_project_script("project-id", source, "main", [])
|
||||||
|
end
|
||||||
|
|
||||||
test "sandbox blocks os.execute" do
|
test "sandbox blocks os.execute" do
|
||||||
source = "function main() os.execute('echo hacked') end"
|
source = "function main() os.execute('echo hacked') end"
|
||||||
|
|
||||||
|
|||||||
@@ -38,14 +38,18 @@ defmodule BDS.TUITest do
|
|||||||
state
|
state
|
||||||
end
|
end
|
||||||
|
|
||||||
defp screen_text(state, width \\ 100, height \\ 32) do
|
defp screen_cells(state, width \\ 100, height \\ 32) do
|
||||||
session = CellSession.new(width, height)
|
session = CellSession.new(width, height)
|
||||||
frame = %ExRatatui.Frame{width: width, height: height}
|
frame = %ExRatatui.Frame{width: width, height: height}
|
||||||
:ok = CellSession.draw(session, BDS.TUI.render(state, frame))
|
:ok = CellSession.draw(session, BDS.TUI.render(state, frame))
|
||||||
snapshot = CellSession.take_cells(session)
|
snapshot = CellSession.take_cells(session)
|
||||||
:ok = CellSession.close(session)
|
:ok = CellSession.close(session)
|
||||||
|
|
||||||
snapshot.cells
|
snapshot.cells
|
||||||
|
end
|
||||||
|
|
||||||
|
defp screen_text(state, width \\ 100, height \\ 32) do
|
||||||
|
state
|
||||||
|
|> screen_cells(width, height)
|
||||||
|> Enum.group_by(& &1.row)
|
|> Enum.group_by(& &1.row)
|
||||||
|> Enum.sort_by(fn {row, _} -> row end)
|
|> Enum.sort_by(fn {row, _} -> row end)
|
||||||
|> Enum.map_join("\n", fn {_row, cells} ->
|
|> Enum.map_join("\n", fn {_row, cells} ->
|
||||||
@@ -53,6 +57,22 @@ defmodule BDS.TUITest do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# The cell where `text` starts on screen (used to assert per-cell styles).
|
||||||
|
defp cell_at_text(cells, text) do
|
||||||
|
{_row, row_cells} =
|
||||||
|
cells
|
||||||
|
|> Enum.group_by(& &1.row)
|
||||||
|
|> Enum.find(fn {_row, row_cells} ->
|
||||||
|
row_cells |> Enum.sort_by(& &1.col) |> Enum.map_join("", & &1.symbol) |> String.contains?(text)
|
||||||
|
end)
|
||||||
|
|
||||||
|
sorted = Enum.sort_by(row_cells, & &1.col)
|
||||||
|
joined = Enum.map_join(sorted, & &1.symbol)
|
||||||
|
{byte_offset, _len} = :binary.match(joined, text)
|
||||||
|
char_offset = joined |> binary_part(0, byte_offset) |> String.length()
|
||||||
|
Enum.at(sorted, char_offset)
|
||||||
|
end
|
||||||
|
|
||||||
defp key(code, modifiers), do: %Key{code: code, kind: "press", modifiers: modifiers}
|
defp key(code, modifiers), do: %Key{code: code, kind: "press", modifiers: modifiers}
|
||||||
|
|
||||||
defp press(state, code, modifiers \\ []) do
|
defp press(state, code, modifiers \\ []) do
|
||||||
@@ -68,7 +88,7 @@ defmodule BDS.TUITest do
|
|||||||
assert text =~ "Hello TUI"
|
assert text =~ "Hello TUI"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "opening a post lands in the markdown preview, not the editor", %{post: post} do
|
test "opening a post lands in the editor with the raw source", %{post: post} do
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
BDS.Posts.update_post(post.id, %{content: "# Big Heading\n\nsome **bold** words"})
|
BDS.Posts.update_post(post.id, %{content: "# Big Heading\n\nsome **bold** words"})
|
||||||
|
|
||||||
@@ -76,19 +96,68 @@ defmodule BDS.TUITest do
|
|||||||
|
|
||||||
assert state.focus == :editor
|
assert state.focus == :editor
|
||||||
assert state.editor.post.id == post.id
|
assert state.editor.post.id == post.id
|
||||||
|
refute state.editor.preview?
|
||||||
|
|
||||||
|
# The editor shows the raw markdown source.
|
||||||
|
assert screen_text(state) =~ "**bold**"
|
||||||
|
|
||||||
|
# ctrl+e flips to the rendered markdown preview: inline markers are
|
||||||
|
# consumed by the styling.
|
||||||
|
state = press(state, "e", ["ctrl"])
|
||||||
assert state.editor.preview?
|
assert state.editor.preview?
|
||||||
|
|
||||||
text = screen_text(state)
|
text = screen_text(state)
|
||||||
assert text =~ "Big Heading"
|
assert text =~ "Big Heading"
|
||||||
# Rendered markdown: inline markers are consumed by the styling
|
|
||||||
# (headings keep their # but get styled, invisible in a text dump).
|
|
||||||
assert text =~ "some bold words"
|
assert text =~ "some bold words"
|
||||||
refute text =~ "**bold**"
|
refute text =~ "**bold**"
|
||||||
|
|
||||||
# ctrl+e drops into the editing textarea with the raw source.
|
# and back to the editor.
|
||||||
state = press(state, "e", ["ctrl"])
|
state = press(state, "e", ["ctrl"])
|
||||||
refute state.editor.preview?
|
refute state.editor.preview?
|
||||||
assert ExRatatui.textarea_get_value(state.editor.textarea) =~ "**bold**"
|
assert screen_text(state) =~ "**bold**"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "the editor word-wraps long lines", %{post: post} do
|
||||||
|
long_line = String.duplicate("lorem ipsum dolor sit amet ", 8) <> "FINALWORD"
|
||||||
|
{:ok, _} = BDS.Posts.update_post(post.id, %{content: long_line})
|
||||||
|
|
||||||
|
state = mount!() |> press("enter")
|
||||||
|
refute state.editor.preview?
|
||||||
|
|
||||||
|
# The tail of a long line wraps onto visible rows without any
|
||||||
|
# horizontal scrolling.
|
||||||
|
assert screen_text(state, 80, 32) =~ "FINALWORD"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "the cursor cell stays visible when the cursor sits below the viewport", %{post: post} do
|
||||||
|
content = Enum.map_join(1..30, "\n", &"line #{&1}")
|
||||||
|
{:ok, _} = BDS.Posts.update_post(post.id, %{content: content})
|
||||||
|
|
||||||
|
state = mount!() |> press("enter")
|
||||||
|
|
||||||
|
# The cursor opens at the end of the buffer — source row 29 of 30.
|
||||||
|
assert ExRatatui.textarea_cursor(state.editor.textarea) == {29, 7}
|
||||||
|
|
||||||
|
cells = screen_cells(state)
|
||||||
|
# The cursor cell is the single space carrying the cursor background
|
||||||
|
# inside the editor area (the sidebar selection also uses a cyan bg).
|
||||||
|
assert Enum.any?(cells, &(&1.bg == :cyan and &1.symbol == " " and &1.col >= 34))
|
||||||
|
end
|
||||||
|
|
||||||
|
test "the cursor line has a distinct background from the other lines", %{post: post} do
|
||||||
|
{:ok, _} = BDS.Posts.update_post(post.id, %{content: "first\nsecond\nthird"})
|
||||||
|
|
||||||
|
state = mount!() |> press("enter")
|
||||||
|
|
||||||
|
# Move the cursor from the end of the buffer onto the first line.
|
||||||
|
state = state |> press("up") |> press("up")
|
||||||
|
assert ExRatatui.textarea_cursor(state.editor.textarea) == {0, 5}
|
||||||
|
|
||||||
|
cells = screen_cells(state)
|
||||||
|
# A fixed dark grey — readable against the light syntax colours in
|
||||||
|
# any terminal palette (the named :dark_gray is palette-dependent).
|
||||||
|
assert cell_at_text(cells, "first").bg == {:rgb, 52, 61, 70}
|
||||||
|
refute cell_at_text(cells, "second").bg == {:rgb, 52, 61, 70}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "ctrl+s persists textarea edits", %{post: post} do
|
test "ctrl+s persists textarea edits", %{post: post} do
|
||||||
@@ -126,26 +195,17 @@ defmodule BDS.TUITest do
|
|||||||
assert state.focus == :sidebar
|
assert state.focus == :sidebar
|
||||||
end
|
end
|
||||||
|
|
||||||
test "the preview word-wraps and ctrl+e toggles back and forth", %{post: post} do
|
test "the preview word-wraps long lines", %{post: post} do
|
||||||
long_line = String.duplicate("lorem ipsum dolor sit amet ", 8) <> "FINALWORD"
|
long_line = String.duplicate("lorem ipsum dolor sit amet ", 8) <> "FINALWORD"
|
||||||
{:ok, _} = BDS.Posts.update_post(post.id, %{content: long_line})
|
{:ok, _} = BDS.Posts.update_post(post.id, %{content: long_line})
|
||||||
|
|
||||||
state = mount!() |> press("enter")
|
state = mount!() |> press("enter") |> press("e", ["ctrl"])
|
||||||
assert state.editor.preview?
|
assert state.editor.preview?
|
||||||
|
|
||||||
# The textarea cannot soft-wrap, so the tail of a long line is off-screen
|
|
||||||
# there; the preview renders through the Markdown widget, which wraps.
|
|
||||||
assert screen_text(state, 80, 32) =~ "FINALWORD"
|
assert screen_text(state, 80, 32) =~ "FINALWORD"
|
||||||
|
|
||||||
state = press(state, "e", ["ctrl"])
|
|
||||||
refute state.editor.preview?
|
|
||||||
|
|
||||||
state = press(state, "e", ["ctrl"])
|
|
||||||
assert state.editor.preview?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "keys in preview mode do not edit the content" do
|
test "keys in preview mode do not edit the content" do
|
||||||
state = mount!() |> press("enter")
|
state = mount!() |> press("enter") |> press("e", ["ctrl"])
|
||||||
assert state.editor.preview?
|
assert state.editor.preview?
|
||||||
before = ExRatatui.textarea_get_value(state.editor.textarea)
|
before = ExRatatui.textarea_get_value(state.editor.textarea)
|
||||||
|
|
||||||
|
|||||||
199
test/bds/ui/code_editor_test.exs
Normal file
199
test/bds/ui/code_editor_test.exs
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
defmodule BDS.UI.CodeEditorTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
alias BDS.UI.CodeEditor
|
||||||
|
alias BDS.UI.CodeEditor.Highlight
|
||||||
|
alias ExRatatui.Layout.Rect
|
||||||
|
alias ExRatatui.Style
|
||||||
|
alias ExRatatui.Text.Line
|
||||||
|
alias ExRatatui.Widgets.Paragraph
|
||||||
|
alias ExRatatui.Widgets.Textarea
|
||||||
|
|
||||||
|
@theme :base16_ocean_dark
|
||||||
|
@rect %Rect{x: 0, y: 0, width: 40, height: 10}
|
||||||
|
|
||||||
|
defp find_span(line, text) do
|
||||||
|
Enum.find(line.spans, fn span -> String.contains?(span.content, text) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp editor_widget(content, opts \\ []) do
|
||||||
|
textarea = ExRatatui.textarea_new()
|
||||||
|
:ok = ExRatatui.textarea_insert_str(textarea, content)
|
||||||
|
|
||||||
|
widget = %CodeEditor{
|
||||||
|
textarea: textarea,
|
||||||
|
language: Keyword.get(opts, :language, :markdown_macros),
|
||||||
|
cursor_style: Keyword.get(opts, :cursor_style, %Style{bg: :cyan}),
|
||||||
|
line_highlight_style: Keyword.get(opts, :line_highlight_style, %Style{}),
|
||||||
|
block: Keyword.get(opts, :block),
|
||||||
|
scroll: Keyword.get(opts, :scroll, {0, 0})
|
||||||
|
}
|
||||||
|
|
||||||
|
{widget, textarea}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp render(widget, rect \\ @rect) do
|
||||||
|
[{paragraph, ^rect}] = ExRatatui.Widget.render(widget, rect)
|
||||||
|
paragraph
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "Highlight.highlight/3 — :lua" do
|
||||||
|
test "colours keywords with the theme keyword colour, distinct from identifiers" do
|
||||||
|
[first, _middle, last] =
|
||||||
|
Highlight.highlight("local function foo()\n return 1\nend", :lua, @theme)
|
||||||
|
|
||||||
|
keyword = find_span(first, "function")
|
||||||
|
assert keyword.style.fg != nil
|
||||||
|
assert find_span(last, "end").style.fg == keyword.style.fg
|
||||||
|
refute find_span(first, "foo").style.fg == keyword.style.fg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "Highlight.highlight/3 — :markdown_macros" do
|
||||||
|
test "recolours [[macro]] syntax with the GUI accent colours" do
|
||||||
|
[line] = Highlight.highlight(~s([[gallery names="x"]]), :markdown_macros, @theme)
|
||||||
|
|
||||||
|
opener = find_span(line, "[[gallery")
|
||||||
|
assert opener.style.fg == {:rgb, 197, 134, 192}
|
||||||
|
assert :bold in opener.style.modifiers
|
||||||
|
|
||||||
|
closer = find_span(line, "]]")
|
||||||
|
assert closer.style.fg == {:rgb, 197, 134, 192}
|
||||||
|
assert :bold in closer.style.modifiers
|
||||||
|
|
||||||
|
assert find_span(line, "names").style.fg == {:rgb, 156, 220, 254}
|
||||||
|
assert find_span(line, ~s("x")).style.fg == {:rgb, 206, 145, 120}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "keeps the base markdown styling outside macros" do
|
||||||
|
content = ~s(before [[gallery names="x"]] after)
|
||||||
|
|
||||||
|
[overlayed] = Highlight.highlight(content, :markdown_macros, @theme)
|
||||||
|
[base] = ExRatatui.CodeBlock.highlight(content, "markdown", @theme)
|
||||||
|
|
||||||
|
base_style = find_span(base, "before").style
|
||||||
|
assert find_span(overlayed, "before").style == base_style
|
||||||
|
assert find_span(overlayed, "after").style == base_style
|
||||||
|
end
|
||||||
|
|
||||||
|
test "highlights the macro over a styled markdown base" do
|
||||||
|
[line] = Highlight.highlight("some **bold** [[macro]] words", :markdown_macros, @theme)
|
||||||
|
|
||||||
|
# Bold markdown keeps its base styling while the macro is recoloured.
|
||||||
|
assert :bold in find_span(line, "bold").style.modifiers
|
||||||
|
assert find_span(line, "[[macro").style.fg == {:rgb, 197, 134, 192}
|
||||||
|
assert find_span(line, "]]").style.fg == {:rgb, 197, 134, 192}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "Highlight.highlight/3 — :liquid" do
|
||||||
|
test "recolours output tags over the HTML base" do
|
||||||
|
[line] = Highlight.highlight("<div>{{ x }}</div>", :liquid, @theme)
|
||||||
|
|
||||||
|
assert find_span(line, "{{").style.fg == {:rgb, 86, 156, 214}
|
||||||
|
assert find_span(line, "}}").style.fg == {:rgb, 86, 156, 214}
|
||||||
|
# The HTML base styling survives outside the tag.
|
||||||
|
assert find_span(line, "div").style.fg != nil
|
||||||
|
end
|
||||||
|
|
||||||
|
test "recolours the tag keyword distinctly from identifiers" do
|
||||||
|
[line] = Highlight.highlight("{% if x %}y{% endif %}", :liquid, @theme)
|
||||||
|
|
||||||
|
keyword = find_span(line, "if")
|
||||||
|
assert keyword.style.fg == {:rgb, 86, 156, 214}
|
||||||
|
assert find_span(line, "endif").style.fg == keyword.style.fg
|
||||||
|
refute find_span(line, " x ").style.fg == keyword.style.fg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "Highlight.highlight/3 — line bookkeeping" do
|
||||||
|
test "empty content yields a single empty line" do
|
||||||
|
assert [%Line{spans: []}] = Highlight.highlight("", :markdown_macros, @theme)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "trailing empty lines are padded back to the textarea's line count" do
|
||||||
|
lines = Highlight.highlight("a\n\n", :text, @theme)
|
||||||
|
assert length(lines) == 3
|
||||||
|
end
|
||||||
|
|
||||||
|
test "spans never contain newline characters" do
|
||||||
|
lines = Highlight.highlight("a\nb\n", :text, @theme)
|
||||||
|
|
||||||
|
for line <- lines, span <- line.spans do
|
||||||
|
refute String.contains?(span.content, "\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "ExRatatui.Widget rendering" do
|
||||||
|
test "emits a wrapping Paragraph, never a bare Textarea, for every highlighted language" do
|
||||||
|
for language <- [:markdown_macros, :liquid, :lua, :text] do
|
||||||
|
{widget, _textarea} = editor_widget("hello", language: language)
|
||||||
|
paragraph = render(widget)
|
||||||
|
|
||||||
|
assert %Paragraph{wrap: true, scroll: {_top, 0}} = paragraph
|
||||||
|
refute match?(%Textarea{}, paragraph)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "splices the cursor cell into the character under the cursor" do
|
||||||
|
{widget, textarea} = editor_widget("hello")
|
||||||
|
:ok = ExRatatui.textarea_handle_key(textarea, "home", [])
|
||||||
|
|
||||||
|
%Paragraph{text: [line | _rest]} = render(widget)
|
||||||
|
|
||||||
|
cursor_span = Enum.find(line.spans, &(&1.style.bg == :cyan))
|
||||||
|
assert cursor_span.content == "h"
|
||||||
|
assert Enum.map_join(line.spans, & &1.content) == "hello"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "appends a cursor cell when the cursor sits at the end of the line" do
|
||||||
|
{widget, _textarea} = editor_widget("hello")
|
||||||
|
|
||||||
|
%Paragraph{text: [line | _rest]} = render(widget)
|
||||||
|
|
||||||
|
cursor_span = List.last(line.spans)
|
||||||
|
assert cursor_span.content == " "
|
||||||
|
assert cursor_span.style.bg == :cyan
|
||||||
|
end
|
||||||
|
|
||||||
|
test "highlights the cursor line with the line highlight style" do
|
||||||
|
{widget, _textarea} =
|
||||||
|
editor_widget("ab\ncd",
|
||||||
|
language: :text,
|
||||||
|
cursor_style: %Style{},
|
||||||
|
line_highlight_style: %Style{bg: :dark_gray}
|
||||||
|
)
|
||||||
|
|
||||||
|
%Paragraph{text: lines} = render(widget)
|
||||||
|
|
||||||
|
# The cursor opens at the end of the second line.
|
||||||
|
assert Enum.all?(Enum.at(lines, 1).spans, &(&1.style.bg == :dark_gray))
|
||||||
|
assert Enum.all?(Enum.at(lines, 0).spans, &(&1.style.bg != :dark_gray))
|
||||||
|
end
|
||||||
|
|
||||||
|
test "scrolls so the cursor visual row stays inside the window" do
|
||||||
|
content = Enum.map_join(1..30, "\n", &"line #{&1}")
|
||||||
|
rect = %Rect{x: 0, y: 0, width: 20, height: 5}
|
||||||
|
{widget, _textarea} = editor_widget(content, rect: rect)
|
||||||
|
|
||||||
|
# The cursor opens on source row 29: 30 visual rows, window height 5.
|
||||||
|
assert %Paragraph{scroll: {25, 0}} = render(widget, rect)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "wrapped source lines count towards the cursor's visual row" do
|
||||||
|
rect = %Rect{x: 0, y: 0, width: 4, height: 2}
|
||||||
|
{widget, _textarea} = editor_widget("abcdefghij", rect: rect)
|
||||||
|
|
||||||
|
# 10 characters in a 4-wide window wrap to 3 visual rows; the cursor
|
||||||
|
# at the end of the line lands on the third.
|
||||||
|
assert %Paragraph{scroll: {1, 0}} = render(widget, rect)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "keeps the scroll offset at zero while the cursor is visible" do
|
||||||
|
{widget, _textarea} = editor_widget("a\nb\nc")
|
||||||
|
|
||||||
|
assert %Paragraph{scroll: {0, 0}} = render(widget)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
78
test/bds/ui/task_grouping_test.exs
Normal file
78
test/bds/ui/task_grouping_test.exs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
defmodule BDS.UI.TaskGroupingTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
alias BDS.UI.TaskGrouping
|
||||||
|
|
||||||
|
defp task(id, status, opts \\ %{}) do
|
||||||
|
%{
|
||||||
|
id: id,
|
||||||
|
name: Map.get(opts, :name, "Task #{id}"),
|
||||||
|
status: status,
|
||||||
|
progress: Map.get(opts, :progress),
|
||||||
|
message: nil,
|
||||||
|
group_id: Map.get(opts, :group_id),
|
||||||
|
group_name: Map.get(opts, :group_name)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "build_task_entries/1" do
|
||||||
|
test "tasks without a group stay single entries in order" do
|
||||||
|
entries = TaskGrouping.build_task_entries([task("a", :running), task("b", :completed)])
|
||||||
|
|
||||||
|
assert [{:single, %{id: "a"}}, {:single, %{id: "b"}}] = entries
|
||||||
|
end
|
||||||
|
|
||||||
|
test "tasks with a group_id are grouped by first-seen order" do
|
||||||
|
entries =
|
||||||
|
TaskGrouping.build_task_entries([
|
||||||
|
task("a", :running, %{group_id: "g1", group_name: "Import"}),
|
||||||
|
task("b", :running),
|
||||||
|
task("c", :pending, %{group_id: "g1", group_name: "Import"}),
|
||||||
|
task("d", :completed, %{group_id: "g2", group_name: "Upload"})
|
||||||
|
])
|
||||||
|
|
||||||
|
assert [
|
||||||
|
{:group, "g1", "Import", [%{id: "a"}, %{id: "c"}]},
|
||||||
|
{:single, %{id: "b"}},
|
||||||
|
{:group, "g2", "Upload", [%{id: "d"}]}
|
||||||
|
] = entries
|
||||||
|
end
|
||||||
|
|
||||||
|
test "group label falls back to the group_id when no group_name is set" do
|
||||||
|
assert [{:group, "g1", "g1", [_]}] =
|
||||||
|
TaskGrouping.build_task_entries([task("a", :running, %{group_id: "g1"})])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "summarize_task_group/1" do
|
||||||
|
test "counts statuses and averages progress contributions" do
|
||||||
|
summary =
|
||||||
|
TaskGrouping.summarize_task_group([
|
||||||
|
task("a", :running, %{progress: 0.5}),
|
||||||
|
task("b", :pending),
|
||||||
|
task("c", :completed)
|
||||||
|
])
|
||||||
|
|
||||||
|
assert summary.total == 3
|
||||||
|
assert summary.running == 1
|
||||||
|
assert summary.pending == 1
|
||||||
|
assert summary.completed == 1
|
||||||
|
assert summary.failed == 0
|
||||||
|
assert summary.cancelled == 0
|
||||||
|
# contributions: 0.5 (running) + 0 (pending) + 1.0 (completed)
|
||||||
|
assert_in_delta summary.progress, 0.5, 0.001
|
||||||
|
end
|
||||||
|
|
||||||
|
test "finished failures and cancellations count as full progress" do
|
||||||
|
summary = TaskGrouping.summarize_task_group([task("a", :failed), task("b", :cancelled)])
|
||||||
|
|
||||||
|
assert summary.progress == 1.0
|
||||||
|
assert summary.failed == 1
|
||||||
|
assert summary.cancelled == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
test "empty group summarizes to zero" do
|
||||||
|
assert %{total: 0, progress: +0.0} = TaskGrouping.summarize_task_group([])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user