* feat(app): workspace labels baseline Existing labels implementation, committed as-is as the baseline for the UI redesign. Server, protocol, catalog store and sync are sound; the UI layer is reworked in the commits that follow. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): show workspace labels on the sidebar meta line Labels could be assigned and then appeared nowhere. They now draw as a chip on the workspace meta row, after the host, change request, checks and service, and they can be switched off from the Show submenu like any other item on that line. One palette, not two. `baseColors.workspaceLabel` was ten raw Tailwind 500s spanning a 1.9:1 to 4.5:1 contrast range — the exact set identity-colors.ts was written to replace. Label color is now the identity color of the same name, so a chip, a host badge and a CI check on one row sit in one contrast band. `workspace-labels/colors.ts` and its per-file `labelColorViolet` blocks are gone; `chip.tsx` and `swatch.tsx` are the only places a label color becomes ink. A row resolves its labels against its own host's catalog and nothing else. The cross-host projection answers too, but two hosts may give one name two colors and the merge settles that by target precedence and then alphabetical serverId — a row painted in a color its host never assigned is lying about the one thing the color is for. The meta row's doc comment argued against tinted chrome on that line. The chip is a deliberate exception — everything else there reports state and shares the state colors, a label is a name a person chose — so the comment now says that instead of contradicting the code. Alignment: - The chip is exactly as tall as the line: text at the row's 16pt lineHeight, no vertical padding, so a labelled row is the same height as an unlabelled one. - A label run that opens the line hangs left by the chip's own padding, landing the name on the rail the title above it uses. Mid-line the ground stays in the flow. - The swatch row reaches 44pt through hitSlop growing outward from a 20pt swatch, replacing ten 44pt colored blobs in the manager modal. - The picker's raw `<Plus>`, `<CheckSquare>` and `<Square>` go through withUnistyles with module-level mappings, at the menu's 14pt. Also fixes a bug this change exposed: `SidebarRowItemsSchema` is a strict object, so adding an item without a key there fails the whole settings write and silently loses every other Show toggle with it. A test now covers each item in SIDEBAR_ROW_ITEMS. Phase 1 of the workspace labels redesign. The filter menu, the picker's interaction model and the manager modal's layout are later phases. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): one Labels filter page with tri-state rows Filtering by label cost three levels: Display -> Labels -> Include -> a page of labels, or -> Exclude -> the same page again. It is now one page: every label across every host, one row each, leading with its colour dot. A row cycles off -> include -> exclude -> off. Include is MenuItem's own check; exclude is lucide's X, the check's own pair, at the same 16 in the same trailing slot, so the column does not shift as a row cycles. Exclude also dims the row, because a state you have to identify by its glyph is not one you read at a glance. Unlabelled is a row in the same list, with a hollow ring where the others carry their colour. Match any / all still appears only once two labels are included. Clear is absent, not disabled, when nothing is filtered. Manage labels sits at the bottom below a separator. The whole root row is gone when no host has a label — unless a filter is still active, since the merged catalog only counts online hosts and losing one would otherwise strand a filter that is still hiding workspaces. The page is titled Labels, so its rows stop repeating the word: "Match any", "Match all", "Clear filter". The two Match rows sit directly under the list they qualify and only appear once two labels are included, so the subject is already on screen. All nine locales move together, translated rather than transliterated — Arabic keeps its noun, where "أي" is a determiner that needs one to stay grammatical. SidebarLabelFilter collapses from four collections plus match to one Record<labelKey, "include" | "exclude"> plus match: a tri-state row is one value per label, so include and exclude can no longer disagree about the same name. Unlabelled keys off the empty string, which normalizeWorkspaceLabelName makes unreachable for a real label. toggleSidebarLabelSelection, countSidebarLabelSelections, sidebarLabelSelectionIncludes and deduplicateSidebarLabelNames go with the old shape; setLabelFilter becomes cycleLabelFilter and setLabelMatch, so the store owns its own transitions. No migration: labels are unreleased, so the old persisted shape never shipped, and migrateSidebarViewState already resets on a safeParse failure. The e2e manager step asserted "Red label color" on a swatch that Phase 1 renamed to "Red"; the selector follows the code, and the accessibility.color key behind the old string is deleted from all nine locales as unreferenced. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): assign labels on the menu's own rails The assign picker was a search box, a create row that unfolded an inline form under it, and hand-rolled label rows whose 44x44 checkbox pushed every dot and name off the rail the rows above them sat on. Nothing lined up with anything. Rows are `MenuItem` now: the colour dot in the 16pt leading slot, assignment as the trailing check the engine already draws for a chosen row. Using the engine's row is the alignment fix; there is no second row implementation to keep in step. Every press toggles and the menu stays open — assigning labels is multi-select, so the dual-target model (`source: "row" | "checkbox"`, `shouldCloseWorkspaceLabelPicker`) is gone along with the model's `close` dependency. You leave by dismissing the menu. Search is deleted. Nobody has enough labels to search, and the field was the thing pushing the list down the surface. `workspaceLabels.search` and `createNamed` go with it across all nine locales; `clearSearch` stays because the manager modal still owns a search field (Phase 4's copy, untouched here). `Create label` moves below a separator at the bottom and opens a page that replaces the list: a name field, the swatch row, one commit row. Picking a colour picks a colour — it no longer creates the label. A failed create keeps the draft and shows the error on the page; a successful one creates, assigns, and returns to the list with the row ticked. Both menus share one page definition. `SidebarWorkspaceMenu` and `SidebarWorkspaceContextMenu` each built the same `pages` memo; they now call `useWorkspaceLabelMenuPages`. Menu engine, all of it forced by putting a text input on a menu page: - `MenuTextField` — the form kit's `FormTextInput` carries a screen's geometry and lands its text 4pt inside the labels above it. This one is drawn as a row's own fill, so the box and the text sit on the row's two rails at once. - `MenuPageDefinition.hoverIntent` — a page you type into is not one the pointer opens or dismisses. Without it the create flyout opened on a pointer passing over the row, and threw the draft away when the mouse drifted off it while the hands were on the keyboard. - The sheet keeps `keyboardBehavior="interactive"`, not `extend`. With `enableDynamicSizing` the largest snap point is the content's own height, so a short page did not grow and the keyboard came up over the field. Caught on an iOS simulator, fixed, and re-shot. - `MenuItem` announces `selected` as `aria-checked`. The deleted checkbox said so; a check drawn and never announced would have been an accessibility regression. Tri-state rows (the filter page's exclude) still cannot announce themselves — menu-wide, still Phase 5's. `sidebar-workspace-row.tsx`'s `isTouchPlatform = platformIsNative || isCompact` is kept deliberately. On a compact web viewport there is no hover, so the row's trailing actions and kebab were unreachable and the labels menu with them; this is the documented `isHovered || isNative || isCompact` shape from CLAUDE.md. Evidence: /tmp/labels-p3-{wide,compact}-{light,dark}-{list,create}.png, the create page on iOS with the keyboard up (/tmp/labels-p3-native-compact-keyboard.png) and the clipped sheet it replaced (-before.png). `packages/app/e2e/browser/workspace-labels.spec.ts` rewritten for the new model, daemon-backed failure coverage kept for both the toggle and the create path, green with the menu unit suites. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): edit a label in one operation `workspace.label.rename.request` and `workspace.label.recolor.request` become one `workspace.label.update.request { name, newName?, color? }`. Both old RPCs are deleted outright — no COMPAT shim, because the labels feature is unreleased and neither name has ever been on a wire a user owns. The `workspaceLabels` capability flag stays; that one is how a new app detects an old daemon. Two calls could land half-applied, which left the catalog in a state nobody asked for and the UI with nothing true to say. One catalog commit now applies the name, the colour, or both. Renaming onto a name the host already has is rejected rather than merged, and the check runs inside the planner so a refused collision applies neither field. A label keeping its own key is not colliding with itself, so case-only edits pass. The manager modal follows: - The host selector is `HostFilter`, the pill History and Schedules use. `includeAllHost` is now a prop: a surface that edits one host's catalog cannot carry out "all". - Search moves to the sheet header, where it spans the header's own rails. As a body control it capped at the component's 420pt and left a hole on the right whenever a host filter wasn't beside it. `workspaceLabels.clearSearch` goes with the box that had a clear button. - A row no longer opens an editor. It carries a pencil in its trailing slot, hover-revealed on web and always visible on native and compact, on the canonical plain-View hover pattern with the press on an inner Pressable. - The edit view is a name field, the swatch row, and one Save that issues one update. Delete keeps its confirm and its affected-workspace count, and moves to `outline` — red belongs to the dialog, not to the surface that opens it. - Copy says edit, never rename or recolor, in all nine locales. `workspaceLabelErrorMessage` drops the `requestType=… code=…` the daemon client appends to every RPC failure. That is what a log wants, not what a user reads under a name field. `workspaceLabels.accessibility.color` stays deleted: the swatch's accessible name is already the colour's name, so nothing needed it back. Co-authored-by: Christoph Leiter <christoph@leiter.io> * chore(app): converge the labels phases The sweep at the end of the labels redesign: the three items earlier phases found and kept out of their own commits, one cross-phase pass, and the docs. `AdaptiveModalSheet`'s close button reaches its target with `hitSlop` instead of `padding`, which had inset its glyph 8pt from the rail the title, the search field and every trailing glyph below it sit on. This is shared chrome, so it moves the close glyph in every sheet in the app; measured on four of them across both paths — the labels manager desktop and compact, the shortcuts dialog, the rename sheet — and each one's trailing rail now agrees with its leading one. `MenuItem` takes `selected: boolean | "mixed"`. A tri-state row was silent to a screen reader: the check announced itself after the last phase, but exclude had no state at all, so an excluded label was indistinguishable from an untouched one. `"mixed"` is ARIA's own third state, the engine still draws the check only for `true`, and the row keeps supplying its own trailing mark — nothing in the menu engine learns what a label is. CLAUDE.md's platform-gating rules said "NEVER use `onPointerEnter`/ `onPointerLeave`", which is the opposite of what `docs/hover.md` and `constants/platform.ts` both mandate. It now names the real rule — hover on a plain `View`, press on a separate inner `Pressable`, and no `onHoverIn`/ `onHoverOut` on a `Pressable` that contains other pressables — and links the doc that owns it rather than restating it. The cross-phase pass turned up one real defect: the replica cache never learned about labels. `StoredWorkspaceSchema` had no `labels`, so a restored workspace came back unlabelled, and since the directory cursor is current on reconnect the daemon has nothing newer to send — the chips stayed gone for the whole session and the filter matched nothing. An optional field, a serializer line, and an assertion in the restore spec. Everything else measured onto its rails already. Left alone and logged: the per-row `Map` in `useWorkspaceLabelDefinitions`, and the display menu closing when the sidebar swaps to its empty state, which is confined to that swap and predates every phase here. `docs/architecture.md` and `docs/data-model.md` described rename and recolor; they now describe the one update commit, which fields it rewrites, and the per-host resolution a row's chips use. `docs/menus.md` documents the third item state where it already documents the other two. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): split the labels filter into include and exclude controls The Labels page rotated one row through off -> include -> exclude -> off, which billed the rare operation to the common one: clearing an include cost two presses and routed through exclude, so the sidebar visibly re-filtered into a state nobody asked for on the way out. The row now owns include and a control on its trailing rail owns exclude. Each is one press each way and neither is reached through the other. `cycleLabelFilter` becomes `toggleLabelInclude` and `toggleLabelExclude`; the store's map shape is unchanged, and setting either state clears the other for that label, so including an excluded row is still one press. A row is never both, so the trailing rail holds exactly one 16pt glyph in every state: the check, a permanent `X`, or the same `X` revealed on hover. `X` rather than a circle-slash for the reason Phase 2 settled it — `Ban` fills its box where the check does not, and the column twitches. The control fades rather than mounts and takes its 44pt target from `hitSlop`, so neither revealing it nor changing state moves anything: measured 453-469 on every row, wide and compact. The control carries a tooltip, gated to web where hover exists. It portals into the overlay root above the flyout with no backdrop of its own, and resting on it does not read as the pointer leaving the surface, so the menu stays up. Accessibility: the control is a `checkbox` named "Exclude {label}" with its own checked state, and it stays in the tree at opacity 0 on rows that have no visible mark, so it is reachable without hover. Keyboard focus reveals it, so tabbing to it never means pressing something invisible. The row keeps Phase 5's `selected="mixed"` for exclude. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): put include and exclude on their own rails on every label row Phase 6 gave the row include and its trailing rail a hover-revealed exclude. The rotation was gone but the awkwardness was not: `X` is the glyph this app dismisses things with, so on a filter row it reads as delete rather than exclude, and one rail with a changing occupant still means the row's trailing area keeps changing identity as you read down the column. Both controls are now on every row in fixed positions, and state is which one is lit. Nothing appears, disappears, swaps places or shifts: the check box is 429-445 and the ban box 453-469 on an included row, an excluded row and an untouched one alike, wide and compact. Because the ban is always there, include -> exclude is one press instead of two. The row still includes, and the check is that same action named. `Ban` rather than `X`. Phase 2 rejected it because its ink fills its 16pt box where a check's does not, so the column twitched when the two swapped on one rail. Nothing swaps here, so what is left is a weight difference: the ban is drawn at 14 inside a 16pt box, which is the visible optical correction available before it stops being a glyph. The box is what the rail is measured from and it stays 16. Lit is `foreground`, unlit `foregroundExtraMuted`. Not `foregroundMuted`, which is the obvious choice and is wrong here specifically: the Match rows further down the same page carry `MenuItem`'s own check in that colour to mean *selected*, so an unlit check in the same ink would say the opposite thing eight pixels above it. Excluded keeps Phase 2's dimmed row. Accessibility: the row keeps `selected` — `true` include, `"mixed"` exclude — and the two buttons carry no checked state of their own, so a label's state is announced once and its two controls read as the actions they are. Both buttons take a tooltip, gated to web with `enabledOnDesktop={isWeb}`, because on non-compact native `TooltipContent` falls back to a `Modal` with its own backdrop. Deleted with it: the `isHovered || isFocused || isNative || isCompact` reveal, the `opacity: 0` mounting, the hover-tracking `View` and the focus plumbing that existed to keep an invisible control reachable. Net -7 lines of code on this row, all of the growth in comments. The store is unchanged; both buttons and the row press map onto `toggleLabelInclude` / `toggleLabelExclude` as they are. The e2e's hover-reveal and `toHaveCount(0)` steps encoded the deleted behaviour and are replaced by a rail measurement taken in every state — relative to the row, since filtering moves the anchor the menu hangs off, and behind a settle poll, since the flyout scales in and a box read mid-animation is not a rail. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): reveal the label filter's controls, and stop the empty state closing the menu Phase 7 put the check and the ban on every label row at all times, which made a resting list of labels read as two columns of buttons with a filter somewhere behind them. A row now shows its own state and nothing else — a marked row its mark, an untouched row nothing — and hovering any row brings both controls up, the mark you have lit and the other one unlit beside it. So the column you read down is the filter, and the row you are pointing at is the one offering to change it. Nothing about the rails changed. The two boxes are laid out in every state and only their ink comes and goes: check 429-445, ban 453-469 on an included row, an excluded row, an untouched one, hovered or not, wide and compact. The reveal is opacity, never mounting, so it cannot move the row out from under the pointer that fired it. Hover is tracked on a plain `View` wrapping the `MenuItem` with the presses on the buttons inside it, since `MenuItem` is itself a `Pressable` (docs/hover.md); each control counts its own keyboard focus as revealed, so tabbing to one never means pressing something invisible; and `pointerEvents` follows visibility so a hidden control cannot be clicked. On native and compact there is no pointer, so both simply stand there. Everything Phase 7 settled is kept: `Ban` at 14 in a 16pt box, `foregroundExtraMuted` for unlit against `foregroundMuted` meaning *selected* eight pixels below, `spacing[2]` between the two with `hitSlop` tiling the gap, the row owning `aria-checked` while the buttons stay plain named actions, and both tooltips gated `enabledOnDesktop={isWeb}`. --- Excluding a label that empties the sidebar closed the display menu. Logged since Phase 2, narrowed in Phase 5 to the empty-state swap, owned by nobody. `SidebarLabelFilterEmptyState` was a component rendered *instead of* the list, with its own container and scroll view, and both branches were handed the same header element. Different subtrees, so React unmounted the header on the swap — and the header holds the display menu's trigger, so the popover went with its anchor. The empty state is now a body: both list modes render it where their groups would go, inside the scroll they already own and below the header they already render, and the swap can no longer reach anything above it. Cleared from that same still-open page, the way back out is the swap in reverse and it holds too. `ProjectModeList` was already the right shape — its "no projects yet" body sits below the header — but its header was conditional on `unpinnedProjects.length > 0 || hasActiveHostFilter`, which is the same bug written as a guard: keep the header when there is a filter to undo. The label filter joins that condition rather than getting a second mechanism. Both empty states move into `sidebar/empty-states.tsx` so the two list modes can render either without importing each other, which also leaves the card's geometry defined once instead of once per body. Still conditional, and left alone: a sidebar with no projects and no filter has no header at all, so clearing the last host filter on an empty sidebar closes the menu the same way. That one is the onboarding empty state, where a section heading over "Add a project" would be a heading over nothing, and no menu is reachable in the state it lands in. The e2e gets the step that would have caught this: exclude into the empty state, assert the page you pressed on is still up, clear from it, assert the same. Verified by reverting both list files to Phase 7 and watching it fail on "element(s) not found". Phase 7's rail assertions are kept as they are — offsets within the row, behind a settle poll — and joined by computed-opacity reads for the four states of the reveal. Evidence: /tmp/labels-qa-p8/, 28 shots plus INDEX.md — the resting list, a hovered row, an included row with the pointer away, and the empty state with the menu still open over it, at wide and compact in both schemes. Co-authored-by: Christoph Leiter <christoph@leiter.io> * feat(app): make the label filter include-only Phases 2, 6, 7 and 8 each tried to give exclusion a comfortable shape inside a 232pt menu row: tri-state rotation, a hover-revealed control, two permanent buttons, two hover-or-lit buttons. Every fix bought a new awkwardness, because two controls in one menu row is a lot of machinery for a filter. The label filter is now the host filter — one tap in, one tap out — and nobody has ever complained about that one. A row is a plain `MenuItem` with the colour dot leading and the engine's own check trailing. Nothing else. Which makes the alignment law trivial to satisfy, and that is the point. Deleted rather than disabled, since 6, 7 and 8 are in the branch history if exclusion ever comes back: both trailing controls, the hover-tracking `View`, the `opacity: 0` mounting, the focus/blur plumbing, the `pointerEvents` gating, both tooltips and their `enabledOnDesktop={isWeb}` gates, the lit/unlit token pair, `Ban`, and the two rails they held. `SidebarLabelFilter` collapses onto the shape of `hostFilters` sitting three fields above it in the same store: `labels: string[]` plus `match`, one `toggleLabelFilter`, one `clearLabelFilter`. The exclude arm of `filterWorkspacesByLabels` goes with it, and `filter.include` / `includeLabel` / `exclude` / `excludeLabel` leave all nine locales. Persisted version 4 with no migration — the record shape never shipped, and `createValidatedPersistStorage` drops state that fails the current schema before `migrate` ever runs. Two things this leaves unused, both deleted: - `MenuItem`'s `selected: boolean | "mixed"`, added in Phase 5 so a tri-state row could announce itself. The filter row was the only caller, so the union collapses back to `boolean` and the two `selected === true` guards that existed for `"mixed"` go back to plain truthiness. - The `docs/menus.md` paragraphs from Phases 7 and 8 on hover-revealing a pressable trailing control inside a menu row. No caller does that any more, so the doc was describing a pattern the codebase no longer has. Kept: `SIDEBAR_UNLABELLED_LABEL_KEY`, because `Unlabelled` is still a row and now includes like any other; `Match any` / `Match all`, because multi-select include still means two different things. Phase 8's empty-state fix is untouched and still holds — `hasActiveSidebarLabelFilter` is what the header's survival condition reads, and it answers the same question against the new shape. Evidence: /tmp/labels-qa-p9/, 12 shots plus INDEX.md — resting, two selected, and the empty state with the menu still open over it, at wide and compact in both schemes. Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): give label-grouped rows their project icons, and label groups a tag Grouping the sidebar by label rendered every workspace row with its placeholder initial. The same workspace under status or project grouping showed its real project icon. The components were reused; the data feeding them was not. One component served both grouping modes and threaded the icon map through correctly. Fourteen lines above it, a second `useProjectIcons` call was gated on `groupMode === "status"`, written when status was the only mode that put icons on rows. Phase 2 extended the render branch to `status || label` and left the gate alone. Nothing forces a render branch and the data it renders to agree, and these two were far enough apart to drift in silence. Reuse buys you one implementation of the drawing; it buys you nothing about who decides what to fetch. So the fix is the shape, not the line. There is now one `useProjectIcons` call for every mode, and its targets come from `buildSidebarProjection` — the same function that produced the rows, from the same `projects` list. A mode can only render a row for a project the projection already knows about, so the map cannot disagree with the screen. The gate is gone rather than extended: extending it would leave the identical trap for the next grouping mode. `useProjectIcons` dedupes by `serverId:projectId` and caches through `useQueries`, so the gate was a premature optimization that bought a bug. Pinned by `sidebar-projection.test.ts`: for each of the three modes, every project view key the projection will render — pinned rows, grouped rows, project headers and the rows under them — has an icon target. Red on the old gate: restoring `groupMode === "status" ? … : []` in its new home fails project and label grouping with `['project', 'other-project']` uncovered, and status passes, which is exactly the bug's signature. The sibling sweep over everything `SidebarStatusModeWrapper` is handed found one more of the same shape, correct today: the projection chose its shortcut sections with `status || label`, so a fourth mode would have silently walked the project rows. Both the groups and the sections now come from one exhaustive `switch` on the mode, which makes the next mode a compile error rather than an empty list. `workspaceEntriesByKey` is already written the safe way round (`!== "project"`), and the rest — host badges, pinning support, the empty-filter state — never read the mode at all. Two names moved with the shape: `SidebarStatusModeWrapper` is `SidebarGroupedModeList`, and its branch is `groupMode !== "project"`, so a new mode lands in the grouped list instead of the project list's `else`. Also: label group headers draw lucide `Tag` instead of `CircleDot`, in the label's colour, muted for `Unlabelled` — the glyph the Labels menu and the workspace menu already use for this feature. It keeps `StatusGroupIcon`'s 14 with no optical nudge, and that is measured rather than assumed: in the header's leading slot both ink a 14x14 box at the same offset, and the tag lays down 76 ink pixels to the circle's 84, so reaching the corners of its box costs it no weight beside the status glyphs. QA: /tmp/labels-qa-p10/ — wide and compact, light and dark, label grouping and the same workspaces under status grouping, plus the hover chevron swap, the glyph zooms, and a before/after pair taken with the fix reverted to the bug's shape. Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): align label chip typography Co-authored-by: Christoph Leiter <christoph@leiter.io> * docs: format architecture module table Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): narrow workspace labels workflow Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): mirror bottom sheet test exports Co-authored-by: Christoph Leiter <christoph@leiter.io> * test(desktop): assert project browse by destination Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): retain empty projects without label filters Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): preserve status grouping test contract Co-authored-by: Christoph Leiter <christoph@leiter.io> * fix(app): retain filters after label load failures Co-authored-by: Christoph Leiter <christoph@leiter.io> --------- Co-authored-by: Christoph Leiter <christoph@leiter.io>
2613 lines
100 KiB
TypeScript
2613 lines
100 KiB
TypeScript
import { en, type TranslationResources } from "./en";
|
|
import { pluginSettings } from "./plugin-settings";
|
|
|
|
export const es: TranslationResources = {
|
|
common: {
|
|
back: "Atrás",
|
|
loading: "Cargando...",
|
|
actions: {
|
|
back: "Atrás",
|
|
cancel: "Cancelar",
|
|
close: "Cerca",
|
|
copy: "Copiar",
|
|
dismiss: "Despedir",
|
|
retry: "Rever",
|
|
search: "Buscar",
|
|
select: "Seleccionar",
|
|
},
|
|
placeholders: {
|
|
search: "Buscar...",
|
|
},
|
|
empty: {
|
|
noResults: "No se encontraron resultados",
|
|
noOptionsMatchSearch: "Ninguna opción coincide con su búsqueda.",
|
|
},
|
|
states: {
|
|
loading: "Cargando...",
|
|
starting: "A partir de...",
|
|
copied: "Copiado",
|
|
copiedLabel: "Copiado{{label}}",
|
|
downloadComplete: "Descarga completa",
|
|
downloadFailed: "Descarga fallida",
|
|
},
|
|
errors: {
|
|
error: "Error",
|
|
unableToSave: "No se puede guardar",
|
|
nameRequired: "El nombre es obligatorio",
|
|
daemonUnavailable: "Daemonno disponible",
|
|
daemonClientUnavailable: "ClienteDaemonno disponible",
|
|
daemonClientDisconnected: "El clienteDaemonestá desconectado",
|
|
noFileFound: "No se encontró ningún archivo para{{token}}",
|
|
unexpectedDictationError: "Se produjo un error inesperado al manejar el dictado.",
|
|
},
|
|
connectionStatus: {
|
|
online: "En línea",
|
|
connecting: "Conectando",
|
|
offline: "Desconectado",
|
|
error: "Error",
|
|
idle: "Inactivo",
|
|
},
|
|
},
|
|
shell: {
|
|
menu: {
|
|
toggleSidebar: "Alternar barra lateral",
|
|
open: "abrir menú",
|
|
close: "Cerrar menú",
|
|
},
|
|
commandCenter: {
|
|
placeholder: "Buscar comandos, archivos, espacios de trabajo y agentes...",
|
|
filePlaceholder: "Buscar archivos...",
|
|
searchingFiles: "Buscando archivos...",
|
|
noMatches: "No hay coincidencias",
|
|
actions: "Comportamiento",
|
|
files: "Archivos",
|
|
workspaces: "Espacios de trabajo",
|
|
agents: "Agentes",
|
|
newAgent: "Nuevo agente",
|
|
addProject: "Agregar proyecto",
|
|
home: "Hogar",
|
|
groupByProject: "Agrupar por proyecto",
|
|
groupByStatus: "Agrupar por estado",
|
|
modelGroupLabel: "Modelo",
|
|
modelSearchKeywords: "cambiar modelo modificar modelo establecer modelo seleccionar modelo",
|
|
thinkingGroupLabel: "Razonamiento",
|
|
thinkingSearchKeywords: "razonamiento esfuerzo pensamiento",
|
|
modeGroupLabel: "Modo",
|
|
modeSearchKeywords: "acceso permiso aprobación modo",
|
|
planModeGroupLabel: "Modo plan",
|
|
planModeSearchKeywords: "plan planificación modo plan",
|
|
fastModeGroupLabel: "Rápido",
|
|
fastModeSearchKeywords: "rápido velocidad baja latencia",
|
|
settingOn: "Activado",
|
|
settingOff: "Desactivado",
|
|
},
|
|
},
|
|
composer: {
|
|
placeholders: {
|
|
desktop: "Envíe un mensaje al agente, etiquete@fileso use/commandsy/skills",
|
|
mobile: "Mensaje,@files,/commands",
|
|
fallback: "Mensaje...",
|
|
terminal: "Prompt",
|
|
},
|
|
input: {
|
|
accessibilityLabel: "Agente de mensajes...",
|
|
terminalAccessibilityLabel: "Terminal prompt",
|
|
focusHint: "{{shortcut}}para enfocar",
|
|
addAttachment: "Agregar archivo adjunto",
|
|
interruptAgent: "agente de interrupción",
|
|
queueMessage: "mensaje de cola",
|
|
sendAndInterrupt: "Enviar e interrumpir",
|
|
sendAndSteer: "Enviar y orientar",
|
|
sendMessage: "enviar mensaje",
|
|
queue: "Cola",
|
|
send: "Enviar",
|
|
},
|
|
cancel: {
|
|
cancelingAgent: "Agente de cancelación",
|
|
stopAgent: "detener agente",
|
|
interrupt: "Interrumpir",
|
|
},
|
|
voice: {
|
|
enableVoiceMode: "Habilitar el modo de voz",
|
|
voiceMode: "Modo de voz",
|
|
unmuteVoiceMode: "Activar el modo de voz",
|
|
muteVoiceMode: "Modo de voz silenciosa",
|
|
stopDictation: "detener el dictado",
|
|
startDictation: "Iniciar dictado",
|
|
unmuteVoice: "Activar voz",
|
|
muteVoice: "voz muda",
|
|
dictation: "Dictado",
|
|
interruptBeforeVoice: "Interrumpir al agente antes de iniciar el modo de voz.",
|
|
},
|
|
attachments: {
|
|
addImage: "Agregar imagen",
|
|
pasteImage: "Pegar imagen",
|
|
addFile: "Upload file",
|
|
addIssueOrPr: "Agregar problema oPR",
|
|
addIssueOrPr_mr: "Agregar problema o MR",
|
|
dropImagesHere: "Suelta imágenes aquí",
|
|
dropFilesHere: "Drop files here",
|
|
editQueuedMessage: "Editar mensaje en cola",
|
|
sendQueuedMessageNow: "Enviar mensaje en cola ahora",
|
|
openImage: "Abrir imagen adjunta",
|
|
removeImage: "Quitar imagen adjunta",
|
|
removeFile: "Remove file attachment",
|
|
openGithub: "Abrir {{kind}} {{number}}",
|
|
removeGithub: "Quitar {{kind}} {{number}}",
|
|
element: "Elemento",
|
|
openBrowserElement: "Abrir archivo adjunto de elemento del navegador",
|
|
removeBrowserElement: "Eliminar el archivo adjunto del elemento del navegador",
|
|
openReview: "Abrir archivo adjunto de reseña",
|
|
removeReview: "Eliminar archivo adjunto de reseña",
|
|
},
|
|
errors: {
|
|
failedToSend: "No se pudo enviar el mensaje",
|
|
failedToCreateAgent: "No se pudo crear el agente",
|
|
noHostSelected: "Ningún anfitrión seleccionado",
|
|
initialPromptRequired: "Se requiere aviso inicial",
|
|
alreadyLoading: "Ya cargando",
|
|
uploadFailed: "Failed to upload file",
|
|
noClipboardImage: "No hay ninguna imagen en el portapapeles",
|
|
pasteImageFailed: "No se pudo pegar la imagen",
|
|
fileTooLarge: "{{fileName}} is too large (max {{size}})",
|
|
},
|
|
clientCommands: {
|
|
archiveAgent: "Archivar el agente actual",
|
|
freshDraft: "Archive este agente y comience un nuevo borrador",
|
|
},
|
|
github: {
|
|
searching: "Búsqueda...",
|
|
noResults: "No se encontraron resultados.",
|
|
searchPlaceholder: "Problemas de búsqueda y relaciones públicas...",
|
|
searchPlaceholder_mr: "Problemas de búsqueda y MRs...",
|
|
title: "Adjuntar problema oPR",
|
|
title_mr: "Adjuntar problema o MR",
|
|
},
|
|
},
|
|
agentControls: {
|
|
provider: {
|
|
fallback: "Proveedor",
|
|
select: "Seleccionar proveedor de agente",
|
|
},
|
|
thinking: {
|
|
title: "Pensamiento",
|
|
unknown: "Desconocido",
|
|
extraHigh: "extra alto",
|
|
select: "Seleccione la opción de pensamiento",
|
|
selectWithValue: "Seleccione la opción de pensamiento ({{value}})",
|
|
},
|
|
model: {
|
|
unknown: "Modelo desconocido",
|
|
},
|
|
features: {
|
|
title: "Características",
|
|
open: "Funciones de agente abierto",
|
|
on: "En",
|
|
off: "Apagado",
|
|
},
|
|
mode: {
|
|
title: "Modo",
|
|
searchPlaceholder: "Modos de búsqueda...",
|
|
selectWithValue: "Seleccione el modo de agente ({{value}})",
|
|
},
|
|
hints: {
|
|
thinking: "Modo de pensamiento",
|
|
model: "Cambiar modelo",
|
|
mode: "Cambiar modo",
|
|
},
|
|
},
|
|
agentStream: {
|
|
empty: "Comience a chatear con este agente...",
|
|
scrollToBottom: "Desplazarse hacia abajo",
|
|
historyLoadFailed: "No se pudo cargar el historial del agente",
|
|
permission: {
|
|
plan: "Plan",
|
|
required: "Permiso requerido",
|
|
deny: "Denegar",
|
|
accept: "Aceptar",
|
|
implement: "Implementar",
|
|
question: "¿Cómo le gustaría proceder?",
|
|
proposedPlan: "Plan propuesto",
|
|
},
|
|
},
|
|
agentPanel: {
|
|
states: {
|
|
notFound: "Agentno encontrado",
|
|
failedToLoad: "No se pudo cargar el agente",
|
|
reconnecting: "Reconectando",
|
|
timelineSyncFailed: "No se pudo actualizar el historial del agente.",
|
|
timelineSyncRetrying: "Reintentando…",
|
|
archivingTitle: "Agente de archivo...",
|
|
archivingSubtitle: "Espere mientras archivamos este agente.",
|
|
},
|
|
unavailable: {
|
|
selectedHost: "Anfitrión seleccionado",
|
|
unknownHost:
|
|
"No se puede abrir este agente porque{{serverLabel}}no está configurado en este dispositivo.",
|
|
addHost:
|
|
"Agregue el host en Configuración o abra un agente en un servidor configurado para continuar.",
|
|
preparingSession: "Preparando sesión{{serverLabel}}...",
|
|
connecting: "Conectando a{{serverLabel}}...",
|
|
showSoon: "Le mostraremos a este agente en un momento.",
|
|
showWhenOnline: "Le mostraremos a este agente una vez que el anfitrión esté en línea.",
|
|
reconnectingTo: "Reconectándose a{{serverLabel}}...",
|
|
showAgainWhenReachable:
|
|
"Le mostraremos a este agente nuevamente tan pronto como podamos comunicarnos con el anfitrión.",
|
|
},
|
|
archived: {
|
|
callout: "Este agente está archivado.",
|
|
unarchive: "Desarchivar",
|
|
},
|
|
},
|
|
sessions: {
|
|
title: "Historial",
|
|
empty: "Aún no hay sesiones",
|
|
noMatches: "No hay sesiones que coincidan",
|
|
tooManyMatches: "Demasiadas coincidencias: acota la búsqueda",
|
|
hostLoadFailed: "{{host}}: No se pudo cargar el historial",
|
|
searchPlaceholder: "Buscar en el historial",
|
|
actions: {
|
|
loadMore: "Cargar más",
|
|
clearSearch: "Borrar búsqueda",
|
|
},
|
|
},
|
|
agentList: {
|
|
fallbackTitle: "Nueva sesión",
|
|
dateSections: {
|
|
recent: "Reciente",
|
|
today: "Hoy",
|
|
yesterday: "Ayer",
|
|
thisWeek: "Esta semana",
|
|
thisMonth: "este mes",
|
|
older: "Más viejo",
|
|
},
|
|
status: {
|
|
initializing: "A partir de",
|
|
idle: "Inactivo",
|
|
running: "Correr",
|
|
error: "Error",
|
|
closed: "Cerrado",
|
|
},
|
|
badges: {
|
|
archived: "Archivado",
|
|
pending: "{{count}}pendiente",
|
|
attention: "Atención",
|
|
},
|
|
archiveSheet: {
|
|
hostOffline: "Hostfuera de línea",
|
|
runningAgent: "Este agente todavía está ejecutándose. Archivarlo detendrá al agente.",
|
|
archive: "Archivo",
|
|
},
|
|
},
|
|
message: {
|
|
diagram: {
|
|
diagram: "Diagrama",
|
|
zoomIn: "Acercar",
|
|
zoomOut: "Alejar",
|
|
resetZoom: "Restablecer vista",
|
|
viewSource: "Ver fuente",
|
|
viewDiagram: "Ver diagrama",
|
|
},
|
|
actions: {
|
|
copyCode: "Copiar código",
|
|
copyTurn: "Copiar turno",
|
|
copyMessage: "Copiar mensaje",
|
|
forkMenu: "Bifurcar mensaje",
|
|
forkInNewTab: "Bifurcar en una pestaña nueva",
|
|
forkInNewWorkspace: "Bifurcar en un espacio de trabajo nuevo",
|
|
forkUnavailable: "Actualiza el host para usar esto.",
|
|
forkMissingWorkspace: "Este agente no está en un espacio de trabajo.",
|
|
forkFailed: "No se pudo bifurcar el chat",
|
|
openFile: "Abrir archivo",
|
|
copied: "Copiado",
|
|
},
|
|
attachments: {
|
|
dismissImage: "Descartar imagen",
|
|
closeImage: "Cerrar imagen",
|
|
imageLoadFailed: "No se pudo cargar la imagen",
|
|
imageUnavailable: "Imagen no disponible",
|
|
imagePreviewUnavailable: "Vista previa de la imagen no disponible.",
|
|
imagePreviewLoadFailed: "No se puede cargar la vista previa de la imagen.",
|
|
review: "Revisión",
|
|
commentsOne: "1 comentario",
|
|
commentsMany: "{{count}} comentarios",
|
|
textAttachment: "Adjunto de texto",
|
|
text: "Texto",
|
|
file: "Archivo",
|
|
},
|
|
speak: {
|
|
header: "Habló",
|
|
},
|
|
activity: {
|
|
details: "Detalles",
|
|
},
|
|
dictation: {
|
|
start: "Iniciar dictado de voz",
|
|
cancel: "Cancelar dictado",
|
|
retry: "Reintentar el dictado",
|
|
insert: "Insertar transcripción",
|
|
insertAndSend: "Insertar transcripción y enviar",
|
|
failed: "Fallo en el dictado:{{error}}",
|
|
failedRetry: "El dictado falló. Toca reintentar.",
|
|
},
|
|
question: {
|
|
submit: "Entregar",
|
|
next: "Siguiente",
|
|
answerPlaceholder: "Escribe tu respuesta...",
|
|
otherPlaceholder: "Otro...",
|
|
},
|
|
todo: {
|
|
title: "Tareas",
|
|
empty: "Aún no hay tareas.",
|
|
tasksProgress: "{{completed}}/{{total}} tareas",
|
|
activity: {
|
|
created: "Se crearon {{count}} tareas",
|
|
added: "Añadida",
|
|
started: "Iniciada",
|
|
completed: "Completada",
|
|
reopened: "Reabierta",
|
|
},
|
|
},
|
|
compaction: {
|
|
loading: "Compactando...",
|
|
auto: "Contexto compactado automáticamente",
|
|
manual: "Contexto compactado manualmente",
|
|
withTokens: "Contexto compactado (tokens{{tokens}}K)",
|
|
completed: "Contexto compactado",
|
|
},
|
|
},
|
|
importSession: {
|
|
title: "Importar sesión",
|
|
filters: {
|
|
all: "Todo",
|
|
},
|
|
status: {
|
|
connectHost: "Conéctese a un host para importar sesiones",
|
|
updateHost: "Actualice el host para importar sesiones.",
|
|
noProviders: "No hay proveedores importables habilitados.",
|
|
loading: "Cargando sesiones recientes...",
|
|
failedAll: "No se pudieron cargar las sesiones recientes.",
|
|
failedProviders: "No se pudieron cargar sesiones para{{providers}}.",
|
|
failedImport: "No se pudo importar la sesión seleccionada.",
|
|
},
|
|
actions: {
|
|
refresh: "Actualizar sesiones",
|
|
},
|
|
preview: {
|
|
untitledSession: "Sesión sin título",
|
|
noPrompt: "Sin vista previa inmediata",
|
|
},
|
|
empty: {
|
|
noRecent: "No hay sesiones recientes para importar.",
|
|
alreadyImported: "Todas las sesiones recientes ya están importadas.",
|
|
noProviderSessions: "No se encontraron sesiones{{provider}}.",
|
|
},
|
|
row: {
|
|
importing: "Importador...",
|
|
},
|
|
},
|
|
workspace: {
|
|
route: {
|
|
loading: "Cargando espacio de trabajo",
|
|
connecting: "Conectando",
|
|
hostOffline: "{{hostName}}está desconectado",
|
|
cannotReachHost: "No se puede alcanzar{{hostName}}",
|
|
hostStatus: "Estado deHost:{{status}}",
|
|
needsHostUpgrade: "Actualiza tu host para restaurar este espacio de trabajo",
|
|
manageHost: "Administrar host",
|
|
recovery: {
|
|
archivedTitle: "Espacio de trabajo archivado",
|
|
restoreDescription:
|
|
"{{workspaceName}} se archivó y se eliminó su worktree. Restaura la rama {{branch}} para volver a abrirlo.",
|
|
unarchiveDescription:
|
|
"{{workspaceName}} está archivado. Desarchívalo para volver a abrirlo.",
|
|
restoreAction: "Restaurar",
|
|
unarchiveAction: "Desarchivar",
|
|
restoringTitle: "Restaurando espacio de trabajo",
|
|
restoringAction: "Restaurando...",
|
|
unavailableTitle: "Espacio de trabajo no disponible",
|
|
checkFailedTitle: "No se pudo comprobar el espacio de trabajo",
|
|
},
|
|
},
|
|
hoverCard: {
|
|
scriptsAccessibility: "GuionesWorkspace",
|
|
copyPath: "Copiar ruta",
|
|
copyBranchName: "Copiar nombre de rama",
|
|
copied: "Copiado",
|
|
},
|
|
fileActions: {
|
|
openFile: "Abrir archivo",
|
|
copyPath: "Copiar ruta",
|
|
copyRelativePath: "Copiar ruta relativa",
|
|
revealIn: "Mostrar en {{target}}",
|
|
download: "Descargar",
|
|
addToChat: "Añadir al chat",
|
|
moreActions: "Más acciones",
|
|
newFile: "Nuevo archivo",
|
|
newFolder: "Nueva carpeta",
|
|
collapseFolder: "Contraer carpeta",
|
|
rename: "Renombrar",
|
|
duplicate: "Duplicar",
|
|
revert: "Descartar cambios",
|
|
delete: "Eliminar",
|
|
confirmDelete: {
|
|
fileTitle: "¿Eliminar archivo?",
|
|
folderTitle: "¿Eliminar carpeta?",
|
|
message: '"{{name}}" se eliminará permanentemente.',
|
|
confirm: "Eliminar",
|
|
cancel: "Cancelar",
|
|
},
|
|
confirmRevert: {
|
|
title: "¿Descartar cambios?",
|
|
message: 'Los cambios en "{{name}}" se descartarán permanentemente.',
|
|
confirm: "Descartar",
|
|
cancel: "Cancelar",
|
|
failed: "No se pudieron descartar los cambios",
|
|
},
|
|
},
|
|
fileExplorer: {
|
|
sort: {
|
|
name: "Nombre",
|
|
modified: "Modificado",
|
|
size: "Tamaño",
|
|
},
|
|
context: {
|
|
size: "Tamaño",
|
|
modified: "Modificado",
|
|
},
|
|
actions: {
|
|
back: "Atrás",
|
|
retry: "Rever",
|
|
refresh: "Actualizar archivos",
|
|
refreshing: "Actualizar archivos",
|
|
hideHiddenFiles: "Ocultar archivos ocultos",
|
|
showHiddenFiles: "Mostrar archivos ocultos",
|
|
},
|
|
empty: {
|
|
noFiles: "Sin archivos",
|
|
noVisibleFiles: "No hay archivos visibles",
|
|
},
|
|
states: {
|
|
unavailable: "Workspaceno está disponible",
|
|
loading: "Cargando archivos...",
|
|
},
|
|
errors: {
|
|
failedToListDirectory: "No se pudo listar el directorio",
|
|
createFailed: "No se pudo crear la entrada",
|
|
renameFailed: "No se pudo renombrar la entrada",
|
|
duplicateFailed: "No se pudo duplicar la entrada",
|
|
revealFailed: "No se pudo mostrar la entrada",
|
|
deleteFailed: "No se pudo eliminar la entrada",
|
|
},
|
|
draft: {
|
|
filePlaceholder: "Nombre del archivo",
|
|
folderPlaceholder: "Nombre de la carpeta",
|
|
},
|
|
},
|
|
setup: {
|
|
descriptor: {
|
|
label: "Configuración",
|
|
completed: "Configuración completada",
|
|
failed: "Error de configuración",
|
|
workspace: "Configuración deWorkspace",
|
|
},
|
|
status: {
|
|
running: "Correr",
|
|
completed: "Terminado",
|
|
failed: "Fallido",
|
|
waiting: "Esperando el resultado de la configuración",
|
|
},
|
|
waiting: "Configurando el espacio de trabajo...",
|
|
empty: {
|
|
noCommands: "No se ejecutó ningún comando de configuración para este espacio de trabajo.",
|
|
},
|
|
accessibility: {
|
|
noCommands: "No se ejecutó ningún comando de configuración para este espacio de trabajo",
|
|
log: "Registro de configuración deWorkspace",
|
|
},
|
|
log: {
|
|
noOutput: "Sin salida",
|
|
},
|
|
},
|
|
browser: {
|
|
unavailable: {
|
|
title: "El navegador es solo para escritorio",
|
|
subtitle: "Abra este espacio de trabajo en Electron para usar el navegador integrado.",
|
|
},
|
|
session: "Sesión de navegador{{browserId}}",
|
|
controls: {
|
|
back: "Atrás",
|
|
forward: "Adelante",
|
|
stopLoading: "dejar de cargar",
|
|
refresh: "Refrescar",
|
|
browserUrl: "NavegadorURL",
|
|
enterUrl: "IngreseURL",
|
|
openDevTools: "Abrir herramientas de desarrollo del navegador",
|
|
cancelSelector: "Cancelar selector de elementos",
|
|
annotateElement: "Anotar elemento",
|
|
screenshotElement: "Capturar elemento",
|
|
screenshotCopied: "Captura copiada al portapapeles",
|
|
elementCopied: "Elemento copiado al portapapeles",
|
|
screenshotFailed: "No se pudo copiar la captura",
|
|
selectorLoading: "Espera a que la página termine de cargar",
|
|
selectorFailed: "No se pudo iniciar el selector de elementos",
|
|
},
|
|
annotate: {
|
|
title: "Anotar elemento",
|
|
placeholder: "Mensaje al agente sobre este elemento…",
|
|
submit: "Adjuntar",
|
|
cancel: "Cancelar",
|
|
},
|
|
devices: {
|
|
label: "Tamaño del dispositivo",
|
|
responsive: "Adaptable",
|
|
},
|
|
errors: {
|
|
failedToLoad: "No se pudo cargar la página",
|
|
invalidUrl: "Navegador no válidoURL",
|
|
unsupportedProtocol: "Navegador bloqueado no compatibleURL:{{protocol}}",
|
|
},
|
|
},
|
|
terminal: {
|
|
hostDisconnected: "Hostno está conectado",
|
|
updateHost: "Actualiza el host para usar el renderizador de terminal nativo.",
|
|
unableToSubscribe: "No se puede suscribir al terminal",
|
|
},
|
|
tabs: {
|
|
loading: "Cargando...",
|
|
modified: "Cambios sin guardar",
|
|
loadingAgentTitle: "Título del agente de carga",
|
|
emptyPane: "No hay pestañas en este panel.",
|
|
fallback: {
|
|
newAgent: "Nuevo agente",
|
|
setup: "Configuración",
|
|
workspaceSetup: "Configuración deWorkspace",
|
|
terminal: "Terminal",
|
|
browser: "Navegador",
|
|
agent: "Agent",
|
|
workspace: "Workspace",
|
|
},
|
|
switcher: {
|
|
trigger: "Cambiar pestañas ({{count}}abierto)",
|
|
title: "Cambiar pestaña",
|
|
searchPlaceholder: "Pestañas de búsqueda",
|
|
},
|
|
menu: {
|
|
openFor: "Menú abierto para{{label}}",
|
|
copyResumeCommand: "Copiar comando de reanudación",
|
|
copyAgentId: "Copiar ID del agente",
|
|
copyTerminalId: "Copiar ID del terminal",
|
|
copyFilePath: "Copy file path",
|
|
rename: "Rebautizar",
|
|
closeAbove: "Cerrar pestañas arriba",
|
|
closeBelow: "Cerrar pestañas a continuación",
|
|
closeLeft: "Cerca de la izquierda",
|
|
closeRight: "Cerca de la derecha",
|
|
closeOthers: "Cerrar otras pestañas",
|
|
reloadAgent: "Recargar agente",
|
|
reloadAgentTooltip:
|
|
"Vuelva a cargar el agente para actualizar habilidades, MCP o estado de inicio de sesión.",
|
|
close: "Cerca",
|
|
renameTerminal: "Cambiar nombre de terminal",
|
|
renameAgent: "Cambiar nombre del agente",
|
|
},
|
|
actions: {
|
|
newTab: "Nueva pestaña",
|
|
newAgent: "Nuevo agente",
|
|
newTerminal: "Nueva terminal",
|
|
preparingTerminal: "Preparando la pestaña del terminal",
|
|
preparingTerminalTooltip: "Preparando terminal...",
|
|
newBrowser: "Nuevo navegador",
|
|
maximizePane: "Maximizar panel",
|
|
restorePane: "Restaurar panel",
|
|
exitFocusMode: "Salir del modo de concentración",
|
|
splitRight: "Panel dividido a la derecha",
|
|
splitDown: "Dividir panel hacia abajo",
|
|
changes: "Cambios",
|
|
files: "Archivos",
|
|
pullRequest: "Solicitud de extracción",
|
|
terminalProfilesMenu: "Terminal profiles",
|
|
editTerminalProfiles: "Edit profiles…",
|
|
},
|
|
explorer: {
|
|
open: "Explorador abierto",
|
|
close: "Cerrar explorador",
|
|
toggle: "Alternar explorador",
|
|
changes: "Cambios",
|
|
files: "Archivos",
|
|
},
|
|
toasts: {
|
|
copyFailed: "Copia fallida",
|
|
agentIdCopiedLabel: "AgentID",
|
|
terminalIdCopiedLabel: "ID del terminal",
|
|
resumeCommandCopiedLabel: "reanudar el comando",
|
|
filePathCopiedLabel: "File path",
|
|
resumeIdUnavailable: "ReanudarIDno disponible",
|
|
resumeCommandUnavailable: "Comando de reanudación no disponible",
|
|
reloadingAgent: "Agente de recarga...",
|
|
reloadedAgent: "Agente recargado",
|
|
failedToReloadAgent: "No se pudo recargar el agente",
|
|
failedToCloseAgent: "No se pudo cerrar el agente",
|
|
},
|
|
confirmations: {
|
|
unsavedTitle: "Cambios sin guardar",
|
|
unsavedMessage:
|
|
"Esta pestaña tiene cambios sin guardar. Al cerrarla se descartará el borrador.",
|
|
closeWithoutSaving: "Cerrar sin guardar",
|
|
closePaneTitle: "¿Cerrar panel?",
|
|
bulkUnsaved:
|
|
"{{count}} pestaña(s) tienen cambios sin guardar. Al cerrar se descartarán esos borradores.",
|
|
close: "Cerca",
|
|
cancel: "Cancelar",
|
|
archive: "Archivo",
|
|
closeTerminalTitle: "¿Cerrar terminal?",
|
|
closeTerminalMessage:
|
|
"Cualquier proceso en ejecución en esta terminal se detendrá inmediatamente.",
|
|
archiveRunningAgentTitle: "¿Agente de ejecución de archivos?",
|
|
archiveRunningAgentMessage:
|
|
"Este agente todavía está ejecutándose. Archivarlo detendrá al agente y cerrará la pestaña.",
|
|
closeTabsLeftTitle: "¿Cerrar pestañas a la izquierda?",
|
|
closeTabsRightTitle: "¿Cerrar pestañas a la derecha?",
|
|
closeOtherTabsTitle: "¿Cerrar otras pestañas?",
|
|
bulk: {
|
|
all: "Esto archivará los agentes{{agents}}, cerrará los terminales{{terminals}}y cerrará las pestañas{{tabs}}. Cualquier proceso en ejecución en una terminal cerrada se detendrá inmediatamente.",
|
|
agentsAndTerminals:
|
|
"Esto archivará los agentes{{agents}}y cerrará los terminales{{terminals}}. Cualquier proceso en ejecución en una terminal cerrada se detendrá inmediatamente.",
|
|
terminalsAndTabs:
|
|
"Esto cerrará los terminales{{terminals}}y cerrará las pestañas{{tabs}}. Cualquier proceso en ejecución en una terminal cerrada se detendrá inmediatamente.",
|
|
agentsAndTabs: "Esto archivará los agentes{{agents}}y cerrará las pestañas{{tabs}}.",
|
|
terminals:
|
|
"Esto cerrará los terminales{{terminals}}. Cualquier proceso en ejecución en una terminal cerrada se detendrá inmediatamente.",
|
|
tabs: "Esto cerrará las pestañas{{tabs}}.",
|
|
agents: "Esto archivará los agentes{{agents}}.",
|
|
},
|
|
},
|
|
},
|
|
header: {
|
|
actions: {
|
|
workspaceActions: "AccionesWorkspace",
|
|
newAgent: "Nuevo agente",
|
|
newTerminal: "Nueva terminal",
|
|
newBrowser: "Nueva pestaña del navegador",
|
|
importSession: "Importar sesión",
|
|
copyPath: "Copiar ruta del espacio de trabajo",
|
|
copyBranchName: "Copiar nombre de sucursal",
|
|
showSetup: "Mostrar configuración",
|
|
},
|
|
toasts: {
|
|
workspacePathUnavailable: "La rutaWorkspaceaún no está disponible",
|
|
branchNameUnavailable: "Nombre de la sucursal no disponible",
|
|
terminalQueued:
|
|
"Preparando el espacio de trabajo, abriendo la terminal cuando esté listo...",
|
|
workspacePathCopiedLabel: "RutaWorkspace",
|
|
branchNameCopiedLabel: "Nombre de la sucursal",
|
|
},
|
|
},
|
|
scripts: {
|
|
title: "Scripts",
|
|
actions: {
|
|
chooseUrl: "Elegir URL",
|
|
copyUrl: "Copiar URL",
|
|
openService: "Ver servicio",
|
|
restart: "Reiniciar",
|
|
run: "Correr",
|
|
stop: "Detener",
|
|
view: "Ver terminal",
|
|
},
|
|
accessibility: {
|
|
trigger: "GuionesWorkspace",
|
|
openService: "Ver servicio {{scriptName}}",
|
|
viewTerminal: "Ver terminal{{scriptName}}",
|
|
runScript: "Ejecute el script{{scriptName}}",
|
|
stopScript: "Detener{{scriptName}}",
|
|
restartScript: "Reiniciar{{scriptName}}",
|
|
copyUrl: "Copiar URL de{{scriptName}}",
|
|
chooseUrl: "Elegir URL para {{scriptName}}",
|
|
script: "Guión{{scriptName}}",
|
|
},
|
|
routes: {
|
|
public: "Proxy inverso",
|
|
paseo: "Memorable",
|
|
direct: "Directa",
|
|
},
|
|
states: {
|
|
exitCode: "salir de{{code}}",
|
|
startFailed: "No se pudo iniciar{{scriptName}}",
|
|
stopFailed: "No se pudo detener{{scriptName}}",
|
|
},
|
|
},
|
|
git: {
|
|
actions: {
|
|
moreOptions: "Más opciones",
|
|
moreActions: "Más acciones",
|
|
commit: {
|
|
label: "Comprometerse",
|
|
pending: "Comprometiéndose...",
|
|
success: "Comprometido",
|
|
},
|
|
pull: {
|
|
label: "Jalar",
|
|
pending: "Tracción...",
|
|
success: "tirado",
|
|
},
|
|
push: {
|
|
label: "Empujar",
|
|
pending: "Emprendedor...",
|
|
success: "Empujado",
|
|
},
|
|
pullAndPush: {
|
|
label: "Tirar y empujar",
|
|
pending: "Tirando y empujando...",
|
|
success: "Tirado y empujado",
|
|
},
|
|
viewPr: "VerPR",
|
|
createPr: {
|
|
label: "CrearPR",
|
|
pending: "CreandoPR...",
|
|
success: "PRcreado",
|
|
label_mr: "Crear MR",
|
|
pending_mr: "Creando MR...",
|
|
success_mr: "MR creado",
|
|
},
|
|
mergeBranch: {
|
|
label: "Fusionar localmente",
|
|
pending: "Fusionando...",
|
|
success: "Fusionado",
|
|
},
|
|
mergeFromBase: {
|
|
label: "Actualización desde{{baseRef}}",
|
|
pending: "Actualizando...",
|
|
success: "Actualizado",
|
|
},
|
|
archive: {
|
|
label: "Archivar espacio de trabajo",
|
|
pending: "Archivando...",
|
|
success: "Archivado",
|
|
},
|
|
mergePr: {
|
|
squash: "Fusionar PR (squash)",
|
|
merge: "Fusionar PR (merge)",
|
|
rebase: "Fusionar PR (rebase)",
|
|
pending: "Fusionando PR...",
|
|
success: "PR fusionado",
|
|
squash_mr: "Fusionar MR (squash)",
|
|
merge_mr: "Fusionar MR (merge)",
|
|
rebase_mr: "Fusionar MR (rebase)",
|
|
pending_mr: "Fusionando MR...",
|
|
success_mr: "MR fusionado",
|
|
},
|
|
viewPr_mr: "Ver MR",
|
|
autoMerge: {
|
|
enableSquash: "Fusión automática (squash)",
|
|
enableMerge: "Fusión automática (merge)",
|
|
enableRebase: "Fusión automática (rebase)",
|
|
enabled: "Combinación automática habilitada",
|
|
enabling: "Habilitando la fusión automática...",
|
|
disabling: "Desactivando la fusión automática...",
|
|
disabled: "Fusión automática deshabilitada",
|
|
},
|
|
unavailable: {
|
|
viewPrNoForge:
|
|
"Ver {{noun}} no está disponible en este momento porque {{brand}} no está conectado",
|
|
pullNoRemote:
|
|
"Pull no está disponible aquí porque esta rama aún no está conectada a un control remoto",
|
|
pullDirty:
|
|
"La extracción no está disponible mientras tenga cambios locales, así que confírmelos o guárdelos primero",
|
|
pullUpToDate: "La extracción no está disponible porque esta rama ya está actualizada",
|
|
pushNoRemote:
|
|
"Push no está disponible aquí porque esta rama aún no está conectada a un control remoto",
|
|
pushBehind:
|
|
"Push aún no está disponible porque hay cambios más nuevos que implementar primero",
|
|
pushNothing: "Push no está disponible porque no hay nada nuevo que enviar",
|
|
pullAndPushNoRemote:
|
|
"Tirar y empujar no está disponible aquí porque esta rama aún no está conectada a un control remoto",
|
|
pullAndPushDirty:
|
|
"Tirar y empujar no está disponible mientras tenga cambios locales, así que confírmelos o guárdelos primero",
|
|
pullAndPushNoIncoming:
|
|
"Pull and push no está disponible porque no hay cambios entrantes que traer primero",
|
|
pullAndPushInSync:
|
|
"Pull and push no está disponible porque esta rama ya está sincronizada",
|
|
pullAndPushNothingToPush:
|
|
"Pull and push no está disponible porque no hay nada nuevo que enviar después de pull",
|
|
createPrNoForge:
|
|
"Crear {{noun}} no está disponible en este momento porque {{brand}} no está conectado",
|
|
createPrNoCommits:
|
|
"CrearPRno está disponible porque esta rama aún no tiene nuevas confirmaciones",
|
|
mergeNoBase:
|
|
"La combinación no está disponible porque no pudimos determinar la rama base",
|
|
mergeDirty:
|
|
"La combinación no está disponible mientras tenga cambios locales, así que confírmelos o guárdelos primero",
|
|
mergeNothing:
|
|
"La combinación no está disponible porque esta rama aún no tiene nada nuevo que fusionar",
|
|
updateNoBase:
|
|
"La actualización no está disponible porque no pudimos determinar la rama base",
|
|
updateDirty:
|
|
"La actualización no está disponible mientras tenga cambios locales, así que confírmelos o guárdelos primero",
|
|
updateCurrent:
|
|
"La actualización no está disponible porque esta rama ya está actualizada con{{baseRef}}",
|
|
mergePrNoGithub:
|
|
"FusionarPRno está disponible en este momento porqueGitHubno está conectado",
|
|
archiveNotWorktree:
|
|
"El archivo no está disponible aquí porque este espacio de trabajo no se creó como un árbol de trabajoPaseo",
|
|
mergePrNoForge:
|
|
"Fusionar {{noun}} no está disponible en este momento porque {{brand}} no está conectado",
|
|
mergePrMissing:
|
|
"FusionarPRno está disponible porque aún no hay una solicitud de extracción",
|
|
mergePrDraft:
|
|
"FusionarPRno está disponible porque la solicitud de extracción aún es un borrador",
|
|
mergePrMerged:
|
|
"FusionarPRno está disponible porque la solicitud de extracción ya está fusionada",
|
|
mergePrClosed:
|
|
"FusionarPRno está disponible porque la solicitud de extracción está cerrada",
|
|
mergePrConflicts:
|
|
"FusionarPRno está disponible porque la solicitud de extracción tiene conflictos",
|
|
mergePrQueue:
|
|
"FusionarPRno está disponible aquí porque este repositorio utiliza una cola de fusión",
|
|
mergePrNotReady:
|
|
"Fusionar {{noun}} no está disponible hasta que {{brand}} informe que {{noun}} está listo para fusionarse",
|
|
autoMergeCannotDisable:
|
|
"La combinación automática está habilitada, pero esta cuenta no puede deshabilitarla",
|
|
},
|
|
toasts: {
|
|
failedCommit: "No se pudo comprometer",
|
|
failedPull: "No se pudo tirar",
|
|
failedPush: "No se pudo empujar",
|
|
failedPullAndPush: "No se pudo tirar y empujar",
|
|
failedCreatePr: "No se pudo crearPR",
|
|
failedMergePr: "No se pudo fusionarPR",
|
|
failedEnableAutoMerge: "No se pudo habilitar la combinación automática",
|
|
failedDisableAutoMerge: "No se pudo deshabilitar la combinación automática",
|
|
baseRefUnavailable: "Referencia base no disponible",
|
|
failedMerge: "No se pudo fusionar",
|
|
failedMergeFromBase: "No se pudo fusionar desde la base",
|
|
},
|
|
archiveWarning: {
|
|
title: '¿Archivo "{{workspaceName}}"?',
|
|
confirm: "Archivo",
|
|
cancel: "Cancelar",
|
|
uncommittedChanges: "Cambios no confirmados",
|
|
uncommittedChangesWithDiff: "Cambios no confirmados ({{diffStat}})",
|
|
addedLine: "Línea añadida{{count}}",
|
|
addedLines: "{{count}}agregó líneas",
|
|
deletedLine: "Línea eliminada de{{count}}",
|
|
deletedLines: "{{count}}líneas eliminadas",
|
|
unpushedCommit: "Confirmación no enviada de{{count}}",
|
|
unpushedCommits: "Confirmaciones no enviadas de{{count}}",
|
|
},
|
|
},
|
|
diff: {
|
|
openChangesTab: "Abrir la pestaña Cambios",
|
|
closeChangesTab: "Cerrar la pestaña Cambios",
|
|
binaryFile: "archivo binario",
|
|
tooLarge: "La diferencia es demasiado grande para mostrarse",
|
|
previewTooLargeTitle: "Este diff es demasiado grande para previsualizarlo",
|
|
previewTooLargeDescription: "Reduce la comparación para previsualizarla aquí",
|
|
unified: "Diferencia unificada",
|
|
split: "Diferencia de lado a lado",
|
|
switchToUnified: "Cambiar a diferencia unificada",
|
|
switchToSplit: "Cambiar a diferencia lado a lado",
|
|
showTreeView: "Mostrar árbol de carpetas",
|
|
hideTreeView: "Ocultar árbol de carpetas",
|
|
options: "Opciones de diferencia",
|
|
hideWhitespace: "Ocultar espacios en blanco",
|
|
showWhitespace: "Mostrar espacios en blanco",
|
|
scrollLongLines: "Desplazarse por largas filas",
|
|
wrapLongLines: "Envolver largas filas",
|
|
collapseAllFolders: "Contraer todas las carpetas",
|
|
expandAllFolders: "Expandir todas las carpetas",
|
|
collapseAllFiles: "Contraer todos los archivos",
|
|
expandAllFiles: "Expandir todos los archivos",
|
|
refreshing: "Refrescante",
|
|
refresh: "Refrescar",
|
|
refreshState: "Actualizar el estado de git y {{brand}}",
|
|
failedRefresh: "No se pudo actualizar el estado de git.",
|
|
emptyHiddenWhitespace: "No hay cambios visibles después de ocultar espacios en blanco",
|
|
emptyUncommitted: "Sin cambios no confirmados",
|
|
emptyAgainstBase: "Sin cambios frente a{{baseRef}}",
|
|
checkingRepository: "Comprobando repositorio...",
|
|
notRepository: "No es un repositorio de git",
|
|
diffMode: "modo diferencial",
|
|
uncommitted: "No comprometido",
|
|
committed: "Comprometido",
|
|
branchUnknown: "Desconocido",
|
|
base: "base",
|
|
newFile: "Nuevo",
|
|
deletedFile: "Eliminado",
|
|
modifiedFile: "Modificado",
|
|
commits: {
|
|
title: "Commits",
|
|
countLabel: "{{count}} commits del espacio de trabajo",
|
|
noneAhead: "Aún no hay commits por delante de {{baseRef}}",
|
|
fileDiffEmpty: "No hay cambios para mostrar",
|
|
fileDiffError: "Error al cargar el diff del archivo",
|
|
loading: "Cargando commits…",
|
|
loadError: "Error al cargar los commits",
|
|
empty: "Aún no hay commits",
|
|
},
|
|
},
|
|
openInEditor: {
|
|
open: "Abierto",
|
|
chooseEditor: "Elige editor",
|
|
openIn: "Abrir espacio de trabajo en{{target}}",
|
|
openFileIn: "Open {{fileName}} in {{target}}",
|
|
failedOpen: "No se pudo abrir el espacio de trabajo",
|
|
},
|
|
pr: {
|
|
actions: {
|
|
viewPullRequest: "Ver",
|
|
openOn: "Abrir en {{brand}}",
|
|
},
|
|
checksSummary: {
|
|
passedLabel: "pasó",
|
|
failedLabel: "falló",
|
|
runningLabel: "en curso",
|
|
passedAccessible: "Comprobaciones superadas",
|
|
failedAccessible: "Comprobaciones fallidas",
|
|
runningAccessible: "Comprobaciones en curso",
|
|
},
|
|
sections: {
|
|
checks: "cheques",
|
|
pipeline: "Pipeline",
|
|
reviews: "Reseñas",
|
|
},
|
|
empty: {
|
|
noJobs: "Sin trabajos",
|
|
loadingPipeline: "Cargando pipeline...",
|
|
pipelineJobsLoadFailed: "No se pudieron cargar los trabajos del pipeline",
|
|
allowedToFail: "permitido fallar",
|
|
},
|
|
approvals: "{{given}} de {{required}} aprobaciones",
|
|
accessibility: {
|
|
pullRequest: "Solicitud de extracción n.°{{number}}",
|
|
pullRequest_mr: "Solicitud de fusión !{{number}}",
|
|
},
|
|
states: {
|
|
draft: "Borrador",
|
|
merged: "Fusionado",
|
|
closed: "Cerrado",
|
|
open: "Abierto",
|
|
},
|
|
activity: {
|
|
commented: "Comentado",
|
|
approved: "Aprobado",
|
|
requestedChanges: "Cambios solicitados",
|
|
reviewed: "Revisado",
|
|
},
|
|
time: {
|
|
justNow: "En este momento",
|
|
},
|
|
thread: {
|
|
discussion: "Hilo de discusión",
|
|
},
|
|
errors: {
|
|
statusLoadFailed: "No se puede cargar el estado de la solicitud de extracción",
|
|
activityLoadFailed: "No se puede cargar la actividad de solicitud de extracción",
|
|
},
|
|
},
|
|
forgeSetup: {
|
|
installCli: "Instala la CLI de {{cli}} para usar las funciones de {{brand}}.",
|
|
signIn: "Ejecuta {{command}} para usar las funciones de {{brand}}.",
|
|
generic: "Configura {{brand}} en este host para usar sus funciones.",
|
|
},
|
|
},
|
|
},
|
|
workspaceLabels: {
|
|
title: "Etiquetas",
|
|
unlabelled: "Sin etiqueta",
|
|
create: "Crear etiqueta",
|
|
createConfirm: "Crear",
|
|
creating: "Creando…",
|
|
name: "Nombre de la etiqueta",
|
|
updateHostUse: "Actualiza este host para usar etiquetas.",
|
|
errors: {
|
|
update: "No se pudo actualizar la etiqueta",
|
|
load: "No se pudieron cargar las etiquetas",
|
|
},
|
|
colors: {
|
|
violet: "Violeta",
|
|
sky: "Celeste",
|
|
emerald: "Esmeralda",
|
|
orange: "Naranja",
|
|
pink: "Rosa",
|
|
indigo: "Índigo",
|
|
teal: "Verde azulado",
|
|
red: "Rojo",
|
|
amber: "Ámbar",
|
|
blue: "Azul",
|
|
},
|
|
filter: {
|
|
clear: "Borrar filtro",
|
|
noMatchesTitle: "Ningún espacio de trabajo coincide",
|
|
noMatchesDescription: "Cambia o borra el filtro de etiquetas para ver espacios de trabajo.",
|
|
},
|
|
manage: {
|
|
open: "Gestionar etiquetas…",
|
|
title: "Gestionar etiquetas",
|
|
search: "Buscar etiquetas",
|
|
empty: "No hay etiquetas en este host.",
|
|
edit: "Editar etiqueta",
|
|
editLabel: "Editar {{name}}",
|
|
name: "Nombre",
|
|
color: "Color",
|
|
save: "Guardar",
|
|
delete: "Eliminar",
|
|
deleteTitle: "¿Eliminar {{name}}?",
|
|
deleteMessage_one: "Esto quita la etiqueta de {{count}} espacio de trabajo en este host.",
|
|
deleteMessage_other: "Esto quita la etiqueta de {{count}} espacios de trabajo en este host.",
|
|
offline: "Este host está desconectado.",
|
|
updateHost: "Actualiza este host para gestionar etiquetas.",
|
|
},
|
|
},
|
|
sidebar: {
|
|
display: {
|
|
trigger: "Preferencias de visualización",
|
|
heading: "Visualización",
|
|
grouping: {
|
|
label: "Agrupación",
|
|
project: "Proyecto",
|
|
status: "Estado",
|
|
labels: "Etiquetas",
|
|
},
|
|
titleSource: {
|
|
label: "Título",
|
|
title: "Título",
|
|
branch: "Nombre de rama",
|
|
},
|
|
show: {
|
|
label: "Mostrar",
|
|
branch: "Rama",
|
|
project: "Proyecto",
|
|
host: "Host",
|
|
changeRequest: "Pull request",
|
|
checks: "Comprobaciones",
|
|
services: "Servicios",
|
|
labels: "Etiquetas",
|
|
diff: "Estadísticas de cambios",
|
|
timestamp: "Última actividad",
|
|
},
|
|
checks: {
|
|
iconAndText: "Icono y texto",
|
|
icon: "Solo icono",
|
|
none: "Oculto",
|
|
},
|
|
hostFilter: {
|
|
label: "Host",
|
|
all: "Todos los hosts",
|
|
},
|
|
},
|
|
pinned: {
|
|
title: "Anclados",
|
|
},
|
|
host: {
|
|
noHost: "Sin anfitrión",
|
|
switchTitle: "Cambiar de anfitrión",
|
|
searchPlaceholder: "Buscar hosts...",
|
|
},
|
|
actions: {
|
|
addProject: "Agregar proyecto",
|
|
newWorkspace: "Nuevo espacio de trabajo",
|
|
hosts: "Hosts",
|
|
home: "Hogar",
|
|
settings: "Ajustes",
|
|
closeSidebar: "Cerrar barra lateral",
|
|
},
|
|
help: {
|
|
trigger: "Ayuda y soporte",
|
|
sectionHelp: "Ayuda",
|
|
diagnostics: "Ejecutar diagnóstico",
|
|
shortcuts: "Atajos de teclado",
|
|
reportIssue: "Informar de un problema",
|
|
discord: "Discord",
|
|
github: "Crear incidencia en GitHub",
|
|
whatsNew: "Novedades",
|
|
appName: "Paseo",
|
|
},
|
|
sections: {
|
|
sessions: "Historial",
|
|
schedules: "Horarios",
|
|
},
|
|
worktreeSetup: {
|
|
title: "Configurar secuencias de comandos del árbol de trabajo",
|
|
description:
|
|
"Agregue comandos de configuración para que los nuevos árboles de trabajo puedan instalar dependencias y prepararse automáticamente.",
|
|
openProjectSettings: "Abrir la configuración del proyecto",
|
|
},
|
|
project: {
|
|
actions: {
|
|
menu: "Acciones del proyecto",
|
|
openSettings: "Abrir la configuración del proyecto",
|
|
openNewWindow: "Open in new window",
|
|
openNewWindowFailed: "Couldn't open a new window",
|
|
openFolder: "Open in file manager",
|
|
openFolderFailed: "Couldn't open folder",
|
|
remove: "Eliminar proyecto",
|
|
removing: "Eliminando...",
|
|
},
|
|
confirmations: {
|
|
removeTitle: "¿Quitar proyecto?",
|
|
removeMessage:
|
|
'¿Quitar "{{projectName}}" de la barra lateral?\n\nLos archivos en el disco no se cambiarán.',
|
|
removeConfirm: "Eliminar",
|
|
cancel: "Cancelar",
|
|
},
|
|
toasts: {
|
|
hostDisconnected: "Hostno está conectado",
|
|
removeFailed: "No se pudieron eliminar algunos espacios de trabajo",
|
|
updateHostToRemove: "Actualiza el host para eliminar proyectos.",
|
|
},
|
|
empty: {
|
|
title: "Aún no hay proyectos",
|
|
description: "Añade un proyecto para empezar",
|
|
},
|
|
},
|
|
workspace: {
|
|
status: {
|
|
serviceRunning: "Servicio {{name}} en ejecución",
|
|
serviceUnhealthy: "Servicio {{name}} con fallos",
|
|
creating: "Creando...",
|
|
},
|
|
actions: {
|
|
menu: "AccionesWorkspace",
|
|
newWorkspace: "Nuevo espacio de trabajo",
|
|
showMore: "Mostrar más",
|
|
showLess: "Mostrar menos",
|
|
createWorkspaceFor: "Crea un nuevo espacio de trabajo para{{projectName}}",
|
|
copyPath: "Copiar ruta",
|
|
copyBranchName: "Copiar nombre de sucursal",
|
|
rename: "Cambiar nombre del espacio de trabajo",
|
|
pin: "Anclar arriba",
|
|
unpin: "Desanclar",
|
|
archive: "Archivo",
|
|
archiveWorkspace: "Archivar espacio de trabajo",
|
|
hideFromSidebar: "Ocultar de la barra lateral",
|
|
archiving: "Archivando...",
|
|
hiding: "Ocultación...",
|
|
},
|
|
confirmations: {
|
|
hideTitle: "¿Ocultar espacio de trabajo?",
|
|
hideMessage:
|
|
'¿Ocultar "{{workspaceName}}" de la barra lateral?\n\nLos archivos en el disco no se cambiarán.',
|
|
hideConfirm: "Esconder",
|
|
cancel: "Cancelar",
|
|
},
|
|
rename: {
|
|
title: "Cambiar nombre del espacio de trabajo",
|
|
submit: "Rebautizar",
|
|
invalidBranchName: "Nombre de sucursal no válido",
|
|
},
|
|
toasts: {
|
|
workspacePathUnavailable: "RutaWorkspaceno disponible",
|
|
pathCopied: "Ruta copiada",
|
|
branchNameCopied: "Nombre de la sucursal copiado",
|
|
hostDisconnected: "Hostno está conectado",
|
|
hideFailed: "No se pudo ocultar el espacio de trabajo",
|
|
archiveFailed: "No se pudo archivar el espacio de trabajo",
|
|
},
|
|
},
|
|
},
|
|
newWorkspace: {
|
|
title: "Nuevo espacio de trabajo",
|
|
create: "Crear",
|
|
isolation: {
|
|
local: "Local",
|
|
worktree: "Nuevo worktree",
|
|
label: "Aislamiento",
|
|
},
|
|
fields: {
|
|
project: "Proyecto",
|
|
base: "Base",
|
|
baseNotApplicable: "No aplicable",
|
|
},
|
|
titlePlaceholder: "Título (opcional)",
|
|
errors: {
|
|
hostDisconnected: "Hostno está conectado",
|
|
createWorktreeFailed: "No se pudo crear el árbol de trabajo",
|
|
composerStateRequired: "Se requiere el estado del compositor",
|
|
selectModel: "Selecciona un modelo",
|
|
},
|
|
tooltips: {
|
|
project: "Choose the project",
|
|
host: "Choose the host",
|
|
isolation: "Choose the isolation level",
|
|
startingRef: "Elige por dónde empezar",
|
|
launch: "Choose what to launch",
|
|
},
|
|
refPicker: {
|
|
startingRef: "Árbitro inicial",
|
|
intoBase: "en {{baseRef}}",
|
|
searching: "Búsqueda...",
|
|
noMatchingRefs: "No hay árbitros coincidentes.",
|
|
searchPlaceholder: "Buscar sucursales y relaciones públicas",
|
|
title: "Empezar desde",
|
|
},
|
|
launch: {
|
|
title: "What to launch",
|
|
chat: "Chat",
|
|
terminal: "Terminal",
|
|
manageProfiles: "Manage profiles",
|
|
submit: "Launch",
|
|
promptPlaceholder: "Prompt {{name}}",
|
|
commandPlaceholder: "Run a command, or leave empty for a blank terminal",
|
|
},
|
|
},
|
|
desktop: {
|
|
quitting: {
|
|
title: "Saliendo dePaseo...",
|
|
detail: "Deteniendo el demonio local.",
|
|
},
|
|
daemon: {
|
|
title: "Daemon",
|
|
status: {
|
|
title: "Estado",
|
|
builtInOnly: "Aquí solo se muestra el demonio de escritorio integrado.",
|
|
running: "correr",
|
|
notRunning: "no corriendo",
|
|
pid: "PID{{pid}}",
|
|
},
|
|
management: {
|
|
title: "Administrar demonio incorporado",
|
|
hint: "Deje quePaseoinicie y detenga el demonio incorporado",
|
|
pauseTitle: "Pausar el demonio incorporado",
|
|
pauseMessage:
|
|
"Esto detendrá el demonio incorporado inmediatamente. Se detendrán los agentes en ejecución y los terminales conectados al demonio integrado.",
|
|
pauseAndStop: "Pausa y para",
|
|
registrationFailed:
|
|
"Built-in daemon started, but Paseo could not save the localhost connection. Toggle daemon management off and on again, or add localhost manually.",
|
|
pausedStopFailed:
|
|
"La gestión del demonio integrado se pausó, peroPaseono pudo detener el demonio.",
|
|
updateFailed: "No se puede actualizar la gestión de demonios integrada.",
|
|
},
|
|
keepRunning: {
|
|
title: "Mantener el demonio en ejecución después de salir",
|
|
hint: "Daemonsigue ejecutándose cuando sales dePaseo",
|
|
},
|
|
logs: {
|
|
title: "Archivo de registro",
|
|
modalTitle: "RegistrosDaemon",
|
|
unavailable: "Ruta de registro no disponible",
|
|
empty: "(el archivo de registro está vacío)",
|
|
copied: "Ruta de registro copiada.",
|
|
copyFailed: "No se puede copiar la ruta del registro.",
|
|
open: "Abrir registros",
|
|
copyPath: "Copiar ruta",
|
|
},
|
|
fullStatus: {
|
|
title: "Estado completo",
|
|
modalTitle: "EstadoDaemon",
|
|
hint: "Ejecuta`paseo daemon status`y muestra la salida.",
|
|
view: "Ver estado",
|
|
copied: "Estado copiado al portapapeles.",
|
|
fetchFailed: "No se pudo recuperar el estado del demonio:{{message}}",
|
|
},
|
|
advancedSettings: "Configuraciones avanzadas",
|
|
openAdvancedSettings: "Abrir configuración avanzada del demonio",
|
|
versionMismatch:
|
|
"Las versiones de la aplicación y del demonio no coinciden. Actualice ambos a la misma versión para obtener la mejor experiencia.",
|
|
loadFailed: "No se puede cargar el estado del demonio del escritorio.",
|
|
},
|
|
updates: {
|
|
status: {
|
|
checking: "Buscando actualizaciones de la aplicación...",
|
|
installing: "Instalando actualización de la aplicación...",
|
|
upToDate: "La aplicación está actualizada.",
|
|
upToDateWithLastChecked: "Up to date. Last checked at {{time}}.",
|
|
pending: "Le avisaremos cuando la actualización esté lista.",
|
|
pendingWithLastChecked:
|
|
"Le avisaremos cuando la actualización esté lista. Última comprobación a las {{time}}.",
|
|
pendingWithVersion: "Actualización encontrada: {{version}}. Descargando...",
|
|
pendingWithVersionAndLastChecked:
|
|
"Actualización encontrada: {{version}}. Descargando... Última comprobación a las {{time}}.",
|
|
availableWithVersion: "Actualización lista:{{version}}",
|
|
availableWithVersionAndLastChecked:
|
|
"Actualización lista:{{version}}. Última comprobación a las {{time}}.",
|
|
available: "Una actualización de la aplicación está lista para instalarse.",
|
|
availableWithLastChecked:
|
|
"Una actualización de la aplicación está lista para instalarse. Última comprobación a las {{time}}.",
|
|
installed: "Actualización de la aplicación instalada. Se requiere reinicio.",
|
|
failed: "No se pudo actualizar la aplicación.",
|
|
idle: "El estado de la actualización aún no se ha comprobado.",
|
|
},
|
|
installError: "No se puede instalar la actualización de la aplicación de escritorio.",
|
|
callout: {
|
|
installingTitle: "Instalando actualización",
|
|
failedTitle: "La actualización falló",
|
|
availableTitle: "Actualización disponible",
|
|
genericError: "Algo salió mal.",
|
|
whatsNew: "Qué hay de nuevo",
|
|
installingAction: "Instalando...",
|
|
installAndRestart: "Instalar y reiniciar",
|
|
installingDescription: "Instalando y reiniciando...",
|
|
versionReady: "{{version}}está listo para instalar.",
|
|
newVersionReady: "Una nueva versión está lista para instalar.",
|
|
restartWarning:
|
|
"La actualización de la aplicación dejará de ejecutar agentes y cerrará sesiones de terminal.",
|
|
},
|
|
},
|
|
settings: {
|
|
loadFailed: "No se puede cargar la configuración del escritorio.",
|
|
saveFailed: "No se puede guardar la configuración del escritorio.",
|
|
},
|
|
rosetta: {
|
|
title: "Descargue la compilaciónApple Silicon",
|
|
runningIntel: "Estás ejecutando la compilaciónInteldePaseoenRosettaenApple Silicon.",
|
|
highCpu:
|
|
"Esto provoca un uso elevado de la CPU. Descargue la compilaciónApple Siliconpara solucionarlo.",
|
|
download: "Descargar",
|
|
},
|
|
permissions: {
|
|
notifications: {
|
|
allowed: "El sistema operativo permite las notificaciones.",
|
|
denied: "Las notificaciones se niegan en la configuración del sistema.",
|
|
notGranted: "Las notificaciones aún no han sido concedidas.",
|
|
webOnly:
|
|
"El estado de notificación de escritorio solo está disponible en tiempo de ejecución web.",
|
|
supported: "Se admiten notificaciones de escritorio.",
|
|
unsupported: "Las notificaciones de escritorio no son compatibles con esta plataforma.",
|
|
apiUnavailable: "La API de notificación web no está disponible en este entorno.",
|
|
requestsWebOnly:
|
|
"Las solicitudes de notificación de escritorio solo están disponibles en tiempo de ejecución web.",
|
|
requestUnavailable: "RequestPermission() de la API de notificación web no está disponible.",
|
|
requestFailed: "No se pudo solicitar permiso de notificación:{{message}}",
|
|
unexpectedState: "Estado de permiso de notificación inesperado:{{state}}",
|
|
},
|
|
microphone: {
|
|
webOnly:
|
|
"El estado del micrófono de escritorio solo está disponible en tiempo de ejecución web.",
|
|
navigatorUnavailable: "Navigator no está disponible en este entorno.",
|
|
granted: "Se concede acceso al micrófono.",
|
|
denied: "El acceso al micrófono está denegado en la configuración del sistema.",
|
|
notGranted: "Aún no se ha concedido el permiso para el micrófono.",
|
|
unexpectedState: "Estado de permiso de micrófono inesperado:{{state}}",
|
|
statusApiUnavailable:
|
|
"La API de estado del micrófono no está disponible en este tiempo de ejecución. Utilice Solicitud para comprobar el acceso.",
|
|
queryFailed: "No se pudo consultar el estado del micrófono:{{message}}",
|
|
captureUnavailable: "La captura de micrófono no está disponible en este entorno.",
|
|
permissionApiUnavailable:
|
|
"La API de estado de permiso no está disponible. Utilice Solicitud para comprobar el acceso.",
|
|
requestsWebOnly:
|
|
"Las solicitudes de micrófono de escritorio solo están disponibles en tiempo de ejecución web.",
|
|
captureApiUnavailable: "La API de captura de micrófono no está disponible en este entorno.",
|
|
requestDenied: "El usuario o el sistema denegaron el permiso del micrófono.",
|
|
noDevice: "No se encontró ningún dispositivo de micrófono.",
|
|
requestFailed: "No se pudo solicitar el permiso del micrófono:{{message}}",
|
|
},
|
|
empty: {
|
|
notifications: "El estado de la notificación aún no se ha verificado.",
|
|
microphone: "El estado del micrófono aún no se ha comprobado.",
|
|
},
|
|
testNotification: {
|
|
title: "Prueba de notificaciónPaseo",
|
|
body: "Si puede ver esto, las notificaciones de escritorio funcionan.",
|
|
notDelivered:
|
|
"La notificación no fue entregada. Verifique Configuración del sistema> Notificaciones.",
|
|
failed: "No se pudo enviar la notificación.",
|
|
},
|
|
},
|
|
integrations: {
|
|
cli: {
|
|
statusFailed: "No se puede verificar el estado de instalación deCLI.",
|
|
installFailed: "No se puede instalar elPaseoCLI.",
|
|
},
|
|
},
|
|
},
|
|
rootError: {
|
|
title: "Paseo tuvo un problema.",
|
|
body: "Vuelve a intentarlo para recargar la app. Si sigue ocurriendo, incluye los detalles de abajo al reportarlo.",
|
|
details: "Detalles",
|
|
},
|
|
startup: {
|
|
errorTitle: "algo salió mal",
|
|
errorDescription:
|
|
"El servidor local no pudo iniciarse. Si esto continúa sucediendo, informe el problema enGitHube incluya los registros a continuación.",
|
|
logs: {
|
|
loading: "Cargando registros de demonio...",
|
|
unavailable: "No hay registros de demonios disponibles.",
|
|
loadFailed: "No se pueden cargar registros de demonio:{{message}}",
|
|
},
|
|
},
|
|
openProject: {
|
|
tiles: {
|
|
addProject: {
|
|
title: "Agregar un proyecto",
|
|
description: "Abra una carpeta en su máquina",
|
|
},
|
|
importSession: {
|
|
title: "Importar sesión",
|
|
description: "Incorporar sesionesCLIexternas recientes",
|
|
},
|
|
setupProviders: {
|
|
title: "Proveedores de configuración",
|
|
description: "ConfigurarClaude Code,Codexy más",
|
|
},
|
|
pairDevice: {
|
|
title: "Emparejar dispositivo",
|
|
description: "Conecta tu teléfono a este demonio",
|
|
},
|
|
},
|
|
},
|
|
projectPicker: {
|
|
placeholder: "Escriba para buscar...",
|
|
browse: "Explorar…",
|
|
opening: "Proyecto de apertura...",
|
|
searching: "Buscando...",
|
|
empty: "Comience a escribir una ruta",
|
|
errors: {
|
|
directory_not_found: "No se encontró el directorio.",
|
|
open_failed: "No se pudo abrir el proyecto.",
|
|
},
|
|
openPath: "Abrir ruta",
|
|
},
|
|
branchSwitcher: {
|
|
triggerTooltip: "Cambiar rama del espacio de trabajo",
|
|
currentBranch: "Sucursal actual:{{branchName}}. Presione para cambiar de rama.",
|
|
placeholder: "Cambiar de rama...",
|
|
searchPlaceholder: "Filtrar ramas...",
|
|
empty: "No se encontraron sucursales.",
|
|
title: "Cambiar rama",
|
|
uncommittedTitle: "Cambios no confirmados",
|
|
uncommittedMessage: "Tienes cambios no confirmados. ¿Guardarlos antes de cambiar de sucursal?",
|
|
stashAndSwitch: "Guardar y cambiar",
|
|
failedToStash: "No se pudieron ocultar los cambios",
|
|
failedToSwitch: "No se pudo cambiar de sucursal",
|
|
restoreStashTitle: "¿Restaurar cambios ocultos?",
|
|
restoreStashMessage:
|
|
"Esta rama ha ocultado cambios de una sesión anterior. ¿Quieres restaurarlos?",
|
|
restore: "Restaurar",
|
|
later: "Más tarde",
|
|
stashRestored: "Se restauraron los cambios ocultos",
|
|
},
|
|
agentAutocomplete: {
|
|
searchingWorkspace: "Buscando espacio de trabajo...",
|
|
loadingCommands: "Cargando comandos...",
|
|
noFiles: "No se encontraron archivos ni directorios",
|
|
noCommands: "No se encontraron comandos",
|
|
failedToLoad: "No se pudo cargar",
|
|
},
|
|
loadOlderHistory: {
|
|
failed: "No se pudo cargar el historial anterior",
|
|
},
|
|
imageAttachmentPicker: {
|
|
permissionTitle: "Permiso requerido",
|
|
permissionMessage: "Permita el acceso a su biblioteca de fotos para adjuntar imágenes.",
|
|
errorTitle: "Error",
|
|
failedToSelect: "No se pudo seleccionar la imagen",
|
|
dialogTitle: "Adjuntar imágenes",
|
|
dialogFilterName: "Imágenes",
|
|
},
|
|
workspaceSetup: {
|
|
title: "Crear espacio de trabajo",
|
|
errors: {
|
|
failedCreateWorktree: "No se pudo crear el árbol de trabajo",
|
|
failedOpenProject: "No se pudo abrir el proyecto",
|
|
selectModel: "Selecciona un modelo",
|
|
hostDisconnected: "Hostno está conectado",
|
|
pendingRequired: "No hay ninguna configuración de espacio de trabajo pendiente",
|
|
composerStateRequired: "Se requiere el estado del compositor de configuraciónWorkspace",
|
|
},
|
|
},
|
|
onboarding: {
|
|
title: "Bienvenido aPaseo",
|
|
subtitle: "Conecte su computadora para comenzar",
|
|
actions: {
|
|
settings: "Ajustes",
|
|
},
|
|
},
|
|
modelSelector: {
|
|
title: "Seleccionar proveedor",
|
|
selectModel: "Seleccionar modelo",
|
|
selectedModel: "Seleccionar modelo ({{model}})",
|
|
loading: "Cargando...",
|
|
loadingShort: "Cargando",
|
|
loadingSelector: "Cargando selector de modelo...",
|
|
error: "Error",
|
|
defaultModel: "Por defecto",
|
|
profiles: "Perfiles",
|
|
providers: "Proveedores",
|
|
model: "Modelo",
|
|
editProfiles: "Editar",
|
|
editProfilesLabel: "Editar perfiles de agente",
|
|
createProfile: "Crear perfil",
|
|
modelCount: "{{count}} modelo",
|
|
modelCountPlural: "{{count}} modelos",
|
|
retry: "Rever",
|
|
retrying: "Reintentando...",
|
|
noMatches: "Ningún modelo coincide con tu búsqueda",
|
|
noMatchesForQuery: "Ningún modelo coincide con «{{query}}»",
|
|
searchAllPlaceholder: "Buscar en todos los modelos...",
|
|
searchPlaceholder: "Buscar modelos...",
|
|
openProviderSettings: "Abrir configuración de{{provider}}",
|
|
},
|
|
providerCatalog: {
|
|
title: "Agregar proveedor",
|
|
search: "Proveedores de búsqueda",
|
|
noProviders: "No se encontraron proveedores",
|
|
actions: {
|
|
add: "Agregar",
|
|
adding: "Añadiendo",
|
|
installed: "Instalado",
|
|
cancel: "Cancelar",
|
|
installInstructions: "Instrucciones de instalación",
|
|
installInstructionsFor: "Instrucciones de instalación de{{provider}}",
|
|
},
|
|
errors: {
|
|
unableToInstall: "No se puede instalar el proveedor",
|
|
},
|
|
},
|
|
providerSelection: {
|
|
defaultModel: "Por defecto",
|
|
selectModel: "Seleccionar modelo",
|
|
loading: "Cargando...",
|
|
error: "Error",
|
|
unavailable: "Indisponible",
|
|
unknownError: "Error desconocido",
|
|
readiness: {
|
|
initialPromptRequired: "Se requiere aviso inicial",
|
|
noProviders: "No hay proveedores disponibles en el host seleccionado",
|
|
modelDefaultsLoading: "Los valores predeterminados del modelo aún se están cargando",
|
|
noModelAvailable: "No hay ningún modelo disponible para el proveedor seleccionado",
|
|
workspaceDirectoryNotFound: "DirectorioWorkspaceno encontrado",
|
|
hostDisconnected: "Hostno está conectado",
|
|
},
|
|
},
|
|
pairing: {
|
|
connectionMethods: {
|
|
title: "Agregar conexión",
|
|
direct: {
|
|
title: "Conexión directa",
|
|
description: "Red local o VPN.",
|
|
},
|
|
scanQr: {
|
|
title: "Escanea el códigoQR",
|
|
description: "Conexión de retransmisión cifrada.",
|
|
},
|
|
pasteLink: {
|
|
title: "Pegar enlace de emparejamiento",
|
|
description: "Conexión de retransmisión cifrada.",
|
|
},
|
|
},
|
|
direct: {
|
|
title: "Conexión directa",
|
|
helper: "Ingrese la dirección de un servidorPaseo.",
|
|
fields: {
|
|
host: "Host",
|
|
port: "Puerto",
|
|
password: "Contraseña",
|
|
optional: "Opcional",
|
|
useSsl: "Usar SSL",
|
|
connectionUri: "URI de conexión",
|
|
},
|
|
advanced: {
|
|
label: "Avanzado",
|
|
show: "Mostrar avanzado",
|
|
hide: "Ocultar avanzado",
|
|
},
|
|
passwordVisibility: {
|
|
show: "Mostrar contraseña",
|
|
hide: "Ocultar contraseña",
|
|
},
|
|
actions: {
|
|
cancel: "Cancelar",
|
|
connect: "Conectar",
|
|
connecting: "Conectando...",
|
|
},
|
|
errors: {
|
|
hostRequired: "Se requiereHost",
|
|
invalidPort: "El puerto debe estar entre 1 y 65535",
|
|
invalidConnection: "Conexión no válida",
|
|
failedTitle: "La conexión falló",
|
|
failedToConnect: "No pudimos conectarnos a{{endpoint}}.",
|
|
noAdditionalDetails: "{{detail}}(no se proporcionan detalles adicionales)",
|
|
timedOut: "Se agotó el tiempo de conexión. Verifique el host/porty su red.",
|
|
refused: "Conexión rechazada. ¿El servidor se está ejecutando en esta dirección?",
|
|
hostNotFound: "Hostno encontrado. Verifique el nombre de host e inténtelo nuevamente.",
|
|
hostUnreachable: "Hostes inalcanzable. Verifique su red y firewall.",
|
|
tlsError:
|
|
"Error de TLS. Las conexiones directas utilizan SSL solo cuando hay un terminador TLS delante del demonio.",
|
|
unableToConnect:
|
|
"No se puede conectar. Verifique el host/porty que se pueda acceder al demonio.",
|
|
details: "Detalles:{{detail}}",
|
|
},
|
|
},
|
|
link: {
|
|
title: "Pegar enlace de emparejamiento",
|
|
helper: "Pegue el enlace de emparejamiento de su servidor.",
|
|
label: "Enlace de emparejamiento",
|
|
errors: {
|
|
required: "Pegue un enlace de emparejamiento (.../#offer=...)",
|
|
missingOffer: "El enlace debe incluir#offer=...",
|
|
emptyOffer: "La carga útil de la oferta está vacía",
|
|
invalid: "Enlace de emparejamiento no válido",
|
|
unableToPair: "No se puede emparejar el host",
|
|
},
|
|
alert: {
|
|
failedTitle: "El emparejamiento falló",
|
|
},
|
|
actions: {
|
|
cancel: "Cancelar",
|
|
pair: "Par",
|
|
pairing: "Emparejamiento...",
|
|
},
|
|
},
|
|
scan: {
|
|
title: "EscanearQR",
|
|
webUnavailableTitle: "No disponible en la web",
|
|
webUnavailableBody:
|
|
'El escaneoQRno es compatible con la compilación web. Utilice "Pegar enlace" en su lugar.',
|
|
backToSettings: "Volver a configuración",
|
|
cameraPermissionTitle: "Permiso de cámara",
|
|
cameraPermissionBody:
|
|
"Permita el acceso a la cámara para escanear el códigoQRde emparejamiento de su demonio.",
|
|
grantPermission: "Conceder permiso",
|
|
pairing: "Emparejamiento...",
|
|
unableToPair: "No se puede emparejar el host",
|
|
errorTitle: "Error",
|
|
},
|
|
device: {
|
|
loadingOffer: "Cargando oferta de maridaje...",
|
|
failedToLoadOffer: "No se pudo cargar la oferta de emparejamiento.",
|
|
relayDisabled: "El relé no está habilitado. Habilite el relé para emparejar un dispositivo.",
|
|
enableTitle: "¿Habilitar el relé?",
|
|
enableDescription:
|
|
"El relé permite conectar este dispositivo desde cualquier lugar. El tráfico de emparejamiento está cifrado de extremo a extremo.",
|
|
relayDocs: "Cómo funciona el relé",
|
|
relayDocsAccessibility: "Leer cómo funciona el relé de Paseo",
|
|
enableRelay: "Habilitar relé",
|
|
enablingRelay: "Habilitando...",
|
|
notNow: "Ahora no",
|
|
directConnectionHint:
|
|
"Sin relé, conéctese directamente por TCP, Tailscale u otra VPN. No se crea ningún código QR.",
|
|
updateRequired: "Actualice el host para habilitar el relé desde Paseo Desktop.",
|
|
unavailable: "Oferta de maridaje no disponible.",
|
|
hint: "Escanee este códigoQRconPaseoen su teléfono o copie el enlace a continuación.",
|
|
qrUnavailable: "CódigoQRno disponible.",
|
|
qrAccessibility: "Código QR de emparejamiento",
|
|
retry: "Rever",
|
|
copy: "Copiar",
|
|
copied: "Copiado",
|
|
},
|
|
},
|
|
realtimeVoice: {
|
|
actions: {
|
|
mute: "Silenciar voz en tiempo real",
|
|
unmute: "Activar voz en tiempo real",
|
|
stop: "Detener la voz en tiempo real e interrumpir el turno.",
|
|
},
|
|
},
|
|
rewind: {
|
|
tooltip: "Rebobinar a este mensaje",
|
|
warning: "Esta acción no se puede deshacer.",
|
|
actions: {
|
|
conversation: "Rebobinar conversación",
|
|
files: "Rebobinar archivos",
|
|
both: "Rebobinar conversaciones y archivos",
|
|
},
|
|
errors: {
|
|
failed: "No se pudo rebobinar el agente",
|
|
},
|
|
},
|
|
diffViewer: {
|
|
empty: "No hay cambios para mostrar",
|
|
},
|
|
serviceUrl: {
|
|
title: "Servicio abiertoURL",
|
|
message: "¿Abrir{{url}}?",
|
|
inPaseo: "EnPaseo",
|
|
externalBrowser: "Navegador externo",
|
|
dontAskAgain: "no vuelvas a preguntar",
|
|
},
|
|
downloads: {
|
|
requestTokenFailed: "No se pudo solicitar el token de descarga.",
|
|
hostUnavailable: "El host de descarga no está disponible.",
|
|
cancelled: "La descarga fue cancelada.",
|
|
failed: "No se pudo descargar el archivo.",
|
|
shareFile: "compartir archivo",
|
|
shareFileNamed: "Compartir{{fileName}}",
|
|
},
|
|
menu: {
|
|
backdrop: "Fondo del menú",
|
|
},
|
|
subagents: {
|
|
title: "Subagentes",
|
|
pillLabelOne: "1 subagente",
|
|
pillLabelMany: "{{count}} subagentes",
|
|
pillLabelRunning: "{{count}} en ejecución",
|
|
pillLabelFailed: "{{count}} con error",
|
|
pillLabelNeedsInputOne: "1 necesita datos",
|
|
pillLabelNeedsInputMany: "{{count}} necesitan datos",
|
|
pillLabelReadyToReview: "{{count}} para revisar",
|
|
detachAction: "Separar {{label}}",
|
|
detachTooltip: "Separar subagente",
|
|
archiveAction: "Archivo{{label}}",
|
|
archiveTooltip: "Subagente de archivo",
|
|
archiveFinishedAction: "Archivar subagentes finalizados",
|
|
archiveFinishedRetry: "Reintentar ({{failed}}/{{total}})",
|
|
},
|
|
panels: {
|
|
draft: {
|
|
newAgent: "Nuevo agente",
|
|
creatingAgent: "Agente creador",
|
|
},
|
|
file: {
|
|
directoryMissing: "No se encontró el directorio de Workspace.",
|
|
loading: "Cargando archivo...",
|
|
noPreview: "No hay vista previa disponible",
|
|
binaryPreviewUnavailable: "Vista previa binaria no disponible",
|
|
failedToLoad: "No se pudo cargar el archivo",
|
|
failedToLoadPreview: "No se pudo cargar la vista previa del archivo",
|
|
editor: {
|
|
fileSize: "Tamaño {{size}}",
|
|
lines: "{{count}} líneas",
|
|
editorStatus: "Estado del editor: {{status}}",
|
|
unsavedChanges: "Cambios sin guardar",
|
|
saving: "Guardando...",
|
|
saveFailed: "Error al guardar",
|
|
changedOnDisk: "Cambiado en disco",
|
|
vimMode: "Modo Vim {{mode}}",
|
|
cursor: "Línea {{line}}, columna {{column}}",
|
|
preview: "Vista previa",
|
|
source: "Código fuente",
|
|
deletedTitle: "Archivo eliminado del disco",
|
|
checkFailedTitle: "No se pudo comprobar el archivo en disco",
|
|
preservedDescription: "La copia abierta se ha conservado.",
|
|
conflictDescription: "Se conservó el búfer local. Elige qué versión mantener.",
|
|
overwrite: "Sobrescribir",
|
|
reload: "Recargar",
|
|
reloadTitle: "¿Recargar desde el disco?",
|
|
reloadMessage: "Se perderán tus cambios locales.",
|
|
},
|
|
},
|
|
files: {
|
|
label: "Archivos",
|
|
subtitle: "Archivos del espacio de trabajo",
|
|
tooltip: "Explorar archivos del espacio de trabajo",
|
|
},
|
|
pullRequest: {
|
|
label: "Solicitud de extracción",
|
|
subtitle: "Detalles de la solicitud de extracción",
|
|
emptyTitle: "Aún no hay ninguna solicitud de extracción",
|
|
emptyDescription: "Crea una solicitud para este checkout y consulta aquí sus detalles.",
|
|
},
|
|
diff: {
|
|
changesLabel: "Cambios",
|
|
changesSubtitle: "Diferencias del árbol de trabajo",
|
|
commitSubtitle: "Diferencias del commit",
|
|
uncommittedSubtitle: "Cambios sin confirmar",
|
|
baseSubtitle: "Comparado con {{baseRef}}",
|
|
directoryMissing: "No se encontró el directorio de Workspace.",
|
|
empty: "Sin cambios",
|
|
loadError: "No se pudieron cargar las diferencias",
|
|
capabilityMissing: "Actualiza el host para ver las diferencias de los commits.",
|
|
},
|
|
},
|
|
toolCallDetails: {
|
|
error: "Error",
|
|
empty: "No hay detalles adicionales disponibles",
|
|
subAgentActivity: "Actividad de subagente",
|
|
input: "Aporte",
|
|
output: "Producción",
|
|
},
|
|
toolCallGroup: {
|
|
editedFiles: {
|
|
one: "editó {{count}} archivo",
|
|
other: "editó {{count}} archivos",
|
|
},
|
|
commands: {
|
|
one: "ejecutó {{count}} comando",
|
|
other: "ejecutó {{count}} comandos",
|
|
},
|
|
readFiles: {
|
|
one: "leyó {{count}} archivo",
|
|
other: "leyó {{count}} archivos",
|
|
},
|
|
searches: {
|
|
one: "buscó {{count}} vez",
|
|
other: "buscó {{count}} veces",
|
|
},
|
|
otherTools: {
|
|
one: "usó {{count}} herramienta adicional",
|
|
other: "usó {{count}} herramientas adicionales",
|
|
},
|
|
paseoCalls: {
|
|
one: "llamó a Paseo {{count}} vez",
|
|
other: "llamó a Paseo {{count}} veces",
|
|
},
|
|
and: "y",
|
|
},
|
|
renameModal: {
|
|
rename: "Rebautizar",
|
|
saving: "Guardando...",
|
|
},
|
|
sidebarCallout: {
|
|
dismiss: "Despedir",
|
|
},
|
|
contextWindow: {
|
|
title: "ventana contextual",
|
|
used: "{{percentage}}% utilizado",
|
|
tokens: "Fichas{{used}}/{{max}}",
|
|
sessionCost: "Costo de la sesión{{cost}}",
|
|
accessibility: "Ventana de contexto{{percentage}}% utilizada",
|
|
},
|
|
review: {
|
|
comment: {
|
|
add: "Agregar comentario de revisión",
|
|
edit: "Editar comentario de revisión",
|
|
delete: "Eliminar comentario de revisión",
|
|
label: "Comentario de revisión",
|
|
placeholder: "Deja un comentario",
|
|
cancel: "Cancelar",
|
|
cancelAccessibility: "Cancelar comentario de revisión",
|
|
save: "Comentario",
|
|
saveAccessibility: "Guardar comentario de revisión",
|
|
},
|
|
},
|
|
settings: {
|
|
title: "Ajustes",
|
|
loading: "Cargando configuración...",
|
|
groups: {
|
|
app: "Aplicación",
|
|
host: "Host",
|
|
},
|
|
hostPicker: {
|
|
switchHost: "Cambiar de anfitrión",
|
|
local: "Local",
|
|
},
|
|
backToWorkspace: "Atrás",
|
|
addHost: "Agregar anfitrión",
|
|
enableBuiltInDaemon: "Activar el demonio integrado",
|
|
projects: "Proyectos",
|
|
projectList: {
|
|
hostLoadFailed: "No se pudieron cargar proyectos desde el host{{hostName}}:{{message}}",
|
|
editProject: "Editar{{projectName}}",
|
|
},
|
|
groupInfo: "Acerca de{{title}}",
|
|
sections: {
|
|
general: "General",
|
|
appearance: "Apariencia",
|
|
editor: "Editor",
|
|
shortcuts: "Atajos",
|
|
integrations: "Integraciones",
|
|
notifications: "Notificaciones",
|
|
permissions: "Permisos",
|
|
diagnostics: "Diagnóstico",
|
|
about: "Acerca de",
|
|
},
|
|
editor: {
|
|
title: "Editor",
|
|
vimKeybindings: "Atajos de Vim",
|
|
vimHint: "Se aplica a archivos fuente en web y escritorio.",
|
|
},
|
|
notifications: {
|
|
title: "Notificaciones",
|
|
permission: "Permiso de notificaciones",
|
|
refreshAccessibility: "Actualizar permiso de notificaciones",
|
|
playSound: "Reproducir sonido",
|
|
playSoundHint: "Reproduce un sonido cuando llega una notificación de escritorio",
|
|
test: "Probar notificación",
|
|
testHint: "Envía una notificación con esta configuración",
|
|
permissionRequired: "Permite el acceso a las notificaciones antes de probar",
|
|
send: "Enviar",
|
|
sending: "Enviando...",
|
|
sentTitle: "Notificación de prueba enviada",
|
|
sentDescription: "Paseo entregó la notificación al sistema operativo.",
|
|
sendFailedTitle: "No se pudo enviar la notificación de prueba",
|
|
},
|
|
hostSections: {
|
|
projects: "Proyectos",
|
|
connections: "Conexiones",
|
|
agents: "Agents",
|
|
metadata: "Metadatos",
|
|
workspaces: "Workspaces",
|
|
providers: "Proveedores",
|
|
usage: "Uso",
|
|
terminals: "Terminals",
|
|
plugins: "Plugins",
|
|
host: "Resumen",
|
|
},
|
|
plugins: pluginSettings.es,
|
|
metadataGeneration: {
|
|
title: "Generación de metadatos",
|
|
description:
|
|
"Elige el modelo que Paseo usa para títulos de espacios de trabajo, nombres de ramas, mensajes de commit y borradores de pull requests",
|
|
selection: "Selección de modelo",
|
|
automatic: "Automática",
|
|
preferred: "Manual",
|
|
automaticHint: "Paseo elige un modelo rápido disponible",
|
|
preferredHint: "Elige el modelo que usa Paseo",
|
|
model: "Modelo",
|
|
fallbackHint: "Si no está disponible, Paseo usa otro modelo disponible",
|
|
docs: "Documentación",
|
|
saveError: "No se pudo actualizar la generación de metadatos",
|
|
},
|
|
general: {
|
|
title: "General",
|
|
browserData: {
|
|
title: "Datos del navegador",
|
|
siteData: "Cookies y datos de sitios",
|
|
description:
|
|
"Las pestañas del navegador comparten inicios de sesión y datos de sitios en Paseo.",
|
|
clear: "Borrar datos del navegador",
|
|
clearing: "Borrando...",
|
|
confirmTitle: "¿Borrar los datos del navegador?",
|
|
confirmMessage:
|
|
"Se cerrarán las sesiones de los sitios y se recargarán las pestañas abiertas del navegador.",
|
|
success: "Datos del navegador borrados.",
|
|
error: "No se pudieron borrar los datos del navegador.",
|
|
},
|
|
defaultSend: {
|
|
label: "Envío predeterminado",
|
|
descriptions: {
|
|
interrupt:
|
|
"Cuando el agente se está ejecutando, Enter interrumpe. Command/Ctrl+Enter pone en cola.",
|
|
steer:
|
|
"Cuando el agente se está ejecutando, Enter dirige el turno activo. Command/Ctrl+Enter pone en cola.",
|
|
queue:
|
|
"Cuando el agente se está ejecutando, Enter pone en cola. Command/Ctrl+Enter envía.",
|
|
},
|
|
options: {
|
|
interrupt: "Interrumpir",
|
|
steer: "Dirigir",
|
|
queue: "Cola",
|
|
},
|
|
},
|
|
serviceUrls: {
|
|
label: "URL de servicio",
|
|
description: "Dónde abrir URL desde scripts en ejecución",
|
|
options: {
|
|
ask: "Preguntar",
|
|
inApp: "EnPaseo",
|
|
external: "Navegador externo",
|
|
},
|
|
},
|
|
terminalScrollback: {
|
|
label: "Historial de terminal",
|
|
description: "Líneas mantenidas en el búfer de terminal incorporado",
|
|
accessibilityLabel: "Líneas del historial de terminal",
|
|
},
|
|
autoExpandReasoning: {
|
|
label: "Siempre expandir razonamiento",
|
|
description:
|
|
"Mostrar los bloques de pensamiento y razonamiento del agente totalmente expandidos de forma predeterminada",
|
|
},
|
|
toolCallDetail: {
|
|
label: "Visualización de llamadas a herramientas",
|
|
description: "Cómo aparecen las llamadas a herramientas en la cronología",
|
|
accessibilityLabel: "Seleccionar visualización de llamadas a herramientas ({{value}})",
|
|
options: {
|
|
overview: "Resumen",
|
|
detailed: "Detalle completo",
|
|
},
|
|
},
|
|
language: {
|
|
label: "Idioma",
|
|
description: "Idioma de la aplicación",
|
|
options: {
|
|
system: "Sistema",
|
|
ar: "العربية",
|
|
en: "English",
|
|
es: "Español",
|
|
fr: "Français",
|
|
ja: "日本語",
|
|
ko: "한국어",
|
|
ptBR: "Português brasileiro",
|
|
ru: "Русский",
|
|
zhCN: "中文",
|
|
},
|
|
},
|
|
},
|
|
diagnostics: {
|
|
title: "Diagnóstico",
|
|
legacyTerminalRenderer: {
|
|
label: "Usar el renderizador de terminal anterior",
|
|
description: "Usa el terminal WebView anterior al volver a abrir un terminal",
|
|
accessibilityLabel: "Usar el renderizador de terminal anterior",
|
|
},
|
|
testAudio: "audio de prueba",
|
|
playTest: "Prueba de juego",
|
|
playing: "Jugando...",
|
|
playbackFailed: "Error de reproducción:{{message}}",
|
|
app: {
|
|
title: "App diagnostic",
|
|
rowTitle: "App diagnostic",
|
|
rowHint: "Collect connection, daemon, provider, desktop, and log details",
|
|
run: "Run",
|
|
running: "Running diagnostic...",
|
|
copyLabel: "diagnostic",
|
|
copyAccessibility: "Copy diagnostic",
|
|
copyFailed: "Failed to copy diagnostic",
|
|
refreshAccessibility: "Refresh diagnostic",
|
|
refreshingAccessibility: "Refreshing diagnostic",
|
|
progress: {
|
|
client: "Client",
|
|
desktop: "Desktop",
|
|
},
|
|
},
|
|
},
|
|
about: {
|
|
title: "Acerca de",
|
|
appVersion: "Versión de la aplicación",
|
|
thisDevice: "este dispositivo",
|
|
connectedHosts: "Anfitriones conectados",
|
|
offline: "Desconectado",
|
|
versionDiffers: "La versión difiere de este dispositivo.",
|
|
releaseChannel: {
|
|
label: "Canal de lanzamiento",
|
|
description: "Cambie aBetapara recibir actualizaciones antes y ayudar a darles forma",
|
|
stable: "Stable",
|
|
beta: "Beta",
|
|
},
|
|
updates: {
|
|
label: "Actualizaciones de aplicaciones",
|
|
readyToInstall: "Listo para instalar:{{version}}",
|
|
installTitle: "Instalar actualización de escritorio",
|
|
installMessage: "Esto actualizaPaseoen esta computadora.",
|
|
installConfirm: "Instalar actualización",
|
|
update: "Actualizar",
|
|
updateTo: "Actualización a{{version}}",
|
|
installing: "Instalando...",
|
|
check: "Controlar",
|
|
checking: "De cheques...",
|
|
alertTitle: "Error",
|
|
alertMessage: "No se puede abrir el cuadro de diálogo de confirmación de actualización.",
|
|
},
|
|
},
|
|
appearance: {
|
|
theme: {
|
|
title: "Tema",
|
|
accessibilityLabel: "Tema:{{value}}",
|
|
options: {
|
|
light: "Luz",
|
|
dark: "Oscuro",
|
|
zinc: "Zinc",
|
|
midnight: "Medianoche",
|
|
claude: "claudio",
|
|
ghostty: "fantasmal",
|
|
pureBlack: "Negro puro",
|
|
auto: "Sistema",
|
|
},
|
|
},
|
|
detailLevel: {
|
|
title: "Nivel de detalle",
|
|
},
|
|
chatOutline: {
|
|
title: "Esquema del chat",
|
|
description: "Muestra un esquema para saltar entre instrucciones",
|
|
},
|
|
fonts: {
|
|
title: "Fuentes",
|
|
systemDefault: "Valor predeterminado del sistema",
|
|
interfaceFont: "Fuente de interfaz",
|
|
interfaceFontHint:
|
|
"Utilizado en toda la aplicación. Déjelo vacío para el valor predeterminado del sistema.",
|
|
interfaceFontAccessibility: "Familia de fuentes de interfaz",
|
|
baseSize: "Tamaño base",
|
|
baseSizeAccessibility: "Tamaño base de la fuente",
|
|
codeFont: "Fuente de código",
|
|
codeFontHint:
|
|
"Se utiliza en código, diferencias y salida del terminal. Déjelo vacío para el valor predeterminado del sistema.",
|
|
codeFontAccessibility: "Familia de fuentes de código",
|
|
codeSize: "Tamaño del código",
|
|
codeSizeAccessibility: "Tamaño de fuente del código",
|
|
},
|
|
syntax: {
|
|
title: "Sintaxis",
|
|
highlightTheme: "Tema destacado",
|
|
highlightThemeHint: "Colores para el código, independientemente del tema de la aplicación.",
|
|
highlightThemeAccessibility: "Tema destacado:{{value}}",
|
|
previewAccessibility: "Vista previa en vivo del tema de sintaxis y fuente del código",
|
|
},
|
|
},
|
|
shortcuts: {
|
|
dialogTitle: "Atajos",
|
|
searchPlaceholder: "Buscar atajos",
|
|
unavailableOnMobile: "Los atajos de teclado solo están disponibles en el escritorio",
|
|
capturePrompt: "Presione el acceso directo...",
|
|
unassigned: "Sin asignar",
|
|
actions: {
|
|
menu: "Acciones para {{name}}",
|
|
done: "Hecho",
|
|
cancel: "Cancelar",
|
|
bind: "Asignar",
|
|
rebind: "Reencuadernar",
|
|
clear: "Borrar",
|
|
reset: "Restablecer al valor predeterminado",
|
|
resetAll: "Restablecer todo",
|
|
},
|
|
sections: {
|
|
general: "General",
|
|
workspaces: "Proyectos y espacios de trabajo",
|
|
tabsPanes: "Pestañas y paneles",
|
|
layout: "Diseño",
|
|
agentInput: "EntradaAgent",
|
|
},
|
|
help: {
|
|
openProject: "Abrir proyecto",
|
|
newWorkspace: "Nuevo espacio de trabajo",
|
|
newWorktree: "Nuevo árbol de trabajo",
|
|
archiveWorkspace: "Archivar espacio de trabajo",
|
|
newTab: "Nueva pestaña",
|
|
closeCurrentTab: "Cerrar pestaña actual",
|
|
jumpToWorkspace: "Saltar al espacio de trabajo",
|
|
jumpToTab: "Saltar a la pestaña",
|
|
previousWorkspace: "Espacio de trabajo anterior",
|
|
nextWorkspace: "Siguiente espacio de trabajo",
|
|
previousTab: "Pestaña anterior",
|
|
nextTab: "Pestaña siguiente",
|
|
splitPaneRight: "Panel dividido a la derecha",
|
|
splitPaneDown: "Dividir panel hacia abajo",
|
|
focusPaneLeft: "Panel de enfoque a la izquierda",
|
|
focusPaneRight: "Panel de enfoque a la derecha",
|
|
focusPaneUp: "Panel de enfoque arriba",
|
|
focusPaneDown: "Panel de enfoque hacia abajo",
|
|
moveTabLeft: "Mover pestaña hacia la izquierda",
|
|
moveTabRight: "Mover pestaña a la derecha",
|
|
moveTabUp: "Mover pestaña hacia arriba",
|
|
moveTabDown: "Mover pestaña hacia abajo",
|
|
closePane: "Cerrar panel",
|
|
newTerminal: "Nueva terminal",
|
|
searchFiles: "Buscar archivos",
|
|
toggleCommandCenter: "Alternar centro de comando",
|
|
showKeyboardShortcuts: "Mostrar atajos de teclado",
|
|
toggleLeftSidebar: "Alternar barra lateral izquierda",
|
|
toggleRightSidebar: "Alternar barra lateral derecha",
|
|
toggleBothSidebars: "Alternar ambas barras laterales",
|
|
toggleSettings: "Alternar configuración",
|
|
toggleFocusMode: "Alternar modo de enfoque",
|
|
toggleExplorerPaneMaximization: "Alternar maximización del panel Explorador",
|
|
cycleTheme: "Tema del ciclo",
|
|
focusMessageInput: "Entrada de mensaje de enfoque",
|
|
cycleAgentMode: "Alternar modo del agente",
|
|
toggleVoiceMode: "Alternar modo de voz",
|
|
startStopDictation: "Iniciar dictado/stop",
|
|
interruptAgent: "agente de interrupción",
|
|
sendMessage: "enviar mensaje",
|
|
queueMessage: "mensaje de cola",
|
|
muteUnmuteVoiceMode: "Silenciar el modo de voz/unmute",
|
|
switchProject: "Cambiar proyecto",
|
|
},
|
|
helpNotes: {
|
|
showKeyboardShortcuts: "Disponible cuando el foco no está en un campo de texto o terminal.",
|
|
},
|
|
},
|
|
integrations: {
|
|
title: "Integraciones",
|
|
docs: {
|
|
cli: "DocumentosCLI",
|
|
openCli: "Abrir la documentación deCLI",
|
|
},
|
|
commandLine: {
|
|
title: "línea de comando",
|
|
description: "Agentes de control y script desde tu terminal",
|
|
},
|
|
actions: {
|
|
install: "Instalar",
|
|
installing: "Instalando...",
|
|
installed: "Instalado",
|
|
},
|
|
},
|
|
permissions: {
|
|
title: "Permisos",
|
|
microphone: "Micrófono",
|
|
refresh: "Refrescar",
|
|
refreshing: "Refrescante...",
|
|
refreshAccessibility: "Actualizar permisos de escritorio",
|
|
actions: {
|
|
granted: "Otorgada",
|
|
request: "Pedido",
|
|
requesting: "Solicitando...",
|
|
},
|
|
},
|
|
host: {
|
|
appearance: {
|
|
title: "Apariencia",
|
|
name: {
|
|
label: "Nombre",
|
|
},
|
|
color: {
|
|
label: "Color",
|
|
accessibilityLabel: "Color, {{value}}",
|
|
options: {
|
|
none: "Predeterminado",
|
|
violet: "Violeta",
|
|
sky: "Cielo",
|
|
emerald: "Esmeralda",
|
|
orange: "Naranja",
|
|
pink: "Rosa",
|
|
indigo: "Índigo",
|
|
teal: "Verde azulado",
|
|
red: "Rojo",
|
|
amber: "Ámbar",
|
|
blue: "Azul",
|
|
},
|
|
},
|
|
badge: {
|
|
label: "Insignia de la barra lateral",
|
|
accessibilityLabel: "Insignia de la barra lateral, {{value}}",
|
|
options: {
|
|
name: "Nombre",
|
|
icon: "Solo icono",
|
|
hidden: "Oculta",
|
|
},
|
|
},
|
|
preview: {
|
|
workspaceName: "my-workspace",
|
|
},
|
|
},
|
|
notFound: "Hostno encontrado",
|
|
badges: {
|
|
relay: "Relé",
|
|
local: "Local",
|
|
},
|
|
connections: {
|
|
title: "Conexiones",
|
|
removeTitle: "Quitar conexión",
|
|
removeMessage: "¿Quitar{{name}}? Esto no se puede deshacer.",
|
|
removeAction: "Eliminar",
|
|
removeErrorTitle: "Error",
|
|
removeErrorMessage: "No se puede eliminar la conexión",
|
|
timeout: "Se acabó el tiempo",
|
|
},
|
|
pairDevices: {
|
|
title: "Emparejar dispositivos",
|
|
rowTitle: "Emparejar un dispositivo",
|
|
rowHint: "Escanee un códigoQRo copie un enlace para conectar su teléfono a este host",
|
|
},
|
|
skills: {
|
|
...en.settings.host.skills,
|
|
sectionTitle: "Habilidades de orquestación",
|
|
title: "Habilidades de orquestación",
|
|
description: "Enseñe a sus agentes a orquestar a través delCLI",
|
|
updateAvailable: "Actualización disponible",
|
|
updateTitle: "¿Actualizar las habilidades dePaseo?",
|
|
updateFallback: "Sincronice las habilidades incluidas con su máquina.",
|
|
uninstallTitle: "¿Desinstalar las habilidadesPaseo?",
|
|
uninstallMessage:
|
|
"Elimina todas las habilidades de orquestaciónPaseode ~/.agents, ~/.claude, ~/.codex.",
|
|
choose: "Elegir habilidades",
|
|
chooseAll: "Todas las habilidades",
|
|
chooseAllHint:
|
|
"Mantén instaladas todas las habilidades incluidas, también las que se agreguen después.",
|
|
chooseList: "Habilidades incluidas",
|
|
chooseEmpty: "Esta versión no incluye habilidades.",
|
|
removeTitle: "¿Eliminar las habilidades deseleccionadas?",
|
|
removeMessage:
|
|
"{{skills}} se eliminarán de ~/.agents, ~/.claude y ~/.codex. También se elimina todo lo que hayas añadido dentro de esas carpetas de habilidades.",
|
|
saveFailed: "No se pudo guardar tu selección de habilidades.",
|
|
statusFailed: "No se puede comprobar el estado de las habilidades de orquestación.",
|
|
updateFailed: "No se pueden actualizar las habilidades de orquestación.",
|
|
uninstallFailed: "No se pueden desinstalar las habilidades de orquestación.",
|
|
saveSelectionFailed: "No se puede guardar la selección de habilidades de orquestación.",
|
|
actions: {
|
|
install: "Instalar",
|
|
installing: "Instalando...",
|
|
installed: "Instalado",
|
|
update: "Actualizar",
|
|
working: "Laboral...",
|
|
remove: "Eliminar",
|
|
uninstall: "Desinstalar",
|
|
save: "Guardar",
|
|
saving: "Guardando...",
|
|
cancel: "Cancelar",
|
|
},
|
|
operations: {
|
|
add: "Agregar habilidad",
|
|
update: "Actualizar habilidad",
|
|
delete: "Eliminar habilidad",
|
|
},
|
|
},
|
|
orchestration: {
|
|
title: "Orquestación",
|
|
unavailable: "Conéctese a este host para administrar la orquestación",
|
|
enableTools: {
|
|
title: "Habilitar herramientasPaseo",
|
|
hint: "Los agentes podrán gestionar árboles de trabajo, agentes y horarios.",
|
|
accessibilityLabel: "Inyectar herramientasPaseo",
|
|
},
|
|
systemPrompt: {
|
|
title: "Aviso del sistema",
|
|
hint: "Agrega un mensaje del sistema a todos los agentes.",
|
|
sheetTitle: "Agregar mensaje del sistema",
|
|
accessibilityLabel: "Agregar mensaje del sistema",
|
|
placeholder: "Mantenga siempre respuestas concisas.",
|
|
edit: "Editar",
|
|
reset: "Restablecer",
|
|
save: "Guardar",
|
|
saving: "Guardando...",
|
|
},
|
|
},
|
|
agents: {
|
|
unavailable: "Connect to this host to manage agents",
|
|
},
|
|
workspaces: {
|
|
unavailable: "Connect to this host to manage workspaces",
|
|
},
|
|
terminalProfiles: {
|
|
unavailable: "Connect to this host to manage terminal profiles",
|
|
sectionTitle: "Terminal profiles",
|
|
editProfile: "Edit profile",
|
|
addProfileTitle: "Add terminal profile",
|
|
editProfileTitle: "Edit terminal profile",
|
|
namePlaceholder: "Claude Code",
|
|
commandPlaceholder: "claude",
|
|
argsPlaceholder: "--dangerously-skip-permissions",
|
|
nameLabel: "Name",
|
|
commandLabel: "Command",
|
|
argsLabel: "Arguments",
|
|
nameRequired: "Name is required",
|
|
commandRequired: "Command is required",
|
|
argsHint: "Space-separated arguments passed to the command",
|
|
saving: "Saving...",
|
|
remove: "Remove",
|
|
removeConfirmTitle: "Remove profile?",
|
|
removeConfirmMessage: 'Remove "{{name}}"?',
|
|
moveUp: "Move up",
|
|
moveDown: "Move down",
|
|
save: "Save",
|
|
emptyState: "No profiles yet. Add one to launch terminals with a specific command.",
|
|
},
|
|
agentProfiles: {
|
|
sectionTitle: "Perfiles de agente",
|
|
unavailable: "Conéctese a este host para administrar perfiles de agente",
|
|
unsupported: "Este host ejecuta un daemon que aún no admite perfiles de agente",
|
|
emptyState:
|
|
"Aún no hay perfiles. Agregue uno para iniciar agentes con un proveedor y un modelo guardados.",
|
|
addProfileTitle: "Agregar perfil de agente",
|
|
newProfile: "Nuevo perfil",
|
|
editProfile: "Editar perfil",
|
|
editProfileTitle: "Editar perfil de agente",
|
|
nameLabel: "Nombre",
|
|
namePlaceholder: "Trabajo de UI",
|
|
iconLabel: "Icono",
|
|
noIcon: "Ninguno",
|
|
providerLabel: "Proveedor",
|
|
providerPlaceholder: "Seleccione un proveedor",
|
|
noProviders: "No hay proveedores disponibles en este host",
|
|
modelLabel: "Modelo",
|
|
noModels: "Este proveedor no tiene modelos para elegir",
|
|
modeLabel: "Modo",
|
|
noModes: "Este proveedor no tiene modos para elegir",
|
|
thinkingLabel: "Pensamiento",
|
|
noThinkingOptions: "Este modelo no tiene niveles de pensamiento",
|
|
featuresLabel: "Características",
|
|
featureCount: "{{count}} características",
|
|
featureCountOne: "{{count}} característica",
|
|
notesLabel: "Notas para los agentes",
|
|
notesPlaceholder: "Úselo para trabajo de UI: componentes, diseño y tokens de diseño.",
|
|
notesHint:
|
|
'Devuelto por la herramienta MCP "list_profiles". Escríbalo como una instrucción para otro agente.',
|
|
save: "Guardar",
|
|
saving: "Guardando...",
|
|
remove: "Eliminar",
|
|
removeConfirmTitle: "¿Eliminar perfil?",
|
|
removeConfirmMessage: '¿Eliminar "{{name}}"?',
|
|
moveUp: "Mover hacia arriba",
|
|
moveDown: "Mover hacia abajo",
|
|
},
|
|
daemon: {
|
|
rename: {
|
|
editLabel: "Editar etiqueta",
|
|
title: "Cambiar nombre de host",
|
|
placeholder: "MiHost",
|
|
submit: "Cambiar nombre",
|
|
},
|
|
restart: {
|
|
title: "Reiniciar demonio",
|
|
hint: "Reinicia el proceso del demonio. La aplicación se volverá a conectar automáticamente",
|
|
confirm: "Reiniciar",
|
|
confirmTitle: "Reiniciar{{name}}",
|
|
confirmMessage:
|
|
"Esto reiniciará el demonio. Los agentes que se ejecutan en él seguirán funcionando; la aplicación se volverá a conectar automáticamente.",
|
|
restarting: "Reiniciando...",
|
|
unableToReconnectTitle: "No se puede volver a conectar",
|
|
unableToReconnectMessage:
|
|
"{{name}}no volvió a conectarse. Por favor verifique que se haya reiniciado.",
|
|
unavailableTitle: "Hostno disponible",
|
|
unavailableMessage:
|
|
"Este host no está conectado. Espere a que se conecte antes de reiniciar.",
|
|
offlineTitle: "Hostfuera de línea",
|
|
offlineMessage:
|
|
"Este anfitrión está desconectado.Paseose vuelve a conectar automáticamente; espere hasta que vuelva a estar en línea antes de reiniciar.",
|
|
requestFailedTitle: "Error",
|
|
requestFailedMessage:
|
|
"No se pudo enviar la solicitud de reinicio.Paseose vuelve a conectar automáticamente; inténtelo nuevamente una vez que el host se muestre en línea.",
|
|
dialogFailedMessage:
|
|
"No se puede abrir el cuadro de diálogo de confirmación de reinicio.",
|
|
},
|
|
update: {
|
|
desktopManagedHint:
|
|
"Este daemon está administrado por Paseo Desktop. Actualiza Paseo Desktop en el host.",
|
|
title: "Update daemon",
|
|
hint: "Update the daemon to the latest version and restart it",
|
|
confirm: "Update",
|
|
confirmTitle: "Update {{name}}",
|
|
confirmMessage:
|
|
"This will update the daemon to the latest version and restart it. Running agents will be briefly interrupted.",
|
|
updating: "Updating...",
|
|
phaseStarting: "Preparing update...",
|
|
phaseDownloading: "Downloading packages...",
|
|
phaseInstalling: "Installing...",
|
|
phaseComplete: "Update complete, restarting...",
|
|
unableToReconnectTitle: "Unable to reconnect",
|
|
unableToReconnectMessage:
|
|
"{{name}} did not come back online after updating. Please verify the daemon restarted.",
|
|
unavailableTitle: "Host unavailable",
|
|
unavailableMessage:
|
|
"This host is not connected. Wait for it to come online before updating.",
|
|
offlineTitle: "Host offline",
|
|
offlineMessage: "This host is offline. Wait until it is back online before updating.",
|
|
requestFailedTitle: "Update failed",
|
|
requestFailedMessage: "Failed to update the daemon: {{error}}",
|
|
dialogFailedMessage: "Unable to open the update confirmation dialog.",
|
|
},
|
|
dangerZone: "Zona de peligro",
|
|
remove: {
|
|
title: "Eliminar host",
|
|
localTitle: "Remove localhost connection",
|
|
hint: "Elimina este host y sus conexiones guardadas de este dispositivo",
|
|
localHint: "Removes localhost from this device and stops the built-in daemon",
|
|
localConfirmTitle: "Remove localhost connection and stop daemon?",
|
|
confirmMessage: "¿Quitar{{name}}? Esto eliminará sus conexiones guardadas.",
|
|
localConfirmMessage:
|
|
"This will remove the localhost connection, turn off built-in daemon management, and stop the managed daemon. Remote hosts remain connected.",
|
|
errorTitle: "Error",
|
|
errorMessage: "No se puede eliminar el host",
|
|
localErrorMessage: "Unable to remove localhost connection",
|
|
},
|
|
},
|
|
},
|
|
providers: {
|
|
title: "Proveedores",
|
|
addProvider: "Agregar proveedor",
|
|
providerDetails: "Detalles del proveedor{{name}}",
|
|
enableProvider: "Habilitar{{name}}",
|
|
unavailable: "Conéctese a este host para ver proveedores",
|
|
loading: "Cargando...",
|
|
addErrorTitle: "Unable to add provider",
|
|
updateErrorTitle: "No se puede actualizar el proveedor",
|
|
actions: {
|
|
menu: "{{name}} actions",
|
|
remove: "Remove provider",
|
|
removing: "Removing...",
|
|
},
|
|
remove: {
|
|
confirmTitle: "Remove {{name}}?",
|
|
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
|
|
confirm: "Remove",
|
|
errorTitle: "Unable to remove provider",
|
|
},
|
|
statuses: {
|
|
disabled: "Desactivado",
|
|
loading: "Cargando",
|
|
error: "Error",
|
|
available: "Disponible",
|
|
notInstalled: "No instalado",
|
|
},
|
|
models: {
|
|
one: "1 modelo",
|
|
many: "{{count}} modelos",
|
|
addModel: "Agregar modelo",
|
|
addCustomTitle: "Agregar modelo personalizado",
|
|
modelId: "ModeloID",
|
|
modelIdPlaceholder: "p.ej. openai/gpt-5",
|
|
add: "Agregar",
|
|
adding: "Añadiendo...",
|
|
failedToSave: "No se pudo guardar el modelo",
|
|
removeModel: "Quitar{{id}}",
|
|
searchPlaceholder: "Buscar modelos",
|
|
loading: "Cargando modelos...",
|
|
retry: "Rever",
|
|
retrying: "Reintentando...",
|
|
noSearchMatches: "Ningún modelo coincide con tu búsqueda",
|
|
noneDetected: "No se detectaron modelos",
|
|
discovered: "descubierto",
|
|
custom: "Modelos personalizados",
|
|
updated: "{{time}}actualizado",
|
|
},
|
|
diagnostic: {
|
|
title: "Diagnóstico",
|
|
button: "Diagnóstico",
|
|
refresh: "Refrescar",
|
|
refreshing: "Refrescante...",
|
|
copyLabel: "diagnóstico",
|
|
copyAccessibility: "Copiar diagnóstico",
|
|
copyFailed: "No se pudo copiar el diagnóstico",
|
|
refreshAccessibility: "Actualizar diagnóstico",
|
|
refreshingAccessibility: "Diagnóstico refrescante",
|
|
running: "Ejecutando diagnóstico...",
|
|
none: "No hay diagnóstico disponible",
|
|
failedToFetch: "No se pudo recuperar el diagnóstico",
|
|
unknownError: "Error desconocido",
|
|
},
|
|
},
|
|
project: {
|
|
noEditableTarget: "Este proyecto no se puede editar en este host.",
|
|
backToProjects: "Volver a proyectos",
|
|
edit: {
|
|
title: "Editar proyecto",
|
|
name: "Nombre",
|
|
nameLabel: "Nombre del proyecto",
|
|
icon: "Icono",
|
|
chooseImage: "Elegir imagen",
|
|
useAutomatic: "Usar automático",
|
|
imageUrl: "URL de imagen o sitio web",
|
|
save: "Guardar cambios",
|
|
savedToast: "Proyecto actualizado",
|
|
},
|
|
readFailures: {
|
|
invalidTitle: "paseo.json no se pudo analizar",
|
|
invalidDescription: "Fije el archivo en el disco y luego vuelva a cargarlo.",
|
|
missingTitle: "Este anfitrión no tiene este proyecto",
|
|
missingSingleHost: "El anfitrión seleccionado no tiene registro de este proyecto.",
|
|
transportTitle: "No se pudo cargar paseo.json",
|
|
transportFallback: "El anfitrión no respondió.",
|
|
failedTitle: "No se pudo cargar paseo.json",
|
|
failedDescription: "Vuelva a cargar para intentarlo de nuevo.",
|
|
},
|
|
worktree: {
|
|
title: "Ganchos del ciclo de vida del árbol de trabajo",
|
|
info: "Comandos que se ejecutan cuando se crea o elimina un árbol de trabajo para este proyecto",
|
|
docs: "Documentos",
|
|
docsTooltip:
|
|
"Consulte los documentos para obtener más detalles y las variables de entorno disponibles para estos comandos.",
|
|
setup: "Configuración",
|
|
setupAccessibility: "Comandos de configuración del árbol de trabajo",
|
|
uncommittedTitle: "Confirma los cambios de paseo.json",
|
|
uncommittedDescription:
|
|
"Los árboles de trabajo nuevos usan el script de configuración de la rama base que selecciones.",
|
|
teardown: "Demoler",
|
|
teardownAccessibility: "Comandos de desmontaje del árbol de trabajo",
|
|
},
|
|
scripts: {
|
|
title: "Scripts",
|
|
info: "Servicios de larga duración y comandos únicos que puede iniciar desde cualquier agente en este proyecto",
|
|
empty: "Aún no hay guiones.",
|
|
untitled: "Guión sin título",
|
|
port: "puerto{{port}}",
|
|
menuAccessibility: "Abrir menú de script",
|
|
removeTitle: "¿Quitar guión?",
|
|
removeMessage: "¿Quitar{{name}}?",
|
|
removeFallbackName: "este guión",
|
|
name: "Nombre",
|
|
command: "Dominio",
|
|
nameAccessibility: "Nombre del guión",
|
|
commandAccessibility: "Comando de guión",
|
|
nameRequired: "El nombre es obligatorio",
|
|
commandRequired: "Se requiere comando",
|
|
newScript: "Nuevo guión",
|
|
editScript: "Editar{{name}}",
|
|
runAsService: "Ejecutar como servicio",
|
|
serviceHint: "Paseosupervisa el proceso y asigna un puerto vía $PASEO_PORT",
|
|
actions: {
|
|
add: "Agregar guión",
|
|
edit: "Editar",
|
|
remove: "Eliminar",
|
|
},
|
|
},
|
|
metadata: {
|
|
title: "Generación de metadatos",
|
|
info: "Instrucciones específicas del proyecto inyectadas en los mensajes de IA quePaseoutiliza para generar metadatos; úselas para hacer cumplir las convenciones de su equipo, como la denominación de ramas, el estilo de confirmación o el formatoPR.",
|
|
branchName: "Nombres de sucursales",
|
|
branchNamePlaceholder: "Prefijo ramas con feat/ o fix/, mb/ para ramas personales",
|
|
commitMessage: "Confirmar mensajes",
|
|
commitMessagePlaceholder: "Utilice confirmaciones convencionales con un alcance",
|
|
pullRequest: "Solicitudes de extracción",
|
|
pullRequestPlaceholder:
|
|
"Liderar con un resumen de un párrafo, incluir una sección de plan de prueba",
|
|
},
|
|
writeFailures: {
|
|
staleTitle: "Configuración cambiada en el disco",
|
|
staleDescription: "Vuelva a cargar para obtener el último paseo.json antes de guardar.",
|
|
failedTitle: "No se pudo guardar paseo.json",
|
|
failedDescription: "Inténtelo de nuevo o vuelva a cargar la última versión desde el disco.",
|
|
},
|
|
actions: {
|
|
reload: "Recargar",
|
|
tryAgain: "Intentar otra vez",
|
|
save: "Guardar",
|
|
saved: "Proyecto guardado",
|
|
saving: "Guardando...",
|
|
cancel: "Cancelar",
|
|
},
|
|
},
|
|
},
|
|
};
|