diff --git a/src/renderer/src/components/activity/activity-thread-options-menu.tsx b/src/renderer/src/components/activity/activity-thread-options-menu.tsx index da1f3bebf6f..95cb85b6d92 100644 --- a/src/renderer/src/components/activity/activity-thread-options-menu.tsx +++ b/src/renderer/src/components/activity/activity-thread-options-menu.tsx @@ -18,7 +18,6 @@ import { import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import { translate } from '@/i18n/i18n' import { OptionsFilterCountBadge } from '@/components/sidebar/options-filter-count-badge' -import { activeFilterCountLabel } from '../sidebar/active-filter-count-label' import { ActivityScopeFilterMenuItems, useActivityScopeFilterCount @@ -82,13 +81,15 @@ export function ActivityThreadOptionsMenu({ const skipCloseAutoFocusRef = React.useRef(false) const activeFilterCount = useActivityScopeFilterCount() + (onUnreadOnlyChange && unreadOnly ? 1 : 0) - const activeFilterLabel = activeFilterCountLabel(activeFilterCount) const optionsLabel = activeFilterCount > 0 ? translate( - 'auto.components.activity.ActivityPrototypePage.threadListOptionsActive', - 'Thread list options ({{value0}} active)', - { value0: activeFilterLabel } + 'auto.components.activity.ActivityPrototypePage.threadListOptionsActiveFilters', + 'Thread list options ({{count}} filters active)', + { + count: activeFilterCount, + defaultValue_one: 'Thread list options ({{count}} filter active)' + } ) : translate( 'auto.components.activity.ActivityPrototypePage.db8a1878b5', @@ -115,9 +116,12 @@ export function ActivityThreadOptionsMenu({ {activeFilterCount > 0 ? translate( - 'auto.components.activity.ActivityPrototypePage.activityOptionsActive', - 'Activity options ({{value0}})', - { value0: activeFilterLabel } + 'auto.components.activity.ActivityPrototypePage.activityOptionsFilterCount', + 'Activity options ({{count}} filters)', + { + count: activeFilterCount, + defaultValue_one: 'Activity options ({{count}} filter)' + } ) : translate( 'auto.components.activity.ActivityPrototypePage.activityOptions', diff --git a/src/renderer/src/components/automations/AutomationDetail.tsx b/src/renderer/src/components/automations/AutomationDetail.tsx index 6c995d83c73..05e65c6c6af 100644 --- a/src/renderer/src/components/automations/AutomationDetail.tsx +++ b/src/renderer/src/components/automations/AutomationDetail.tsx @@ -6,7 +6,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip import { getAgentCatalog, AgentIcon } from '@/lib/agent-catalog' import type { Automation, AutomationRun } from '../../../../shared/automations-types' import { formatUiAutomationSchedule } from './automation-schedule-label' -import { formatAutomationPrecheckTimeout } from '../../../../shared/automation-precheck' +import { formatUiNarrowDuration } from '@/i18n/relative-time-format' import { AutomationRunErrorNotice, formatAutomationDateTimeWithRelative @@ -328,7 +328,7 @@ export function AutomationDetail({ ? translate( 'auto.components.automations.AutomationDetail.precheckEnabled', 'Enabled, {{timeout}}', - { timeout: formatAutomationPrecheckTimeout(automation.precheck.timeoutSeconds) } + { timeout: formatUiNarrowDuration(automation.precheck.timeoutSeconds, 'second') } ) : translate('auto.components.automations.AutomationDetail.precheckNone', 'None') } diff --git a/src/renderer/src/components/automations/AutomationHostFilterNotice.tsx b/src/renderer/src/components/automations/AutomationHostFilterNotice.tsx index df5de97236f..401550caedd 100644 --- a/src/renderer/src/components/automations/AutomationHostFilterNotice.tsx +++ b/src/renderer/src/components/automations/AutomationHostFilterNotice.tsx @@ -21,9 +21,13 @@ export function automationHostLoadSummaryMessage( return null } return translate( - 'auto.components.automations.hostSummary.partialFailure', - '{{failed}} of {{total}} hosts could not be loaded', - { failed: failedHostCount, total: totalHostCount } + 'auto.components.automations.hostSummary.partialFailureOfHosts', + '{{failed}} of {{count}} hosts could not be loaded', + { + failed: failedHostCount, + count: totalHostCount, + defaultValue_one: '{{failed}} of {{count}} host could not be loaded' + } ) } diff --git a/src/renderer/src/components/automations/AutomationRunsDashboard.tsx b/src/renderer/src/components/automations/AutomationRunsDashboard.tsx index 1d31531762a..6863b902633 100644 --- a/src/renderer/src/components/automations/AutomationRunsDashboard.tsx +++ b/src/renderer/src/components/automations/AutomationRunsDashboard.tsx @@ -257,16 +257,15 @@ export function AutomationRunsDashboard({
- {visibleFailures.length === 1 - ? translate( - 'auto.components.automations.AutomationRunsDashboard.historyUnavailableOne', - 'Run history is unavailable for 1 automation. Counts include available history only.' - ) - : translate( - 'auto.components.automations.AutomationRunsDashboard.historyUnavailableMany', - 'Run history is unavailable for {{count}} automations. Counts include available history only.', - { count: visibleFailures.length } - )} + {translate( + 'auto.components.automations.AutomationRunsDashboard.historyUnavailable', + 'Run history is unavailable for {{count}} automations. Counts include available history only.', + { + count: visibleFailures.length, + defaultValue_one: + 'Run history is unavailable for {{count}} automation. Counts include available history only.' + } + )}
) : null} diff --git a/src/renderer/src/components/automations/automation-usage-model.ts b/src/renderer/src/components/automations/automation-usage-model.ts index 49e11636f3f..06fd3a4daca 100644 --- a/src/renderer/src/components/automations/automation-usage-model.ts +++ b/src/renderer/src/components/automations/automation-usage-model.ts @@ -20,7 +20,7 @@ export function formatAutomationTokens(value: number | null | undefined): string export function formatAutomationCost(value: number | null | undefined): string { if (value === null || value === undefined) { - return 'n/a' + return translate('auto.components.automations.usage.costUnavailable', 'n/a') } if (value > 0 && value < 0.01) { return `$${value.toFixed(4)}` diff --git a/src/renderer/src/components/diff-comments/DiffCommentCard.tsx b/src/renderer/src/components/diff-comments/DiffCommentCard.tsx index a7e2f77a126..54716863dba 100644 --- a/src/renderer/src/components/diff-comments/DiffCommentCard.tsx +++ b/src/renderer/src/components/diff-comments/DiffCommentCard.tsx @@ -2,9 +2,10 @@ import { ImeTextarea } from '@/lib/ime-text-field' import { CornerDownLeft, Pencil, Trash } from 'lucide-react' import { useLayoutEffect, useRef, useState, type ReactNode } from 'react' import { Button } from '@/components/ui/button' -import { getDiffCommentLineLabel } from '@/lib/diff-comment-compat' +import { getDiffCommentLineMetaLabel } from './diff-comment-line-meta-label' import { useMountedRef } from '@/hooks/useMountedRef' import { translate } from '@/i18n/i18n' +import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision' // Render note cards in per-zone React roots; keep persisted DiffComment names while UI says Note to distinguish PR review comments. @@ -49,6 +50,8 @@ export function DiffCommentCard({ onSubmitEdit, headerActions }: Props): React.JSX.Element { + // Zone cards live in separate React roots, so subscribe directly to language changes. + useUiLanguageRevision() const [editing, setEditing] = useState(false) const [draft, setDraft] = useState(body) const [submitting, setSubmitting] = useState(false) @@ -134,7 +137,7 @@ export function DiffCommentCard({ const trimmedDraft = draft.trim() const canSubmit = !submitting && trimmedDraft.length > 0 && trimmedDraft !== body const lineLabel = - label === undefined ? getDiffCommentLineLabel({ lineNumber, startLine }).toLowerCase() : label + label === undefined ? getDiffCommentLineMetaLabel({ lineNumber, startLine }) : label const metaText = [ author || translate('auto.components.diff.comments.DiffCommentCard.noteAuthorFallback', 'Note'), lineLabel, diff --git a/src/renderer/src/components/diff-comments/diff-comment-line-meta-label.ts b/src/renderer/src/components/diff-comments/diff-comment-line-meta-label.ts new file mode 100644 index 00000000000..edff63fd5c7 --- /dev/null +++ b/src/renderer/src/components/diff-comments/diff-comment-line-meta-label.ts @@ -0,0 +1,15 @@ +import type { DiffComment } from '../../../../shared/diff-comment-types' +import { translate } from '@/i18n/i18n' + +// Card meta text, e.g. "Note line 4 sent"; agent prompts keep the English getDiffCommentLineLabel. +export function getDiffCommentLineMetaLabel( + comment: Pick +): string { + if (comment.startLine !== undefined && comment.startLine !== comment.lineNumber) { + return translate('diffComments.lineRangeMeta', 'lines {{start}}-{{end}}', { + start: comment.startLine, + end: comment.lineNumber + }) + } + return translate('diffComments.lineMeta', 'line {{line}}', { line: comment.lineNumber }) +} diff --git a/src/renderer/src/components/diff-comments/diff-comment-zone-card.tsx b/src/renderer/src/components/diff-comments/diff-comment-zone-card.tsx index d6d34f80f46..dfb1f44d205 100644 --- a/src/renderer/src/components/diff-comments/diff-comment-zone-card.tsx +++ b/src/renderer/src/components/diff-comments/diff-comment-zone-card.tsx @@ -1,6 +1,5 @@ import type { RefObject } from 'react' import type { Root } from 'react-dom/client' -import { getDiffCommentLineLabel } from '@/lib/diff-comment-compat' import { formatDiffComments } from '@/lib/diff-comments-format' import { TooltipProvider } from '@/components/ui/tooltip' import type { DiffCommentDeliverySnapshot } from '@/store/slices/diffComments' @@ -80,7 +79,6 @@ export function renderDiffCommentZoneCard( [...current, added]) diff --git a/src/renderer/src/components/pull-request-page/page/surface.tsx b/src/renderer/src/components/pull-request-page/page/surface.tsx index bf1d4141367..208a15d6bd8 100644 --- a/src/renderer/src/components/pull-request-page/page/surface.tsx +++ b/src/renderer/src/components/pull-request-page/page/surface.tsx @@ -39,7 +39,7 @@ export default function PullRequestPage({ repoId, sourceContext, initialTab, - backLabel = 'Pull requests', + backLabel = translate('auto.components.TaskPage.backToPullRequests', 'Pull requests'), projectOrigin, onUse, onReviewRequestsChange, diff --git a/src/renderer/src/components/right-sidebar/source-control/ai/text-generation-dialog.tsx b/src/renderer/src/components/right-sidebar/source-control/ai/text-generation-dialog.tsx index ae05193fb56..a72c58dc31b 100644 --- a/src/renderer/src/components/right-sidebar/source-control/ai/text-generation-dialog.tsx +++ b/src/renderer/src/components/right-sidebar/source-control/ai/text-generation-dialog.tsx @@ -84,6 +84,41 @@ function buildBasePromptPreview(actionId: SourceControlTextActionId): string { } } +function savedRecipeMessage(actionId: SourceControlTextActionId, scope: 'repo' | 'global'): string { + switch (actionId) { + case 'commitMessage': + return scope === 'repo' + ? translate( + 'sourceControl.textGeneration.savedCommitRecipeRepo', + 'Saved commit-message recipe for this repository.' + ) + : translate( + 'sourceControl.textGeneration.savedCommitRecipeGlobal', + 'Saved commit-message recipe as a global default.' + ) + case 'pullRequest': + return scope === 'repo' + ? translate( + 'sourceControl.textGeneration.savedReviewRecipeRepo', + 'Saved hosted-review recipe for this repository.' + ) + : translate( + 'sourceControl.textGeneration.savedReviewRecipeGlobal', + 'Saved hosted-review recipe as a global default.' + ) + case 'branchName': + return scope === 'repo' + ? translate( + 'sourceControl.textGeneration.savedBranchRecipeRepo', + 'Saved branch-name recipe for this repository.' + ) + : translate( + 'sourceControl.textGeneration.savedBranchRecipeGlobal', + 'Saved branch-name recipe as a global default.' + ) + } +} + export function SourceControlTextGenerationDialog({ actionId, title, @@ -119,12 +154,6 @@ export function SourceControlTextGenerationDialog({ [actionId, discoveryHostKey, repo, settings, languageRevision] ) const baseParams = resolved.ok ? resolved.value.params : null - const recipeLabel = - actionId === 'commitMessage' - ? 'commit-message recipe' - : actionId === 'pullRequest' - ? 'hosted-review recipe' - : 'branch-name recipe' const saveTargets: SourceControlTextGenerationSaveTarget[] = repo?.id ? [ { @@ -133,7 +162,7 @@ export function SourceControlTextGenerationDialog({ 'auto.components.right.sidebar.SourceControlTextGenerationDialog.5959da1e4d', 'Save for this repository only' ), - successMessage: `Saved ${recipeLabel} for this repository.` + successMessage: savedRecipeMessage(actionId, 'repo') }, { target: { type: 'global' }, @@ -141,7 +170,7 @@ export function SourceControlTextGenerationDialog({ 'auto.components.right.sidebar.SourceControlTextGenerationDialog.7f1ec309a4', 'Save as default for all repositories' ), - successMessage: `Saved ${recipeLabel} as a global default.` + successMessage: savedRecipeMessage(actionId, 'global') } ] : [ @@ -151,7 +180,7 @@ export function SourceControlTextGenerationDialog({ 'auto.components.right.sidebar.SourceControlTextGenerationDialog.c5b7fa7cb6', 'Save as global default' ), - successMessage: `Saved ${recipeLabel} as a global default.` + successMessage: savedRecipeMessage(actionId, 'global') } ] const formKey = open diff --git a/src/renderer/src/components/right-sidebar/source-control/listing/row-layout.ts b/src/renderer/src/components/right-sidebar/source-control/listing/row-layout.ts index 289602b1b7e..aa9b81ddb61 100644 --- a/src/renderer/src/components/right-sidebar/source-control/listing/row-layout.ts +++ b/src/renderer/src/components/right-sidebar/source-control/listing/row-layout.ts @@ -1,12 +1,26 @@ +import { translate } from '@/i18n/i18n' + // Keep overlays measurable so Radix tooltips cannot transiently jump to the top-left on hover. export const SOURCE_CONTROL_ROW_ACTION_OVERLAY_CLASS = 'absolute right-0 top-0 bottom-0 flex shrink-0 items-center gap-1.5 bg-accent pr-3 pl-2 opacity-0 pointer-events-none transition-opacity group-hover:opacity-100 group-hover:pointer-events-auto focus-within:opacity-100 focus-within:pointer-events-auto [@media(hover:none)]:opacity-100 [@media(hover:none)]:pointer-events-auto' export const SOURCE_CONTROL_TREE_INDENT_PX = 12 export const SOURCE_CONTROL_TREE_DIRECTORY_PADDING_PX = 8 export const SOURCE_CONTROL_TREE_FILE_PADDING_PX = 20 -export const SUBMODULE_WORKTREE_ONLY_LABEL = 'Stage inside submodule' -export const SUBMODULE_WORKTREE_ONLY_TOOLTIP = - 'The parent repo (including Stage All) cannot stage file changes inside a submodule' -export const SUBMODULE_LOADING_LABEL = 'Loading submodule changes…' -export const SUBMODULE_EMPTY_LABEL = 'No changes in submodule' -export const SUBMODULE_ERROR_LABEL = 'Failed to load submodule changes' +export function getSubmoduleWorktreeOnlyLabel(): string { + return translate('sourceControl.submodule.worktreeOnlyLabel', 'Stage inside submodule') +} +export function getSubmoduleWorktreeOnlyTooltip(): string { + return translate( + 'sourceControl.submodule.worktreeOnlyTooltip', + 'The parent repo (including Stage All) cannot stage file changes inside a submodule' + ) +} +export function getSubmoduleLoadingLabel(): string { + return translate('sourceControl.submodule.loading', 'Loading submodule changes…') +} +export function getSubmoduleEmptyLabel(): string { + return translate('sourceControl.submodule.empty', 'No changes in submodule') +} +export function getSubmoduleErrorLabel(): string { + return translate('sourceControl.submodule.loadFailed', 'Failed to load submodule changes') +} diff --git a/src/renderer/src/components/right-sidebar/source-control/listing/submodule-placeholder-row.tsx b/src/renderer/src/components/right-sidebar/source-control/listing/submodule-placeholder-row.tsx index 5228f7a0596..82b5c935fbf 100644 --- a/src/renderer/src/components/right-sidebar/source-control/listing/submodule-placeholder-row.tsx +++ b/src/renderer/src/components/right-sidebar/source-control/listing/submodule-placeholder-row.tsx @@ -5,9 +5,9 @@ import { translate } from '@/i18n/i18n' import { SOURCE_CONTROL_TREE_FILE_PADDING_PX, SOURCE_CONTROL_TREE_INDENT_PX, - SUBMODULE_EMPTY_LABEL, - SUBMODULE_ERROR_LABEL, - SUBMODULE_LOADING_LABEL + getSubmoduleEmptyLabel, + getSubmoduleErrorLabel, + getSubmoduleLoadingLabel } from './row-layout' export function SubmodulePlaceholderRow({ @@ -21,15 +21,15 @@ export function SubmodulePlaceholderRow({ }): React.JSX.Element { const fallback = state === 'error' - ? SUBMODULE_ERROR_LABEL + ? getSubmoduleErrorLabel() : state === 'empty' - ? SUBMODULE_EMPTY_LABEL + ? getSubmoduleEmptyLabel() : state === 'truncated' ? translate( 'auto.components.right.sidebar.SourceControl.submoduleTruncated', 'More submodule changes were omitted' ) - : SUBMODULE_LOADING_LABEL + : getSubmoduleLoadingLabel() return (
- {SUBMODULE_WORKTREE_ONLY_LABEL} + {getSubmoduleWorktreeOnlyLabel()}
)} diff --git a/src/renderer/src/components/right-sidebar/source-control/listing/use-file-projection.ts b/src/renderer/src/components/right-sidebar/source-control/listing/use-file-projection.ts index 38273b59998..8f2feccefda 100644 --- a/src/renderer/src/components/right-sidebar/source-control/listing/use-file-projection.ts +++ b/src/renderer/src/components/right-sidebar/source-control/listing/use-file-projection.ts @@ -35,7 +35,8 @@ import { } from './submodule-expansion' import type { FlatEntry } from './use-selection' import type { GitStatusSourceControlTreeNode } from './directory-action-paths' -import { SUBMODULE_EMPTY_LABEL, SUBMODULE_LOADING_LABEL } from './row-layout' +import { getSubmoduleEmptyLabel, getSubmoduleLoadingLabel } from './row-layout' +import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision' export type SourceControlFileProjection = { grouped: SourceControlEntryGroups @@ -156,6 +157,7 @@ export function useSourceControlFileProjection({ return roots }, [displaySections, sourceControlViewMode]) + const languageRevision = useUiLanguageRevision() const visibleTreeRowsBySection = useMemo(() => { if (sourceControlViewMode !== 'tree') { return EMPTY_TREE_ROWS_BY_SECTION @@ -166,18 +168,20 @@ export function useSourceControlFileProjection({ flattenSourceControlTree(treeRootsBySection[section.id] ?? [], collapsedTreeDirs), expandedSubmoduleKeys, submoduleStatusByKey, - SUBMODULE_LOADING_LABEL, - SUBMODULE_EMPTY_LABEL + getSubmoduleLoadingLabel(), + getSubmoduleEmptyLabel() ) } return rows + // oxlint-disable-next-line react-hooks/exhaustive-deps -- placeholder labels read the UI language. }, [ collapsedTreeDirs, displaySections, treeRootsBySection, expandedSubmoduleKeys, sourceControlViewMode, - submoduleStatusByKey + submoduleStatusByKey, + languageRevision ]) // List view needs the same lazy submodule expansion as tree view, spliced into the flat entry list. @@ -191,12 +195,19 @@ export function useSourceControlFileProjection({ section.items, expandedSubmoduleKeys, submoduleStatusByKey, - SUBMODULE_LOADING_LABEL, - SUBMODULE_EMPTY_LABEL + getSubmoduleLoadingLabel(), + getSubmoduleEmptyLabel() ) } return rows - }, [displaySections, expandedSubmoduleKeys, sourceControlViewMode, submoduleStatusByKey]) + // oxlint-disable-next-line react-hooks/exhaustive-deps -- placeholder labels read the UI language. + }, [ + displaySections, + expandedSubmoduleKeys, + sourceControlViewMode, + submoduleStatusByKey, + languageRevision + ]) const branchTreeRoots = useMemo( () => diff --git a/src/renderer/src/components/sidebar/NonGitFolderDialog.tsx b/src/renderer/src/components/sidebar/NonGitFolderDialog.tsx index b7b375704ad..94367c63e19 100644 --- a/src/renderer/src/components/sidebar/NonGitFolderDialog.tsx +++ b/src/renderer/src/components/sidebar/NonGitFolderDialog.tsx @@ -34,7 +34,13 @@ async function addSshFolderProject(args: { ownerOptions: ReturnType }> { if (!args.runtimeEnvironmentId) { - throw new Error(`SSH connection "${args.connectionId}" not found or not connected`) + throw new Error( + translate( + 'auto.components.sidebar.NonGitFolderDialog.sshConnectionUnavailable', + 'SSH connection "{{connection}}" not found or not connected', + { connection: args.connectionId } + ) + ) } const added = await addRuntimeSshRepo(args.runtimeEnvironmentId, { connectionId: args.connectionId, diff --git a/src/renderer/src/components/sidebar/RemoveFolderDialog.tsx b/src/renderer/src/components/sidebar/RemoveFolderDialog.tsx index 777dc021c25..ad8beb22606 100644 --- a/src/renderer/src/components/sidebar/RemoveFolderDialog.tsx +++ b/src/renderer/src/components/sidebar/RemoveFolderDialog.tsx @@ -86,16 +86,14 @@ const RemoveFolderDialog = React.memo(function RemoveFolderDialog() { const openTerminalWarning = openTerminalCount === 0 ? null - : openTerminalCount === 1 - ? translate( - 'auto.components.sidebar.RemoveFolderDialog.openTerminalWarningOne', - '1 open terminal in this project will be closed.' - ) - : translate( - 'auto.components.sidebar.RemoveFolderDialog.openTerminalWarningMany', - '{{count}} open terminals in this project will be closed.', - { count: openTerminalCount } - ) + : translate( + 'auto.components.sidebar.RemoveFolderDialog.openTerminalWarning', + '{{count}} open terminals in this project will be closed.', + { + count: openTerminalCount, + defaultValue_one: '{{count}} open terminal in this project will be closed.' + } + ) // Translate the whole sentence for reorderable locales, then restore emphasis at the name sentinel. const description = diff --git a/src/renderer/src/components/sidebar/SidebarHeader.test.tsx b/src/renderer/src/components/sidebar/SidebarHeader.test.tsx index 7d272a9bdf7..bc504cc17e0 100644 --- a/src/renderer/src/components/sidebar/SidebarHeader.test.tsx +++ b/src/renderer/src/components/sidebar/SidebarHeader.test.tsx @@ -55,8 +55,7 @@ vi.mock('./SidebarWorkspaceOptionsMenu', () => ({ vi.mock('./workspace-options-menu-items', () => ({ useWorkspaceOptionsFilterBadge: () => ({ hasAnyFilter: false, - activeFilterCount: 0, - activeFilterLabel: '0 filters' + activeFilterCount: 0 }), WorkspaceOptionsMenuItems: () => null })) diff --git a/src/renderer/src/components/sidebar/SidebarRepositoryFilterSection.tsx b/src/renderer/src/components/sidebar/SidebarRepositoryFilterSection.tsx index 9cb112d6585..60106936215 100644 --- a/src/renderer/src/components/sidebar/SidebarRepositoryFilterSection.tsx +++ b/src/renderer/src/components/sidebar/SidebarRepositoryFilterSection.tsx @@ -23,13 +23,13 @@ function getProjectFilterVisibilityLabel({ 'All projects' ) } - if (selectedCount === 1) { - return selectedRepos[0]?.displayName ?? 'Projects' + if (selectedCount === 1 && selectedRepos[0]) { + return selectedRepos[0].displayName } return translate( - 'auto.components.sidebar.SidebarRepositoryFilterSection.selectedProjectsCount', - '{{value0}} projects', - { value0: selectedCount } + 'auto.components.sidebar.SidebarRepositoryFilterSection.selectedProjects', + '{{count}} projects', + { count: selectedCount, defaultValue_one: '{{count}} project' } ) } diff --git a/src/renderer/src/components/sidebar/SidebarWorkspaceOptionsMenu.tsx b/src/renderer/src/components/sidebar/SidebarWorkspaceOptionsMenu.tsx index 2bc48bc9212..80ea20bd8f7 100644 --- a/src/renderer/src/components/sidebar/SidebarWorkspaceOptionsMenu.tsx +++ b/src/renderer/src/components/sidebar/SidebarWorkspaceOptionsMenu.tsx @@ -26,7 +26,7 @@ const SidebarWorkspaceOptionsMenu = React.memo(function SidebarWorkspaceOptionsM }: SidebarWorkspaceOptionsMenuProps) { useUiLanguageRevision() const [open, setOpen] = useState(false) - const { hasAnyFilter, activeFilterCount, activeFilterLabel } = useWorkspaceOptionsFilterBadge() + const { hasAnyFilter, activeFilterCount } = useWorkspaceOptionsFilterBadge() const handleOpenChange = useCallback( (next: boolean) => { @@ -49,9 +49,12 @@ const SidebarWorkspaceOptionsMenu = React.memo(function SidebarWorkspaceOptionsM aria-label={ hasAnyFilter ? translate( - 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.optionsActiveLabel', - 'Workspace options ({{value0}} active)', - { value0: activeFilterLabel } + 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.optionsActiveFilters', + 'Workspace options ({{count}} filters active)', + { + count: activeFilterCount, + defaultValue_one: 'Workspace options ({{count}} filter active)' + } ) : translate( 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.9919ae1082', @@ -68,9 +71,12 @@ const SidebarWorkspaceOptionsMenu = React.memo(function SidebarWorkspaceOptionsM {hasAnyFilter ? translate( - 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.bc96dbd041', - 'Workspace options ({{value0}})', - { value0: activeFilterLabel } + 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.optionsFilterCount', + 'Workspace options ({{count}} filters)', + { + count: activeFilterCount, + defaultValue_one: 'Workspace options ({{count}} filter)' + } ) : translate( 'auto.components.sidebar.SidebarWorkspaceOptionsMenu.9919ae1082', diff --git a/src/renderer/src/components/sidebar/WorktreeCardAgents.tsx b/src/renderer/src/components/sidebar/WorktreeCardAgents.tsx index fb6a104e2f1..5ff16ef8a1b 100644 --- a/src/renderer/src/components/sidebar/WorktreeCardAgents.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCardAgents.tsx @@ -27,6 +27,7 @@ import { DEFAULT_AGENT_ACTIVITY_DISPLAY_MODE } from '../../../../shared/constant import { revealElementInScrollContainer } from './worktree-sidebar-reveal' import { useWorktreeAgentExpansionState } from './worktree-card-agents-expansion-state' import { translate } from '@/i18n/i18n' +import { agentSendDisabledReasonLabel } from '@/lib/agent-send-disabled-reason-label' import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision' import { activateStructuredAgentSessionTab } from '@/lib/agent-session/structured-agent-session-tab-activation' import { activateRetainedAgentRow } from './activate-retained-agent-row' @@ -80,7 +81,7 @@ const WorktreeCardAgentsBody = React.memo(function WorktreeCardAgentsBody({ agents, className }: BodyProps) { - useUiLanguageRevision() + const languageRevision = useUiLanguageRevision() const agentActivityDisplayMode = useAppStore((s) => s.agentActivityDisplayMode) ?? DEFAULT_AGENT_ACTIVITY_DISPLAY_MODE const dropAgentStatus = useAppStore((s) => s.dropAgentStatus) @@ -115,6 +116,7 @@ const WorktreeCardAgentsBody = React.memo(function WorktreeCardAgentsBody({ const isAgentSendTargetModeActive = agentSendPopoverTargetMode !== null const sendTargetsByPaneKey = useMemo(() => { void agentStatusEpoch + void languageRevision if (!isAgentSendTargetModeActive) { return new Map< string, @@ -127,15 +129,25 @@ const WorktreeCardAgentsBody = React.memo(function WorktreeCardAgentsBody({ target.paneKey, agentSendPopoverTargetMode?.status === 'sending' && agentSendPopoverTargetMode.sendingPaneKey === target.paneKey - ? { status: 'sending' as const, disabledReason: 'Sending...' } + ? { + status: 'sending' as const, + disabledReason: translate( + 'auto.components.sidebar.WorktreeCardAgents.sendingTarget', + 'Sending...' + ) + } : target.disabledReason - ? { status: target.status, disabledReason: target.disabledReason } + ? { + status: target.status, + disabledReason: agentSendDisabledReasonLabel(target.disabledReason) + } : { status: target.status } ]) ) }, [ // Freshness timers advance this epoch without replacing the status map. agentStatusEpoch, + languageRevision, agentSendPopoverTargetMode?.sendingPaneKey, agentSendPopoverTargetMode?.status, isAgentSendTargetModeActive, @@ -358,7 +370,10 @@ const WorktreeCardAgentsBody = React.memo(function WorktreeCardAgentsBody({ const summaryAgents = hasLineage ? rootAgents : agents // Collapse compact multi-agent lists except when their rows are the send-target picker. const shouldUseSummaryRow = summaryAgents.length > 1 && !isAgentSendTargetModeActive - const subjectLabel = `${hasLineage ? rootAgents.length : agents.length} agents` + const subjectLabel = translate('sidebar.agentSummary.agentCount', '{{count}} agents', { + count: hasLineage ? rootAgents.length : agents.length, + defaultValue_one: '{{count}} agent' + }) return (
s.repos) @@ -54,8 +52,7 @@ export function useWorkspaceOptionsFilterBadge(): { ) return { hasAnyFilter: activeFilterCount > 0, - activeFilterCount, - activeFilterLabel: activeFilterCountLabel(activeFilterCount) + activeFilterCount } } diff --git a/src/renderer/src/components/sidebar/worktree-card-agent-summary.ts b/src/renderer/src/components/sidebar/worktree-card-agent-summary.ts index f50333786ad..de0021b87a5 100644 --- a/src/renderer/src/components/sidebar/worktree-card-agent-summary.ts +++ b/src/renderer/src/components/sidebar/worktree-card-agent-summary.ts @@ -2,6 +2,7 @@ import type { AgentDotState } from '@/components/AgentStateDot' import type { DashboardAgentRow as DashboardAgentRowData } from '@/components/dashboard/useDashboardData' import { formatAgentTypeLabel } from '@/lib/agent-status' import { agentRowDisplayDotState } from '@/lib/agent-row-dot-state' +import { translate } from '@/i18n/i18n' export type SummaryAgentGroup = { state: AgentDotState @@ -31,27 +32,173 @@ export function getAgentDotState(agent: DashboardAgentRowData): AgentDotState { export function formatSummaryStateLabel(state: AgentDotState): string { switch (state) { case 'waiting': - return 'waiting' + return translate('sidebar.agentSummary.state.waiting', 'waiting') case 'blocked': - return 'blocked' + return translate('sidebar.agentSummary.state.blocked', 'blocked') case 'interrupted': - return 'interrupted' + return translate('sidebar.agentSummary.state.interrupted', 'interrupted') case 'failed': - return 'failed' + return translate('sidebar.agentSummary.state.failed', 'failed') case 'working': - return 'working' + return translate('sidebar.agentSummary.state.working', 'working') case 'monitoring': - return 'monitoring' + return translate('sidebar.agentSummary.state.monitoring', 'monitoring') case 'done': - return 'done' + return translate('sidebar.agentSummary.state.done', 'done') case 'idle': - return 'idle' + return translate('sidebar.agentSummary.state.idle', 'idle') case 'unverifiable': - return 'not reporting' + return translate('sidebar.agentSummary.state.notReporting', 'not reporting') case 'unconfirmed': - return 'unconfirmed' + return translate('sidebar.agentSummary.state.unconfirmed', 'unconfirmed') case 'permission': - return 'needs attention' + return translate('sidebar.agentSummary.state.needsAttention', 'needs attention') + } +} + +// Per-state plural keys let locales inflect the status word for its count. +function formatStateCount(state: AgentDotState, count: number): string { + switch (state) { + case 'waiting': + return translate('sidebar.agentSummary.stateCount.waiting', '{{count}} waiting', { + count, + defaultValue_one: '{{count}} waiting' + }) + case 'blocked': + return translate('sidebar.agentSummary.stateCount.blocked', '{{count}} blocked', { + count, + defaultValue_one: '{{count}} blocked' + }) + case 'interrupted': + return translate('sidebar.agentSummary.stateCount.interrupted', '{{count}} interrupted', { + count, + defaultValue_one: '{{count}} interrupted' + }) + case 'failed': + return translate('sidebar.agentSummary.stateCount.failed', '{{count}} failed', { + count, + defaultValue_one: '{{count}} failed' + }) + case 'working': + return translate('sidebar.agentSummary.stateCount.working', '{{count}} working', { + count, + defaultValue_one: '{{count}} working' + }) + case 'monitoring': + return translate('sidebar.agentSummary.stateCount.monitoring', '{{count}} monitoring', { + count, + defaultValue_one: '{{count}} monitoring' + }) + case 'done': + return translate('sidebar.agentSummary.stateCount.done', '{{count}} done', { + count, + defaultValue_one: '{{count}} done' + }) + case 'idle': + return translate('sidebar.agentSummary.stateCount.idle', '{{count}} idle', { + count, + defaultValue_one: '{{count}} idle' + }) + case 'unverifiable': + return translate('sidebar.agentSummary.stateCount.notReporting', '{{count}} not reporting', { + count, + defaultValue_one: '{{count}} not reporting' + }) + case 'unconfirmed': + return translate('sidebar.agentSummary.stateCount.unconfirmed', '{{count}} unconfirmed', { + count, + defaultValue_one: '{{count}} unconfirmed' + }) + case 'permission': + return translate( + 'sidebar.agentSummary.stateCount.needsAttention', + '{{count}} needs attention', + { + count, + defaultValue_one: '{{count}} needs attention' + } + ) + } +} + +// The _one form drops "All" because a lone agent reads "1 agent done". +function formatAllAgentsInState(state: AgentDotState, count: number): string { + switch (state) { + case 'waiting': + return translate('sidebar.agentSummary.allInState.waiting', 'All {{count}} agents waiting', { + count, + defaultValue_one: '{{count}} agent waiting' + }) + case 'blocked': + return translate('sidebar.agentSummary.allInState.blocked', 'All {{count}} agents blocked', { + count, + defaultValue_one: '{{count}} agent blocked' + }) + case 'interrupted': + return translate( + 'sidebar.agentSummary.allInState.interrupted', + 'All {{count}} agents interrupted', + { + count, + defaultValue_one: '{{count}} agent interrupted' + } + ) + case 'failed': + return translate('sidebar.agentSummary.allInState.failed', 'All {{count}} agents failed', { + count, + defaultValue_one: '{{count}} agent failed' + }) + case 'working': + return translate('sidebar.agentSummary.allInState.working', 'All {{count}} agents working', { + count, + defaultValue_one: '{{count}} agent working' + }) + case 'monitoring': + return translate( + 'sidebar.agentSummary.allInState.monitoring', + 'All {{count}} agents monitoring', + { + count, + defaultValue_one: '{{count}} agent monitoring' + } + ) + case 'done': + return translate('sidebar.agentSummary.allInState.done', 'All {{count}} agents done', { + count, + defaultValue_one: '{{count}} agent done' + }) + case 'idle': + return translate('sidebar.agentSummary.allInState.idle', 'All {{count}} agents idle', { + count, + defaultValue_one: '{{count}} agent idle' + }) + case 'unverifiable': + return translate( + 'sidebar.agentSummary.allInState.notReporting', + 'All {{count}} agents not reporting', + { + count, + defaultValue_one: '{{count}} agent not reporting' + } + ) + case 'unconfirmed': + return translate( + 'sidebar.agentSummary.allInState.unconfirmed', + 'All {{count}} agents unconfirmed', + { + count, + defaultValue_one: '{{count}} agent unconfirmed' + } + ) + case 'permission': + return translate( + 'sidebar.agentSummary.allInState.needsAttention', + 'All {{count}} agents needs attention', + { + count, + defaultValue_one: '{{count}} agent needs attention' + } + ) } } @@ -78,21 +225,14 @@ export function summarizeAgents(agents: DashboardAgentRowData[], subjectLabel: s const dotState = getAgentDotState(agent) counts.set(dotState, (counts.get(dotState) ?? 0) + 1) } - const parts = SUMMARY_STATE_ORDER.flatMap((state) => { - const count = counts.get(state) ?? 0 - if (count === 0) { - return [] - } - const label = formatSummaryStateLabel(state) - return `${count} ${label}` - }) - if (parts.length === 1) { - const onlyStatusLabel = parts[0].replace(/^\d+\s+/, '') - return agents.length === 1 - ? `${subjectLabel} ${onlyStatusLabel}` - : `All ${subjectLabel} ${onlyStatusLabel}` + const states = SUMMARY_STATE_ORDER.filter((state) => (counts.get(state) ?? 0) > 0) + if (states.length === 1) { + return formatAllAgentsInState(states[0], agents.length) } - return `${subjectLabel}: ${parts.join(', ')}` + return translate('sidebar.agentSummary.mixedStates', '{{subject}}: {{states}}', { + subject: subjectLabel, + states: states.map((state) => formatStateCount(state, counts.get(state) ?? 0)).join(', ') + }) } export function summarizeAgentIdentities(agents: DashboardAgentRowData[]): string { @@ -100,7 +240,10 @@ export function summarizeAgentIdentities(agents: DashboardAgentRowData[]): strin .map((agent) => { const agentLabel = formatAgentTypeLabel(agent.agentType) const stateLabel = formatSummaryStateLabel(getAgentDotState(agent)) - return `${agentLabel} ${stateLabel}` + return translate('sidebar.agentSummary.agentIdentityState', '{{agent}} {{status}}', { + agent: agentLabel, + status: stateLabel + }) }) .join('; ') } diff --git a/src/renderer/src/components/status-bar/PetStatusSegment.tsx b/src/renderer/src/components/status-bar/PetStatusSegment.tsx index 11352eb9474..e9ecf21c3ca 100644 --- a/src/renderer/src/components/status-bar/PetStatusSegment.tsx +++ b/src/renderer/src/components/status-bar/PetStatusSegment.tsx @@ -43,8 +43,12 @@ function PetStatusSegmentInner(): React.JSX.Element { ? activeBundled.label : activeCustom ? customPetLabel(activeCustom) - : 'Pet' - const label = petVisible ? activeLabel : `${activeLabel} hidden` + : translate('auto.components.status.bar.PetStatusSegment.petFallbackLabel', 'Pet') + const label = petVisible + ? activeLabel + : translate('auto.components.status.bar.PetStatusSegment.petHiddenLabel', '{{pet}} hidden', { + pet: activeLabel + }) const handleImport = async (): Promise => { console.log('[pet-overlay] upload: click') diff --git a/src/renderer/src/components/workspace-cleanup/workspace-cleanup-candidate-row.tsx b/src/renderer/src/components/workspace-cleanup/workspace-cleanup-candidate-row.tsx index e376e943816..0275ead127f 100644 --- a/src/renderer/src/components/workspace-cleanup/workspace-cleanup-candidate-row.tsx +++ b/src/renderer/src/components/workspace-cleanup/workspace-cleanup-candidate-row.tsx @@ -206,10 +206,11 @@ export const CandidateRow = React.memo(function CandidateRow({ ) : null} - {translate( - 'auto.components.workspace.cleanup.WorkspaceCleanupDialog.352f15d6fc', - 'Last active' - )}{' '} - {formatWorkspaceCleanupRelativeTime(candidate.lastActivityAt, now)} + {translate('components.workspace.cleanup.browse.lastActive', 'Last active {{value0}}', { + value0: formatWorkspaceCleanupRelativeTime(candidate.lastActivityAt, now) + })} {factStatuses.map((status) => ( diff --git a/src/renderer/src/components/worktree-jump-palette-surface.tsx b/src/renderer/src/components/worktree-jump-palette-surface.tsx index c72325c00ff..0957a6b8b57 100644 --- a/src/renderer/src/components/worktree-jump-palette-surface.tsx +++ b/src/renderer/src/components/worktree-jump-palette-surface.tsx @@ -177,9 +177,14 @@ export function WorktreeJumpPaletteSurface({
{controller.filterActive - ? `${translate('worktreeJumpPalette.filter.ariaActive', 'Filter: {{value0}} active.', { - value0: getPaletteFilterSelectionCount(controller.filter) - })} ` + ? `${translate( + 'worktreeJumpPalette.filter.ariaActiveCount', + 'Filter: {{count}} active.', + { + count: getPaletteFilterSelectionCount(controller.filter), + defaultValue_one: 'Filter: {{count}} active.' + } + )} ` : ''} {controller.deferredQuery.trim() ? translate( diff --git a/src/renderer/src/i18n/en-runtime-required.json b/src/renderer/src/i18n/en-runtime-required.json index 810908a19e2..6845fd48e78 100644 --- a/src/renderer/src/i18n/en-runtime-required.json +++ b/src/renderer/src/i18n/en-runtime-required.json @@ -118,6 +118,12 @@ "resultsFound_other": "{{count}} results found." }, "activity": { + "ActivityPrototypePage": { + "activityOptionsFilterCount_one": "Activity options ({{count}} filter)", + "activityOptionsFilterCount_other": "Activity options ({{count}} filters)", + "threadListOptionsActiveFilters_one": "Thread list options ({{count}} filter active)", + "threadListOptionsActiveFilters_other": "Thread list options ({{count}} filters active)" + }, "ActivityThreadContextMenu": { "clearMany_one": "Clear {{count}} Agent from List", "clearMany_other": "Clear {{count}} Agents from List", @@ -145,6 +151,8 @@ "usageCoverageRuns_other": "{{known}}/{{count}} runs" }, "AutomationRunsDashboard": { + "historyUnavailable_one": "Run history is unavailable for {{count}} automation. Counts include available history only.", + "historyUnavailable_other": "Run history is unavailable for {{count}} automations. Counts include available history only.", "local": "Local", "remote": "Remote" }, @@ -175,6 +183,10 @@ "extraAgentArgs": { "unsupported": "Extra arguments aren't supported for this agent yet." }, + "hostSummary": { + "partialFailureOfHosts_one": "{{failed}} of {{count}} host could not be loaded", + "partialFailureOfHosts_other": "{{failed}} of {{count}} hosts could not be loaded" + }, "runHistory": { "occurrencesCount_one": "{{count}} time", "occurrencesCount_other": "{{count}} times", @@ -885,10 +897,24 @@ "removeContainedProjects_one": "Remove {{count}} contained project", "removeContainedProjects_other": "Remove {{count}} contained projects" }, + "RemoveFolderDialog": { + "openTerminalWarning_one": "{{count}} open terminal in this project will be closed.", + "openTerminalWarning_other": "{{count}} open terminals in this project will be closed." + }, "SetupScriptPromptCard": { "savedWithSkippedFields_one": "{{count}} unsupported field skipped. Saved the setup command.", "savedWithSkippedFields_other": "{{count}} unsupported fields skipped. Saved the setup command." }, + "SidebarRepositoryFilterSection": { + "selectedProjects_one": "{{count}} project", + "selectedProjects_other": "{{count}} projects" + }, + "SidebarWorkspaceOptionsMenu": { + "optionsActiveFilters_one": "Workspace options ({{count}} filter active)", + "optionsActiveFilters_other": "Workspace options ({{count}} filters active)", + "optionsFilterCount_one": "Workspace options ({{count}} filter)", + "optionsFilterCount_other": "Workspace options ({{count}} filters)" + }, "WorkspaceKanbanDrawerHeader": { "selectedCount_one": "{{count}} selected", "selectedCount_other": "{{count}} selected" @@ -2149,6 +2175,58 @@ } }, "sidebar": { + "agentSummary": { + "agentCount_one": "{{count}} agent", + "agentCount_other": "{{count}} agents", + "allInState": { + "blocked_one": "{{count}} agent blocked", + "blocked_other": "All {{count}} agents blocked", + "done_one": "{{count}} agent done", + "done_other": "All {{count}} agents done", + "failed_one": "{{count}} agent failed", + "failed_other": "All {{count}} agents failed", + "idle_one": "{{count}} agent idle", + "idle_other": "All {{count}} agents idle", + "interrupted_one": "{{count}} agent interrupted", + "interrupted_other": "All {{count}} agents interrupted", + "monitoring_one": "{{count}} agent monitoring", + "monitoring_other": "All {{count}} agents monitoring", + "needsAttention_one": "{{count}} agent needs attention", + "needsAttention_other": "All {{count}} agents needs attention", + "notReporting_one": "{{count}} agent not reporting", + "notReporting_other": "All {{count}} agents not reporting", + "unconfirmed_one": "{{count}} agent unconfirmed", + "unconfirmed_other": "All {{count}} agents unconfirmed", + "waiting_one": "{{count}} agent waiting", + "waiting_other": "All {{count}} agents waiting", + "working_one": "{{count}} agent working", + "working_other": "All {{count}} agents working" + }, + "stateCount": { + "blocked_one": "{{count}} blocked", + "blocked_other": "{{count}} blocked", + "done_one": "{{count}} done", + "done_other": "{{count}} done", + "failed_one": "{{count}} failed", + "failed_other": "{{count}} failed", + "idle_one": "{{count}} idle", + "idle_other": "{{count}} idle", + "interrupted_one": "{{count}} interrupted", + "interrupted_other": "{{count}} interrupted", + "monitoring_one": "{{count}} monitoring", + "monitoring_other": "{{count}} monitoring", + "needsAttention_one": "{{count}} needs attention", + "needsAttention_other": "{{count}} needs attention", + "notReporting_one": "{{count}} not reporting", + "notReporting_other": "{{count}} not reporting", + "unconfirmed_one": "{{count}} unconfirmed", + "unconfirmed_other": "{{count}} unconfirmed", + "waiting_one": "{{count}} waiting", + "waiting_other": "{{count}} waiting", + "working_one": "{{count}} working", + "working_other": "{{count}} working" + } + }, "createProject": { "errors": { "createDirectoryFailed": "Failed to create directory: {{detail}}", @@ -2312,10 +2390,10 @@ "namingFailure": { "errors": { "agentNotRun": "Orca could not run the chat-name agent.", - "noAgentAvailable": "No chat-name agent can run in this workspace.", - "noName": "The chat-name agent returned no name.", + "antigravityFailed": "Antigravity could not name this chat. Try generating the name again.", "grokFailed": "Grok could not name this chat. Try generating the name again.", - "antigravityFailed": "Antigravity could not name this chat. Try generating the name again." + "noAgentAvailable": "No chat-name agent can run in this workspace.", + "noName": "The chat-name agent returned no name." } } }, @@ -2389,14 +2467,16 @@ "showLinked_other": "Show {{count}} linked reviews and tasks" } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filter", - "activeFilterCount_other": "{{count}} filters" - }, "workspaceSpace": { "compact": { "linkedAndScannedCount_one": "{{size}} in linked worktrees · {{count}} workspace", "linkedAndScannedCount_other": "{{size}} in linked worktrees · {{count}} workspaces" } + }, + "worktreeJumpPalette": { + "filter": { + "ariaActiveCount_one": "Filter: {{count}} active.", + "ariaActiveCount_other": "Filter: {{count}} active." + } } } diff --git a/src/renderer/src/i18n/locales/de.json b/src/renderer/src/i18n/locales/de.json index e73516f535a..c2ddf2a471d 100644 --- a/src/renderer/src/i18n/locales/de.json +++ b/src/renderer/src/i18n/locales/de.json @@ -138,6 +138,73 @@ "peerCheckFailed": "Orca konnte den WSL-Host nicht fragen, ob eine andere Orca-Instanz auf diesem Computer ihn noch nutzt: {{detail}}", "removalUnrecorded": "Orca konnte nicht erfassen, was nach dem Entfernen noch läuft: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "wartend", + "blocked": "blockiert", + "interrupted": "unterbrochen", + "failed": "fehlgeschlagen", + "working": "in Arbeit", + "monitoring": "Überwachung aktiv", + "done": "erledigt", + "idle": "inaktiv", + "notReporting": "ohne Statusmeldung", + "unconfirmed": "unbestätigt", + "needsAttention": "Aufmerksamkeit erforderlich" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}}: {{status}}", + "agentCount_one": "{{count}} Agent", + "agentCount_other": "{{count}} Agenten", + "stateCount": { + "waiting_one": "{{count}} wartend", + "waiting_other": "{{count}} wartend", + "blocked_one": "{{count}} blockiert", + "blocked_other": "{{count}} blockiert", + "interrupted_one": "{{count}} unterbrochen", + "interrupted_other": "{{count}} unterbrochen", + "failed_one": "{{count}} fehlgeschlagen", + "failed_other": "{{count}} fehlgeschlagen", + "working_one": "{{count}} arbeitet", + "working_other": "{{count}} arbeiten", + "monitoring_one": "{{count}} mit aktiver Überwachung", + "monitoring_other": "{{count}} mit aktiver Überwachung", + "done_one": "{{count}} fertig", + "done_other": "{{count}} fertig", + "idle_one": "{{count}} inaktiv", + "idle_other": "{{count}} inaktiv", + "notReporting_one": "{{count}} ohne Statusmeldung", + "notReporting_other": "{{count}} ohne Statusmeldung", + "unconfirmed_one": "{{count}} unbestätigt", + "unconfirmed_other": "{{count}} unbestätigt", + "needsAttention_one": "{{count}} benötigt Aufmerksamkeit", + "needsAttention_other": "{{count}} benötigen Aufmerksamkeit" + }, + "allInState": { + "waiting_one": "{{count}} Agent wartet", + "waiting_other": "Alle {{count}} Agenten warten", + "blocked_one": "{{count}} Agent blockiert", + "blocked_other": "Alle {{count}} Agenten blockiert", + "interrupted_one": "{{count}} Agent unterbrochen", + "interrupted_other": "Alle {{count}} Agenten unterbrochen", + "failed_one": "{{count}} Agent fehlgeschlagen", + "failed_other": "Alle {{count}} Agenten fehlgeschlagen", + "working_one": "{{count}} Agent arbeitet", + "working_other": "Alle {{count}} Agenten arbeiten", + "monitoring_one": "{{count}} Agent mit aktiver Überwachung", + "monitoring_other": "Alle {{count}} Agenten mit aktiver Überwachung", + "done_one": "{{count}} Agent fertig", + "done_other": "Alle {{count}} Agenten fertig", + "idle_one": "{{count}} Agent inaktiv", + "idle_other": "Alle {{count}} Agenten inaktiv", + "notReporting_one": "{{count}} Agent ohne Statusmeldung", + "notReporting_other": "Alle {{count}} Agenten ohne Statusmeldung", + "unconfirmed_one": "{{count}} Agent unbestätigt", + "unconfirmed_other": "Alle {{count}} Agenten unbestätigt", + "needsAttention_one": "{{count}} Agent benötigt Aufmerksamkeit", + "needsAttention_other": "Alle {{count}} Agenten benötigen Aufmerksamkeit" + } } }, "app": { @@ -967,8 +1034,9 @@ "clearHosts": "Host-Auswahl zurücksetzen", "clearProjects": "Projektauswahl zurücksetzen", "back": "Zurück", - "ariaActive": "Filter: {{value0}} aktiv.", - "scopedTo": "Beschränkt auf" + "scopedTo": "Beschränkt auf", + "ariaActiveCount_one": "Filter: {{count}} aktiv.", + "ariaActiveCount_other": "Filter: {{count}} aktiv." }, "taskUrl": { "loadingHint": "{{value0}} wird geladen…", @@ -3603,7 +3671,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "{{value0}} entfernen", - "352f15d6fc": "Zuletzt aktiv", "b6bae1eed1": "Abbrechen", "38ca0b1400": "Dadurch werden die zugehörigen lokalen Dateien dauerhaft gelöscht. Dies lässt sich nicht rückgängig machen.", "e97e4580c7": "Geändert", @@ -4340,7 +4407,9 @@ "f395c9a685": "Dateiimport fehlgeschlagen", "e6234bcc17": "Das Hochladen eines eigenen Haustiers erfordert einen vollständigen Neustart der App (bloßes Neuladen reicht nicht).", "6d0a8cd179": "Haustier anzeigen", - "1fbc51cc77": "Haustier ausblenden" + "1fbc51cc77": "Haustier ausblenden", + "petFallbackLabel": "Haustier", + "petHiddenLabel": "{{pet}} ausgeblendet" }, "PortsStatusSegment": { "4ebf90c12e": "Keine externen Ports erkannt", @@ -5926,7 +5995,8 @@ "c49fb13492": "Ordner konnte auf diesem Host nicht hinzugefügt werden", "9a766f33ac": "Dieser Pfad wurde auf dem SSH-Host geprüft.", "79fd02cf5f": "Dieser Pfad wurde auf {{hostName}} geprüft.", - "8851b77327": "Dieser Pfad wurde lokal geprüft." + "8851b77327": "Dieser Pfad wurde lokal geprüft.", + "sshConnectionUnavailable": "SSH-Verbindung „{{connection}}“ wurde nicht gefunden oder ist nicht verbunden" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Hooks ausführen", @@ -6012,8 +6082,8 @@ "removeDescriptionSsh": "Dies entfernt {{name}} nur aus Orca. Die Dateien bleiben auf {{host}} — zum Wiederherstellen diesen SSH-Host erneut hinzufügen.", "removeDescriptionLocal": "Dies entfernt {{name}} nur aus Orca. Es bleibt auf dem Datenträger erhalten.", "removeDescriptionVmRecipe": "Dies entfernt {{name}} aus Orca. Das zugehörige VM-Rezept legt fest, ob die Umgebung und ihre Dateien dauerhaft gelöscht werden.", - "openTerminalWarningOne": "1 offenes Terminal in diesem Projekt wird geschlossen.", - "openTerminalWarningMany": "{{count}} offene Terminals in diesem Projekt werden geschlossen." + "openTerminalWarning_one": "{{count}} offenes Terminal in diesem Projekt wird geschlossen.", + "openTerminalWarning_other": "{{count}} offene Terminals in diesem Projekt werden geschlossen." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Aktiven Arbeitsbereich anzeigen" @@ -6123,7 +6193,8 @@ "4815c70605": "Keine passenden Projekte", "bbbc6e8e3b": "Keine passenden nicht ausgewählten Projekte", "allProjects": "Alle Projekte", - "selectedProjectsCount": "{{value0}} Projekte" + "selectedProjects_one": "{{count}} Projekt", + "selectedProjects_other": "{{count}} Projekte" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Orca neu starten", @@ -6184,8 +6255,6 @@ "7bada3b1ab": "Sortieren nach", "dc0bb670bc": "Gruppieren nach", "9919ae1082": "Arbeitsbereichsoptionen", - "bc96dbd041": "Arbeitsbereichsoptionen ({{value0}})", - "optionsActiveLabel": "Arbeitsbereichsoptionen ({{value0}} aktiv)", "af9249c505": "Letzte Arbeitsbereichsaktivität", "b451c8b162": "Zuletzt aktiv", "6664282a7b": "Projekte zum Anordnen ziehen", @@ -6219,7 +6288,11 @@ "219ebf1961": "Branch-Name", "folderPathIdentity": "Branch / Ordnerpfad", "cli": "Orca CLI", - "workspaceOptions": "Arbeitsbereichsoptionen" + "workspaceOptions": "Arbeitsbereichsoptionen", + "optionsActiveFilters_one": "Arbeitsbereichsoptionen ({{count}} Filter aktiv)", + "optionsActiveFilters_other": "Arbeitsbereichsoptionen ({{count}} Filter aktiv)", + "optionsFilterCount_one": "Arbeitsbereichsoptionen ({{count}} Filter)", + "optionsFilterCount_other": "Arbeitsbereichsoptionen ({{count}} Filter)" }, "SshTargetRow": { "4677394048": "Verbindung wird hergestellt…", @@ -6289,7 +6362,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agenten", - "agentUnavailable": "Agent ist nicht verfügbar" + "agentUnavailable": "Agent ist nicht verfügbar", + "sendingTarget": "Wird gesendet…" }, "WorktreeCardMeta": { "3e65e11cc6": "Metadaten des Arbeitsbereichs", @@ -17274,9 +17348,6 @@ "sortedAscending": "{{value0}}, aufsteigend sortiert", "sortedDescending": "{{value0}}, absteigend sortiert" }, - "hostSummary": { - "partialFailure": "{{failed}} von {{total}} Hosts konnten nicht geladen werden" - }, "emptyState": { "unknownHost": "dieser Host", "hostLoading": "Host wird geladen…", @@ -17390,8 +17461,6 @@ "failed24h": "Fehlgeschlagen · 24 h", "successful7d": "Erfolgreich · 7 Tage", "failed7d": "Fehlgeschlagen · 7 Tage", - "historyUnavailableOne": "Für 1 Automatisierung ist der Ausführungsverlauf nicht verfügbar. Die Zählungen berücksichtigen nur verfügbare Verlaufsdaten.", - "historyUnavailableMany": "Für {{count}} Automatisierungen ist der Ausführungsverlauf nicht verfügbar. Die Zählungen berücksichtigen nur verfügbare Verlaufsdaten.", "automation": "Automatisierung", "triggered": "Ausgelöst", "trigger": "Auslöser", @@ -17400,7 +17469,9 @@ "emptyDescription": "Ausführungen erscheinen hier, sobald eine Automatisierung ausgelöst wurde.", "runs": "Ausführungen", "local": "Lokal", - "remote": "Entfernt" + "remote": "Entfernt", + "historyUnavailable_one": "Für {{count}} Automatisierung ist kein Ausführungsverlauf verfügbar. Die Zählwerte berücksichtigen nur den verfügbaren Verlauf.", + "historyUnavailable_other": "Für {{count}} Automatisierungen ist kein Ausführungsverlauf verfügbar. Die Zählwerte berücksichtigen nur den verfügbaren Verlauf." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Navigationspfad für Automatisierungen", @@ -17468,7 +17539,8 @@ }, "usage": { "tokensAndCost_one": "{{tokens}} Token · {{cost}}", - "tokensAndCost_other": "{{tokens}} Tokens · {{cost}}" + "tokensAndCost_other": "{{tokens}} Tokens · {{cost}}", + "costUnavailable": "k. A." }, "externalDisplay": { "sshHost": "SSH-Host", @@ -17480,6 +17552,10 @@ "connectSshHost": "Diesen SSH-Host verbinden, um Automatisierungen von {{provider}} zu verwalten.", "cannotManageOnSshHost": "{{provider}} kann auf diesem SSH-Host keine Automatisierungen verwalten.", "cannotManageLocally": "{{provider}} kann auf diesem Rechner keine Automatisierungen verwalten." + }, + "hostSummary": { + "partialFailureOfHosts_one": "Laden fehlgeschlagen: {{failed}} von {{count}} Host", + "partialFailureOfHosts_other": "Laden fehlgeschlagen: {{failed}} von {{count}} Hosts" } }, "agent": { @@ -17545,8 +17621,10 @@ }, "filtersSection": "Filter", "viewSection": "Ansicht", - "threadListOptionsActive": "Optionen für die Thread-Liste ({{value0}} aktiv)", - "activityOptionsActive": "Aktivitätsoptionen ({{value0}})" + "threadListOptionsActiveFilters_one": "Optionen für die Thread-Liste ({{count}} Filter aktiv)", + "threadListOptionsActiveFilters_other": "Optionen für die Thread-Liste ({{count}} Filter aktiv)", + "activityOptionsFilterCount_one": "Aktivitätsoptionen ({{count}} Filter)", + "activityOptionsFilterCount_other": "Aktivitätsoptionen ({{count}} Filter)" }, "clearCompleted": { "undo": "Rückgängig machen", @@ -19698,7 +19776,8 @@ "selectionWithheldCount_one": "{{count}} ausgewählter Arbeitsbereich wird durch die aktuellen Filter ausgeblendet und wurde abgewählt.", "selectionWithheldCount_other": "{{count}} ausgewählte Arbeitsbereiche werden durch die aktuellen Filter ausgeblendet und wurden abgewählt.", "selectAllSafetyChecked_one": "{{count}} sicherheitsgeprüften Arbeitsbereich auswählen", - "selectAllSafetyChecked_other": "Alle {{count}} sicherheitsgeprüften Arbeitsbereiche auswählen" + "selectAllSafetyChecked_other": "Alle {{count}} sicherheitsgeprüften Arbeitsbereiche auswählen", + "lastActive": "Zuletzt aktiv: {{value0}}" }, "scan": { "progress": "Arbeitsbereiche werden geprüft ({{value0}}/{{value1}})", @@ -20347,7 +20426,13 @@ "kimiContinueSessionConflict": "Kimi hat widersprüchliche Optionen erhalten: --continue, --session. Vor einem erneuten Versuch das Textgenerierungsrezept oder die CLI-Argumente korrigieren." }, "enableSourceControlAi": "KI für die Quellcodeverwaltung unter Einstellungen -> Git aktivieren.", - "chooseBaseBranch": "Vor dem Generieren einen Basis-Branch auswählen." + "chooseBaseBranch": "Vor dem Generieren einen Basis-Branch auswählen.", + "savedCommitRecipeRepo": "Rezept für Commit-Nachrichten für dieses Repository gespeichert.", + "savedCommitRecipeGlobal": "Rezept für Commit-Nachrichten als globalen Standard gespeichert.", + "savedReviewRecipeRepo": "Rezept für gehostete Reviews für dieses Repository gespeichert.", + "savedReviewRecipeGlobal": "Rezept für gehostete Reviews als globalen Standard gespeichert.", + "savedBranchRecipeRepo": "Rezept für Branch-Namen für dieses Repository gespeichert.", + "savedBranchRecipeGlobal": "Rezept für Branch-Namen als globalen Standard gespeichert." }, "remoteError": { "submodule": { @@ -20421,6 +20506,13 @@ "pull": "Pull blockiert — nicht versionierte Dateien zuerst verschieben, entfernen oder hinzufügen." }, "authenticationFailed": "Authentifizierung fehlgeschlagen. Die Zugangsdaten für das Remote prüfen." + }, + "submodule": { + "worktreeOnlyLabel": "Im Submodul vormerken", + "worktreeOnlyTooltip": "Das übergeordnete Repo (einschließlich „Alle vormerken“) kann Dateiänderungen in einem Submodul nicht vormerken", + "loading": "Submodul-Änderungen werden geladen…", + "empty": "Keine Änderungen im Submodul", + "loadFailed": "Submodul-Änderungen konnten nicht geladen werden" } }, "agentsSidebarIntro": { @@ -22098,10 +22190,6 @@ "workspaceApiKeyHint": "Einen persönlichen API-Schlüssel für {{workspace}} einfügen. Ist dieser Arbeitsbereich bereits verbunden, ersetzt Orca den gespeicherten Schlüssel." } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} Filter", - "activeFilterCount_other": "{{count}} Filter" - }, "editorConflicts": { "kind": { "addedByUs": "Auf eigener Seite hinzugefügt", @@ -22475,5 +22563,15 @@ "image": "Benutzerdefiniertes Haustier", "bundle": "Haustierpaket" } + }, + "diffComments": { + "lineRangeMeta": "Zeilen {{start}}-{{end}}", + "lineMeta": "Zeile {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "Agent benötigt eine Genehmigung", + "statusStale": "Agentenstatus ist veraltet" + } } } diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index fa2937539c2..b250a0bb90e 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -138,6 +138,73 @@ "peerCheckFailed": "Orca couldn’t ask the WSL host whether another Orca on this computer still uses it: {{detail}}", "removalUnrecorded": "Orca couldn’t record what this Remove left running: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "waiting", + "blocked": "blocked", + "interrupted": "interrupted", + "failed": "failed", + "working": "working", + "monitoring": "monitoring", + "done": "done", + "idle": "idle", + "notReporting": "not reporting", + "unconfirmed": "unconfirmed", + "needsAttention": "needs attention" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}} {{status}}", + "agentCount_one": "{{count}} agent", + "agentCount_other": "{{count}} agents", + "stateCount": { + "waiting_one": "{{count}} waiting", + "waiting_other": "{{count}} waiting", + "blocked_one": "{{count}} blocked", + "blocked_other": "{{count}} blocked", + "interrupted_one": "{{count}} interrupted", + "interrupted_other": "{{count}} interrupted", + "failed_one": "{{count}} failed", + "failed_other": "{{count}} failed", + "working_one": "{{count}} working", + "working_other": "{{count}} working", + "monitoring_one": "{{count}} monitoring", + "monitoring_other": "{{count}} monitoring", + "done_one": "{{count}} done", + "done_other": "{{count}} done", + "idle_one": "{{count}} idle", + "idle_other": "{{count}} idle", + "notReporting_one": "{{count}} not reporting", + "notReporting_other": "{{count}} not reporting", + "unconfirmed_one": "{{count}} unconfirmed", + "unconfirmed_other": "{{count}} unconfirmed", + "needsAttention_one": "{{count}} needs attention", + "needsAttention_other": "{{count}} needs attention" + }, + "allInState": { + "waiting_one": "{{count}} agent waiting", + "waiting_other": "All {{count}} agents waiting", + "blocked_one": "{{count}} agent blocked", + "blocked_other": "All {{count}} agents blocked", + "interrupted_one": "{{count}} agent interrupted", + "interrupted_other": "All {{count}} agents interrupted", + "failed_one": "{{count}} agent failed", + "failed_other": "All {{count}} agents failed", + "working_one": "{{count}} agent working", + "working_other": "All {{count}} agents working", + "monitoring_one": "{{count}} agent monitoring", + "monitoring_other": "All {{count}} agents monitoring", + "done_one": "{{count}} agent done", + "done_other": "All {{count}} agents done", + "idle_one": "{{count}} agent idle", + "idle_other": "All {{count}} agents idle", + "notReporting_one": "{{count}} agent not reporting", + "notReporting_other": "All {{count}} agents not reporting", + "unconfirmed_one": "{{count}} agent unconfirmed", + "unconfirmed_other": "All {{count}} agents unconfirmed", + "needsAttention_one": "{{count}} agent needs attention", + "needsAttention_other": "All {{count}} agents needs attention" + } } }, "app": { @@ -990,8 +1057,9 @@ "clearHosts": "Clear hosts", "clearProjects": "Clear projects", "back": "Back", - "ariaActive": "Filter: {{value0}} active.", - "scopedTo": "Scoped to" + "scopedTo": "Scoped to", + "ariaActiveCount_one": "Filter: {{count}} active.", + "ariaActiveCount_other": "Filter: {{count}} active." }, "taskUrl": { "loadingHint": "Loading {{value0}}…", @@ -3638,7 +3706,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "Remove {{value0}}", - "352f15d6fc": "Last active", "b6bae1eed1": "Cancel", "38ca0b1400": "This permanently deletes their local files. You can't undo this.", "e97e4580c7": "Dirty", @@ -4375,7 +4442,9 @@ "f395c9a685": "Failed to import file", "e6234bcc17": "Custom pet upload needs a full app restart (not just reload).", "6d0a8cd179": "Show pet", - "1fbc51cc77": "Hide pet" + "1fbc51cc77": "Hide pet", + "petFallbackLabel": "Pet", + "petHiddenLabel": "{{pet}} hidden" }, "PortsStatusSegment": { "4ebf90c12e": "No external ports detected", @@ -5312,7 +5381,6 @@ "title_other": "{{count}} installed Orca skills are out of date", "title_one": "{{count}} installed Orca skill is out of date" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "Update skills", "checking": "Checking installed Orca skills…", @@ -5344,7 +5412,6 @@ "updateAction_one": "Update {{count}} skill", "upToDate_one": "{{count}} skill is up to date." }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "Replace with Orca's copy (keeps a backup)" }, @@ -5976,7 +6043,8 @@ "c49fb13492": "Failed to add folder on this host", "9a766f33ac": "This path was checked on the SSH host.", "79fd02cf5f": "This path was checked on {{hostName}}.", - "8851b77327": "This path was checked locally." + "8851b77327": "This path was checked locally.", + "sshConnectionUnavailable": "SSH connection \"{{connection}}\" not found or not connected" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Run hooks", @@ -6062,8 +6130,8 @@ "removeDescriptionSsh": "This only removes {{name}} from Orca. Its files stay on {{host}} — re-add that SSH host to recover it.", "removeDescriptionLocal": "This only removes {{name}} from Orca. It is still on your disk.", "removeDescriptionVmRecipe": "This removes {{name}} from Orca. Its VM recipe determines whether the environment and its files are permanently deleted.", - "openTerminalWarningOne": "1 open terminal in this project will be closed.", - "openTerminalWarningMany": "{{count}} open terminals in this project will be closed." + "openTerminalWarning_one": "{{count}} open terminal in this project will be closed.", + "openTerminalWarning_other": "{{count}} open terminals in this project will be closed." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Reveal active workspace" @@ -6173,7 +6241,8 @@ "4815c70605": "No projects match", "bbbc6e8e3b": "No unselected projects match", "allProjects": "All projects", - "selectedProjectsCount": "{{value0}} projects" + "selectedProjects_one": "{{count}} project", + "selectedProjects_other": "{{count}} projects" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Restart Orca", @@ -6234,8 +6303,6 @@ "7bada3b1ab": "Sort by", "dc0bb670bc": "Group by", "9919ae1082": "Workspace options", - "bc96dbd041": "Workspace options ({{value0}})", - "optionsActiveLabel": "Workspace options ({{value0}} active)", "af9249c505": "Most recent workspace activity", "b451c8b162": "Recent", "6664282a7b": "Drag projects to arrange them", @@ -6269,7 +6336,11 @@ "219ebf1961": "Branch name", "folderPathIdentity": "Branch / folder path", "cli": "Orca CLI", - "workspaceOptions": "Workspace options" + "workspaceOptions": "Workspace options", + "optionsActiveFilters_one": "Workspace options ({{count}} filter active)", + "optionsActiveFilters_other": "Workspace options ({{count}} filters active)", + "optionsFilterCount_one": "Workspace options ({{count}} filter)", + "optionsFilterCount_other": "Workspace options ({{count}} filters)" }, "SshTargetRow": { "4677394048": "Connecting…", @@ -6339,7 +6410,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agents", - "agentUnavailable": "Agent is not available" + "agentUnavailable": "Agent is not available", + "sendingTarget": "Sending..." }, "WorktreeCardMeta": { "3e65e11cc6": "Workspace metadata", @@ -17679,9 +17751,6 @@ "sortedAscending": "{{value0}}, sorted ascending", "sortedDescending": "{{value0}}, sorted descending" }, - "hostSummary": { - "partialFailure": "{{failed}} of {{total}} hosts could not be loaded" - }, "emptyState": { "unknownHost": "this host", "hostLoading": "Loading host…", @@ -17795,8 +17864,6 @@ "failed24h": "Failed · 24h", "successful7d": "Successful · 7d", "failed7d": "Failed · 7d", - "historyUnavailableOne": "Run history is unavailable for 1 automation. Counts include available history only.", - "historyUnavailableMany": "Run history is unavailable for {{count}} automations. Counts include available history only.", "automation": "Automation", "triggered": "Triggered", "trigger": "Trigger", @@ -17805,7 +17872,9 @@ "emptyDescription": "Runs appear here after an automation is triggered.", "runs": "Runs", "local": "Local", - "remote": "Remote" + "remote": "Remote", + "historyUnavailable_one": "Run history is unavailable for {{count}} automation. Counts include available history only.", + "historyUnavailable_other": "Run history is unavailable for {{count}} automations. Counts include available history only." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Automations breadcrumb", @@ -17873,7 +17942,8 @@ }, "usage": { "tokensAndCost_one": "{{tokens}} token · {{cost}}", - "tokensAndCost_other": "{{tokens}} tokens · {{cost}}" + "tokensAndCost_other": "{{tokens}} tokens · {{cost}}", + "costUnavailable": "n/a" }, "externalDisplay": { "sshHost": "SSH host", @@ -17885,6 +17955,10 @@ "connectSshHost": "Connect this SSH host before managing {{provider}} automations.", "cannotManageOnSshHost": "{{provider}} cannot manage automations on this SSH host.", "cannotManageLocally": "{{provider}} cannot manage automations on this machine." + }, + "hostSummary": { + "partialFailureOfHosts_one": "{{failed}} of {{count}} host could not be loaded", + "partialFailureOfHosts_other": "{{failed}} of {{count}} hosts could not be loaded" } }, "agent": { @@ -17950,8 +18024,10 @@ }, "filtersSection": "Filters", "viewSection": "View", - "threadListOptionsActive": "Thread list options ({{value0}} active)", - "activityOptionsActive": "Activity options ({{value0}})" + "threadListOptionsActiveFilters_one": "Thread list options ({{count}} filter active)", + "threadListOptionsActiveFilters_other": "Thread list options ({{count}} filters active)", + "activityOptionsFilterCount_one": "Activity options ({{count}} filter)", + "activityOptionsFilterCount_other": "Activity options ({{count}} filters)" }, "clearCompleted": { "undo": "Undo", @@ -20124,7 +20200,8 @@ "selectionWithheldCount_one": "{{count}} selected workspace is hidden by the current filters and was deselected.", "selectionWithheldCount_other": "{{count}} selected workspaces are hidden by the current filters and were deselected.", "selectAllSafetyChecked_one": "Select {{count}} safety-checked workspace", - "selectAllSafetyChecked_other": "Select all {{count}} safety-checked workspaces" + "selectAllSafetyChecked_other": "Select all {{count}} safety-checked workspaces", + "lastActive": "Last active {{value0}}" }, "scan": { "progress": "Scanning workspaces ({{value0}}/{{value1}})", @@ -20773,7 +20850,13 @@ "kimiContinueSessionConflict": "Kimi received conflicting options: --continue, --session. Correct the generation recipe or CLI arguments before retrying." }, "enableSourceControlAi": "Enable Source Control AI in Settings -> Git.", - "chooseBaseBranch": "Choose a base branch before generating." + "chooseBaseBranch": "Choose a base branch before generating.", + "savedCommitRecipeRepo": "Saved commit-message recipe for this repository.", + "savedCommitRecipeGlobal": "Saved commit-message recipe as a global default.", + "savedReviewRecipeRepo": "Saved hosted-review recipe for this repository.", + "savedReviewRecipeGlobal": "Saved hosted-review recipe as a global default.", + "savedBranchRecipeRepo": "Saved branch-name recipe for this repository.", + "savedBranchRecipeGlobal": "Saved branch-name recipe as a global default." }, "remoteError": { "submodule": { @@ -20847,6 +20930,13 @@ "pull": "Pull blocked — move, remove, or add untracked files first." }, "authenticationFailed": "Authentication failed. Check your remote credentials." + }, + "submodule": { + "worktreeOnlyLabel": "Stage inside submodule", + "worktreeOnlyTooltip": "The parent repo (including Stage All) cannot stage file changes inside a submodule", + "loading": "Loading submodule changes…", + "empty": "No changes in submodule", + "loadFailed": "Failed to load submodule changes" } }, "agentsSidebarIntro": { @@ -22567,10 +22657,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filter", - "activeFilterCount_other": "{{count}} filters" - }, "editorConflicts": { "kind": { "addedByUs": "Added by us", @@ -22944,5 +23030,15 @@ "image": "Custom pet", "bundle": "Pet bundle" } + }, + "diffComments": { + "lineRangeMeta": "lines {{start}}-{{end}}", + "lineMeta": "line {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "Agent needs permission", + "statusStale": "Agent status is stale" + } } } diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 2b7bf0f5c75..78e092680bc 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -564,8 +564,10 @@ "clearHosts": "Borrar hosts", "clearProjects": "Borrar proyectos", "back": "Atrás", - "ariaActive": "Filtro: {{value0}} activos.", - "scopedTo": "Ámbito:" + "scopedTo": "Ámbito:", + "ariaActiveCount_one": "Filtro: {{count}} activo.", + "ariaActiveCount_other": "Filtro: {{count}} activos.", + "ariaActiveCount_many": "Filtro: {{count}} activos." }, "linearIssue": { "createLabel": "Crear árbol de trabajo a partir de un problema Linear __{{value0}} __: {{value1}}", @@ -3190,7 +3192,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "Quitar {{value0}}", - "352f15d6fc": "Último activo", "b6bae1eed1": "Cancelar", "38ca0b1400": "Esto elimina permanentemente sus archivos locales. No puedes deshacer esto.", "e97e4580c7": "Con cambios", @@ -3929,7 +3930,9 @@ "f395c9a685": "No se pudo importar el archivo", "e6234bcc17": "Subir una mascota personalizada requiere reiniciar la app por completo (no solo recargarla).", "6d0a8cd179": "Mostrar mascota", - "1fbc51cc77": "Ocultar mascota" + "1fbc51cc77": "Ocultar mascota", + "petFallbackLabel": "Mascota", + "petHiddenLabel": "{{pet}} no visible" }, "PortsStatusSegment": { "4ebf90c12e": "No se detectaron puertos externos", @@ -4987,7 +4990,6 @@ "title_one": "{{count}} skills de Orca instaladas están desactualizadas", "title_many": "{{count}} skills de Orca instaladas están desactualizadas" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "Actualizar skills", "checking": "Comprobando las skills de Orca instaladas…", @@ -5035,7 +5037,6 @@ "updateServer": "Actualiza Orca en el servidor", "connectHost": "Conecta el host SSH" }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "Reemplazar por la copia de Orca (guarda una copia de seguridad)" }, @@ -5584,7 +5585,8 @@ "c49fb13492": "No se pudo agregar la carpeta en este host", "9a766f33ac": "Esta ruta se verificó en el host SSH.", "79fd02cf5f": "Esta ruta se verificó en {{hostName}}.", - "8851b77327": "Esta ruta se verificó localmente." + "8851b77327": "Esta ruta se verificó localmente.", + "sshConnectionUnavailable": "No se encontró la conexión SSH «{{connection}}» o no está conectada" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Ejecutar hooks", @@ -5672,8 +5674,9 @@ "removeDescriptionSsh": "Esto solo elimina {{name}} de Orca. Sus archivos permanecen en {{host}}; vuelve a añadir ese host SSH para recuperarlo.", "removeDescriptionLocal": "Esto solo elimina {{name}} de Orca. Sigue estando en tu disco.", "removeDescriptionVmRecipe": "Esto elimina {{name}} de Orca. Su receta de VM determina si el entorno y sus archivos se eliminan permanentemente.", - "openTerminalWarningOne": "Se cerrará 1 terminal abierto en este proyecto.", - "openTerminalWarningMany": "Se cerrarán {{count}} terminales abiertos en este proyecto." + "openTerminalWarning_one": "Se cerrará {{count}} terminal abierto en este proyecto.", + "openTerminalWarning_other": "Se cerrarán {{count}} terminales abiertos en este proyecto.", + "openTerminalWarning_many": "Se cerrarán {{count}} terminales abiertos en este proyecto." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Mostrar espacio de trabajo activo" @@ -5784,7 +5787,9 @@ "4815c70605": "Ningún proyecto coincide", "bbbc6e8e3b": "Ningún proyecto no seleccionado coincide", "allProjects": "Todos los proyectos", - "selectedProjectsCount": "{{value0}} proyectos" + "selectedProjects_one": "{{count}} proyecto", + "selectedProjects_other": "{{count}} proyectos", + "selectedProjects_many": "{{count}} proyectos" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Reiniciar Orca", @@ -5832,8 +5837,6 @@ "7bada3b1ab": "Ordenar por", "dc0bb670bc": "Agrupar por", "9919ae1082": "Opciones de espacio de trabajo", - "bc96dbd041": "Opciones de espacio de trabajo ({{value0}})", - "optionsActiveLabel": "Opciones de espacio de trabajo ({{value0}} activos)", "af9249c505": "Actividad más reciente en el espacio de trabajo", "b451c8b162": "Reciente", "6664282a7b": "Arrastra proyectos para organizarlos", @@ -5874,7 +5877,13 @@ "219ebf1961": "Nombre de rama", "folderPathIdentity": "Rama / ruta de carpeta", "cli": "Orca CLI", - "workspaceOptions": "Opciones de espacio de trabajo" + "workspaceOptions": "Opciones de espacio de trabajo", + "optionsActiveFilters_one": "Opciones de espacio de trabajo ({{count}} filtro activo)", + "optionsActiveFilters_other": "Opciones de espacio de trabajo ({{count}} filtros activos)", + "optionsActiveFilters_many": "Opciones de espacio de trabajo ({{count}} filtros activos)", + "optionsFilterCount_one": "Opciones de espacio de trabajo ({{count}} filtro)", + "optionsFilterCount_other": "Opciones de espacio de trabajo ({{count}} filtros)", + "optionsFilterCount_many": "Opciones de espacio de trabajo ({{count}} filtros)" }, "SshTargetRow": { "4677394048": "Conectando…", @@ -5945,7 +5954,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agents", - "agentUnavailable": "El agente no está disponible" + "agentUnavailable": "El agente no está disponible", + "sendingTarget": "Enviando..." }, "WorktreeCardMeta": { "3e65e11cc6": "Metadatos del espacio de trabajo", @@ -6256,8 +6266,7 @@ "62e71f2d5d": "Crear espacio de trabajo para {{value0}}" } } - }, - "project": {} + } }, "sleep": { "worktree": { @@ -17008,8 +17017,6 @@ "failed24h": "Fallidas · 24 h", "successful7d": "Exitosas · 7 días", "failed7d": "Fallidas · 7 días", - "historyUnavailableOne": "El historial de ejecuciones no está disponible para 1 automatización. Los recuentos solo incluyen el historial disponible.", - "historyUnavailableMany": "El historial de ejecuciones no está disponible para {{count}} automatizaciones. Los recuentos solo incluyen el historial disponible.", "automation": "Automatización", "triggered": "Activada", "trigger": "Activar", @@ -17018,7 +17025,10 @@ "emptyDescription": "Las ejecuciones aparecerán aquí después de activar una automatización.", "runs": "Ejecuciones", "local": "Local", - "remote": "Remoto" + "remote": "Remoto", + "historyUnavailable_one": "El historial de ejecuciones no está disponible para {{count}} automatización. Los recuentos solo incluyen el historial disponible.", + "historyUnavailable_other": "El historial de ejecuciones no está disponible para {{count}} automatizaciones. Los recuentos solo incluyen el historial disponible.", + "historyUnavailable_many": "El historial de ejecuciones no está disponible para {{count}} automatizaciones. Los recuentos solo incluyen el historial disponible." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Ruta de navegación de automatizaciones", @@ -17462,9 +17472,6 @@ "sortedAscending": "{{value0}}, orden ascendente", "sortedDescending": "{{value0}}, orden descendente" }, - "hostSummary": { - "partialFailure": "No se pudieron cargar {{failed}} de {{total}} hosts" - }, "capturedOwner": { "orphan": "Esta automatización no tiene host donde ejecutarse. Elimínala o vuelve a añadir el host al que pertenece.", "unfenced": "Orca en este host necesita una actualización antes de que puedas ver el historial de ejecuciones o gestionar esta automatización. Las ejecuciones programadas aún pueden continuar en el host." @@ -17547,7 +17554,8 @@ "usage": { "tokensAndCost_one": "{{tokens}} token · {{cost}}", "tokensAndCost_other": "{{tokens}} tokens · {{cost}}", - "tokensAndCost_many": "{{tokens}} tokens · {{cost}}" + "tokensAndCost_many": "{{tokens}} tokens · {{cost}}", + "costUnavailable": "n/d" }, "externalDisplay": { "sshHost": "Host SSH", @@ -17559,6 +17567,11 @@ "connectSshHost": "Conecta este host SSH antes de gestionar automatizaciones de {{provider}}.", "cannotManageOnSshHost": "{{provider}} no puede gestionar automatizaciones en este host SSH.", "cannotManageLocally": "{{provider}} no puede gestionar automatizaciones en este equipo." + }, + "hostSummary": { + "partialFailureOfHosts_one": "Carga fallida en {{failed}} de {{count}} host", + "partialFailureOfHosts_other": "Carga fallida en {{failed}} de {{count}} hosts", + "partialFailureOfHosts_many": "Carga fallida en {{failed}} de {{count}} hosts" } }, "agent": { @@ -17624,8 +17637,12 @@ }, "filtersSection": "Filtros", "viewSection": "Vista", - "threadListOptionsActive": "Opciones de lista de hilos ({{value0}} activos)", - "activityOptionsActive": "Opciones de actividad ({{value0}})" + "threadListOptionsActiveFilters_one": "Opciones de lista de hilos ({{count}} filtro activo)", + "threadListOptionsActiveFilters_other": "Opciones de lista de hilos ({{count}} filtros activos)", + "threadListOptionsActiveFilters_many": "Opciones de lista de hilos ({{count}} filtros activos)", + "activityOptionsFilterCount_one": "Opciones de actividad ({{count}} filtro)", + "activityOptionsFilterCount_other": "Opciones de actividad ({{count}} filtros)", + "activityOptionsFilterCount_many": "Opciones de actividad ({{count}} filtros)" }, "ActivityScopeFilterControls": { "resetScope": "Mostrar todos los hosts y proyectos", @@ -19858,7 +19875,8 @@ "selectionWithheldCount_many": "{{count}} espacios de trabajo seleccionados están ocultos por los filtros actuales y se han deseleccionado.", "selectAllSafetyChecked_one": "Seleccionar {{count}} espacio de trabajo con seguridad comprobada", "selectAllSafetyChecked_other": "Seleccionar todos los {{count}} espacios de trabajo con seguridad comprobada", - "selectAllSafetyChecked_many": "Seleccionar todos los {{count}} espacios de trabajo con seguridad comprobada" + "selectAllSafetyChecked_many": "Seleccionar todos los {{count}} espacios de trabajo con seguridad comprobada", + "lastActive": "Última actividad: {{value0}}" }, "scan": { "noWorkspaces": "No se encontraron espacios de trabajo.", @@ -20939,6 +20957,96 @@ "peerCheckFailed": "Orca no pudo consultar al host WSL si otro Orca en este equipo aún lo usa: {{detail}}", "removalUnrecorded": "Orca no pudo registrar qué quedó en ejecución tras esta eliminación: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "en espera", + "blocked": "bloqueado", + "interrupted": "interrumpido", + "failed": "fallido", + "working": "trabajando", + "monitoring": "supervisando", + "done": "completado", + "idle": "inactivo", + "notReporting": "sin datos de estado", + "unconfirmed": "sin confirmar", + "needsAttention": "requiere atención" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}}: {{status}}", + "agentCount_one": "{{count}} agente", + "agentCount_other": "{{count}} agentes", + "agentCount_many": "{{count}} agentes", + "stateCount": { + "waiting_one": "{{count}} en espera", + "waiting_other": "{{count}} en espera", + "waiting_many": "{{count}} en espera", + "blocked_one": "{{count}} bloqueado", + "blocked_other": "{{count}} bloqueados", + "blocked_many": "{{count}} bloqueados", + "interrupted_one": "{{count}} interrumpido", + "interrupted_other": "{{count}} interrumpidos", + "interrupted_many": "{{count}} interrumpidos", + "failed_one": "{{count}} fallido", + "failed_other": "{{count}} fallidos", + "failed_many": "{{count}} fallidos", + "working_one": "{{count}} trabajando", + "working_other": "{{count}} trabajando", + "working_many": "{{count}} trabajando", + "monitoring_one": "{{count}} supervisando", + "monitoring_other": "{{count}} supervisando", + "monitoring_many": "{{count}} supervisando", + "done_one": "{{count}} completado", + "done_other": "{{count}} completados", + "done_many": "{{count}} completados", + "idle_one": "{{count}} inactivo", + "idle_other": "{{count}} inactivos", + "idle_many": "{{count}} inactivos", + "notReporting_one": "{{count}} sin datos de estado", + "notReporting_other": "{{count}} sin datos de estado", + "notReporting_many": "{{count}} sin datos de estado", + "unconfirmed_one": "{{count}} sin confirmar", + "unconfirmed_other": "{{count}} sin confirmar", + "unconfirmed_many": "{{count}} sin confirmar", + "needsAttention_one": "{{count}} requiere atención", + "needsAttention_other": "{{count}} requieren atención", + "needsAttention_many": "{{count}} requieren atención" + }, + "allInState": { + "waiting_one": "{{count}} agente en espera", + "waiting_other": "Todos los {{count}} agentes en espera", + "waiting_many": "Todos los {{count}} agentes en espera", + "blocked_one": "{{count}} agente bloqueado", + "blocked_other": "Todos los {{count}} agentes bloqueados", + "blocked_many": "Todos los {{count}} agentes bloqueados", + "interrupted_one": "{{count}} agente interrumpido", + "interrupted_other": "Todos los {{count}} agentes interrumpidos", + "interrupted_many": "Todos los {{count}} agentes interrumpidos", + "failed_one": "{{count}} agente fallido", + "failed_other": "Todos los {{count}} agentes fallidos", + "failed_many": "Todos los {{count}} agentes fallidos", + "working_one": "{{count}} agente trabajando", + "working_other": "Todos los {{count}} agentes trabajando", + "working_many": "Todos los {{count}} agentes trabajando", + "monitoring_one": "{{count}} agente supervisando", + "monitoring_other": "Todos los {{count}} agentes supervisando", + "monitoring_many": "Todos los {{count}} agentes supervisando", + "done_one": "{{count}} agente ha terminado", + "done_other": "Todos los {{count}} agentes han terminado", + "done_many": "Todos los {{count}} agentes han terminado", + "idle_one": "{{count}} agente inactivo", + "idle_other": "Todos los {{count}} agentes inactivos", + "idle_many": "Todos los {{count}} agentes inactivos", + "notReporting_one": "{{count}} agente sin datos de estado", + "notReporting_other": "Todos los {{count}} agentes sin datos de estado", + "notReporting_many": "Todos los {{count}} agentes sin datos de estado", + "unconfirmed_one": "{{count}} agente sin confirmar", + "unconfirmed_other": "Todos los {{count}} agentes sin confirmar", + "unconfirmed_many": "Todos los {{count}} agentes sin confirmar", + "needsAttention_one": "{{count}} agente requiere atención", + "needsAttention_other": "Todos los {{count}} agentes requieren atención", + "needsAttention_many": "Todos los {{count}} agentes requieren atención" + } } }, "rendererRecovery": { @@ -21364,7 +21472,13 @@ "kimiContinueSessionConflict": "Kimi recibió opciones incompatibles: --continue, --session. Corrige la acción de generación de texto o los argumentos de la CLI antes de volver a intentarlo." }, "enableSourceControlAi": "Activa Source Control AI en Ajustes -> Git.", - "chooseBaseBranch": "Elige una rama base antes de generar." + "chooseBaseBranch": "Elige una rama base antes de generar.", + "savedCommitRecipeRepo": "Receta de mensajes de commit guardada para este repositorio.", + "savedCommitRecipeGlobal": "Receta de mensajes de commit guardada como valor predeterminado global.", + "savedReviewRecipeRepo": "Receta de revisión alojada guardada para este repositorio.", + "savedReviewRecipeGlobal": "Receta de revisión alojada guardada como valor predeterminado global.", + "savedBranchRecipeRepo": "Receta de nombres de rama guardada para este repositorio.", + "savedBranchRecipeGlobal": "Receta de nombres de rama guardada como valor predeterminado global." }, "remoteError": { "submodule": { @@ -21438,6 +21552,13 @@ "pull": "Pull bloqueado — mueve, elimina o añade primero los archivos sin seguimiento." }, "authenticationFailed": "Falló la autenticación. Comprueba tus credenciales del remoto." + }, + "submodule": { + "worktreeOnlyLabel": "Agregar al stage dentro del submódulo", + "worktreeOnlyTooltip": "El repo principal (incluido Agregar todo al stage) no puede agregar al stage los cambios de archivos dentro de un submódulo", + "loading": "Cargando cambios del submódulo…", + "empty": "No hay cambios en el submódulo", + "loadFailed": "No se pudieron cargar los cambios del submódulo" } }, "aiVault": { @@ -22565,11 +22686,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filtro", - "activeFilterCount_other": "{{count}} filtros", - "activeFilterCount_many": "{{count}} filtros" - }, "editorConflicts": { "kind": { "addedByUs": "Añadido por nosotros", @@ -23102,5 +23218,15 @@ "image": "Mascota personalizada", "bundle": "Bundle de mascota" } + }, + "diffComments": { + "lineRangeMeta": "líneas {{start}}-{{end}}", + "lineMeta": "línea {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "El agente necesita permiso", + "statusStale": "El estado del agente está desactualizado" + } } } diff --git a/src/renderer/src/i18n/locales/fr.json b/src/renderer/src/i18n/locales/fr.json index d180820f7e5..43b585c934b 100644 --- a/src/renderer/src/i18n/locales/fr.json +++ b/src/renderer/src/i18n/locales/fr.json @@ -793,8 +793,10 @@ "clearHosts": "Effacer les hôtes", "clearProjects": "Effacer les projets", "back": "Retour", - "ariaActive": "Filtre : {{value0}} actif(s).", - "scopedTo": "Portée :" + "scopedTo": "Portée :", + "ariaActiveCount_one": "Filtre : {{count}} actif.", + "ariaActiveCount_other": "Filtre : {{count}} actifs.", + "ariaActiveCount_many": "Filtre : {{count}} actifs." }, "taskUrl": { "loadingHint": "Chargement de {{value0}}…", @@ -3414,7 +3416,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "Supprimer {{value0}}", - "352f15d6fc": "Dernière activité", "b6bae1eed1": "Annuler", "38ca0b1400": "Cette opération supprime définitivement leurs fichiers locaux. Vous ne pourrez pas annuler.", "e97e4580c7": "Modifié", @@ -4153,7 +4154,9 @@ "f395c9a685": "Échec de l'importation du fichier", "e6234bcc17": "L'ajout d'un compagnon personnalisé nécessite un redémarrage complet de l'app (pas seulement un rechargement).", "6d0a8cd179": "Afficher le compagnon", - "1fbc51cc77": "Masquer le compagnon" + "1fbc51cc77": "Masquer le compagnon", + "petFallbackLabel": "Compagnon", + "petHiddenLabel": "{{pet}} (non visible)" }, "PortsStatusSegment": { "4ebf90c12e": "Aucun port externe détecté", @@ -5120,7 +5123,6 @@ "title_one": "{{count}} skills Orca installés ne sont pas à jour", "title_many": "{{count}} skills Orca installés ne sont pas à jour" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "Mettre à jour les skills", "checking": "Vérification des skills Orca installés…", @@ -5157,7 +5159,6 @@ "updateAction_other": "Mettre à jour {{count}} skills", "updateAction_many": "Mettre à jour {{count}} skills" }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "Remplacer par la copie d’Orca (conserve une sauvegarde)" }, @@ -5823,7 +5824,8 @@ "c49fb13492": "Échec de l'ajout du dossier sur cet hôte", "9a766f33ac": "Ce chemin a été vérifié sur l'hôte SSH.", "79fd02cf5f": "Ce chemin a été vérifié sur {{hostName}}.", - "8851b77327": "Ce chemin a été vérifié localement." + "8851b77327": "Ce chemin a été vérifié localement.", + "sshConnectionUnavailable": "La connexion SSH « {{connection}} » est introuvable ou n’est pas connectée" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Exécuter les hooks", @@ -5911,8 +5913,9 @@ "removeDescriptionSsh": "Ceci retire uniquement {{name}} d'Orca. Ses fichiers restent sur {{host}} — rajoutez cet hôte SSH pour le récupérer.", "removeDescriptionLocal": "Ceci retire uniquement {{name}} d'Orca. Il est toujours sur votre disque.", "removeDescriptionVmRecipe": "Ceci retire {{name}} d'Orca. Sa recette de VM détermine si l'environnement et ses fichiers sont définitivement supprimés.", - "openTerminalWarningOne": "1 terminal ouvert dans ce projet sera fermé.", - "openTerminalWarningMany": "{{count}} terminaux ouverts dans ce projet seront fermés." + "openTerminalWarning_one": "{{count}} terminal ouvert dans ce projet sera fermé.", + "openTerminalWarning_other": "{{count}} terminaux ouverts dans ce projet seront fermés.", + "openTerminalWarning_many": "{{count}} terminaux ouverts dans ce projet seront fermés." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Révéler l'espace de travail actif" @@ -6023,7 +6026,9 @@ "4815c70605": "Aucun projet ne correspond", "bbbc6e8e3b": "Aucun projet non sélectionné ne correspond", "allProjects": "Tous les projets", - "selectedProjectsCount": "{{value0}} projets" + "selectedProjects_one": "{{count}} projet", + "selectedProjects_other": "{{count}} projets", + "selectedProjects_many": "{{count}} projets" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Redémarrer Orca", @@ -6085,8 +6090,6 @@ "7bada3b1ab": "Trier par", "dc0bb670bc": "Grouper par", "9919ae1082": "Options des espaces de travail", - "bc96dbd041": "Options des espaces de travail ({{value0}})", - "optionsActiveLabel": "Options des espaces de travail ({{value0}} actifs)", "af9249c505": "Activité d'espace de travail la plus récente", "b451c8b162": "Récents", "6664282a7b": "Glissez les projets pour les ranger", @@ -6120,7 +6123,13 @@ "219ebf1961": "Nom de branche", "folderPathIdentity": "Branche / chemin de dossier", "cli": "Orca CLI", - "workspaceOptions": "Options de l'espace de travail" + "workspaceOptions": "Options de l'espace de travail", + "optionsActiveFilters_one": "Options de l’espace de travail ({{count}} filtre actif)", + "optionsActiveFilters_other": "Options de l’espace de travail ({{count}} filtres actifs)", + "optionsActiveFilters_many": "Options de l’espace de travail ({{count}} filtres actifs)", + "optionsFilterCount_one": "Options de l’espace de travail ({{count}} filtre)", + "optionsFilterCount_other": "Options de l’espace de travail ({{count}} filtres)", + "optionsFilterCount_many": "Options de l’espace de travail ({{count}} filtres)" }, "SshTargetRow": { "4677394048": "Connexion…", @@ -6191,7 +6200,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agents", - "agentUnavailable": "L'agent n'est pas disponible" + "agentUnavailable": "L'agent n'est pas disponible", + "sendingTarget": "Envoi…" }, "WorktreeCardMeta": { "3e65e11cc6": "Métadonnées de l'espace de travail", @@ -6476,8 +6486,7 @@ "62e71f2d5d": "Créer un espace de travail pour {{value0}}" } } - }, - "project": {} + } }, "sleep": { "worktree": { @@ -17572,9 +17581,6 @@ "sortedAscending": "{{value0}}, tri croissant", "sortedDescending": "{{value0}}, tri décroissant" }, - "hostSummary": { - "partialFailure": "{{failed}} des {{total}} hôtes n'ont pas pu être chargés" - }, "emptyState": { "unknownHost": "cet hôte", "hostLoading": "Chargement de l'hôte…", @@ -17689,8 +17695,6 @@ "failed24h": "Échec · 24h", "successful7d": "Réussi · 7j", "failed7d": "Échec · 7j", - "historyUnavailableOne": "L'historique d'exécution n'est pas disponible pour 1 automatisation. Les décomptes incluent uniquement l’historique disponible.", - "historyUnavailableMany": "L'historique d'exécution n'est pas disponible pour les automatisations {{count}}. Les décomptes incluent uniquement l’historique disponible.", "automation": "Automation", "triggered": "Déclenché", "trigger": "Déclenchement", @@ -17699,7 +17703,10 @@ "emptyDescription": "Les exécutions apparaissent ici après le déclenchement d'une automatisation.", "runs": "Fonctionne", "local": "Locale", - "remote": "Télécommande" + "remote": "Télécommande", + "historyUnavailable_one": "L’historique d’exécution est indisponible pour {{count}} automatisation. Les décomptes incluent uniquement l’historique disponible.", + "historyUnavailable_other": "L’historique d’exécution est indisponible pour {{count}} automatisations. Les décomptes incluent uniquement l’historique disponible.", + "historyUnavailable_many": "L’historique d’exécution est indisponible pour {{count}} automatisations. Les décomptes incluent uniquement l’historique disponible." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Fil d'Ariane des automatisations", @@ -17771,7 +17778,8 @@ "usage": { "tokensAndCost_one": "{{tokens}} token · {{cost}}", "tokensAndCost_other": "{{tokens}} tokens · {{cost}}", - "tokensAndCost_many": "{{tokens}} tokens · {{cost}}" + "tokensAndCost_many": "{{tokens}} tokens · {{cost}}", + "costUnavailable": "n/d" }, "externalDisplay": { "sshHost": "Hôte SSH", @@ -17783,6 +17791,11 @@ "connectSshHost": "Connectez cet hôte SSH avant de gérer les automatisations {{provider}}.", "cannotManageOnSshHost": "{{provider}} ne peut pas gérer les automatisations sur cet hôte SSH.", "cannotManageLocally": "{{provider}} ne peut pas gérer les automatisations sur cette machine." + }, + "hostSummary": { + "partialFailureOfHosts_one": "Échec du chargement de {{failed}} sur {{count}} hôte", + "partialFailureOfHosts_other": "Échec du chargement de {{failed}} sur {{count}} hôtes", + "partialFailureOfHosts_many": "Échec du chargement de {{failed}} sur {{count}} hôtes" } }, "agent": { @@ -17848,8 +17861,12 @@ "unconfirmed": "Impossible de confirmer", "permission": "A besoin d'attention" }, - "threadListOptionsActive": "Options de la liste des fils ({{value0}} actifs)", - "activityOptionsActive": "Options d'activité ({{value0}})" + "threadListOptionsActiveFilters_one": "Options de la liste des fils ({{count}} filtre actif)", + "threadListOptionsActiveFilters_other": "Options de la liste des fils ({{count}} filtres actifs)", + "threadListOptionsActiveFilters_many": "Options de la liste des fils ({{count}} filtres actifs)", + "activityOptionsFilterCount_one": "Options d’activité ({{count}} filtre)", + "activityOptionsFilterCount_other": "Options d’activité ({{count}} filtres)", + "activityOptionsFilterCount_many": "Options d’activité ({{count}} filtres)" }, "ActivityScopeFilterControls": { "resetScope": "Afficher tous les hôtes et projets", @@ -20078,7 +20095,8 @@ "selectionWithheldCount_many": "{{count}} espaces de travail sélectionnés sont masqués par les filtres actuels et ont été désélectionnés.", "selectAllSafetyChecked_one": "Sélectionner {{count}} espace de travail dont la sécurité a été vérifiée", "selectAllSafetyChecked_other": "Sélectionner tous les {{count}} espaces de travail dont la sécurité a été vérifiée", - "selectAllSafetyChecked_many": "Sélectionner tous les {{count}} espaces de travail dont la sécurité a été vérifiée" + "selectAllSafetyChecked_many": "Sélectionner tous les {{count}} espaces de travail dont la sécurité a été vérifiée", + "lastActive": "Dernière activité : {{value0}}" }, "scan": { "progress": "Analyse des espaces de travail ({{value0}}/{{value1}})", @@ -20697,6 +20715,96 @@ "peerCheckFailed": "Orca n'a pas pu demander à l'hôte WSL si un autre Orca sur cet ordinateur l'utilise encore : {{detail}}", "removalUnrecorded": "Orca n'a pas pu enregistrer ce qui est resté en cours d'exécution après cette suppression : {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "en attente", + "blocked": "bloqué", + "interrupted": "interrompu", + "failed": "échec", + "working": "en cours", + "monitoring": "surveillance", + "done": "terminé", + "idle": "inactif", + "notReporting": "aucun état transmis", + "unconfirmed": "non confirmé", + "needsAttention": "attention requise" + }, + "mixedStates": "{{subject}} : {{states}}", + "agentIdentityState": "{{agent}} : {{status}}", + "agentCount_one": "{{count}} agent", + "agentCount_other": "{{count}} agents", + "agentCount_many": "{{count}} agents", + "stateCount": { + "waiting_one": "{{count}} en attente", + "waiting_other": "{{count}} en attente", + "waiting_many": "{{count}} en attente", + "blocked_one": "{{count}} bloqué", + "blocked_other": "{{count}} bloqués", + "blocked_many": "{{count}} bloqués", + "interrupted_one": "{{count}} interrompu", + "interrupted_other": "{{count}} interrompus", + "interrupted_many": "{{count}} interrompus", + "failed_one": "{{count}} en échec", + "failed_other": "{{count}} en échec", + "failed_many": "{{count}} en échec", + "working_one": "{{count}} travaille", + "working_other": "{{count}} travaillent", + "working_many": "{{count}} travaillent", + "monitoring_one": "{{count}} surveille", + "monitoring_other": "{{count}} surveillent", + "monitoring_many": "{{count}} surveillent", + "done_one": "{{count}} terminé", + "done_other": "{{count}} terminés", + "done_many": "{{count}} terminés", + "idle_one": "{{count}} inactif", + "idle_other": "{{count}} inactifs", + "idle_many": "{{count}} inactifs", + "notReporting_one": "{{count}} sans état transmis", + "notReporting_other": "{{count}} sans état transmis", + "notReporting_many": "{{count}} sans état transmis", + "unconfirmed_one": "{{count}} non confirmé", + "unconfirmed_other": "{{count}} non confirmés", + "unconfirmed_many": "{{count}} non confirmés", + "needsAttention_one": "{{count}} requiert votre attention", + "needsAttention_other": "{{count}} requièrent votre attention", + "needsAttention_many": "{{count}} requièrent votre attention" + }, + "allInState": { + "waiting_one": "{{count}} agent en attente", + "waiting_other": "Tous les {{count}} agents en attente", + "waiting_many": "Tous les {{count}} agents en attente", + "blocked_one": "{{count}} agent bloqué", + "blocked_other": "Tous les {{count}} agents bloqués", + "blocked_many": "Tous les {{count}} agents bloqués", + "interrupted_one": "{{count}} agent interrompu", + "interrupted_other": "Tous les {{count}} agents interrompus", + "interrupted_many": "Tous les {{count}} agents interrompus", + "failed_one": "{{count}} agent en échec", + "failed_other": "Tous les {{count}} agents en échec", + "failed_many": "Tous les {{count}} agents en échec", + "working_one": "{{count}} agent travaille", + "working_other": "Tous les {{count}} agents travaillent", + "working_many": "Tous les {{count}} agents travaillent", + "monitoring_one": "{{count}} agent surveille", + "monitoring_other": "Tous les {{count}} agents surveillent", + "monitoring_many": "Tous les {{count}} agents surveillent", + "done_one": "{{count}} agent a terminé", + "done_other": "Tous les {{count}} agents ont terminé", + "done_many": "Tous les {{count}} agents ont terminé", + "idle_one": "{{count}} agent inactif", + "idle_other": "Tous les {{count}} agents inactifs", + "idle_many": "Tous les {{count}} agents inactifs", + "notReporting_one": "{{count}} agent sans état transmis", + "notReporting_other": "Tous les {{count}} agents sans état transmis", + "notReporting_many": "Tous les {{count}} agents sans état transmis", + "unconfirmed_one": "{{count}} agent non confirmé", + "unconfirmed_other": "Tous les {{count}} agents non confirmés", + "unconfirmed_many": "Tous les {{count}} agents non confirmés", + "needsAttention_one": "{{count}} agent requiert votre attention", + "needsAttention_other": "Tous les {{count}} agents requièrent votre attention", + "needsAttention_many": "Tous les {{count}} agents requièrent votre attention" + } } }, "editor": { @@ -20917,7 +21025,13 @@ "kimiContinueSessionConflict": "Kimi a reçu des options incompatibles : --continue, --session. Corrigez la recette de génération ou les arguments CLI avant de réessayer." }, "enableSourceControlAi": "Activez l’IA du contrôle de code source dans Paramètres -> Git.", - "chooseBaseBranch": "Choisissez une branche de base avant de générer." + "chooseBaseBranch": "Choisissez une branche de base avant de générer.", + "savedCommitRecipeRepo": "Recette de message de commit enregistrée pour ce dépôt.", + "savedCommitRecipeGlobal": "Recette de message de commit enregistrée comme valeur par défaut globale.", + "savedReviewRecipeRepo": "Recette de revue hébergée enregistrée pour ce dépôt.", + "savedReviewRecipeGlobal": "Recette de revue hébergée enregistrée comme valeur par défaut globale.", + "savedBranchRecipeRepo": "Recette de nom de branche enregistrée pour ce dépôt.", + "savedBranchRecipeGlobal": "Recette de nom de branche enregistrée comme valeur par défaut globale." }, "remoteError": { "submodule": { @@ -20991,6 +21105,13 @@ "pull": "Pull bloqué — déplacez, supprimez ou ajoutez d'abord les fichiers non suivis." }, "authenticationFailed": "Échec de l'authentification. Vérifiez vos identifiants d'accès au dépôt distant." + }, + "submodule": { + "worktreeOnlyLabel": "Indexer dans le sous-module", + "worktreeOnlyTooltip": "Le dépôt parent (y compris « Tout indexer ») ne peut pas indexer les modifications de fichiers dans un sous-module", + "loading": "Chargement des modifications du sous-module…", + "empty": "Aucune modification dans le sous-module", + "loadFailed": "Impossible de charger les modifications du sous-module" } }, "agentsSidebarIntro": { @@ -22565,11 +22686,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filtre", - "activeFilterCount_other": "{{count}} filtres", - "activeFilterCount_many": "{{count}} filtres" - }, "editorConflicts": { "kind": { "addedByUs": "Ajouté chez nous", @@ -23102,5 +23218,15 @@ "image": "Compagnon personnalisé", "bundle": "Bundle de compagnon" } + }, + "diffComments": { + "lineRangeMeta": "lignes {{start}}-{{end}}", + "lineMeta": "ligne {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "L’agent a besoin d’une autorisation", + "statusStale": "Le statut de l’agent est obsolète" + } } } diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index e2aa481857d..a113a54b423 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -560,8 +560,8 @@ "clearHosts": "ホストをクリア", "clearProjects": "プロジェクトをクリア", "back": "戻る", - "ariaActive": "フィルター: {{value0}} 件アクティブ。", - "scopedTo": "スコープ:" + "scopedTo": "スコープ:", + "ariaActiveCount_other": "フィルター:{{count}} 個が有効。" }, "linearIssue": { "createLabel": "Linear 課題 {{value0}}: {{value1}} からワークツリーを作成", @@ -3136,7 +3136,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "{{value0}} を削除", - "352f15d6fc": "最終アクティブ", "b6bae1eed1": "キャンセル", "38ca0b1400": "これにより、ローカルファイルが完全に削除されます。これを元に戻すことはできません。", "e97e4580c7": "汚い", @@ -3865,7 +3864,9 @@ "f395c9a685": "ファイルのインポートに失敗しました", "e6234bcc17": "カスタムペットのアップロードには、(リロードだけでなく) アプリを完全に再起動する必要があります。", "6d0a8cd179": "ペットを見せる", - "1fbc51cc77": "ペットを隠す" + "1fbc51cc77": "ペットを隠す", + "petFallbackLabel": "ペット", + "petHiddenLabel": "{{pet}} は非表示" }, "PortsStatusSegment": { "4ebf90c12e": "外部ポートが検出されませんでした", @@ -4821,7 +4822,6 @@ "description": "Agent がこのバージョンの Orca の最新の手順に従うように、{{value0}} を更新してください。", "title_other": "インストール済みの Orca スキル {{count}} 件が古くなっています" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "スキルを更新", "checking": "インストール済みの Orca スキルを確認中…", @@ -4859,7 +4859,6 @@ "updateServer": "サーバーの Orca を更新してください", "connectHost": "SSH ホストに接続してください" }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "Orca のコピーに置き換える(バックアップを保持)" }, @@ -5349,7 +5348,8 @@ "c49fb13492": "このホスト上でのフォルダーの追加に失敗しました", "9a766f33ac": "このパスは SSH ホストでチェックされました。", "79fd02cf5f": "このパスは {{hostName}} でチェックされました。", - "8851b77327": "このパスはローカルでチェックされました。" + "8851b77327": "このパスはローカルでチェックされました。", + "sshConnectionUnavailable": "SSH 接続「{{connection}}」が見つからないか、接続されていません" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "フックを実行する", @@ -5433,8 +5433,7 @@ "removeDescriptionSsh": "この操作は {{name}} を Orca から削除するだけです。ファイルは {{host}} に残っており、その SSH ホストを再追加すれば復元できます。", "removeDescriptionLocal": "この操作は {{name}} を Orca から削除するだけです。ファイルはディスクに残っています。", "removeDescriptionVmRecipe": "これにより、{{name}} が Orca から削除されます。その VM レシピによって、環境とそのファイルが完全に削除されるかどうかが決まります。", - "openTerminalWarningOne": "このプロジェクトで開いているターミナル 1 個が閉じられます。", - "openTerminalWarningMany": "このプロジェクトで開いているターミナル {{count}} 個が閉じられます。" + "openTerminalWarning_other": "このプロジェクトで開いている {{count}} 個のターミナルが閉じられます。" }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "アクティブなワークスペースを表示する" @@ -5544,7 +5543,7 @@ "4815c70605": "一致するプロジェクトはありません", "bbbc6e8e3b": "選択されていないプロジェクトは一致しません", "allProjects": "すべてのプロジェクト", - "selectedProjectsCount": "{{value0}} 件のプロジェクト" + "selectedProjects_other": "{{count}} 件のプロジェクト" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Orca を再起動", @@ -5592,8 +5591,6 @@ "7bada3b1ab": "並べ替え", "dc0bb670bc": "グループ化", "9919ae1082": "ワークスペースのオプション", - "bc96dbd041": "ワークスペースオプション ({{value0}})", - "optionsActiveLabel": "ワークスペースオプション({{value0}} 件アクティブ)", "af9249c505": "最新のワークスペースアクティビティ", "b451c8b162": "最近の", "6664282a7b": "プロジェクトをドラッグして配置します", @@ -5634,7 +5631,9 @@ "automation": "オートメーション", "folderPathIdentity": "ブランチ / フォルダーパス", "cli": "Orca CLI", - "workspaceOptions": "ワークスペースのオプション" + "workspaceOptions": "ワークスペースのオプション", + "optionsActiveFilters_other": "ワークスペースのオプション({{count}} 個のフィルターが有効)", + "optionsFilterCount_other": "ワークスペースのオプション({{count}} 個のフィルター)" }, "SshTargetRow": { "4677394048": "接続中…", @@ -5703,7 +5702,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agent", - "agentUnavailable": "Agent を利用できません" + "agentUnavailable": "Agent を利用できません", + "sendingTarget": "送信中…" }, "WorktreeCardMeta": { "3e65e11cc6": "ワークスペースのメタデータ", @@ -16610,8 +16610,6 @@ "failed24h": "失敗 · 24時間", "successful7d": "成功 · 7日間", "failed7d": "失敗 · 7日間", - "historyUnavailableOne": "1件の自動化で実行履歴を利用できません。カウントには利用可能な履歴のみが含まれます。", - "historyUnavailableMany": "{{count}}件の自動化で実行履歴を利用できません。カウントには利用可能な履歴のみが含まれます。", "automation": "自動化", "triggered": "トリガー済み", "trigger": "トリガー", @@ -16620,7 +16618,8 @@ "emptyDescription": "自動化がトリガーされると、ここに実行が表示されます。", "runs": "実行", "local": "ローカル", - "remote": "リモート" + "remote": "リモート", + "historyUnavailable_other": "{{count}} 件のオートメーションで実行履歴を利用できません。集計には利用可能な履歴のみが含まれます。" }, "AutomationsPageBreadcrumb": { "ariaLabel": "自動化のパンくずリスト", @@ -16984,9 +16983,6 @@ "sortedAscending": "{{value0}}、昇順にソート", "sortedDescending": "{{value0}}、降順でソート" }, - "hostSummary": { - "partialFailure": "{{total}} ホスト中 {{failed}} をロードできませんでした" - }, "emptyState": { "unknownHost": "このホスト", "hostLoading": "ホストを読み込み中…", @@ -17129,7 +17125,8 @@ "namedWorkspaceGone": "{{name}}(利用できなくなりました)" }, "usage": { - "tokensAndCost_other": "{{tokens}} トークン · {{cost}}" + "tokensAndCost_other": "{{tokens}} トークン · {{cost}}", + "costUnavailable": "不明" }, "externalDisplay": { "sshHost": "SSH ホスト", @@ -17141,6 +17138,9 @@ "connectSshHost": "{{provider}} のオートメーションを管理する前に、この SSH ホストに接続してください。", "cannotManageOnSshHost": "{{provider}} はこの SSH ホストでオートメーションを管理できません。", "cannotManageLocally": "{{provider}} はこのマシンでオートメーションを管理できません。" + }, + "hostSummary": { + "partialFailureOfHosts_other": "{{count}} 台中 {{failed}} 台のホストを読み込めませんでした" } }, "agent": { @@ -17206,8 +17206,8 @@ }, "filtersSection": "フィルター", "viewSection": "表示", - "threadListOptionsActive": "スレッドリストのオプション({{value0}} 件アクティブ)", - "activityOptionsActive": "アクティビティのオプション({{value0}})" + "threadListOptionsActiveFilters_other": "スレッドリストのオプション({{count}} 個のフィルターが有効)", + "activityOptionsFilterCount_other": "アクティビティのオプション({{count}} 個のフィルター)" }, "ActivityScopeFilterControls": { "resetScope": "すべてのホストとプロジェクトを表示", @@ -19335,7 +19335,8 @@ "forceDeleteRisk_other": "現在 {{count}} 件のワークスペースにリスクがあり、強制削除が必要になる可能性があります", "selectionVanishedCount_other": "選択した {{count}} 件のワークスペースはすでに存在しません。", "selectionWithheldCount_other": "選択した {{count}} 件のワークスペースは現在のフィルターで非表示になっているため、選択を解除しました。", - "selectAllSafetyChecked_other": "安全性を確認した {{count}} 件のワークスペースをすべて選択" + "selectAllSafetyChecked_other": "安全性を確認した {{count}} 件のワークスペースをすべて選択", + "lastActive": "最終アクティブ:{{value0}}" }, "scan": { "progress": "ワークスペースのスキャン ({{value0}}/{{value1}})", @@ -20036,6 +20037,50 @@ "peerCheckFailed": "Orca は WSL ホストに、このコンピューター上の別の Orca がまだ使用しているかを問い合わせられませんでした: {{detail}}", "removalUnrecorded": "Orca は、今回の削除後も実行中のものを記録できませんでした: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "待機中", + "blocked": "ブロック中", + "interrupted": "中断", + "failed": "失敗", + "working": "作業中", + "monitoring": "監視中", + "done": "完了", + "idle": "アイドル", + "notReporting": "報告なし", + "unconfirmed": "未確認", + "needsAttention": "対応が必要" + }, + "mixedStates": "{{subject}}:{{states}}", + "agentIdentityState": "{{agent}}:{{status}}", + "agentCount_other": "{{count}} 個の Agent", + "stateCount": { + "waiting_other": "{{count}} 個が待機中", + "blocked_other": "{{count}} 個がブロック中", + "interrupted_other": "{{count}} 個が中断", + "failed_other": "{{count}} 個が失敗", + "working_other": "{{count}} 個が作業中", + "monitoring_other": "{{count}} 個が監視中", + "done_other": "{{count}} 個が完了", + "idle_other": "{{count}} 個がアイドル", + "notReporting_other": "{{count}} 個から報告なし", + "unconfirmed_other": "{{count}} 個が未確認", + "needsAttention_other": "{{count}} 個に対応が必要" + }, + "allInState": { + "waiting_other": "全 {{count}} 個の Agent が待機中", + "blocked_other": "全 {{count}} 個の Agent がブロック中", + "interrupted_other": "全 {{count}} 個の Agent が中断", + "failed_other": "全 {{count}} 個の Agent が失敗", + "working_other": "全 {{count}} 個の Agent が作業中", + "monitoring_other": "全 {{count}} 個の Agent が監視中", + "done_other": "全 {{count}} 個の Agent が完了", + "idle_other": "全 {{count}} 個の Agent がアイドル", + "notReporting_other": "全 {{count}} 個の Agent から報告なし", + "unconfirmed_other": "全 {{count}} 個の Agent が未確認", + "needsAttention_other": "全 {{count}} 個の Agent に対応が必要" + } } }, "editor": { @@ -20343,7 +20388,13 @@ "kimiContinueSessionConflict": "Kimi に競合するオプションが渡されました:--continue, --session。再試行する前にテキスト生成レシピまたは CLI 引数を修正してください。" }, "enableSourceControlAi": "設定 -> Git でソース管理 AI を有効にしてください。", - "chooseBaseBranch": "生成する前にベースブランチを選択してください。" + "chooseBaseBranch": "生成する前にベースブランチを選択してください。", + "savedCommitRecipeRepo": "このリポジトリのコミットメッセージレシピを保存しました。", + "savedCommitRecipeGlobal": "コミットメッセージレシピをグローバルの既定値として保存しました。", + "savedReviewRecipeRepo": "このリポジトリのホスト型レビューレシピを保存しました。", + "savedReviewRecipeGlobal": "ホスト型レビューレシピをグローバルの既定値として保存しました。", + "savedBranchRecipeRepo": "このリポジトリのブランチ名レシピを保存しました。", + "savedBranchRecipeGlobal": "ブランチ名レシピをグローバルの既定値として保存しました。" }, "remoteError": { "submodule": { @@ -20417,6 +20468,13 @@ "pull": "プルがブロックされました — 先に未追跡ファイルを移動、削除、または追加してください。" }, "authenticationFailed": "認証に失敗しました。リモートの認証情報を確認してください。" + }, + "submodule": { + "worktreeOnlyLabel": "サブモジュール内でステージ", + "worktreeOnlyTooltip": "親リポジトリ(「すべてステージ」を含む)からは、サブモジュール内のファイル変更をステージできません", + "loading": "サブモジュールの変更を読み込み中…", + "empty": "サブモジュールに変更はありません", + "loadFailed": "サブモジュールの変更を読み込めませんでした" } }, "rendererRecovery": { @@ -21943,10 +22001,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} 件のフィルター", - "activeFilterCount_other": "{{count}} 件のフィルター" - }, "editorConflicts": { "kind": { "addedByUs": "こちらで追加", @@ -22476,5 +22530,15 @@ "image": "カスタムペット", "bundle": "ペットバンドル" } + }, + "diffComments": { + "lineRangeMeta": "{{start}}-{{end}} 行目", + "lineMeta": "{{line}} 行目" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "Agent に許可が必要です", + "statusStale": "Agent のステータスが古くなっています" + } } } diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index dcc2d26b1f2..8075b7fff3e 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -560,8 +560,8 @@ "clearHosts": "호스트 지우기", "clearProjects": "프로젝트 지우기", "back": "뒤로", - "ariaActive": "필터: {{value0}}개 활성.", - "scopedTo": "범위:" + "scopedTo": "범위:", + "ariaActiveCount_other": "필터: {{count}}개 활성." }, "linearIssue": { "createLabel": "Linear 문제 {{value0}}: {{value1}}에서 작업 트리 만들기", @@ -3136,7 +3136,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "{{value0}} 제거", - "352f15d6fc": "마지막 활동", "b6bae1eed1": "취소", "38ca0b1400": "그러면 로컬 파일이 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.", "e97e4580c7": "변경 있음", @@ -3865,7 +3864,9 @@ "f395c9a685": "파일을 가져오지 못했습니다.", "e6234bcc17": "맞춤 애완동물 업로드에는 앱 전체를 다시 시작해야 합니다(단순히 다시 로드하는 것이 아님).", "6d0a8cd179": "애완동물 표시", - "1fbc51cc77": "애완동물 숨기기" + "1fbc51cc77": "애완동물 숨기기", + "petFallbackLabel": "애완 동물", + "petHiddenLabel": "{{pet}} 숨김" }, "PortsStatusSegment": { "4ebf90c12e": "외부 포트가 감지되지 않았습니다.", @@ -4821,7 +4822,6 @@ "description": "Agents가 이 버전의 Orca에 대한 최신 지침을 따르도록 {{value0}}을(를) 업데이트하세요.", "title_other": "설치된 Orca 스킬 {{count}}개가 최신 상태가 아닙니다" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "스킬 업데이트", "checking": "설치된 Orca 스킬을 확인하는 중…", @@ -4859,7 +4859,6 @@ "updateServer": "서버의 Orca 업데이트 필요", "connectHost": "SSH 호스트 연결 필요" }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "Orca 사본으로 교체(백업 보관)" }, @@ -5349,7 +5348,8 @@ "c49fb13492": "이 호스트에 폴더를 추가하지 못했습니다.", "9a766f33ac": "이 경로는 SSH 호스트에서 확인되었습니다.", "79fd02cf5f": "이 경로는 {{hostName}}에서 확인되었습니다.", - "8851b77327": "이 경로는 로컬에서 확인되었습니다." + "8851b77327": "이 경로는 로컬에서 확인되었습니다.", + "sshConnectionUnavailable": "\"{{connection}}\" SSH 연결을 찾을 수 없거나 연결되지 않았습니다" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "후크 실행", @@ -5433,8 +5433,7 @@ "removeDescriptionSsh": "이 작업은 {{name}}을(를) Orca에서 제거만 합니다. 파일은 {{host}}에 그대로 남아 있으며, 해당 SSH 호스트를 다시 추가하면 복구할 수 있습니다.", "removeDescriptionLocal": "이 작업은 {{name}}을(를) Orca에서 제거만 합니다. 파일은 디스크에 그대로 남아 있습니다.", "removeDescriptionVmRecipe": "이렇게 하면 Orca에서 {{name}}이(가) 제거됩니다. 해당 VM 레시피에 따라 환경과 해당 파일이 영구적으로 삭제되는지 여부가 결정됩니다.", - "openTerminalWarningOne": "이 프로젝트에서 열려 있는 터미널 1개가 닫힙니다.", - "openTerminalWarningMany": "이 프로젝트에서 열려 있는 터미널 {{count}}개가 닫힙니다." + "openTerminalWarning_other": "이 프로젝트에서 열려 있는 터미널 {{count}}개가 닫힙니다." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "활성 워크스페이스로 이동" @@ -5544,7 +5543,7 @@ "4815c70605": "일치하는 프로젝트가 없습니다.", "bbbc6e8e3b": "선택되지 않은 일치하는 프로젝트가 없습니다.", "allProjects": "모든 프로젝트", - "selectedProjectsCount": "프로젝트 {{value0}}개" + "selectedProjects_other": "프로젝트 {{count}}개" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Orca 재시작", @@ -5592,8 +5591,6 @@ "7bada3b1ab": "정렬 기준", "dc0bb670bc": "그룹화 기준", "9919ae1082": "워크스페이스 옵션", - "bc96dbd041": "워크스페이스 옵션({{value0}})", - "optionsActiveLabel": "워크스페이스 옵션 ({{value0}} 활성)", "af9249c505": "가장 최근의 워크스페이스 활동", "b451c8b162": "최근", "6664282a7b": "프로젝트를 드래그하여 정렬하세요.", @@ -5634,7 +5631,9 @@ "automation": "자동화", "folderPathIdentity": "브랜치 / 폴더 경로", "cli": "Orca CLI", - "workspaceOptions": "워크스페이스 옵션" + "workspaceOptions": "워크스페이스 옵션", + "optionsActiveFilters_other": "워크스페이스 옵션(필터 {{count}}개 활성)", + "optionsFilterCount_other": "워크스페이스 옵션(필터 {{count}}개)" }, "SshTargetRow": { "4677394048": "연결 중…", @@ -5703,7 +5702,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "에이전트", - "agentUnavailable": "에이전트를 사용할 수 없습니다" + "agentUnavailable": "에이전트를 사용할 수 없습니다", + "sendingTarget": "전송 중..." }, "WorktreeCardMeta": { "3e65e11cc6": "워크스페이스 메타데이터", @@ -16610,8 +16610,6 @@ "failed24h": "실패 · 24시간", "successful7d": "성공 · 7일", "failed7d": "실패 · 7일", - "historyUnavailableOne": "자동화 1개의 실행 기록을 사용할 수 없습니다. 집계에는 사용 가능한 기록만 포함됩니다.", - "historyUnavailableMany": "자동화 {{count}}개의 실행 기록을 사용할 수 없습니다. 집계에는 사용 가능한 기록만 포함됩니다.", "automation": "자동화", "triggered": "트리거됨", "trigger": "트리거", @@ -16620,7 +16618,8 @@ "emptyDescription": "자동화를 트리거하면 여기에 실행이 표시됩니다.", "runs": "실행", "local": "로컬", - "remote": "원격" + "remote": "원격", + "historyUnavailable_other": "자동화 {{count}}개의 실행 기록을 사용할 수 없습니다. 집계에는 사용 가능한 기록만 포함됩니다." }, "AutomationsPageBreadcrumb": { "ariaLabel": "자동화 탐색경로", @@ -16984,9 +16983,6 @@ "sortedAscending": "{{value0}}, 오름차순 정렬", "sortedDescending": "{{value0}}, 내림차순으로 정렬" }, - "hostSummary": { - "partialFailure": "{{total}} 호스트 중 {{failed}}을(를) 로드할 수 없습니다." - }, "emptyState": { "unknownHost": "이 호스트", "hostLoading": "호스트 로드 중…", @@ -17129,7 +17125,8 @@ "namedWorkspaceGone": "{{name}} (더 이상 사용할 수 없음)" }, "usage": { - "tokensAndCost_other": "{{tokens}} 토큰 · {{cost}}" + "tokensAndCost_other": "{{tokens}} 토큰 · {{cost}}", + "costUnavailable": "알 수 없음" }, "externalDisplay": { "sshHost": "SSH 호스트", @@ -17141,6 +17138,9 @@ "connectSshHost": "{{provider}} 자동화를 관리하기 전에 이 SSH 호스트에 연결하세요.", "cannotManageOnSshHost": "{{provider}}에서 이 SSH 호스트의 자동화를 관리할 수 없습니다.", "cannotManageLocally": "{{provider}}에서 이 컴퓨터의 자동화를 관리할 수 없습니다." + }, + "hostSummary": { + "partialFailureOfHosts_other": "호스트 {{count}}개 중 {{failed}}개를 불러오지 못했습니다" } }, "agent": { @@ -17206,8 +17206,8 @@ }, "filtersSection": "필터", "viewSection": "보기", - "threadListOptionsActive": "스레드 목록 옵션 ({{value0}} 활성)", - "activityOptionsActive": "활동 옵션 ({{value0}})" + "threadListOptionsActiveFilters_other": "스레드 목록 옵션(필터 {{count}}개 활성)", + "activityOptionsFilterCount_other": "활동 옵션(필터 {{count}}개)" }, "ActivityScopeFilterControls": { "resetScope": "모든 호스트 및 프로젝트 표시", @@ -19328,7 +19328,8 @@ "forceDeleteRisk_other": "현재 워크스페이스 {{count}}개에 위험 요소가 있으며 강제 삭제가 필요할 수 있음", "selectionVanishedCount_other": "선택한 워크스페이스 {{count}}개가 더 이상 존재하지 않습니다.", "selectionWithheldCount_other": "선택한 워크스페이스 {{count}}개가 현재 필터에 의해 숨겨져 선택 해제되었습니다.", - "selectAllSafetyChecked_other": "안전성 검사를 마친 워크스페이스 {{count}}개 모두 선택" + "selectAllSafetyChecked_other": "안전성 검사를 마친 워크스페이스 {{count}}개 모두 선택", + "lastActive": "마지막 활동: {{value0}}" }, "scan": { "progress": "워크스페이스 스캔 중({{value0}}/{{value1}})", @@ -20036,6 +20037,50 @@ "peerCheckFailed": "Orca가 WSL 호스트에 이 컴퓨터의 다른 Orca가 아직 사용 중인지 확인을 요청하지 못했습니다: {{detail}}", "removalUnrecorded": "Orca가 이번 제거 후에도 계속 실행 중인 항목을 기록하지 못했습니다: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "대기 중", + "blocked": "차단됨", + "interrupted": "중단됨", + "failed": "실패", + "working": "작업 중", + "monitoring": "모니터링 중", + "done": "완료", + "idle": "유휴", + "notReporting": "보고 없음", + "unconfirmed": "미확인", + "needsAttention": "확인 필요" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}} {{status}}", + "agentCount_other": "에이전트 {{count}}개", + "stateCount": { + "waiting_other": "{{count}}개 대기 중", + "blocked_other": "{{count}}개 차단됨", + "interrupted_other": "{{count}}개 중단됨", + "failed_other": "{{count}}개 실패", + "working_other": "{{count}}개 작업 중", + "monitoring_other": "{{count}}개 모니터링 중", + "done_other": "{{count}}개 완료", + "idle_other": "{{count}}개 유휴", + "notReporting_other": "{{count}}개 보고 없음", + "unconfirmed_other": "{{count}}개 미확인", + "needsAttention_other": "{{count}}개 확인 필요" + }, + "allInState": { + "waiting_other": "에이전트 {{count}}개 모두 대기 중", + "blocked_other": "에이전트 {{count}}개 모두 차단됨", + "interrupted_other": "에이전트 {{count}}개 모두 중단됨", + "failed_other": "에이전트 {{count}}개 모두 실패", + "working_other": "에이전트 {{count}}개 모두 작업 중", + "monitoring_other": "에이전트 {{count}}개 모두 모니터링 중", + "done_other": "에이전트 {{count}}개 모두 완료", + "idle_other": "에이전트 {{count}}개 모두 유휴", + "notReporting_other": "에이전트 {{count}}개 모두 보고 없음", + "unconfirmed_other": "에이전트 {{count}}개 모두 미확인", + "needsAttention_other": "에이전트 {{count}}개 모두 확인 필요" + } } }, "editor": { @@ -20343,7 +20388,13 @@ "kimiContinueSessionConflict": "Kimi가 충돌하는 옵션을 받았습니다: --continue, --session. 다시 시도하기 전에 텍스트 생성 레시피 또는 CLI 인수를 수정하세요." }, "enableSourceControlAi": "설정 -> Git에서 소스 제어 AI를 활성화하세요.", - "chooseBaseBranch": "생성하기 전에 기준 브랜치를 선택하세요." + "chooseBaseBranch": "생성하기 전에 기준 브랜치를 선택하세요.", + "savedCommitRecipeRepo": "이 저장소의 커밋 메시지 레시피를 저장했습니다.", + "savedCommitRecipeGlobal": "커밋 메시지 레시피를 전역 기본값으로 저장했습니다.", + "savedReviewRecipeRepo": "이 저장소의 호스팅 리뷰 레시피를 저장했습니다.", + "savedReviewRecipeGlobal": "호스팅 리뷰 레시피를 전역 기본값으로 저장했습니다.", + "savedBranchRecipeRepo": "이 저장소의 브랜치 이름 레시피를 저장했습니다.", + "savedBranchRecipeGlobal": "브랜치 이름 레시피를 전역 기본값으로 저장했습니다." }, "remoteError": { "submodule": { @@ -20417,6 +20468,13 @@ "pull": "풀 차단됨 — 먼저 추적되지 않은 파일을 이동, 제거 또는 추가하세요." }, "authenticationFailed": "인증에 실패했습니다. 원격 인증 정보를 확인하세요." + }, + "submodule": { + "worktreeOnlyLabel": "하위 모듈 내에서 스테이징", + "worktreeOnlyTooltip": "상위 저장소(모두 스테이지 포함)에서는 하위 모듈 내 파일 변경 사항을 스테이징할 수 없습니다", + "loading": "하위 모듈 변경 사항을 불러오는 중…", + "empty": "하위 모듈에 변경 사항 없음", + "loadFailed": "하위 모듈 변경 사항을 불러오지 못했습니다" } }, "rendererRecovery": { @@ -21943,10 +22001,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "필터 {{count}}개", - "activeFilterCount_other": "필터 {{count}}개" - }, "editorConflicts": { "kind": { "addedByUs": "우리 쪽에서 추가됨", @@ -22476,5 +22530,15 @@ "image": "사용자 정의 애완동물", "bundle": "애완동물 번들" } + }, + "diffComments": { + "lineRangeMeta": "{{start}}-{{end}}행", + "lineMeta": "{{line}}행" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "에이전트에 권한이 필요합니다", + "statusStale": "에이전트 상태 정보가 오래되었습니다" + } } } diff --git a/src/renderer/src/i18n/locales/pt.json b/src/renderer/src/i18n/locales/pt.json index daf006c438d..2e8eac2a3ea 100644 --- a/src/renderer/src/i18n/locales/pt.json +++ b/src/renderer/src/i18n/locales/pt.json @@ -200,7 +200,13 @@ "kimiContinueSessionConflict": "Kimi recebeu opções conflitantes: --continue, --session. Corrija a receita de geração de texto ou os argumentos da CLI antes de tentar novamente." }, "enableSourceControlAi": "Ative a IA de Controle de Versão em Configurações -> Git.", - "chooseBaseBranch": "Escolha uma branch base antes de gerar." + "chooseBaseBranch": "Escolha uma branch base antes de gerar.", + "savedCommitRecipeRepo": "Receita de mensagem de commit salva para este repositório.", + "savedCommitRecipeGlobal": "Receita de mensagem de commit salva como padrão global.", + "savedReviewRecipeRepo": "Receita de revisão hospedada salva para este repositório.", + "savedReviewRecipeGlobal": "Receita de revisão hospedada salva como padrão global.", + "savedBranchRecipeRepo": "Receita de nome de branch salva para este repositório.", + "savedBranchRecipeGlobal": "Receita de nome de branch salva como padrão global." }, "remoteError": { "submodule": { @@ -274,6 +280,13 @@ "pull": "Pull bloqueado — mova, remova ou adicione os arquivos não rastreados primeiro." }, "authenticationFailed": "Falha na autenticação. Verifique suas credenciais de acesso ao remoto." + }, + "submodule": { + "worktreeOnlyLabel": "Adicionar ao stage dentro do submódulo", + "worktreeOnlyTooltip": "O repo pai (incluindo Adicionar tudo ao stage) não pode adicionar ao stage alterações de arquivos dentro de um submódulo", + "loading": "Carregando alterações do submódulo…", + "empty": "Nenhuma alteração no submódulo", + "loadFailed": "Não foi possível carregar as alterações do submódulo" } }, "githubChecks": { @@ -479,6 +492,96 @@ "peerCheckFailed": "O Orca não conseguiu consultar o host WSL para saber se outro Orca neste computador ainda o usa: {{detail}}", "removalUnrecorded": "O Orca não conseguiu registrar o que continuou em execução após esta remoção: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "aguardando", + "blocked": "bloqueado", + "interrupted": "interrompido", + "failed": "falhou", + "working": "trabalhando", + "monitoring": "monitorando", + "done": "concluído", + "idle": "ocioso", + "notReporting": "sem informar o status", + "unconfirmed": "não confirmado", + "needsAttention": "precisa de atenção" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}}: {{status}}", + "agentCount_one": "{{count}} agente", + "agentCount_other": "{{count}} agentes", + "agentCount_many": "{{count}} agentes", + "stateCount": { + "waiting_one": "{{count}} aguardando", + "waiting_other": "{{count}} aguardando", + "waiting_many": "{{count}} aguardando", + "blocked_one": "{{count}} bloqueado", + "blocked_other": "{{count}} bloqueados", + "blocked_many": "{{count}} bloqueados", + "interrupted_one": "{{count}} interrompido", + "interrupted_other": "{{count}} interrompidos", + "interrupted_many": "{{count}} interrompidos", + "failed_one": "{{count}} falhou", + "failed_other": "{{count}} falharam", + "failed_many": "{{count}} falharam", + "working_one": "{{count}} trabalhando", + "working_other": "{{count}} trabalhando", + "working_many": "{{count}} trabalhando", + "monitoring_one": "{{count}} monitorando", + "monitoring_other": "{{count}} monitorando", + "monitoring_many": "{{count}} monitorando", + "done_one": "{{count}} concluído", + "done_other": "{{count}} concluídos", + "done_many": "{{count}} concluídos", + "idle_one": "{{count}} ocioso", + "idle_other": "{{count}} ociosos", + "idle_many": "{{count}} ociosos", + "notReporting_one": "{{count}} sem informar o status", + "notReporting_other": "{{count}} sem informar o status", + "notReporting_many": "{{count}} sem informar o status", + "unconfirmed_one": "{{count}} não confirmado", + "unconfirmed_other": "{{count}} não confirmados", + "unconfirmed_many": "{{count}} não confirmados", + "needsAttention_one": "{{count}} precisa de atenção", + "needsAttention_other": "{{count}} precisam de atenção", + "needsAttention_many": "{{count}} precisam de atenção" + }, + "allInState": { + "waiting_one": "{{count}} agente aguardando", + "waiting_other": "Todos os {{count}} agentes aguardando", + "waiting_many": "Todos os {{count}} agentes aguardando", + "blocked_one": "{{count}} agente bloqueado", + "blocked_other": "Todos os {{count}} agentes bloqueados", + "blocked_many": "Todos os {{count}} agentes bloqueados", + "interrupted_one": "{{count}} agente interrompido", + "interrupted_other": "Todos os {{count}} agentes interrompidos", + "interrupted_many": "Todos os {{count}} agentes interrompidos", + "failed_one": "{{count}} agente falhou", + "failed_other": "Todos os {{count}} agentes falharam", + "failed_many": "Todos os {{count}} agentes falharam", + "working_one": "{{count}} agente trabalhando", + "working_other": "Todos os {{count}} agentes trabalhando", + "working_many": "Todos os {{count}} agentes trabalhando", + "monitoring_one": "{{count}} agente monitorando", + "monitoring_other": "Todos os {{count}} agentes monitorando", + "monitoring_many": "Todos os {{count}} agentes monitorando", + "done_one": "{{count}} agente concluiu o trabalho", + "done_other": "Todos os {{count}} agentes concluíram o trabalho", + "done_many": "Todos os {{count}} agentes concluíram o trabalho", + "idle_one": "{{count}} agente ocioso", + "idle_other": "Todos os {{count}} agentes ociosos", + "idle_many": "Todos os {{count}} agentes ociosos", + "notReporting_one": "{{count}} agente sem informar o status", + "notReporting_other": "Todos os {{count}} agentes sem informar o status", + "notReporting_many": "Todos os {{count}} agentes sem informar o status", + "unconfirmed_one": "{{count}} agente não confirmado", + "unconfirmed_other": "Todos os {{count}} agentes não confirmados", + "unconfirmed_many": "Todos os {{count}} agentes não confirmados", + "needsAttention_one": "{{count}} agente precisa de atenção", + "needsAttention_other": "Todos os {{count}} agentes precisam de atenção", + "needsAttention_many": "Todos os {{count}} agentes precisam de atenção" + } } }, "tray": { @@ -795,8 +898,10 @@ "clearHosts": "Limpar hosts", "clearProjects": "Limpar projetos", "back": "Voltar", - "ariaActive": "Filtro: {{value0}} ativo(s).", - "scopedTo": "Limitado a" + "scopedTo": "Limitado a", + "ariaActiveCount_one": "Filtro: {{count}} ativo.", + "ariaActiveCount_other": "Filtro: {{count}} ativos.", + "ariaActiveCount_many": "Filtro: {{count}} ativos." }, "taskUrl": { "loadingHint": "Carregando {{value0}}…", @@ -2795,7 +2900,9 @@ "f395c9a685": "Falha ao importar o arquivo", "e6234bcc17": "O envio de bichinho personalizado exige reiniciar todo o aplicativo (não apenas recarregar).", "6d0a8cd179": "Mostrar bichinho", - "1fbc51cc77": "Ocultar bichinho" + "1fbc51cc77": "Ocultar bichinho", + "petFallbackLabel": "Bichinho", + "petHiddenLabel": "{{pet}} (não visível)" }, "PortsStatusSegment": { "4ebf90c12e": "Nenhuma porta externa detectada", @@ -10882,8 +10989,6 @@ "7bada3b1ab": "Ordenar por", "dc0bb670bc": "Agrupar por", "9919ae1082": "Opções do espaço de trabalho", - "bc96dbd041": "Opções do espaço de trabalho ({{value0}})", - "optionsActiveLabel": "Opções do espaço de trabalho ({{value0}} ativas)", "af9249c505": "Atividade mais recente do espaço de trabalho", "b451c8b162": "Recente", "6664282a7b": "Arraste os projetos para organizá-los", @@ -10917,7 +11022,13 @@ "folderPathIdentity": "Branch / caminho da pasta", "cli": "CLI do Orca", "workspaceOptions": "Opções do espaço de trabalho", - "host": "Host" + "host": "Host", + "optionsActiveFilters_one": "Opções do espaço de trabalho ({{count}} filtro ativo)", + "optionsActiveFilters_other": "Opções do espaço de trabalho ({{count}} filtros ativos)", + "optionsActiveFilters_many": "Opções do espaço de trabalho ({{count}} filtros ativos)", + "optionsFilterCount_one": "Opções do espaço de trabalho ({{count}} filtro)", + "optionsFilterCount_other": "Opções do espaço de trabalho ({{count}} filtros)", + "optionsFilterCount_many": "Opções do espaço de trabalho ({{count}} filtros)" }, "WorktreeList": { "7a8b9c0d1e": "Atualização necessária", @@ -11601,7 +11712,9 @@ "4815c70605": "Nenhum projeto corresponde", "bbbc6e8e3b": "Nenhum projeto não selecionado corresponde", "allProjects": "Todos os projetos", - "selectedProjectsCount": "{{value0}} projetos" + "selectedProjects_one": "{{count}} projeto", + "selectedProjects_other": "{{count}} projetos", + "selectedProjects_many": "{{count}} projetos" }, "SidebarWorkspaceFilterSection": { "c3fa13dc2e": "Ocultar branch padrão", @@ -11786,7 +11899,8 @@ "c49fb13492": "Falha ao adicionar a pasta neste host", "9a766f33ac": "Este caminho foi verificado no host SSH.", "79fd02cf5f": "Este caminho foi verificado em {{hostName}}.", - "8851b77327": "Este caminho foi verificado localmente." + "8851b77327": "Este caminho foi verificado localmente.", + "sshConnectionUnavailable": "A conexão SSH \"{{connection}}\" não foi encontrada ou não está conectada" }, "RemoteFileBrowser": { "2300612806": "Digite para filtrar ou informe um caminho…", @@ -11832,8 +11946,9 @@ "removeDescriptionSsh": "Isso remove {{name}} apenas do Orca. Seus arquivos permanecem em {{host}} — adicione novamente esse host SSH para recuperá-lo.", "removeDescriptionLocal": "Isso remove {{name}} apenas do Orca. Ele ainda está no seu disco.", "removeDescriptionVmRecipe": "Isso remove {{name}} do Orca. A receita de VM determina se o ambiente e seus arquivos são excluídos permanentemente.", - "openTerminalWarningOne": "1 terminal aberto neste projeto será fechado.", - "openTerminalWarningMany": "{{count}} terminais abertos neste projeto serão fechados." + "openTerminalWarning_one": "{{count}} terminal aberto neste projeto será fechado.", + "openTerminalWarning_other": "{{count}} terminais abertos neste projeto serão fechados.", + "openTerminalWarning_many": "{{count}} terminais abertos neste projeto serão fechados." }, "WorktreeCardMetadataStatusBadges": { "fe188062a1": "Estado: Aberto", @@ -12117,7 +12232,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Agentes", - "agentUnavailable": "O agente não está disponível" + "agentUnavailable": "O agente não está disponível", + "sendingTarget": "Enviando..." }, "CacheTimer": { "expiredTooltip": "A próxima mensagem reenviará todo o contexto como tokens sem cache", @@ -13253,7 +13369,6 @@ "updateAction_other": "Atualizar {{count}} skills", "updateAction_many": "Atualizar {{count}} skills" }, - "SkillFreshnessRow": {}, "SkillShareReviewContent": { "6d6233a3a4": "Copiar link", "0142581727": "Enviando…", @@ -13580,7 +13695,6 @@ "loading": "Carregando links compartilhados…", "noMatches": "Nenhum link corresponde a esta busca." }, - "SkillUpdateResultRows": {}, "skill-install-progress-state": { "currentSkill": "Instalando {{value0}} de {{value1}}: {{value2}}…" }, @@ -13871,8 +13985,6 @@ "failed24h": "Com falha · 24h", "successful7d": "Bem-sucedidas · 7d", "failed7d": "Com falha · 7d", - "historyUnavailableOne": "O histórico de execução não está disponível para 1 automação. As contagens incluem apenas o histórico disponível.", - "historyUnavailableMany": "O histórico de execução não está disponível para {{count}} automações. As contagens incluem apenas o histórico disponível.", "automation": "Automação", "triggered": "Acionada", "trigger": "Acionador", @@ -13881,7 +13993,10 @@ "emptyDescription": "As execuções aparecem aqui depois que uma automação é acionada.", "runs": "Execuções", "local": "Local", - "remote": "Remoto" + "remote": "Remoto", + "historyUnavailable_one": "O histórico de execuções está indisponível para {{count}} automação. As contagens incluem apenas o histórico disponível.", + "historyUnavailable_other": "O histórico de execuções está indisponível para {{count}} automações. As contagens incluem apenas o histórico disponível.", + "historyUnavailable_many": "O histórico de execuções está indisponível para {{count}} automações. As contagens incluem apenas o histórico disponível." }, "AutomationEditorDialog": { "fb1896a5e7": "Cancelar", @@ -14106,9 +14221,6 @@ "AutomationListLocalRows": { "c92c9463c6": "Ações da automação" }, - "hostSummary": { - "partialFailure": "{{failed}} de {{total}} hosts não puderam ser carregados" - }, "ownerConflict": { "dismiss": "Descartar" }, @@ -14187,7 +14299,8 @@ "usage": { "tokensAndCost_one": "{{tokens}} token · {{cost}}", "tokensAndCost_other": "{{tokens}} tokens · {{cost}}", - "tokensAndCost_many": "{{tokens}} tokens · {{cost}}" + "tokensAndCost_many": "{{tokens}} tokens · {{cost}}", + "costUnavailable": "n/d" }, "externalDisplay": { "sshHost": "Host SSH", @@ -14199,6 +14312,11 @@ "connectSshHost": "Conecte este host SSH antes de gerenciar automações de {{provider}}.", "cannotManageOnSshHost": "{{provider}} não pode gerenciar automações neste host SSH.", "cannotManageLocally": "{{provider}} não pode gerenciar automações nesta máquina." + }, + "hostSummary": { + "partialFailureOfHosts_one": "Falha ao carregar {{failed}} de {{count}} host", + "partialFailureOfHosts_other": "Falha ao carregar {{failed}} de {{count}} hosts", + "partialFailureOfHosts_many": "Falha ao carregar {{failed}} de {{count}} hosts" } }, "TaskPage": { @@ -16978,7 +17096,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "Remover {{value0}}", - "352f15d6fc": "Última atividade", "b6bae1eed1": "Cancelar", "38ca0b1400": "Isso exclui permanentemente seus arquivos locais. Você não pode desfazer isso.", "e97e4580c7": "Sujo", @@ -17546,8 +17663,12 @@ }, "filtersSection": "Filtros", "viewSection": "Visualização", - "threadListOptionsActive": "Opções da lista de conversas ({{value0}} ativas)", - "activityOptionsActive": "Opções de atividade ({{value0}})" + "threadListOptionsActiveFilters_one": "Opções da lista de threads ({{count}} filtro ativo)", + "threadListOptionsActiveFilters_other": "Opções da lista de threads ({{count}} filtros ativos)", + "threadListOptionsActiveFilters_many": "Opções da lista de threads ({{count}} filtros ativos)", + "activityOptionsFilterCount_one": "Opções de atividade ({{count}} filtro)", + "activityOptionsFilterCount_other": "Opções de atividade ({{count}} filtros)", + "activityOptionsFilterCount_many": "Opções de atividade ({{count}} filtros)" }, "clearCompleted": { "undo": "Desfazer", @@ -20692,7 +20813,8 @@ "selectionWithheldCount_many": "{{count}} espaços de trabalho selecionados estão ocultos pelos filtros atuais e foram desmarcados.", "selectAllSafetyChecked_one": "Selecionar {{count}} espaço de trabalho com segurança verificada", "selectAllSafetyChecked_other": "Selecionar todos os {{count}} espaços de trabalho com segurança verificada", - "selectAllSafetyChecked_many": "Selecionar todos os {{count}} espaços de trabalho com segurança verificada" + "selectAllSafetyChecked_many": "Selecionar todos os {{count}} espaços de trabalho com segurança verificada", + "lastActive": "Última atividade: {{value0}}" }, "scan": { "progress": "Verificando espaços de trabalho ({{value0}}/{{value1}})", @@ -22378,11 +22500,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filtro", - "activeFilterCount_other": "{{count}} filtros", - "activeFilterCount_many": "{{count}} filtros" - }, "editorConflicts": { "kind": { "addedByUs": "Adicionado por nós", @@ -22915,5 +23032,15 @@ "image": "Bichinho personalizado", "bundle": "Pacote do bichinho" } + }, + "diffComments": { + "lineRangeMeta": "linhas {{start}}-{{end}}", + "lineMeta": "linha {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "O agente precisa de permissão", + "statusStale": "O status do agente está desatualizado" + } } } diff --git a/src/renderer/src/i18n/locales/ru.json b/src/renderer/src/i18n/locales/ru.json index 676746cf473..bee849a6bd4 100644 --- a/src/renderer/src/i18n/locales/ru.json +++ b/src/renderer/src/i18n/locales/ru.json @@ -140,6 +140,119 @@ "restartGaveUp_few": "Не удалось перезапустить сервер Orca в {{distro}} после {{count}} попыток", "restartGaveUp_many": "Не удалось перезапустить сервер Orca в {{distro}} после {{count}} попыток" } + }, + "agentSummary": { + "state": { + "waiting": "ожидание", + "blocked": "заблокирован", + "interrupted": "прерван", + "failed": "ошибка", + "working": "в работе", + "monitoring": "наблюдение", + "done": "готово", + "idle": "бездействует", + "notReporting": "нет данных о статусе", + "unconfirmed": "не подтверждён", + "needsAttention": "требует внимания" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}}: {{status}}", + "agentCount_one": "{{count}} агент", + "agentCount_other": "{{count}} агента", + "agentCount_few": "{{count}} агента", + "agentCount_many": "{{count}} агентов", + "stateCount": { + "waiting_one": "{{count}} ожидает", + "waiting_other": "{{count}} ожидают", + "blocked_one": "{{count}} заблокирован", + "blocked_other": "{{count}} заблокированы", + "interrupted_one": "{{count}} прерван", + "interrupted_other": "{{count}} прерваны", + "failed_one": "{{count}} дал сбой", + "failed_other": "{{count}} дали сбой", + "working_one": "{{count}} работает", + "working_other": "{{count}} работают", + "monitoring_one": "{{count}} наблюдает", + "monitoring_other": "{{count}} наблюдают", + "done_one": "{{count}} завершил работу", + "done_other": "{{count}} завершили работу", + "idle_one": "{{count}} бездействует", + "idle_other": "{{count}} бездействуют", + "notReporting_one": "{{count}} не сообщает статус", + "notReporting_other": "{{count}} не сообщают статус", + "unconfirmed_one": "{{count}} не подтверждён", + "unconfirmed_other": "{{count}} не подтверждены", + "needsAttention_one": "{{count}} требует внимания", + "needsAttention_other": "{{count}} требуют внимания", + "waiting_few": "{{count}} ожидают", + "waiting_many": "{{count}} ожидают", + "blocked_few": "{{count}} заблокированы", + "blocked_many": "{{count}} заблокированы", + "interrupted_few": "{{count}} прерваны", + "interrupted_many": "{{count}} прерваны", + "failed_few": "{{count}} дали сбой", + "failed_many": "{{count}} дали сбой", + "working_few": "{{count}} работают", + "working_many": "{{count}} работают", + "monitoring_few": "{{count}} наблюдают", + "monitoring_many": "{{count}} наблюдают", + "done_few": "{{count}} завершили работу", + "done_many": "{{count}} завершили работу", + "idle_few": "{{count}} бездействуют", + "idle_many": "{{count}} бездействуют", + "notReporting_few": "{{count}} не сообщают статус", + "notReporting_many": "{{count}} не сообщают статус", + "unconfirmed_few": "{{count}} не подтверждены", + "unconfirmed_many": "{{count}} не подтверждены", + "needsAttention_few": "{{count}} требуют внимания", + "needsAttention_many": "{{count}} требуют внимания" + }, + "allInState": { + "waiting_one": "{{count}} агент ожидает", + "waiting_other": "Все {{count}} агента ожидают", + "blocked_one": "{{count}} агент заблокирован", + "blocked_other": "Все {{count}} агента заблокированы", + "interrupted_one": "{{count}} агент прерван", + "interrupted_other": "Все {{count}} агента прерваны", + "failed_one": "{{count}} агент дал сбой", + "failed_other": "Все {{count}} агента дали сбой", + "working_one": "{{count}} агент работает", + "working_other": "Все {{count}} агента работают", + "monitoring_one": "{{count}} агент наблюдает", + "monitoring_other": "Все {{count}} агента наблюдают", + "done_one": "{{count}} агент завершил работу", + "done_other": "Все {{count}} агента завершили работу", + "idle_one": "{{count}} агент бездействует", + "idle_other": "Все {{count}} агента бездействуют", + "notReporting_one": "{{count}} агент не сообщает статус", + "notReporting_other": "Все {{count}} агента не сообщают статус", + "unconfirmed_one": "{{count}} агент не подтверждён", + "unconfirmed_other": "Все {{count}} агента не подтверждены", + "needsAttention_one": "{{count}} агент требует внимания", + "needsAttention_other": "Все {{count}} агента требуют внимания", + "waiting_few": "Все {{count}} агента ожидают", + "waiting_many": "Все {{count}} агентов ожидают", + "blocked_few": "Все {{count}} агента заблокированы", + "blocked_many": "Все {{count}} агентов заблокированы", + "interrupted_few": "Все {{count}} агента прерваны", + "interrupted_many": "Все {{count}} агентов прерваны", + "failed_few": "Все {{count}} агента дали сбой", + "failed_many": "Все {{count}} агентов дали сбой", + "working_few": "Все {{count}} агента работают", + "working_many": "Все {{count}} агентов работают", + "monitoring_few": "Все {{count}} агента наблюдают", + "monitoring_many": "Все {{count}} агентов наблюдают", + "done_few": "Все {{count}} агента завершили работу", + "done_many": "Все {{count}} агентов завершили работу", + "idle_few": "Все {{count}} агента бездействуют", + "idle_many": "Все {{count}} агентов бездействуют", + "notReporting_few": "Все {{count}} агента не сообщают статус", + "notReporting_many": "Все {{count}} агентов не сообщают статус", + "unconfirmed_few": "Все {{count}} агента не подтверждены", + "unconfirmed_many": "Все {{count}} агентов не подтверждены", + "needsAttention_few": "Все {{count}} агента требуют внимания", + "needsAttention_many": "Все {{count}} агентов требуют внимания" + } } }, "app": { @@ -961,8 +1074,11 @@ "clearHosts": "Очистить выбор серверов", "clearProjects": "Очистить выбор проектов", "back": "Назад", - "ariaActive": "Фильтр: активных — {{value0}}.", - "scopedTo": "Область поиска" + "scopedTo": "Область поиска", + "ariaActiveCount_one": "Фильтр: активен {{count}} фильтр.", + "ariaActiveCount_other": "Фильтр: {{count}} активного фильтра.", + "ariaActiveCount_few": "Фильтр: активны {{count}} фильтра.", + "ariaActiveCount_many": "Фильтр: активны {{count}} фильтров." }, "taskUrl": { "loadingHint": "Загрузка {{value0}}…", @@ -3651,7 +3767,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "Удалить {{value0}}", - "352f15d6fc": "Последняя активность", "b6bae1eed1": "Отмена", "38ca0b1400": "Локальные файлы будут удалены навсегда. Это действие нельзя отменить.", "e97e4580c7": "Есть изменения", @@ -4395,7 +4510,9 @@ "f395c9a685": "Не удалось импортировать файл", "e6234bcc17": "Для загрузки своего питомца нужен полный перезапуск приложения, простого обновления окна недостаточно.", "6d0a8cd179": "Показать питомца", - "1fbc51cc77": "Скрыть питомца" + "1fbc51cc77": "Скрыть питомца", + "petFallbackLabel": "Питомец", + "petHiddenLabel": "{{pet}} не отображается" }, "PortsStatusSegment": { "4ebf90c12e": "Внешние порты не обнаружены", @@ -6156,7 +6273,8 @@ "c49fb13492": "Не удалось добавить папку на этом компьютере", "9a766f33ac": "Этот путь проверен на SSH-сервере.", "79fd02cf5f": "Этот путь проверен на {{hostName}}.", - "8851b77327": "Этот путь проверен локально." + "8851b77327": "Этот путь проверен локально.", + "sshConnectionUnavailable": "SSH-соединение «{{connection}}» не найдено или не подключено" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Выполнить хуки", @@ -6246,8 +6364,10 @@ "removeDescriptionSsh": "Это только уберёт {{name}} из Orca. Файлы останутся на {{host}} — добавьте этот SSH-сервер заново, чтобы восстановить доступ.", "removeDescriptionLocal": "Это только уберёт {{name}} из Orca. Папка останется на диске.", "removeDescriptionVmRecipe": "Это уберёт {{name}} из Orca. Будут ли окружение и его файлы удалены навсегда, зависит от рецепта ВМ.", - "openTerminalWarningOne": "1 открытый терминал этого проекта будет закрыт.", - "openTerminalWarningMany": "Будут закрыты открытые терминалы этого проекта: {{count}}." + "openTerminalWarning_one": "В этом проекте будет закрыт {{count}} открытый терминал.", + "openTerminalWarning_other": "В этом проекте будет закрыто {{count}} открытого терминала.", + "openTerminalWarning_few": "В этом проекте будут закрыты {{count}} открытых терминала.", + "openTerminalWarning_many": "В этом проекте будут закрыты {{count}} открытых терминалов." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Показать активное рабочее пространство" @@ -6359,7 +6479,10 @@ "4815c70605": "Нет подходящих проектов", "bbbc6e8e3b": "Подходящих невыбранных проектов нет", "allProjects": "Все проекты", - "selectedProjectsCount": "Проектов: {{value0}}" + "selectedProjects_one": "{{count}} проект", + "selectedProjects_other": "{{count}} проекта", + "selectedProjects_few": "{{count}} проекта", + "selectedProjects_many": "{{count}} проектов" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Перезапустить Orca", @@ -6422,7 +6545,6 @@ "7bada3b1ab": "Сортировать по", "dc0bb670bc": "Группировать по", "9919ae1082": "Параметры рабочих пространств", - "bc96dbd041": "Параметры рабочих пространств ({{value0}})", "af9249c505": "Недавняя активность рабочих пространств", "b451c8b162": "Недавние", "6664282a7b": "Перетаскивайте проекты, чтобы менять их порядок", @@ -6457,7 +6579,14 @@ "folderPathIdentity": "Ветка / путь папки", "cli": "Orca CLI", "workspaceOptions": "Параметры рабочих пространств", - "optionsActiveLabel": "Параметры рабочего пространства (активно: {{value0}})" + "optionsActiveFilters_one": "Параметры рабочих пространств ({{count}} активный фильтр)", + "optionsActiveFilters_other": "Параметры рабочих пространств ({{count}} активного фильтра)", + "optionsFilterCount_one": "Параметры рабочих пространств ({{count}} фильтр)", + "optionsFilterCount_other": "Параметры рабочих пространств ({{count}} фильтра)", + "optionsActiveFilters_few": "Параметры рабочих пространств ({{count}} активных фильтра)", + "optionsActiveFilters_many": "Параметры рабочих пространств ({{count}} активных фильтров)", + "optionsFilterCount_few": "Параметры рабочих пространств ({{count}} фильтра)", + "optionsFilterCount_many": "Параметры рабочих пространств ({{count}} фильтров)" }, "SshTargetRow": { "4677394048": "Подключение…", @@ -6529,7 +6658,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Агенты", - "agentUnavailable": "Агент недоступен" + "agentUnavailable": "Агент недоступен", + "sendingTarget": "Отправка…" }, "WorktreeCardMeta": { "3e65e11cc6": "Метаданные рабочего пространства", @@ -17730,9 +17860,6 @@ "sortedAscending": "{{value0}}, по возрастанию", "sortedDescending": "{{value0}}, по убыванию" }, - "hostSummary": { - "partialFailure": "Не удалось загрузить серверы: {{failed}} из {{total}}" - }, "emptyState": { "unknownHost": "этот сервер", "hostLoading": "Загрузка сервера…", @@ -17848,8 +17975,6 @@ "failed24h": "Неуспешно · 24 ч", "successful7d": "Успешно · 7 дн", "failed7d": "Неуспешно · 7 дн", - "historyUnavailableOne": "История запусков недоступна для 1 автоматизации. В счётчиках учтена только доступная история.", - "historyUnavailableMany": "История запусков недоступна для автоматизаций: {{count}}. В счётчиках учтена только доступная история.", "automation": "Автоматизация", "triggered": "Запущено", "trigger": "Триггер", @@ -17858,7 +17983,11 @@ "emptyDescription": "После срабатывания автоматизации её запуски появятся здесь.", "runs": "Запуски", "local": "Локально", - "remote": "Удалённо" + "remote": "Удалённо", + "historyUnavailable_one": "История запусков недоступна для {{count}} автоматизации. В подсчётах учитывается только доступная история.", + "historyUnavailable_other": "История запусков недоступна для {{count}} автоматизации. В подсчётах учитывается только доступная история.", + "historyUnavailable_few": "История запусков недоступна для {{count}} автоматизаций. В подсчётах учитывается только доступная история.", + "historyUnavailable_many": "История запусков недоступна для {{count}} автоматизаций. В подсчётах учитывается только доступная история." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Путь раздела автоматизаций", @@ -17934,7 +18063,8 @@ "tokensAndCost_one": "{{tokens}} токен · {{cost}}", "tokensAndCost_few": "{{tokens}} токена · {{cost}}", "tokensAndCost_many": "{{tokens}} токенов · {{cost}}", - "tokensAndCost_other": "{{tokens}} токена · {{cost}}" + "tokensAndCost_other": "{{tokens}} токена · {{cost}}", + "costUnavailable": "нет данных" }, "externalDisplay": { "sshHost": "SSH-сервер", @@ -17946,6 +18076,12 @@ "connectSshHost": "Подключите этот SSH-сервер перед управлением автоматизациями {{provider}}.", "cannotManageOnSshHost": "{{provider}} не может управлять автоматизациями на этом SSH-сервере.", "cannotManageLocally": "{{provider}} не может управлять автоматизациями на этом компьютере." + }, + "hostSummary": { + "partialFailureOfHosts_one": "Не удалось загрузить {{failed}} из {{count}} сервера", + "partialFailureOfHosts_other": "Не удалось загрузить {{failed}} из {{count}} сервера", + "partialFailureOfHosts_few": "Не удалось загрузить {{failed}} из {{count}} серверов", + "partialFailureOfHosts_many": "Не удалось загрузить {{failed}} из {{count}} серверов" } }, "agent": { @@ -18010,9 +18146,15 @@ }, "filtersSection": "Фильтры", "viewSection": "Вид", - "threadListOptionsActive": "Параметры списка обсуждений (активно: {{value0}})", - "activityOptionsActive": "Параметры событий ({{value0}})", - "groupAgentActivityBy": "Группировать события агентов по" + "groupAgentActivityBy": "Группировать события агентов по", + "threadListOptionsActiveFilters_one": "Параметры списка обсуждений ({{count}} активный фильтр)", + "threadListOptionsActiveFilters_other": "Параметры списка обсуждений ({{count}} активного фильтра)", + "activityOptionsFilterCount_one": "Параметры событий ({{count}} фильтр)", + "activityOptionsFilterCount_other": "Параметры событий ({{count}} фильтра)", + "threadListOptionsActiveFilters_few": "Параметры списка обсуждений ({{count}} активных фильтра)", + "threadListOptionsActiveFilters_many": "Параметры списка обсуждений ({{count}} активных фильтров)", + "activityOptionsFilterCount_few": "Параметры событий ({{count}} фильтра)", + "activityOptionsFilterCount_many": "Параметры событий ({{count}} фильтров)" }, "clearCompleted": { "undo": "Отменить действие", @@ -20306,7 +20448,8 @@ "selectAllSafetyChecked_one": "Выбрать {{count}} рабочее пространство, прошедшее проверку безопасности", "selectAllSafetyChecked_few": "Выбрать все {{count}} рабочих пространства, прошедших проверку безопасности", "selectAllSafetyChecked_many": "Выбрать все {{count}} рабочих пространств, прошедших проверку безопасности", - "selectAllSafetyChecked_other": "Выбрать все рабочие пространства, прошедшие проверку безопасности ({{count}})" + "selectAllSafetyChecked_other": "Выбрать все рабочие пространства, прошедшие проверку безопасности ({{count}})", + "lastActive": "Последняя активность: {{value0}}" }, "scan": { "progress": "Сканирование рабочих пространств ({{value0}}/{{value1}})", @@ -20974,7 +21117,13 @@ "kimiContinueSessionConflict": "Kimi получил конфликтующие параметры: --continue, --session. Исправьте рецепт создания текста или аргументы CLI перед повторной попыткой." }, "enableSourceControlAi": "Включите ИИ для управления версиями в разделе «Настройки -> Git».", - "chooseBaseBranch": "Перед генерацией выберите базовую ветку." + "chooseBaseBranch": "Перед генерацией выберите базовую ветку.", + "savedCommitRecipeRepo": "Рецепт сообщения коммита сохранён для этого репозитория.", + "savedCommitRecipeGlobal": "Рецепт сообщения коммита сохранён как глобальный вариант по умолчанию.", + "savedReviewRecipeRepo": "Рецепт для PR и MR сохранён для этого репозитория.", + "savedReviewRecipeGlobal": "Рецепт для PR и MR сохранён как глобальный вариант по умолчанию.", + "savedBranchRecipeRepo": "Рецепт названия ветки сохранён для этого репозитория.", + "savedBranchRecipeGlobal": "Рецепт названия ветки сохранён как глобальный вариант по умолчанию." }, "remoteError": { "submodule": { @@ -21048,6 +21197,13 @@ "pull": "Получение и слияние заблокированы — сначала переместите, удалите или добавьте неотслеживаемые файлы." }, "authenticationFailed": "Ошибка аутентификации. Проверьте учётные данные для удалённого репозитория." + }, + "submodule": { + "worktreeOnlyLabel": "Добавить в индекс внутри подмодуля", + "worktreeOnlyTooltip": "Родительский репозиторий (включая «Добавить всё в индекс») не может добавлять в индекс изменения файлов внутри подмодуля", + "loading": "Загрузка изменений подмодуля…", + "empty": "В подмодуле нет изменений", + "loadFailed": "Не удалось загрузить изменения подмодуля" } }, "agentsSidebarIntro": { @@ -22621,12 +22777,6 @@ "workspaceApiKeyHint": "Вставьте личный API-ключ для {{workspace}}. Если это рабочее пространство уже подключено, Orca заменит его сохранённый ключ." } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} фильтр", - "activeFilterCount_other": "{{count}} фильтра", - "activeFilterCount_few": "{{count}} фильтра", - "activeFilterCount_many": "{{count}} фильтров" - }, "stats": { "usageBreakdown": { "events_few": "{{count}} события", @@ -23162,5 +23312,15 @@ "image": "Пользовательский питомец", "bundle": "Пакет питомца" } + }, + "diffComments": { + "lineRangeMeta": "строки {{start}}-{{end}}", + "lineMeta": "строка {{line}}" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "Агенту требуется разрешение", + "statusStale": "Статус агента устарел" + } } } diff --git a/src/renderer/src/i18n/locales/tr.json b/src/renderer/src/i18n/locales/tr.json index 659be5dc603..f7063e33d34 100644 --- a/src/renderer/src/i18n/locales/tr.json +++ b/src/renderer/src/i18n/locales/tr.json @@ -138,6 +138,73 @@ "peerCheckFailed": "Orca tarafından WSL ana makinesine bu bilgisayardaki başka bir Orca'nın onu hâlâ kullanıp kullanmadığı sorulamadı: {{detail}}", "removalUnrecorded": "Bu kaldırma işleminden sonra nelerin çalışmaya devam ettiği Orca tarafından kaydedilemedi: {{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "bekliyor", + "blocked": "engellendi", + "interrupted": "kesildi", + "failed": "hata verdi", + "working": "çalışıyor", + "monitoring": "izliyor", + "done": "tamamlandı", + "idle": "boşta", + "notReporting": "durum bildirmiyor", + "unconfirmed": "doğrulanmadı", + "needsAttention": "dikkat gerektiriyor" + }, + "mixedStates": "{{subject}}: {{states}}", + "agentIdentityState": "{{agent}}: {{status}}", + "agentCount_one": "{{count}} ajan", + "agentCount_other": "{{count}} ajan", + "stateCount": { + "waiting_one": "{{count}} bekliyor", + "waiting_other": "{{count}} bekliyor", + "blocked_one": "{{count}} engellendi", + "blocked_other": "{{count}} engellendi", + "interrupted_one": "{{count}} kesildi", + "interrupted_other": "{{count}} kesildi", + "failed_one": "{{count}} hata verdi", + "failed_other": "{{count}} hata verdi", + "working_one": "{{count}} çalışıyor", + "working_other": "{{count}} çalışıyor", + "monitoring_one": "{{count}} izliyor", + "monitoring_other": "{{count}} izliyor", + "done_one": "{{count}} tamamlandı", + "done_other": "{{count}} tamamlandı", + "idle_one": "{{count}} boşta", + "idle_other": "{{count}} boşta", + "notReporting_one": "{{count}} durum bildirmiyor", + "notReporting_other": "{{count}} durum bildirmiyor", + "unconfirmed_one": "{{count}} doğrulanmadı", + "unconfirmed_other": "{{count}} doğrulanmadı", + "needsAttention_one": "{{count}} dikkat gerektiriyor", + "needsAttention_other": "{{count}} dikkat gerektiriyor" + }, + "allInState": { + "waiting_one": "{{count}} ajan bekliyor", + "waiting_other": "{{count}} ajanın tamamı bekliyor", + "blocked_one": "{{count}} ajan engellendi", + "blocked_other": "{{count}} ajanın tamamı engellendi", + "interrupted_one": "{{count}} ajanın çalışması kesildi", + "interrupted_other": "{{count}} ajanın tamamının çalışması kesildi", + "failed_one": "{{count}} ajan hata verdi", + "failed_other": "{{count}} ajanın tamamı hata verdi", + "working_one": "{{count}} ajan çalışıyor", + "working_other": "{{count}} ajanın tamamı çalışıyor", + "monitoring_one": "{{count}} ajan izliyor", + "monitoring_other": "{{count}} ajanın tamamı izliyor", + "done_one": "{{count}} ajan işini bitirdi", + "done_other": "{{count}} ajanın tamamı işini bitirdi", + "idle_one": "{{count}} ajan boşta", + "idle_other": "{{count}} ajanın tamamı boşta", + "notReporting_one": "{{count}} ajan durum bildirmiyor", + "notReporting_other": "{{count}} ajanın tamamı durum bildirmiyor", + "unconfirmed_one": "{{count}} ajan doğrulanmadı", + "unconfirmed_other": "{{count}} ajanın tamamı doğrulanmadı", + "needsAttention_one": "{{count}} ajan dikkat gerektiriyor", + "needsAttention_other": "{{count}} ajanın tamamı dikkat gerektiriyor" + } } }, "app": { @@ -945,8 +1012,9 @@ "clearHosts": "Sunucuları temizle", "clearProjects": "Projeleri temizle", "back": "Geri", - "ariaActive": "Filtre: {{value0}} etkin.", - "scopedTo": "Kapsam" + "scopedTo": "Kapsam", + "ariaActiveCount_one": "Filtre: {{count}} etkin.", + "ariaActiveCount_other": "Filtre: {{count}} etkin." }, "taskUrl": { "loadingHint": "{{value0}} yükleniyor…", @@ -3581,7 +3649,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "{{value0}} öğesini kaldır", - "352f15d6fc": "Son aktif", "b6bae1eed1": "İptal", "38ca0b1400": "Bu, yerel dosyalarını kalıcı olarak siler. Bu işlem geri alınamaz.", "e97e4580c7": "Kirli", @@ -4315,7 +4382,9 @@ "f395c9a685": "Dosya içe aktarılamadı", "e6234bcc17": "Özel evcil hayvan yüklemesi için uygulamanın tamamen yeniden başlatılması gerekir (yalnızca yeniden yükleme yeterli değil).", "6d0a8cd179": "Evcil hayvanı göster", - "1fbc51cc77": "Evcil hayvanı gizle" + "1fbc51cc77": "Evcil hayvanı gizle", + "petFallbackLabel": "Evcil Hayvan", + "petHiddenLabel": "{{pet}} gizli" }, "PortsStatusSegment": { "4ebf90c12e": "Harici bağlantı noktası bulunamadı", @@ -5912,7 +5981,8 @@ "c49fb13492": "Bu host'ta klasör eklenemedi", "9a766f33ac": "Bu yol SSH sunucusunda kontrol edildi.", "79fd02cf5f": "Bu yol {{hostName}} üzerinde kontrol edildi.", - "8851b77327": "Bu yol yerel olarak kontrol edildi." + "8851b77327": "Bu yol yerel olarak kontrol edildi.", + "sshConnectionUnavailable": "\"{{connection}}\" SSH bağlantısı bulunamadı veya bağlı değil" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "Hook'ları çalıştır", @@ -5998,8 +6068,8 @@ "removeDescriptionSsh": "Bu işlem yalnızca {{name}} öğesini Orca'dan kaldırır. Dosyaları {{host}} üzerinde kalır, geri almak için o SSH sunucusunu yeniden ekleyin.", "removeDescriptionLocal": "Bu işlem yalnızca {{name}} öğesini Orca'dan kaldırır. Hâlâ diskinizde bulunur.", "removeDescriptionVmRecipe": "Bu işlem {{name}} öğesini Orca'dan kaldırır. Ortamın ve dosyalarının kalıcı olarak silinip silinmeyeceğini VM tarifi belirler.", - "openTerminalWarningOne": "Bu projedeki 1 açık terminal kapatılacak.", - "openTerminalWarningMany": "Bu projedeki {{count}} açık terminal kapatılacak." + "openTerminalWarning_one": "Bu projedeki {{count}} açık terminal kapatılacak.", + "openTerminalWarning_other": "Bu projedeki {{count}} açık terminal kapatılacak." }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "Etkin çalışma alanını göster" @@ -6109,7 +6179,8 @@ "4815c70605": "Eşleşen proje yok", "bbbc6e8e3b": "Eşleşen seçilmemiş proje yok", "allProjects": "Tüm projeler", - "selectedProjectsCount": "{{value0}} proje" + "selectedProjects_one": "{{count}} proje", + "selectedProjects_other": "{{count}} proje" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "Orca'yı Yeniden Başlat", @@ -6170,8 +6241,6 @@ "7bada3b1ab": "Sıralama ölçütü", "dc0bb670bc": "Gruplama ölçütü", "9919ae1082": "Çalışma alanı seçenekleri", - "bc96dbd041": "Çalışma alanı seçenekleri ({{value0}})", - "optionsActiveLabel": "Çalışma alanı seçenekleri ({{value0}} etkin)", "af9249c505": "En son çalışma alanı etkinliği", "b451c8b162": "Son", "6664282a7b": "Projeleri düzenlemek için sürükleyin", @@ -6205,7 +6274,11 @@ "219ebf1961": "Branch adı", "folderPathIdentity": "Branch / klasör yolu", "cli": "Orca CLI", - "workspaceOptions": "Çalışma alanı seçenekleri" + "workspaceOptions": "Çalışma alanı seçenekleri", + "optionsActiveFilters_one": "Çalışma alanı seçenekleri ({{count}} etkin filtre)", + "optionsActiveFilters_other": "Çalışma alanı seçenekleri ({{count}} etkin filtre)", + "optionsFilterCount_one": "Çalışma alanı seçenekleri ({{count}} filtre)", + "optionsFilterCount_other": "Çalışma alanı seçenekleri ({{count}} filtre)" }, "SshTargetRow": { "4677394048": "Bağlanıyor…", @@ -6275,7 +6348,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "Ajanlar", - "agentUnavailable": "Ajan kullanılamıyor" + "agentUnavailable": "Ajan kullanılamıyor", + "sendingTarget": "Gönderiliyor…" }, "WorktreeCardMeta": { "3e65e11cc6": "Çalışma alanı meta verileri", @@ -17260,9 +17334,6 @@ "sortedAscending": "{{value0}}, artan sırada", "sortedDescending": "{{value0}}, azalan sırada" }, - "hostSummary": { - "partialFailure": "{{total}} sunucudan {{failed}} tanesi yüklenemedi" - }, "emptyState": { "unknownHost": "bu sunucu", "hostLoading": "Sunucu yükleniyor…", @@ -17376,8 +17447,6 @@ "failed24h": "Başarısız · 24s", "successful7d": "Başarılı · 7g", "failed7d": "Başarısız · 7g", - "historyUnavailableOne": "1 otomasyon için çalıştırma geçmişi kullanılamıyor. Sayımlar yalnızca mevcut geçmişi içerir.", - "historyUnavailableMany": "{{count}} otomasyon için çalıştırma geçmişi kullanılamıyor. Sayımlar yalnızca mevcut geçmişi içerir.", "automation": "Otomasyon", "triggered": "Tetiklendi", "trigger": "Tetikleyici", @@ -17386,7 +17455,9 @@ "emptyDescription": "Bir otomasyon tetiklendikten sonra çalıştırmalar burada görünür.", "runs": "Çalıştırmalar", "local": "Yerel", - "remote": "Uzak" + "remote": "Uzak", + "historyUnavailable_one": "{{count}} otomasyon için çalıştırma geçmişi kullanılamıyor. Sayımlara yalnızca kullanılabilir geçmiş dahildir.", + "historyUnavailable_other": "{{count}} otomasyon için çalıştırma geçmişi kullanılamıyor. Sayımlara yalnızca kullanılabilir geçmiş dahildir." }, "AutomationsPageBreadcrumb": { "ariaLabel": "Otomasyonlar gezinme yolu", @@ -17454,7 +17525,8 @@ }, "usage": { "tokensAndCost_other": "{{tokens}} token · {{cost}}", - "tokensAndCost_one": "{{tokens}} token · {{cost}}" + "tokensAndCost_one": "{{tokens}} token · {{cost}}", + "costUnavailable": "bilinmiyor" }, "externalDisplay": { "sshHost": "SSH sunucusu", @@ -17466,6 +17538,10 @@ "connectSshHost": "{{provider}} otomasyonlarını yönetmeden önce bu SSH sunucusuna bağlanın.", "cannotManageOnSshHost": "{{provider}} bu SSH sunucusunda otomasyonları yönetemiyor.", "cannotManageLocally": "{{provider}} bu makinede otomasyonları yönetemiyor." + }, + "hostSummary": { + "partialFailureOfHosts_one": "{{count}} sunucudan {{failed}} tanesi yüklenemedi", + "partialFailureOfHosts_other": "{{count}} sunucudan {{failed}} tanesi yüklenemedi" } }, "agent": { @@ -17531,8 +17607,10 @@ }, "filtersSection": "Filtreler", "viewSection": "Görünüm", - "threadListOptionsActive": "Sohbet listesi seçenekleri ({{value0}} etkin)", - "activityOptionsActive": "Etkinlik seçenekleri ({{value0}})" + "threadListOptionsActiveFilters_one": "Konu listesi seçenekleri ({{count}} etkin filtre)", + "threadListOptionsActiveFilters_other": "Konu listesi seçenekleri ({{count}} etkin filtre)", + "activityOptionsFilterCount_one": "Etkinlik seçenekleri ({{count}} filtre)", + "activityOptionsFilterCount_other": "Etkinlik seçenekleri ({{count}} filtre)" }, "clearCompleted": { "undo": "Geri al", @@ -19682,7 +19760,8 @@ "selectionWithheldCount_other": "Seçili {{count}} çalışma alanı geçerli filtreler tarafından gizlendiği için seçimden çıkarıldı.", "selectionWithheldCount_one": "Seçili {{count}} çalışma alanı geçerli filtreler tarafından gizlendiği için seçimden çıkarıldı.", "selectAllSafetyChecked_other": "Güvenlik kontrolünden geçen {{count}} çalışma alanının tümünü seç", - "selectAllSafetyChecked_one": "Güvenlik kontrolünden geçen {{count}} çalışma alanının tümünü seç" + "selectAllSafetyChecked_one": "Güvenlik kontrolünden geçen {{count}} çalışma alanının tümünü seç", + "lastActive": "Son etkinlik: {{value0}}" }, "scan": { "progress": "Çalışma alanları taranıyor ({{value0}}/{{value1}})", @@ -20330,7 +20409,13 @@ "kimiContinueSessionConflict": "Kimi çakışan seçenekler aldı: --continue, --session. Yeniden denemeden önce metin oluşturma tarifini veya CLI argümanlarını düzeltin." }, "enableSourceControlAi": "Ayarlar -> Git bölümünde Kaynak Kontrolü AI özelliğini etkinleştirin.", - "chooseBaseBranch": "Oluşturmadan önce bir temel branch seçin." + "chooseBaseBranch": "Oluşturmadan önce bir temel branch seçin.", + "savedCommitRecipeRepo": "Commit mesajı tarifi bu repository için kaydedildi.", + "savedCommitRecipeGlobal": "Commit mesajı tarifi genel varsayılan olarak kaydedildi.", + "savedReviewRecipeRepo": "Barındırılan inceleme tarifi bu repository için kaydedildi.", + "savedReviewRecipeGlobal": "Barındırılan inceleme tarifi genel varsayılan olarak kaydedildi.", + "savedBranchRecipeRepo": "Branch adı tarifi bu repository için kaydedildi.", + "savedBranchRecipeGlobal": "Branch adı tarifi genel varsayılan olarak kaydedildi." }, "remoteError": { "submodule": { @@ -20404,6 +20489,13 @@ "pull": "Pull engellendi — önce izlenmeyen dosyaları taşıyın, kaldırın veya ekleyin." }, "authenticationFailed": "Kimlik doğrulanamadı. Remote kimlik bilgilerinizi kontrol edin." + }, + "submodule": { + "worktreeOnlyLabel": "Alt modül içinde stage'e ekle", + "worktreeOnlyTooltip": "Ana repo (Tümünü Stage Et dahil) alt modül içindeki dosya değişikliklerini stage'e ekleyemez", + "loading": "Alt modül değişiklikleri yükleniyor…", + "empty": "Alt modülde değişiklik yok", + "loadFailed": "Alt modül değişiklikleri yüklenemedi" } }, "agentsSidebarIntro": { @@ -21925,10 +22017,6 @@ "workspaceApiKeyHint": "{{workspace}} için bir Kişisel API anahtarı yapıştırın. Bu çalışma alanı zaten bağlıysa Orca kayıtlı anahtarını değiştirir." } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} filtre", - "activeFilterCount_other": "{{count}} filtre" - }, "editorConflicts": { "kind": { "addedByUs": "Bizim tarafımızdan eklendi", @@ -22458,5 +22546,15 @@ "image": "Özel evcil hayvan", "bundle": "Evcil hayvan paketi" } + }, + "diffComments": { + "lineRangeMeta": "{{start}}-{{end}}. satırlar", + "lineMeta": "{{line}}. satır" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "Ajan için izin gerekiyor", + "statusStale": "Ajan durumu güncel değil" + } } } diff --git a/src/renderer/src/i18n/locales/zh-Hant.json b/src/renderer/src/i18n/locales/zh-Hant.json index c02def6ff26..241ad34cc05 100644 --- a/src/renderer/src/i18n/locales/zh-Hant.json +++ b/src/renderer/src/i18n/locales/zh-Hant.json @@ -137,6 +137,50 @@ "peerCheckFailed": "Orca 無法向 WSL 主機詢問此電腦上的另一個 Orca 是否仍在使用該主機:{{detail}}", "removalUnrecorded": "Orca 無法記錄此次移除後仍在執行的項目:{{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "等待中", + "blocked": "已阻塞", + "interrupted": "已中斷", + "failed": "失敗", + "working": "執行中", + "monitoring": "監控中", + "done": "已完成", + "idle": "閒置", + "notReporting": "未回報狀態", + "unconfirmed": "未確認", + "needsAttention": "需要處理" + }, + "mixedStates": "{{subject}}:{{states}}", + "agentIdentityState": "{{agent}} {{status}}", + "agentCount_other": "{{count}} 個代理程式", + "stateCount": { + "waiting_other": "{{count}} 個等待中", + "blocked_other": "{{count}} 個已阻塞", + "interrupted_other": "{{count}} 個已中斷", + "failed_other": "{{count}} 個失敗", + "working_other": "{{count}} 個執行中", + "monitoring_other": "{{count}} 個監控中", + "done_other": "{{count}} 個已完成", + "idle_other": "{{count}} 個閒置", + "notReporting_other": "{{count}} 個未回報狀態", + "unconfirmed_other": "{{count}} 個未確認", + "needsAttention_other": "{{count}} 個需要處理" + }, + "allInState": { + "waiting_other": "全部 {{count}} 個代理程式等待中", + "blocked_other": "全部 {{count}} 個代理程式已阻塞", + "interrupted_other": "全部 {{count}} 個代理程式已中斷", + "failed_other": "全部 {{count}} 個代理程式失敗", + "working_other": "全部 {{count}} 個代理程式執行中", + "monitoring_other": "全部 {{count}} 個代理程式監控中", + "done_other": "全部 {{count}} 個代理程式已完成", + "idle_other": "全部 {{count}} 個代理程式閒置", + "notReporting_other": "全部 {{count}} 個代理程式未回報狀態", + "unconfirmed_other": "全部 {{count}} 個代理程式未確認", + "needsAttention_other": "全部 {{count}} 個代理程式需要處理" + } } }, "app": { @@ -941,8 +985,8 @@ "clearHosts": "清除主機", "clearProjects": "清除專案", "back": "返回", - "ariaActive": "篩選:已啟用 {{value0}} 個。", - "scopedTo": "範圍為" + "scopedTo": "範圍為", + "ariaActiveCount_other": "篩選:已啟用 {{count}} 個。" }, "taskUrl": { "loadingHint": "正在載入 {{value0}}...", @@ -3554,7 +3598,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "刪除 {{value0}}", - "352f15d6fc": "最後活躍", "b6bae1eed1": "取消", "38ca0b1400": "這將永久刪除它們的本機檔案。您無法復原此操作。", "e97e4580c7": "有改動", @@ -4283,7 +4326,9 @@ "f395c9a685": "匯入檔案失敗", "e6234bcc17": "自訂寵物上傳需要完全重新啟動應用程式(不僅是重新載入)。", "6d0a8cd179": "顯示寵物", - "1fbc51cc77": "隱藏寵物" + "1fbc51cc77": "隱藏寵物", + "petFallbackLabel": "寵物", + "petHiddenLabel": "{{pet}} 已隱藏" }, "PortsStatusSegment": { "4ebf90c12e": "未偵測到外部連接埠", @@ -5796,7 +5841,8 @@ "c49fb13492": "在此主機上新增資料夾失敗", "9a766f33ac": "已在 SSH 主機上檢查此路徑。", "79fd02cf5f": "已在 {{hostName}} 上檢查此路徑。", - "8851b77327": "已在本機檢查此路徑。" + "8851b77327": "已在本機檢查此路徑。", + "sshConnectionUnavailable": "找不到 SSH 連線「{{connection}}」或尚未連線" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "執行鉤子", @@ -5880,8 +5926,7 @@ "removeDescriptionSsh": "此操作僅將 {{name}} 從 Orca 中移除。檔案仍保留在 {{host}} 上 — 重新新增該 SSH 主機即可恢復。", "removeDescriptionLocal": "此操作僅將 {{name}} 從 Orca 中移除。檔案仍保留在您的磁碟上。", "removeDescriptionVmRecipe": "這會從 Orca 中移除 {{name}}。其 VM 配方決定是否永久刪除環境及其檔案。", - "openTerminalWarningOne": "此專案中 1 個開啟的終端機將被關閉。", - "openTerminalWarningMany": "此專案中 {{count}} 個開啟的終端機將被關閉。" + "openTerminalWarning_other": "此專案中開啟的 {{count}} 個終端機將會關閉。" }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "顯示目前的工作區" @@ -5991,7 +6036,7 @@ "4815c70605": "沒有符合的專案", "bbbc6e8e3b": "沒有符合的未選擇專案", "allProjects": "所有專案", - "selectedProjectsCount": "{{value0}} 個專案" + "selectedProjects_other": "{{count}} 個專案" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "重新啟動 Orca", @@ -6051,8 +6096,6 @@ "7bada3b1ab": "排序方式", "dc0bb670bc": "分組依據", "9919ae1082": "工作區選項", - "bc96dbd041": "工作區選項 ({{value0}})", - "optionsActiveLabel": "工作區選項({{value0}} 個已啟用)", "af9249c505": "最近的工作區活動", "b451c8b162": "最近的", "6664282a7b": "拖曳專案進行排列", @@ -6086,7 +6129,9 @@ "219ebf1961": "分支名稱", "folderPathIdentity": "分支 / 資料夾路徑", "cli": "Orca CLI", - "workspaceOptions": "工作區選項" + "workspaceOptions": "工作區選項", + "optionsActiveFilters_other": "工作區選項({{count}} 個篩選條件已啟用)", + "optionsFilterCount_other": "工作區選項({{count}} 個篩選條件)" }, "SshTargetRow": { "4677394048": "正在連線…", @@ -6155,7 +6200,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "代理程式", - "agentUnavailable": "代理程式無法使用" + "agentUnavailable": "代理程式無法使用", + "sendingTarget": "正在傳送..." }, "WorktreeCardMeta": { "3e65e11cc6": "工作區後設資料", @@ -17069,9 +17115,6 @@ "sortedAscending": "{{value0}},遞增排序", "sortedDescending": "{{value0}},遞減排序" }, - "hostSummary": { - "partialFailure": "{{total}} 台主機中有 {{failed}} 台無法載入" - }, "emptyState": { "unknownHost": "該主機", "hostLoading": "正在載入主機...", @@ -17184,8 +17227,6 @@ "failed24h": "失敗 · 24 小時", "successful7d": "成功 · 7 天", "failed7d": "失敗 · 7 天", - "historyUnavailableOne": "1 個自動化的執行歷史記錄不可用。計數僅包括可用歷史記錄。", - "historyUnavailableMany": "{{count}} 個自動化的執行歷史記錄不可用。計數僅包括可用歷史記錄。", "automation": "自動化", "triggered": "已觸發", "trigger": "觸發", @@ -17194,7 +17235,8 @@ "emptyDescription": "觸發自動化後,執行記錄會顯示在這裡。", "runs": "執行", "local": "本機", - "remote": "遠端" + "remote": "遠端", + "historyUnavailable_other": "{{count}} 個自動化的執行歷程無法使用。計數僅包含可用的歷程記錄。" }, "AutomationsPageBreadcrumb": { "ariaLabel": "自動化麵包屑", @@ -17258,7 +17300,8 @@ "namedWorkspaceGone": "{{name}}(已無法使用)" }, "usage": { - "tokensAndCost_other": "{{tokens}} token · {{cost}}" + "tokensAndCost_other": "{{tokens}} token · {{cost}}", + "costUnavailable": "無資料" }, "externalDisplay": { "sshHost": "SSH 主機", @@ -17270,6 +17313,9 @@ "connectSshHost": "請先連線至此 SSH 主機,再管理 {{provider}} 自動化。", "cannotManageOnSshHost": "{{provider}} 無法管理此 SSH 主機上的自動化。", "cannotManageLocally": "{{provider}} 無法管理此電腦上的自動化。" + }, + "hostSummary": { + "partialFailureOfHosts_other": "{{count}} 台主機中有 {{failed}} 台無法載入" } }, "agent": { @@ -17335,8 +17381,8 @@ }, "filtersSection": "篩選條件", "viewSection": "檢視", - "threadListOptionsActive": "討論串清單選項(已啟用 {{value0}} 個)", - "activityOptionsActive": "活動選項({{value0}})" + "threadListOptionsActiveFilters_other": "討論串清單選項({{count}} 個篩選條件已啟用)", + "activityOptionsFilterCount_other": "活動選項({{count}} 個篩選條件)" }, "clearCompleted": { "undo": "復原", @@ -19419,7 +19465,8 @@ "forceDeleteRisk_other": "{{count}} 個工作區目前存在風險,可能需要強制刪除", "selectionVanishedCount_other": "所選的 {{count}} 個工作區已不存在。", "selectionWithheldCount_other": "所選的 {{count}} 個工作區已被目前的篩選條件隱藏,因此已取消選取。", - "selectAllSafetyChecked_other": "選取全部 {{count}} 個已通過安全檢查的工作區" + "selectAllSafetyChecked_other": "選取全部 {{count}} 個已通過安全檢查的工作區", + "lastActive": "上次活動時間:{{value0}}" }, "scan": { "progress": "正在掃描工作區({{value0}}/{{value1}})", @@ -20062,7 +20109,13 @@ "kimiContinueSessionConflict": "Kimi 收到衝突的選項:--continue, --session。請在重試前修正產生文字的動作範本或 CLI 引數。" }, "enableSourceControlAi": "請在「設定 -> Git」中啟用原始碼控制 AI。", - "chooseBaseBranch": "產生前請先選擇基礎分支。" + "chooseBaseBranch": "產生前請先選擇基礎分支。", + "savedCommitRecipeRepo": "已為此存放庫儲存提交訊息動作範本。", + "savedCommitRecipeGlobal": "已將提交訊息動作範本儲存為全域預設值。", + "savedReviewRecipeRepo": "已為此存放庫儲存託管審查動作範本。", + "savedReviewRecipeGlobal": "已將託管審查動作範本儲存為全域預設值。", + "savedBranchRecipeRepo": "已為此存放庫儲存分支名稱動作範本。", + "savedBranchRecipeGlobal": "已將分支名稱動作範本儲存為全域預設值。" }, "remoteError": { "submodule": { @@ -20136,6 +20189,13 @@ "pull": "拉取遭阻擋 — 請先移動、移除或新增未追蹤的檔案。" }, "authenticationFailed": "身分驗證失敗。請檢查遠端憑證。" + }, + "submodule": { + "worktreeOnlyLabel": "在子模組內暫存", + "worktreeOnlyTooltip": "父存放庫(包括「暫存全部」)無法暫存子模組內的檔案變更", + "loading": "正在載入子模組變更…", + "empty": "子模組中沒有變更", + "loadFailed": "無法載入子模組變更" } }, "agentsSidebarIntro": { @@ -21642,10 +21702,6 @@ "workspaceApiKeyHint": "請貼上 {{workspace}} 的個人 API 金鑰。若此工作區已連線,Orca 會取代已儲存的金鑰。" } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} 個篩選條件", - "activeFilterCount_other": "{{count}} 個篩選條件" - }, "editorConflicts": { "kind": { "addedByUs": "我們新增", @@ -22175,5 +22231,15 @@ "image": "自訂寵物", "bundle": "寵物套件" } + }, + "diffComments": { + "lineRangeMeta": "第 {{start}}-{{end}} 行", + "lineMeta": "第 {{line}} 行" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "代理程式需要權限", + "statusStale": "代理程式狀態資訊已過期" + } } } diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index 20f70490c89..cc9618aa98a 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -560,8 +560,8 @@ "clearHosts": "清除主机", "clearProjects": "清除项目", "back": "返回", - "ariaActive": "筛选:{{value0}} 个生效。", - "scopedTo": "范围:" + "scopedTo": "范围:", + "ariaActiveCount_other": "筛选:已启用 {{count}} 个。" }, "linearIssue": { "createLabel": "从 Linear 议题 {{value0}} 创建工作树:{{value1}}", @@ -3136,7 +3136,6 @@ "cleanup": { "WorkspaceCleanupDialog": { "3828408538": "删除 {{value0}}", - "352f15d6fc": "最后活跃", "b6bae1eed1": "取消", "38ca0b1400": "这将永久删除他们的本地文件。您无法撤销此操作。", "e97e4580c7": "有改动", @@ -3865,7 +3864,9 @@ "f395c9a685": "导入文件失败", "e6234bcc17": "自定义宠物上传需要完全重启应用(不仅是重新加载)。", "6d0a8cd179": "显示宠物", - "1fbc51cc77": "隐藏宠物" + "1fbc51cc77": "隐藏宠物", + "petFallbackLabel": "宠物", + "petHiddenLabel": "{{pet}} 已隐藏" }, "PortsStatusSegment": { "4ebf90c12e": "未检测到外部端口", @@ -4821,7 +4822,6 @@ "description": "更新 {{value0}},让智能体遵循此版本 Orca 的最新说明。", "title_other": "{{count}} 个已安装的 Orca 技能需要更新" }, - "SkillFreshnessRow": {}, "SkillFreshnessUpdateDialog": { "title": "更新技能", "checking": "正在检查已安装的 Orca 技能…", @@ -4859,7 +4859,6 @@ "updateServer": "请在服务器上更新 Orca", "connectHost": "请连接 SSH 主机" }, - "SkillUpdateResultRows": {}, "SkillUpdateRow": { "replaceWithOrca": "替换为 Orca 的副本(保留备份)" }, @@ -5349,7 +5348,8 @@ "c49fb13492": "添加远程文件夹失败", "9a766f33ac": "已在 SSH 主机上检查此路径。", "79fd02cf5f": "已在 {{hostName}} 上检查此路径。", - "8851b77327": "已在本机检查此路径。" + "8851b77327": "已在本机检查此路径。", + "sshConnectionUnavailable": "未找到 SSH 连接“{{connection}}”或该连接未连接" }, "OrcaYamlTrustDialog": { "f3e2b868fb": "运行钩子", @@ -5433,8 +5433,7 @@ "removeDescriptionSsh": "此操作仅将 {{name}} 从 Orca 中移除。文件仍保留在 {{host}} 上 — 重新添加该 SSH 主机即可恢复。", "removeDescriptionLocal": "此操作仅将 {{name}} 从 Orca 中移除。文件仍保留在您的磁盘上。", "removeDescriptionVmRecipe": "这会从 Orca 中删除 {{name}}。其VM配方决定是否永久删除环境及其文件。", - "openTerminalWarningOne": "此项目中 1 个打开的终端将被关闭。", - "openTerminalWarningMany": "此项目中 {{count}} 个打开的终端将被关闭。" + "openTerminalWarning_other": "此项目中打开的 {{count}} 个终端将被关闭。" }, "ScrollToCurrentWorkspaceToolbarButton": { "23989bb663": "显示活动工作区" @@ -5544,7 +5543,7 @@ "4815c70605": "没有匹配的项目", "bbbc6e8e3b": "没有匹配的未选择项目", "allProjects": "所有项目", - "selectedProjectsCount": "{{value0}} 个项目" + "selectedProjects_other": "{{count}} 个项目" }, "SidebarSettingsHelpMenu": { "ad3d3ed7f1": "重启 Orca", @@ -5592,8 +5591,6 @@ "7bada3b1ab": "排序方式", "dc0bb670bc": "分组依据", "9919ae1082": "工作区选项", - "bc96dbd041": "工作区选项 ({{value0}})", - "optionsActiveLabel": "工作区选项({{value0}} 个生效)", "af9249c505": "最近的工作区活动", "b451c8b162": "最近的", "6664282a7b": "拖动项目进行排列", @@ -5634,7 +5631,9 @@ "automation": "自动化", "folderPathIdentity": "分支 / 文件夹路径", "cli": "Orca CLI", - "workspaceOptions": "工作区选项" + "workspaceOptions": "工作区选项", + "optionsActiveFilters_other": "工作区选项({{count}} 个筛选条件已启用)", + "optionsFilterCount_other": "工作区选项({{count}} 个筛选条件)" }, "SshTargetRow": { "4677394048": "正在连接…", @@ -5703,7 +5702,8 @@ }, "WorktreeCardAgents": { "1b0a156717": "智能体", - "agentUnavailable": "智能体不可用" + "agentUnavailable": "智能体不可用", + "sendingTarget": "正在发送..." }, "WorktreeCardMeta": { "3e65e11cc6": "工作区元数据", @@ -16610,8 +16610,6 @@ "failed24h": "失败 · 24 小时", "successful7d": "成功 · 7 天", "failed7d": "失败 · 7 天", - "historyUnavailableOne": "1 个自动化的运行历史不可用。计数仅包含可用的历史记录。", - "historyUnavailableMany": "{{count}} 个自动化的运行历史不可用。计数仅包含可用的历史记录。", "automation": "自动化", "triggered": "已触发", "trigger": "触发", @@ -16620,7 +16618,8 @@ "emptyDescription": "触发自动化后,运行记录会显示在这里。", "runs": "运行", "local": "本地", - "remote": "远程" + "remote": "远程", + "historyUnavailable_other": "{{count}} 个自动化的运行历史不可用。统计仅包含可用的历史记录。" }, "AutomationsPageBreadcrumb": { "ariaLabel": "自动化面包屑导航", @@ -16984,9 +16983,6 @@ "sortedAscending": "{{value0}},升序排序", "sortedDescending": "{{value0}},降序排序" }, - "hostSummary": { - "partialFailure": "无法加载 {{total}} 主机的 {{failed}}" - }, "emptyState": { "unknownHost": "该主机", "hostLoading": "正在加载主机...", @@ -17129,7 +17125,8 @@ "namedWorkspaceGone": "{{name}}(已不可用)" }, "usage": { - "tokensAndCost_other": "{{tokens}} token · {{cost}}" + "tokensAndCost_other": "{{tokens}} token · {{cost}}", + "costUnavailable": "暂无数据" }, "externalDisplay": { "sshHost": "SSH 主机", @@ -17141,6 +17138,9 @@ "connectSshHost": "请先连接此 SSH 主机,再管理 {{provider}} 自动化。", "cannotManageOnSshHost": "{{provider}} 无法管理此 SSH 主机上的自动化。", "cannotManageLocally": "{{provider}} 无法管理此计算机上的自动化。" + }, + "hostSummary": { + "partialFailureOfHosts_other": "{{count}} 个主机中有 {{failed}} 个无法加载" } }, "agent": { @@ -17206,8 +17206,8 @@ }, "filtersSection": "筛选", "viewSection": "视图", - "threadListOptionsActive": "线程列表选项({{value0}} 个生效)", - "activityOptionsActive": "活动选项({{value0}})" + "threadListOptionsActiveFilters_other": "线程列表选项({{count}} 个筛选条件已启用)", + "activityOptionsFilterCount_other": "活动选项({{count}} 个筛选条件)" }, "ActivityScopeFilterControls": { "resetScope": "显示所有主机和项目", @@ -19294,7 +19294,8 @@ "forceDeleteRisk_other": "{{count}} 个工作区目前存在风险,可能需要强制删除", "selectionVanishedCount_other": "所选的 {{count}} 个工作区已不存在。", "selectionWithheldCount_other": "所选的 {{count}} 个工作区被当前筛选条件隐藏,已取消选择。", - "selectAllSafetyChecked_other": "选择全部 {{count}} 个已通过安全检查的工作区" + "selectAllSafetyChecked_other": "选择全部 {{count}} 个已通过安全检查的工作区", + "lastActive": "最后活跃:{{value0}}" }, "scan": { "progress": "扫描工作区 ({{value0}}/{{value1}})", @@ -20037,6 +20038,50 @@ "peerCheckFailed": "Orca 无法向 WSL 主机询问此电脑上的另一个 Orca 是否仍在使用该主机:{{detail}}", "removalUnrecorded": "Orca 无法记录此次移除后仍在运行的内容:{{detail}}" } + }, + "agentSummary": { + "state": { + "waiting": "等待中", + "blocked": "已阻塞", + "interrupted": "已中断", + "failed": "失败", + "working": "工作中", + "monitoring": "监控中", + "done": "已完成", + "idle": "空闲", + "notReporting": "未报告状态", + "unconfirmed": "未确认", + "needsAttention": "需要处理" + }, + "mixedStates": "{{subject}}:{{states}}", + "agentIdentityState": "{{agent}} {{status}}", + "agentCount_other": "{{count}} 个智能体", + "stateCount": { + "waiting_other": "{{count}} 个等待中", + "blocked_other": "{{count}} 个已阻塞", + "interrupted_other": "{{count}} 个已中断", + "failed_other": "{{count}} 个失败", + "working_other": "{{count}} 个工作中", + "monitoring_other": "{{count}} 个监控中", + "done_other": "{{count}} 个已完成", + "idle_other": "{{count}} 个空闲", + "notReporting_other": "{{count}} 个未报告状态", + "unconfirmed_other": "{{count}} 个未确认", + "needsAttention_other": "{{count}} 个需要处理" + }, + "allInState": { + "waiting_other": "全部 {{count}} 个智能体等待中", + "blocked_other": "全部 {{count}} 个智能体已阻塞", + "interrupted_other": "全部 {{count}} 个智能体已中断", + "failed_other": "全部 {{count}} 个智能体失败", + "working_other": "全部 {{count}} 个智能体工作中", + "monitoring_other": "全部 {{count}} 个智能体监控中", + "done_other": "全部 {{count}} 个智能体已完成", + "idle_other": "全部 {{count}} 个智能体空闲", + "notReporting_other": "全部 {{count}} 个智能体未报告状态", + "unconfirmed_other": "全部 {{count}} 个智能体未确认", + "needsAttention_other": "全部 {{count}} 个智能体需要处理" + } } }, "editor": { @@ -20344,7 +20389,13 @@ "kimiContinueSessionConflict": "Kimi 收到了冲突的选项:--continue, --session。请在重试前修正生成预设或 CLI 参数。" }, "enableSourceControlAi": "请在设置 -> Git 中启用源代码控制 AI。", - "chooseBaseBranch": "请先选择基础分支,再生成。" + "chooseBaseBranch": "请先选择基础分支,再生成。", + "savedCommitRecipeRepo": "已为此仓库保存提交消息预设。", + "savedCommitRecipeGlobal": "已将提交消息预设保存为全局默认值。", + "savedReviewRecipeRepo": "已为此仓库保存托管评审预设。", + "savedReviewRecipeGlobal": "已将托管评审预设保存为全局默认值。", + "savedBranchRecipeRepo": "已为此仓库保存分支名称预设。", + "savedBranchRecipeGlobal": "已将分支名称预设保存为全局默认值。" }, "remoteError": { "submodule": { @@ -20418,6 +20469,13 @@ "pull": "拉取被阻止 — 请先移动、移除或添加未跟踪文件。" }, "authenticationFailed": "身份验证失败。请检查远程凭据。" + }, + "submodule": { + "worktreeOnlyLabel": "在子模块内暂存", + "worktreeOnlyTooltip": "父仓库(包括“暂存全部”)无法暂存子模块内的文件更改", + "loading": "正在加载子模块更改…", + "empty": "子模块中没有更改", + "loadFailed": "无法加载子模块更改" } }, "rendererRecovery": { @@ -21944,10 +22002,6 @@ } } }, - "workspaceOptions": { - "activeFilterCount_one": "{{count}} 个筛选条件", - "activeFilterCount_other": "{{count}} 个筛选条件" - }, "editorConflicts": { "kind": { "addedByUs": "我们添加", @@ -22477,5 +22531,15 @@ "image": "自定义宠物", "bundle": "宠物包" } + }, + "diffComments": { + "lineRangeMeta": "第 {{start}}-{{end}} 行", + "lineMeta": "第 {{line}} 行" + }, + "agentSendTargets": { + "disabledReason": { + "needsPermission": "智能体需要授权", + "statusStale": "智能体状态信息已过期" + } } } diff --git a/src/renderer/src/lib/agent-send-disabled-reason-label.ts b/src/renderer/src/lib/agent-send-disabled-reason-label.ts new file mode 100644 index 00000000000..43d5e1de7e9 --- /dev/null +++ b/src/renderer/src/lib/agent-send-disabled-reason-label.ts @@ -0,0 +1,18 @@ +import { translate } from '@/i18n/i18n' + +// Target derivation keeps English reasons as comparison sentinels; translate only for display. +export function agentSendDisabledReasonLabel(reason: string): string { + switch (reason) { + case 'Agent needs permission': + return translate('agentSendTargets.disabledReason.needsPermission', 'Agent needs permission') + case 'Agent status is stale': + return translate('agentSendTargets.disabledReason.statusStale', 'Agent status is stale') + case 'Terminal is no longer available': + return translate( + 'auto.components.editor.ReviewNotesSendMenu.terminalGone', + 'Terminal is no longer available' + ) + default: + return reason + } +}