fix(i18n): localize remaining plurals, fragments and hardcoded copy in task page, automations and shared components (#35413)

* fix(i18n): localize remaining renderer plurals, fragments and hardcoded copy

Convert manual one/many keys and value0 counts to CLDR plural families,
replace fragment concatenations with whole-sentence keys or Trans, and route
hardcoded English labels, errors and compact time units through the UI locale.

Refs #32207

* fix(i18n): re-render memoized agent state dots on language change

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
This commit is contained in:
OrcaWin
2026-10-28 16:20:33 -07:00
committed by GitHub
co-authored by OrcaWin
parent 552691fa0e
commit b1cf46775c
107 changed files with 4965 additions and 1544 deletions
+14 -11
View File
@@ -1,6 +1,8 @@
import React from 'react'
import { Activity, CircleCheck, CircleDashed } from 'lucide-react'
import { cn } from '@/lib/utils'
import { translate } from '@/i18n/i18n'
import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision'
import { AgentQuestionIcon } from '@/components/AgentQuestionIcon'
import { AgentWorkingSpinner } from '@/components/AgentWorkingSpinner'
import {
@@ -36,27 +38,27 @@ export type AgentDotState =
export function agentStateLabel(state: AgentDotState): string {
switch (state) {
case 'working':
return 'Working'
return translate('auto.components.AgentStateDot.working', 'Working')
case 'monitoring':
return 'Monitoring background tasks'
return translate('auto.components.AgentStateDot.monitoring', 'Monitoring background tasks')
case 'blocked':
return 'Blocked'
return translate('auto.components.AgentStateDot.blocked', 'Blocked')
case 'waiting':
return 'Waiting for input'
return translate('auto.components.AgentStateDot.waiting', 'Waiting for input')
case 'interrupted':
return 'Interrupted'
return translate('auto.components.AgentStateDot.interrupted', 'Interrupted')
case 'failed':
return 'Failed'
return translate('auto.components.AgentStateDot.failed', 'Failed')
case 'done':
return 'Done'
return translate('auto.components.AgentStateDot.done', 'Done')
case 'idle':
return 'Idle'
return translate('auto.components.AgentStateDot.idle', 'Idle')
case 'unverifiable':
return 'No recent update'
return translate('auto.components.AgentStateDot.unverifiable', 'No recent update')
case 'unconfirmed':
return 'Couldn’t confirm'
return translate('auto.components.AgentStateDot.unconfirmed', 'Couldn’t confirm')
case 'permission':
return 'Needs attention'
return translate('auto.components.AgentStateDot.permission', 'Needs attention')
}
}
@@ -108,6 +110,7 @@ export const AgentStateDot = React.memo(function AgentStateDot({
tooltipSide,
progress
}: Props): React.JSX.Element {
useUiLanguageRevision()
const box = size === 'md' ? 'h-3 w-3' : 'h-2.5 w-2.5'
const inner = size === 'md' ? 'size-2' : 'size-1.5'
const icon = size === 'md' ? 'size-3' : 'size-2.5'
@@ -127,11 +127,17 @@ function SwitchPromptDialog({ prompt }: { prompt: ClaudeAccountSwitchPrompt }):
<RefreshCw className="size-3.5" aria-hidden="true" />
{chosen.length <= 1
? translate('accounts.claude.switchSessions.restartOne', 'Restart session')
: translate(
'accounts.claude.switchSessions.restartOther',
'Restart {{count}} sessions',
{ count: chosen.length }
)}
: chosen.length === 1
? translate(
'accounts.claude.switchSessions.restartCount_one',
'Restart {{count}} session',
{ count: chosen.length }
)
: translate(
'accounts.claude.switchSessions.restartCount_other',
'Restart {{count}} sessions',
{ count: chosen.length }
)}
</Button>
</DialogFooter>
</DialogContent>
@@ -146,12 +152,12 @@ function promptDescription(prompt: ClaudeAccountSwitchPrompt): string {
const count = elsewhere.length + cantMove.length
return count === 1
? translate(
'accounts.claude.switchSessions.reviewBodyOne',
"1 other Claude session wasn't moved to {{next}}.",
{ next }
'accounts.claude.switchSessions.reviewBody_one',
"{{count}} other Claude session wasn't moved to {{next}}.",
{ count, next }
)
: translate(
'accounts.claude.switchSessions.reviewBodyOther',
'accounts.claude.switchSessions.reviewBody_other',
"{{count}} other Claude sessions weren't moved to {{next}}.",
{ count, next }
)
@@ -159,12 +165,12 @@ function promptDescription(prompt: ClaudeAccountSwitchPrompt): string {
const accounts = { count: onAccount.length, previous: prompt.previousAccountLabel, next }
return onAccount.length === 1
? translate(
'accounts.claude.switchSessions.bodyOne',
'1 Claude session is still running on {{previous}}. Restarting continues the conversation on {{next}}. Busy sessions wait for idle before restarting.',
'accounts.claude.switchSessions.body_one',
'{{count}} Claude session is still running on {{previous}}. Restarting continues the conversation on {{next}}. Busy sessions wait for idle before restarting.',
accounts
)
: translate(
'accounts.claude.switchSessions.bodyOther',
'accounts.claude.switchSessions.body_other',
'{{count}} Claude sessions are still running on {{previous}}. Restarting continues each conversation on {{next}}. Busy sessions wait for idle before restarting.',
accounts
)
@@ -19,6 +19,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip
import { translate } from '@/i18n/i18n'
import type { JiraIssue } from '../../../shared/jira/jira-types'
import { copyJiraTextToClipboard } from './jira-issue-workspace-actions'
import type { IssueCopyTarget } from './issue-copy-target-messages'
import { buildJiraIssuePrompt } from './jira-prompt-templates'
import { Popover, PopoverAnchor } from '@/components/ui/popover'
import { JiraPromptTemplatePopover } from './JiraPromptTemplatePopover'
@@ -35,21 +36,21 @@ export function JiraIssueRowCopyMenu({
const setAnchor = (element: HTMLDivElement | null) => {
anchorRef.current = element
}
const actions = [
const actions: { label: string; text: string; copyTarget: IssueCopyTarget }[] = [
{
label: translate('auto.components.JiraIssueWorkspace.38839801e8', 'Copy key'),
text: issue.key,
copiedLabel: 'Key'
copyTarget: 'key'
},
{
label: translate('auto.components.JiraIssueWorkspace.779bb91ee0', 'Copy URL'),
text: issue.url,
copiedLabel: 'URL'
copyTarget: 'url'
},
{
label: translate('auto.components.JiraIssueWorkspace.0cc62bd690', 'Copy prompt'),
text: buildJiraIssuePrompt(issue),
copiedLabel: 'Prompt'
copyTarget: 'prompt'
}
]
const Item = children ? ContextMenuItem : DropdownMenuItem
@@ -58,8 +59,8 @@ export function JiraIssueRowCopyMenu({
<>
{actions.map((action) => (
<Item
key={action.copiedLabel}
onSelect={() => void copyJiraTextToClipboard(action.text, action.copiedLabel)}
key={action.copyTarget}
onSelect={() => void copyJiraTextToClipboard(action.text, action.copyTarget)}
>
<Clipboard className="size-3.5" />
{action.label}
@@ -24,8 +24,11 @@ export function JiraLinkedWorkspaceAction({
}): React.JSX.Element {
const label =
workspaces.length === 1
? translate('jira.workspace.single', '1 workspace linked to {{key}}', { key: issue.key })
: translate('jira.workspace.count', '{{count}} workspaces linked to {{key}}', {
? translate('jira.workspace.linkedCount_one', '{{count}} workspace linked to {{key}}', {
count: workspaces.length,
key: issue.key
})
: translate('jira.workspace.linkedCount_other', '{{count}} workspaces linked to {{key}}', {
count: workspaces.length,
key: issue.key
})
@@ -123,7 +123,7 @@ export function JiraPromptTemplatePopover({
disabled={copying || !prompt}
onClick={async () => {
setCopying(true)
const copied = await copyJiraTextToClipboard(prompt, 'Prompt')
const copied = await copyJiraTextToClipboard(prompt, 'prompt')
setCopying(false)
if (copied) {
onClose()
+21 -12
View File
@@ -216,8 +216,15 @@ export default function Landing(): React.JSX.Element {
const repos = useAppStore((s) => s.repos)
const openModal = useAppStore((s) => s.openModal)
const createTargetLabel =
repos.length > 0 && repos.every((repo) => isGitRepoKind(repo)) ? 'Worktree' : 'Workspace'
const createActionLabel =
repos.length > 0 && repos.every((repo) => isGitRepoKind(repo))
? translate('auto.components.NewWorkspaceComposerModal.createWorktree', 'Create worktree')
: translate('auto.components.NewWorkspaceComposerModal.createWorkspace', 'Create workspace')
const moveUpLabel = translate('auto.components.Landing.moveUpWorkspace', 'Move up workspace')
const moveDownLabel = translate(
'auto.components.Landing.moveDownWorkspace',
'Move down workspace'
)
const hasProjects = repos.length > 0
const hasGitHubProject = useMemo(() => hasGitHubBackedProject(repos), [repos])
const showGitHubSupportFooter = repos.length === 0 || hasGitHubProject
@@ -231,15 +238,18 @@ export default function Landing(): React.JSX.Element {
const nextWorktreeShortcut = useShortcutKeyDetails('worktree.navigateDown')
const shortcuts = useMemo<ShortcutItem[]>(() => {
return [
{
id: 'create',
shortcut: createWorktreeShortcut,
action: `Create ${createTargetLabel.toLowerCase()}`
},
{ id: 'up', shortcut: previousWorktreeShortcut, action: 'Move up workspace' },
{ id: 'down', shortcut: nextWorktreeShortcut, action: 'Move down workspace' }
{ id: 'create', shortcut: createWorktreeShortcut, action: createActionLabel },
{ id: 'up', shortcut: previousWorktreeShortcut, action: moveUpLabel },
{ id: 'down', shortcut: nextWorktreeShortcut, action: moveDownLabel }
]
}, [createTargetLabel, createWorktreeShortcut, nextWorktreeShortcut, previousWorktreeShortcut])
}, [
createActionLabel,
moveUpLabel,
moveDownLabel,
createWorktreeShortcut,
nextWorktreeShortcut,
previousWorktreeShortcut
])
return (
<div className="absolute inset-0 flex items-center justify-center bg-background">
@@ -284,8 +294,7 @@ export default function Landing(): React.JSX.Element {
onClick={() => openModal('new-workspace-composer', { telemetrySource: 'unknown' })}
>
<GitBranchPlus className="size-3.5" />
{translate('auto.components.Landing.76a95f7f47', 'Create')}{' '}
{createTargetLabel.toLowerCase()}
{createActionLabel}
</button>
</div>
@@ -85,7 +85,10 @@ export function LinearIssueMarkdownDescriptionEditor({
attributes: {
class: 'rich-markdown-editor',
spellcheck: getRichMarkdownSpellcheckAttribute(richMarkdownSpellcheckEnabled),
'aria-label': 'Issue description'
'aria-label': translate(
'auto.components.LinearIssueWorkspace.issueDescriptionLabel',
'Issue description'
)
},
handleKeyDown: (_view, event) => {
if (!isScreenSubmitShortcut(event)) {
@@ -5,6 +5,7 @@ import { openLinearIssueWorkspaceOrStart } from '@/lib/linear-issue-workspace-op
import { getWorktreeAttachmentLabel } from '@/lib/worktree-attachment-label'
import { folderWorkspaceToWorktree } from '../../../shared/folder-workspace-worktree'
import { useAppStore } from '@/store'
import { translate } from '@/i18n/i18n'
import { useAllWorktrees } from '@/store/selectors'
import type { LinearComment, LinearIssue } from '../../../shared/linear/issue-types'
import { linearGetIssue, linearIssueComments } from '@/runtime/runtime-linear-issue-mutations'
@@ -156,7 +157,7 @@ export default function LinearItemDrawer({
id: comment.id,
body: comment.body,
createdAt: comment.createdAt,
user: { displayName: 'You' }
user: { displayName: translate('auto.components.issueComments.you', 'You') }
}
optimisticCommentsRef.current.push(newComment)
setComments((prev) => [...prev, newComment])
@@ -45,15 +45,17 @@ export function NativeChatRemoteResumeActions({
disabled={busy || startedHere.length === 0}
onClick={() => resume(startedHere)}
>
{translate(
startedHere.length === 1
? 'auto.components.NativeChatResumeOnRestartModal.serverResumeHereOne'
: 'auto.components.NativeChatResumeOnRestartModal.serverResumeHere',
startedHere.length === 1
? 'Resume 1 chat started here'
: 'Resume {{count}} chats started here',
{ count: startedHere.length }
)}
{startedHere.length === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.serverResumeHereCount_one',
'Resume {{count}} chat started here',
{ count: startedHere.length }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.serverResumeHereCount_other',
'Resume {{count}} chats started here',
{ count: startedHere.length }
)}
</Button>
</>
)
@@ -48,28 +48,31 @@ function finishedDescription(everyChatResumed: boolean, byUpdate: boolean): stri
function runTitle(run: ResumeRun, total: number, resumed: number): React.ReactNode {
if (!resumeRunInFlight(run)) {
if (total === 1) {
return translate(
'auto.components.NativeChatResumeRunPanel.resumedTitleOne',
'Resumed {{value0}} of 1 chat',
{ value0: resumed }
)
}
return translate(
'auto.components.NativeChatResumeRunPanel.resumedTitle',
'Resumed {{value0}} of {{value1}} chats',
{ value0: resumed, value1: total }
)
return total === 1
? translate(
'auto.components.NativeChatResumeRunPanel.resumedOfTotal_one',
'Resumed {{resumed}} of {{count}} chat',
{ resumed, count: total }
)
: translate(
'auto.components.NativeChatResumeRunPanel.resumedOfTotal_other',
'Resumed {{resumed}} of {{count}} chats',
{ resumed, count: total }
)
}
return (
<span className="flex items-center gap-2">
<Loader2 className="size-4 animate-spin text-muted-foreground" />
{total === 1
? translate('auto.components.NativeChatResumeRunPanel.resumingTitleOne', 'Resuming 1 chat')
? translate(
'auto.components.NativeChatResumeRunPanel.resumingCount_one',
'Resuming {{count}} chat',
{ count: total }
)
: translate(
'auto.components.NativeChatResumeRunPanel.resumingTitle',
'Resuming {{value0}} chats',
{ value0: total }
'auto.components.NativeChatResumeRunPanel.resumingCount_other',
'Resuming {{count}} chats',
{ count: total }
)}
</span>
)
@@ -139,28 +139,55 @@ export default function NewWorkspaceComposerCard(
: translate('auto.components.NewWorkspaceComposerCard.notConnected', 'Not connected')
const connectButtonLabel =
selectedRepoSshStatus === 'disconnected' || selectedRepoSshStatus === null
? 'Connect'
: 'Reconnect'
? translate('auto.components.NewWorkspaceComposerCard.connect', 'Connect')
: translate('auto.components.NewWorkspaceComposerCard.reconnect', 'Reconnect')
const setupConfigLabel =
setupConfig?.kind === 'default-tabs'
? 'Default tab commands'
? translate(
'auto.components.NewWorkspaceComposerCard.setupConfigDefaultTabs',
'Default tab commands'
)
: setupConfig?.kind === 'setup-and-default-tabs'
? 'Setup and default tab commands'
: 'Setup script'
? translate(
'auto.components.NewWorkspaceComposerCard.setupConfigSetupAndDefaultTabs',
'Setup and default tab commands'
)
: translate(
'auto.components.NewWorkspaceComposerCard.setupConfigSetupScript',
'Setup script'
)
const setupRunLabel =
setupConfig?.kind === 'default-tabs'
? 'Run default tab commands'
? translate(
'auto.components.NewWorkspaceComposerCard.runDefaultTabCommands',
'Run default tab commands'
)
: setupConfig?.kind === 'setup-and-default-tabs'
? 'Run setup and default tab commands'
: 'Run setup command'
? translate(
'auto.components.NewWorkspaceComposerCard.runSetupAndDefaultTabCommands',
'Run setup and default tab commands'
)
: translate('auto.components.NewWorkspaceComposerCard.runSetupCommand', 'Run setup command')
const setupAskLabel =
setupConfig?.kind === 'default-tabs'
? 'Run default tab commands now?'
? translate(
'auto.components.NewWorkspaceComposerCard.askRunDefaultTabCommands',
'Run default tab commands now?'
)
: setupConfig?.kind === 'setup-and-default-tabs'
? 'Run setup and default tab commands now?'
: 'Run setup now?'
const setupRunButtonLabel = setupConfig?.kind === 'setup' ? 'Run setup now' : 'Run commands now'
const setupSkipButtonLabel = setupConfig?.kind === 'setup' ? 'Skip for now' : 'Skip commands'
? translate(
'auto.components.NewWorkspaceComposerCard.askRunSetupAndDefaultTabCommands',
'Run setup and default tab commands now?'
)
: translate('auto.components.NewWorkspaceComposerCard.askRunSetup', 'Run setup now?')
const setupRunButtonLabel =
setupConfig?.kind === 'setup'
? translate('auto.components.NewWorkspaceComposerCard.runSetupNow', 'Run setup now')
: translate('auto.components.NewWorkspaceComposerCard.runCommandsNow', 'Run commands now')
const setupSkipButtonLabel =
setupConfig?.kind === 'setup'
? translate('auto.components.NewWorkspaceComposerCard.skipForNow', 'Skip for now')
: translate('auto.components.NewWorkspaceComposerCard.skipCommands', 'Skip commands')
const showSetupAgentStartupPolicy =
setupControlsEnabled && setupConfig !== null && setupConfig.kind !== 'default-tabs'
const agentCatalog = getAgentCatalog()
+7 -3
View File
@@ -276,9 +276,13 @@ function QuickOpenContent({ visible }: { visible: boolean }): React.JSX.Element
{/* Announce result count changes to assistive technology. */}
<div aria-live="polite" className="sr-only">
{deferredQuery.trim()
? translate('auto.components.QuickOpen.b227d88520', '{{value0}} files found', {
value0: filtered.length
})
? filtered.length === 1
? translate('auto.components.QuickOpen.filesFound_one', '{{count}} file found', {
count: filtered.length
})
: translate('auto.components.QuickOpen.filesFound_other', '{{count}} files found', {
count: filtered.length
})
: ''}
</div>
</CommandDialog>
+7 -1
View File
@@ -143,7 +143,13 @@ export function UpdateCard(): React.JSX.Element | null {
.catch((error) => {
const message = String((error as Error)?.message ?? error)
console.error('[updates] failed to enable HTTP/1.1 compatibility:', error)
setCompatibilitySetupError(`Could not enable compatibility mode. ${message}`)
setCompatibilitySetupError(
translate(
'auto.components.UpdateCard.compatibilityModeFailed',
'Could not enable compatibility mode. {{message}}',
{ message }
)
)
setCompatibilityRelaunching(false)
})
}
+6 -1
View File
@@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react'
import { Search } from 'lucide-react'
import { ZOOM_LEVEL_CHANGED_EVENT } from '@/lib/zoom-events'
import type { ZoomLevelChangedEventDetail } from '@/lib/zoom-events'
import { translate } from '@/i18n/i18n'
// Unmount after fading so the fixed overlay cannot interfere with Radix layering, outside clicks or focus.
const DISPLAY_MS = 1500
@@ -44,7 +45,11 @@ export function ZoomOverlay(): React.JSX.Element | null {
}
const title =
detail.type === 'ui' ? 'UI Zoom' : detail.type === 'editor' ? 'Editor Zoom' : 'Terminal Zoom'
detail.type === 'ui'
? translate('auto.components.ZoomOverlay.uiZoom', 'UI Zoom')
: detail.type === 'editor'
? translate('auto.components.ZoomOverlay.editorZoom', 'Editor Zoom')
: translate('auto.components.ZoomOverlay.terminalZoom', 'Terminal Zoom')
return (
<div
@@ -16,7 +16,8 @@ import type {
} from '../../../../shared/automations-types'
import { getExternalAutomationScheduleDisplay } from './external-automation-schedule-display'
import { getExternalProviderLabel } from './external-automation-display'
import { translate } from '@/i18n/i18n'
import { Trans } from 'react-i18next'
import { i18n, translate } from '@/i18n/i18n'
export function AutomationDeleteDialog({
deleteTarget,
@@ -52,12 +53,20 @@ export function AutomationDeleteDialog({
)}
</DialogTitle>
<DialogDescription className="text-xs">
{translate('auto.components.automations.AutomationsPage.15e0bfb13b', 'Delete')}{' '}
<span className="break-all font-medium text-foreground">{deleteTarget?.name}</span>{' '}
{translate(
'auto.components.automations.AutomationsPage.b264564427',
'and its run history. Workspaces created by previous runs are not deleted.'
)}
<Trans
i18n={i18n}
defaults={translate(
'auto.components.automations.AutomationsPage.deleteAutomationDescription',
'Delete <name/> and its run history. Workspaces created by previous runs are not deleted.'
)}
components={{
name: (
<span className="break-all font-medium text-foreground">
{deleteTarget?.name}
</span>
)
}}
/>
</DialogDescription>
</DialogHeader>
{deleteTarget ? (
@@ -141,19 +150,31 @@ export function ExternalAutomationDeleteDialog({
)}
</DialogTitle>
<DialogDescription className="text-xs">
{translate('auto.components.automations.AutomationsPage.15e0bfb13b', 'Delete')}{' '}
<span className="break-all font-medium text-foreground">
{externalDeleteTarget?.job.name}
</span>{' '}
{translate('auto.components.automations.AutomationsPage.02a33e3204', 'from')}{' '}
{externalDeleteTarget
? getExternalProviderLabel(externalDeleteTarget.manager)
: translate(
'auto.components.automations.AutomationsPage.8500baacb4',
'external source'
)}{' '}
{translate('auto.components.automations.AutomationsPage.1b586f0e2b', 'on')}{' '}
{externalDeleteTarget?.manager.targetLabel}.
<Trans
i18n={i18n}
defaults={translate(
'auto.components.automations.AutomationsPage.deleteExternalAutomationDescription',
'Delete <name/> from <provider/> on <host/>.'
)}
components={{
name: (
<span className="break-all font-medium text-foreground">
{externalDeleteTarget?.job.name}
</span>
),
provider: (
<>
{externalDeleteTarget
? getExternalProviderLabel(externalDeleteTarget.manager)
: translate(
'auto.components.automations.AutomationsPage.8500baacb4',
'external source'
)}
</>
),
host: <>{externalDeleteTarget?.manager.targetLabel}</>
}}
/>
</DialogDescription>
</DialogHeader>
{externalDeleteTarget ? (
@@ -62,13 +62,31 @@ function DetailMetric({
function formatGrace(minutes: number): string {
if (minutes <= 0) {
return 'No grace'
return translate('auto.components.automations.AutomationDetail.noGrace', 'No grace')
}
if (minutes < 60) {
return `${minutes} minutes`
return minutes === 1
? translate(
'auto.components.automations.AutomationDetail.graceMinutes_one',
'{{count}} minute',
{ count: minutes }
)
: translate(
'auto.components.automations.AutomationDetail.graceMinutes_other',
'{{count}} minutes',
{ count: minutes }
)
}
const hours = minutes / 60
return `${hours} ${hours === 1 ? 'hour' : 'hours'}`
return hours === 1
? translate('auto.components.automations.AutomationDetail.graceHours_one', '{{count}} hour', {
count: hours
})
: translate(
'auto.components.automations.AutomationDetail.graceHours_other',
'{{count}} hours',
{ count: hours }
)
}
function ToolbarIconButton({
@@ -131,15 +149,27 @@ export function AutomationDetail({
const usageSummary = summarizeAutomationRunUsage(runs)
const usageCoverage =
usageSummary.knownRuns > 0
? `${usageSummary.knownRuns}/${runs.length} runs`
? runs.length === 1
? translate(
'auto.components.automations.AutomationDetail.usageCoverageRuns_one',
'{{known}}/{{count}} run',
{ known: usageSummary.knownRuns, count: runs.length }
)
: translate(
'auto.components.automations.AutomationDetail.usageCoverageRuns_other',
'{{known}}/{{count}} runs',
{ known: usageSummary.knownRuns, count: runs.length }
)
: usageSummary.unavailableRuns > 0
? 'Unavailable'
: 'No runs'
? translate('auto.components.automations.AutomationDetail.usageUnavailable', 'Unavailable')
: translate('auto.components.automations.AutomationDetail.noRuns', 'No runs')
const agentLabel =
getAgentCatalog().find((agent) => agent.id === automation.agentId)?.label ?? automation.agentId
const runLocationLabel =
automation.workspaceMode === 'new_per_run'
? (automation.baseBranch ?? projectDefaultBaseRef ?? 'Project default')
? (automation.baseBranch ??
projectDefaultBaseRef ??
translate('auto.components.automations.AutomationDetail.projectDefault', 'Project default'))
: workspaceName
const sourceDisplay = getAutomationSourceDisplay(automation.sourceContext, hostLabelById)
const hostDisplay = getAutomationHostDetailDisplay({
@@ -261,7 +291,7 @@ export function AutomationDetail({
value={
automation.enabled
? formatAutomationDateTimeWithRelative(automation.nextRunAt, now)
: 'Paused'
: translate('auto.components.automations.AutomationsPage.paused', 'Paused')
}
/>
<DetailMetric
@@ -279,7 +309,17 @@ export function AutomationDetail({
/>
<DetailMetric
label={translate('auto.components.automations.AutomationDetail.15ea446b93', 'Session')}
value={automation.reuseSession ? 'Reuse live session' : 'Fresh each run'}
value={
automation.reuseSession
? translate(
'auto.components.automations.AutomationDetail.reuseLiveSession',
'Reuse live session'
)
: translate(
'auto.components.automations.AutomationDetail.freshEachRun',
'Fresh each run'
)
}
/>
{sourceDisplay ? (
<DetailMetric
@@ -296,8 +336,12 @@ export function AutomationDetail({
label={translate('auto.components.automations.AutomationDetail.e353ab9516', 'Precheck')}
value={
automation.precheck
? `Enabled, ${formatAutomationPrecheckTimeout(automation.precheck.timeoutSeconds)}`
: 'None'
? translate(
'auto.components.automations.AutomationDetail.precheckEnabled',
'Enabled, {{timeout}}',
{ timeout: formatAutomationPrecheckTimeout(automation.precheck.timeoutSeconds) }
)
: translate('auto.components.automations.AutomationDetail.precheckNone', 'None')
}
/>
<div className="min-w-0">
@@ -68,7 +68,6 @@ export function AutomationListExternalRow({
onRequestAction
}: AutomationListExternalRowProps): React.JSX.Element {
const providerLabel = getExternalProviderLabel(entry.manager)
const targetKindLabel = getExternalTargetKindLabel(entry.manager)
const isSelected = selectedExternalKey === entry.key
const sshStatus =
entry.manager.target.type === 'ssh'
@@ -77,13 +76,13 @@ export function AutomationListExternalRow({
const disabledMessage = getExternalAutomationActionDisabledMessage({
manager: entry.manager,
providerLabel,
targetKindLabel,
sshStatus,
actionInProgress: externalActionKey !== null
})
const actionDisabled = disabledMessage !== null
const scheduleLabel = getExternalAutomationScheduleDisplay(entry.manager, entry.job).label
const hostLabel = entry.manager.targetLabel || entry.manager.label || 'Local'
const hostLabel =
entry.manager.targetLabel || entry.manager.label || getExternalTargetKindLabel(entry.manager)
const projectLabel = entry.job.workdir ?? providerLabel
const nextRunLabel = entry.job.enabled
? formatExternalDate(entry.job.nextRunAt, relativeNow)
@@ -101,14 +101,22 @@ function automationUsageText(summary: AutomationUsageSummary | undefined): strin
}
function usageAmountText(summary: AutomationUsageSummary): string {
return translate(
'auto.components.automations.AutomationsPage.runUsageSummary',
'{{cost}} est. · {{tokens}} tokens',
{
cost: formatAutomationCost(summary.estimatedCostUsd),
tokens: formatAutomationTokens(summary.totalTokens)
}
)
const params = {
count: summary.totalTokens,
cost: formatAutomationCost(summary.estimatedCostUsd),
tokens: formatAutomationTokens(summary.totalTokens)
}
return summary.totalTokens === 1
? translate(
'auto.components.automations.AutomationsPage.runUsageSummaryTokens_one',
'{{cost}} est. · {{tokens}} token',
params
)
: translate(
'auto.components.automations.AutomationsPage.runUsageSummaryTokens_other',
'{{cost}} est. · {{tokens}} tokens',
params
)
}
export function AutomationListLocalRow({
@@ -11,6 +11,7 @@ import { isRepoSearchQueryTooLarge, searchRepos } from '@/lib/repo-search'
import { cn } from '@/lib/utils'
import { useMountedRef } from '@/hooks/useMountedRef'
import { translate } from '@/i18n/i18n'
import { projectHostCountLabel } from '@/components/project-host-count-label'
import type { Repo } from '../../../../shared/repo-types'
import {
getAutomationProjectGroupForRepo,
@@ -264,7 +265,7 @@ export default function AutomationProjectCombobox({
const hasHostMenu = hasMultipleHostsInGroup(group.sources)
const hostLabel = showHostLabels ? getRepoHostLabel?.(selectedSource) : null
const detail = hasHostMenu
? `${hostLabel?.trim() || getRepoExecutionHostId(selectedSource)} · ${group.sources.length} hosts`
? `${hostLabel?.trim() || getRepoExecutionHostId(selectedSource)} · ${projectHostCountLabel(group.sources.length)}`
: getRepoDetail(selectedSource, hostLabel)
return (
<div
@@ -72,7 +72,17 @@ export function AutomationRunHistory({
}))
const runCountLabel = useMemo(() => {
const completed = runs.filter((run) => run.status === 'completed').length
return `${runs.length} ${runs.length === 1 ? 'run' : 'runs'} · ${completed} completed`
return runs.length === 1
? translate(
'auto.components.automations.runHistory.runCountSummary_one',
'{{count}} run · {{completed}} completed',
{ count: runs.length, completed }
)
: translate(
'auto.components.automations.runHistory.runCountSummary_other',
'{{count}} runs · {{completed}} completed',
{ count: runs.length, completed }
)
}, [runs])
const selectedRunId =
@@ -94,15 +94,16 @@ export function ExternalAutomationManagers({
</div>
</div>
<Badge variant="outline">
{automationCount}{' '}
{automationCount === 1
? translate(
'auto.components.automations.ExternalAutomationManagers.701515f010',
'automation'
'auto.components.automations.ExternalAutomationManagers.automationCount_one',
'{{count}} automation',
{ count: automationCount }
)
: translate(
'auto.components.automations.ExternalAutomationManagers.e2532150ed',
'automations'
'auto.components.automations.ExternalAutomationManagers.automationCount_other',
'{{count}} automations',
{ count: automationCount }
)}
</Badge>
</div>
@@ -15,6 +15,7 @@ import {
} from '../../../../shared/automation-extra-agent-args'
import { automationAuthorityCatalogKey } from './automation-host-catalog-types'
import { automationHostDiagnostics } from './automation-host-diagnostics'
import { translate } from '@/i18n/i18n'
export const REQUEST_TIMEOUT_MS = 15_000
@@ -141,7 +142,10 @@ export async function assertAutomationCreateIdempotencySupported(
await assertAuthorityCapability(
authority,
AUTOMATION_CREATE_IDEMPOTENCY_RUNTIME_CAPABILITY,
'Moving automations to this host requires a newer Orca server. Update the HUB and try again.'
translate(
'auto.components.automations.capabilityProbe.createIdempotencyUpdateRequired',
'Moving automations to this host requires a newer Orca server. Update the HUB and try again.'
)
)
}
@@ -1,4 +1,5 @@
import type { Automation } from '../../../../shared/automations-types'
import { translate } from '@/i18n/i18n'
import { getAutomationRunRepoId } from '../../../../shared/automation-run-identity'
import {
isRunnableAutomationSchedule,
@@ -36,6 +37,9 @@ export function buildAutomationEditDraft(automation: Automation): AutomationDraf
scheduleWarning:
schedule || hasCustomSchedule
? null
: 'This automation has an unsupported saved schedule. Pick a supported schedule before saving changes.'
: translate(
'auto.components.automations.editDraft.unsupportedSchedule',
'This automation has an unsupported saved schedule. Pick a supported schedule before saving changes.'
)
}
}
@@ -1,10 +1,7 @@
import { describe, expect, it, vi } from 'vitest'
import { hostStableKey, ownerKey } from '../../../../shared/automation-owner-key'
import { RUNTIME_OWNED_SSH_TARGET_ID_PREFIX } from '../../../../shared/execution-host'
import {
AUTOMATION_ORPHAN_ENTRY_LABEL,
buildAutomationHostCatalog
} from './automation-host-catalog'
import { automationOrphanEntryLabel, buildAutomationHostCatalog } from './automation-host-catalog'
import type {
AutomationCatalogSshMirrorInput,
AutomationHostCatalog,
@@ -368,7 +365,7 @@ describe('buildAutomationHostCatalog', () => {
)
const orphan = catalog.entries.find((entry) => entry.kind === 'orphan')
expect(orphan).toMatchObject({
label: AUTOMATION_ORPHAN_ENTRY_LABEL,
label: automationOrphanEntryLabel(),
catalogState: 'authoritative',
executionHealth: 'unavailable',
owner: null
@@ -1,4 +1,5 @@
import { hostStableKey, parseHostStableKey } from '../../../../shared/automation-owner-key'
import { translate } from '@/i18n/i18n'
import type {
AutomationOwnerRef,
StableAutomationAuthorityRef,
@@ -21,7 +22,12 @@ import { orderAutomationHostCatalogEntries } from './automation-host-catalog-ord
/** Project mirrored state without connecting or probing; authority health/capabilities are inputs, so rendering the picker adds no network traffic. */
export const AUTOMATION_ORPHAN_ENTRY_LABEL = 'Unassigned legacy automations'
export function automationOrphanEntryLabel(): string {
return translate(
'auto.components.automations.hostCatalog.orphanEntryLabel',
'Unassigned legacy automations'
)
}
type ReferencedAuthorityScope = { targetIds: Set<string>; orphan: boolean }
@@ -214,7 +220,7 @@ function projectOrphanEntry(ctx: AuthorityProjectionContext): AutomationHostCata
{ authority: ctx.authority, selector: { kind: 'orphan' } },
{
owner: null,
label: AUTOMATION_ORPHAN_ENTRY_LABEL,
label: automationOrphanEntryLabel(),
authorityLabel: ctx.authorityLabel,
kind: 'orphan',
catalogState: settled ? 'authoritative' : 'unhydrated',
@@ -12,10 +12,7 @@ import type {
} from '../../../../shared/automation-owner-ref'
import { createAutomationHostCache } from './automation-host-cache'
import { createAutomationHostQueryController } from './automation-host-cache-controller'
import {
AUTOMATION_ORPHAN_ENTRY_LABEL,
buildAutomationHostCatalog
} from './automation-host-catalog'
import { automationOrphanEntryLabel, buildAutomationHostCatalog } from './automation-host-catalog'
import { resetAutomationHostCatalogGenerationsForTests } from './automation-host-catalog-generation'
import {
automationAuthorityCatalogKey,
@@ -172,7 +169,7 @@ describe('an old runtime answering with one unscoped list', () => {
expect(
orphanEntry?.label,
'the orphan entry never materialised, so the old runtime shows zero automations'
).toBe(AUTOMATION_ORPHAN_ENTRY_LABEL)
).toBe(automationOrphanEntryLabel())
expect(second.hydration.orphanSettledAuthorityKeys.has(RUNTIME_AUTHORITY_KEY)).toBe(true)
await controller.applyCatalog(second)
@@ -159,7 +159,14 @@ export function formatAutomationLastRunCell(
}
const relative = formatAutomationRelativeTime(snapshot.at, now)
const absolute = formatAutomationDateTime(snapshot.at)
const text = status && relative ? `${status} ${relative}` : status || relative || absolute
const text =
status && relative
? translate(
'auto.components.automations.automation.list.last.run.statusWithRelative',
'{{status}} {{relative}}',
{ status, relative }
)
: status || relative || absolute
return {
text,
title: status ? `${status} · ${absolute}` : absolute,
@@ -2,6 +2,8 @@ import React from 'react'
import type { Badge } from '@/components/ui/badge'
import { cn } from '@/lib/utils'
import type { AutomationRun } from '../../../../shared/automations-types'
import { translate } from '@/i18n/i18n'
import { formatUiNarrowRelativeTime } from '@/i18n/relative-time-format'
// Reuse one formatter across run cells; per-cell construction dominates large-history rendering.
const automationDateTimeFormatter = new Intl.DateTimeFormat(undefined, {
@@ -13,7 +15,7 @@ const automationDateTimeFormatter = new Intl.DateTimeFormat(undefined, {
export function formatAutomationDateTime(value: number | null | undefined): string {
if (!value) {
return 'Never'
return translate('auto.components.automations.automationPageParts.never', 'Never')
}
return automationDateTimeFormatter.format(value)
}
@@ -30,21 +32,17 @@ export function formatAutomationRelativeTime(
const minuteMs = 60 * 1000
const hourMs = 60 * minuteMs
const dayMs = 24 * hourMs
const format = (amount: number, unit: string): string => `${amount}${unit}`
let text: string
const sign = diffMs >= 0 ? 1 : -1
if (absMs < minuteMs) {
text = 'now'
} else if (absMs < hourMs) {
text = format(Math.round(absMs / minuteMs), 'm')
} else if (absMs < dayMs) {
text = format(Math.round(absMs / hourMs), 'h')
} else {
text = format(Math.round(absMs / dayMs), 'd')
return translate('auto.components.automations.automationPageParts.now', 'now')
}
if (text === 'now') {
return text
if (absMs < hourMs) {
return formatUiNarrowRelativeTime(sign * Math.round(absMs / minuteMs), 'minute')
}
return diffMs >= 0 ? `in ${text}` : `${text} ago`
if (absMs < dayMs) {
return formatUiNarrowRelativeTime(sign * Math.round(absMs / hourMs), 'hour')
}
return formatUiNarrowRelativeTime(sign * Math.round(absMs / dayMs), 'day')
}
export function formatAutomationDateTimeWithRelative(
@@ -74,23 +72,44 @@ export function getAutomationRunStatusVariant(
export function getAutomationRunStatusLabel(status: AutomationRun['status']): string {
switch (status) {
case 'pending':
return 'Queued'
return translate('auto.components.automations.automationPageParts.runStatusPending', 'Queued')
case 'dispatching':
return 'Starting'
return translate(
'auto.components.automations.automationPageParts.runStatusDispatching',
'Starting'
)
case 'dispatched':
return 'Launched'
return translate(
'auto.components.automations.automationPageParts.runStatusDispatched',
'Launched'
)
case 'completed':
return 'Done'
return translate('auto.components.automations.automationPageParts.runStatusCompleted', 'Done')
case 'skipped_precheck':
return 'Precheck skipped'
return translate(
'auto.components.automations.automationPageParts.runStatusSkippedPrecheck',
'Precheck skipped'
)
case 'skipped_missed':
return 'Skipped'
return translate(
'auto.components.automations.automationPageParts.runStatusSkippedMissed',
'Skipped'
)
case 'skipped_unavailable':
return 'Unavailable'
return translate(
'auto.components.automations.automationPageParts.runStatusSkippedUnavailable',
'Unavailable'
)
case 'skipped_needs_interactive_auth':
return 'Needs credentials'
return translate(
'auto.components.automations.automationPageParts.runStatusSkippedNeedsInteractiveAuth',
'Needs credentials'
)
case 'dispatch_failed':
return 'Failed'
return translate(
'auto.components.automations.automationPageParts.runStatusDispatchFailed',
'Failed'
)
}
}
@@ -1,4 +1,5 @@
import type { AutomationRun } from '../../../../shared/automations-types'
import { translate } from '@/i18n/i18n'
export function getAutomationRunContent(run: AutomationRun): string {
const savedOutput = run.outputSnapshot?.content.trim()
@@ -13,5 +14,9 @@ export function getAutomationRunContent(run: AutomationRun): string {
return output
}
}
return run.error ?? run.usage?.unavailableMessage ?? 'No output content available.'
return (
run.error ??
run.usage?.unavailableMessage ??
translate('auto.components.automations.runContent.noOutput', 'No output content available.')
)
}
@@ -17,14 +17,26 @@ export function automationRunOccurrenceLabel(run: AutomationRunOccurrences): str
return null
}
const count = run.occurrenceCount ?? 1
// Avoid i18next’s reserved count parameter, which would require _one/_other catalog keys.
const times = String(count)
// Older hosts may supply count without the jointly stamped timestamp; still show the count.
return run.lastOccurrenceAt
? translate(
'auto.components.automations.runHistory.occurrencesWithLatest',
'{{times}} times, most recently {{date}}',
{ times, date: formatAutomationDateTime(run.lastOccurrenceAt) }
)
: translate('auto.components.automations.runHistory.occurrences', '{{times}} times', { times })
? count === 1
? translate(
'auto.components.automations.runHistory.occurrencesWithLatestCount_one',
'{{count}} time, most recently {{date}}',
{ count, date: formatAutomationDateTime(run.lastOccurrenceAt) }
)
: translate(
'auto.components.automations.runHistory.occurrencesWithLatestCount_other',
'{{count}} times, most recently {{date}}',
{ count, date: formatAutomationDateTime(run.lastOccurrenceAt) }
)
: count === 1
? translate('auto.components.automations.runHistory.occurrencesCount_one', '{{count}} time', {
count
})
: translate(
'auto.components.automations.runHistory.occurrencesCount_other',
'{{count}} times',
{ count }
)
}
@@ -1,4 +1,5 @@
import type { Automation, AutomationRun } from '../../../../shared/automations-types'
import { translate } from '@/i18n/i18n'
export type AutomationRunViewAvailability = 'terminal' | 'workspace' | 'snapshot' | 'metadata'
@@ -66,8 +67,8 @@ export function getAutomationRunViewState({
if (run.workspaceId && workspaceExists && terminalTargetExists) {
return {
availability: 'terminal',
actionLabel: 'View run',
statusLabel: 'Run is open',
actionLabel: translate('auto.components.automations.runViewState.viewRun', 'View run'),
statusLabel: translate('auto.components.automations.runViewState.runOpen', 'Run is open'),
canOpen: true
}
}
@@ -75,8 +76,11 @@ export function getAutomationRunViewState({
if (run.workspaceId && workspaceExists && hasPaneIdentity && terminalOnPairedServer) {
return {
availability: 'terminal',
actionLabel: 'View run',
statusLabel: 'Run terminal is on the paired server.',
actionLabel: translate('auto.components.automations.runViewState.viewRun', 'View run'),
statusLabel: translate(
'auto.components.automations.runViewState.terminalOnPairedServer',
'Run terminal is on the paired server.'
),
canOpen: true
}
}
@@ -84,8 +88,11 @@ export function getAutomationRunViewState({
if (run.workspaceId && workspaceExists && hasTerminalIdentity) {
return {
availability: 'terminal',
actionLabel: 'View run',
statusLabel: 'Run terminal is unavailable.',
actionLabel: translate('auto.components.automations.runViewState.viewRun', 'View run'),
statusLabel: translate(
'auto.components.automations.runViewState.terminalUnavailable',
'Run terminal is unavailable.'
),
canOpen: true
}
}
@@ -94,8 +101,14 @@ export function getAutomationRunViewState({
if (run.workspaceId && workspaceExists && run.dispatchedAt !== null) {
return {
availability: 'workspace',
actionLabel: 'Open workspace',
statusLabel: 'Workspace is available.',
actionLabel: translate(
'auto.components.automations.runViewState.openWorkspace',
'Open workspace'
),
statusLabel: translate(
'auto.components.automations.runViewState.workspaceAvailable',
'Workspace is available.'
),
canOpen: true
}
}
@@ -103,20 +116,36 @@ export function getAutomationRunViewState({
if (run.outputSnapshot?.content.trim()) {
return {
availability: 'snapshot',
actionLabel: 'Snapshot saved',
statusLabel: 'Showing saved run snapshot.',
actionLabel: translate(
'auto.components.automations.runViewState.snapshotSaved',
'Snapshot saved'
),
statusLabel: translate(
'auto.components.automations.runViewState.showingSnapshot',
'Showing saved run snapshot.'
),
canOpen: false
}
}
return {
availability: 'metadata',
actionLabel: 'View run',
actionLabel: translate('auto.components.automations.runViewState.viewRun', 'View run'),
statusLabel: run.workspaceId
? run.workspaceDisplayName?.trim()
? `${run.workspaceDisplayName.trim()} no longer available`
: 'Workspace no longer available'
: 'No workspace launched',
? translate(
'auto.components.automations.runViewState.namedWorkspaceGone',
'{{name}} no longer available',
{ name: run.workspaceDisplayName.trim() }
)
: translate(
'auto.components.automations.runViewState.workspaceGone',
'Workspace no longer available'
)
: translate(
'auto.components.automations.runViewState.noWorkspaceLaunched',
'No workspace launched'
),
canOpen: false
}
}
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import type { AutomationRun } from '../../../../shared/automations-types'
import type { Worktree } from '../../../../shared/worktree/types'
@@ -17,8 +18,14 @@ export function getAutomationRunWorkspaceDisplay({
}): AutomationRunWorkspaceDisplay {
if (!run.workspaceId) {
return {
rowLabel: 'Not launched',
detailLabel: 'Not launched',
rowLabel: translate(
'auto.components.automations.runWorkspaceDisplay.notLaunched',
'Not launched'
),
detailLabel: translate(
'auto.components.automations.runWorkspaceDisplay.notLaunched',
'Not launched'
),
muted: true
}
}
@@ -33,7 +40,11 @@ export function getAutomationRunWorkspaceDisplay({
const previousName = run.workspaceDisplayName?.trim()
if (previousName) {
const deletedLabel = `${previousName} (no longer available)`
const deletedLabel = translate(
'auto.components.automations.runWorkspaceDisplay.namedWorkspaceGone',
'{{name}} (no longer available)',
{ name: previousName }
)
return {
rowLabel: previousName,
detailLabel: deletedLabel,
@@ -43,8 +54,14 @@ export function getAutomationRunWorkspaceDisplay({
}
return {
rowLabel: 'Workspace no longer available',
detailLabel: 'Workspace no longer available',
rowLabel: translate(
'auto.components.automations.runViewState.workspaceGone',
'Workspace no longer available'
),
detailLabel: translate(
'auto.components.automations.runViewState.workspaceGone',
'Workspace no longer available'
),
muted: true
}
}
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import { getExecutionHostLabel } from '../../../../shared/execution-host'
import type { TaskSourceContext } from '../../../../shared/task-source-context'
@@ -21,10 +22,26 @@ export function getAutomationSourceDisplay(
.filter((part): part is string => Boolean(part))
.join(' · ')
const title = [
`${providerLabel} source`,
`Host: ${hostLabel}`,
sourceContext.accountLabel ? `Account: ${sourceContext.accountLabel}` : null,
identityLabel ? `Source: ${identityLabel}` : null
translate(
'auto.components.taskSourceContextSummary.providerSourceTitle',
'{{provider}} source',
{ provider: providerLabel }
),
translate('auto.components.taskSourceContextSummary.hostTitle', 'Host: {{hosts}}', {
hosts: hostLabel
}),
sourceContext.accountLabel
? translate(
'auto.components.taskSourceContextSummary.accountTitle',
'Account: {{accounts}}',
{ accounts: sourceContext.accountLabel }
)
: null,
identityLabel
? translate('auto.components.taskSourceContextSummary.sourceTitle', 'Source: {{source}}', {
source: identityLabel
})
: null
]
.filter((part): part is string => Boolean(part))
.join(' · ')
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import type { AutomationRunUsage } from '../../../../shared/automations-types'
// Keep retained-run summaries shared across owning authorities; only display formatting belongs to the renderer.
@@ -31,9 +32,27 @@ export function getAutomationUsageStatusLabel(
usage: AutomationRunUsage | null | undefined
): string {
if (!usage || usage.status === 'unavailable') {
return usage?.unavailableMessage ?? 'Usage unavailable'
return (
usage?.unavailableMessage ??
translate('auto.components.automations.AutomationsPage.usageUnavailable', 'Usage unavailable')
)
}
const cost = formatAutomationCost(usage.estimatedCostUsd)
const tokens = formatAutomationTokens(usage.totalTokens)
return `${tokens} tokens · ${cost}`
const count = usage.totalTokens ?? 0
const params = {
count,
tokens: formatAutomationTokens(usage.totalTokens),
cost: formatAutomationCost(usage.estimatedCostUsd)
}
// count drives CLDR plural selection; tokens is the compact display form.
return count === 1
? translate(
'auto.components.automations.usage.tokensAndCost_one',
'{{tokens}} token · {{cost}}',
params
)
: translate(
'auto.components.automations.usage.tokensAndCost_other',
'{{tokens}} tokens · {{cost}}',
params
)
}
@@ -1,9 +1,13 @@
import type { ExternalAutomationManager } from '../../../../shared/automations-types'
import { formatAutomationDateTimeWithRelative } from './automation-page-parts'
import { translate } from '@/i18n/i18n'
import {
formatAutomationDateTime,
formatAutomationDateTimeWithRelative
} from './automation-page-parts'
export function formatExternalDate(value: string | null, now: number): string {
if (!value) {
return 'Never'
return formatAutomationDateTime(null)
}
const parsed = Date.parse(value)
if (!Number.isFinite(parsed)) {
@@ -17,5 +21,7 @@ export function getExternalProviderLabel(_manager: ExternalAutomationManager): s
}
export function getExternalTargetKindLabel(manager: ExternalAutomationManager): string {
return manager.target.type === 'ssh' ? 'SSH host' : 'Local'
return manager.target.type === 'ssh'
? translate('auto.components.automations.externalDisplay.sshHost', 'SSH host')
: translate('auto.components.automations.externalDisplay.local', 'Local')
}
@@ -36,10 +36,9 @@ describe('external automation action availability', () => {
error: 'SSH target is not connected.'
}),
providerLabel: 'OpenClaw',
targetKindLabel: 'SSH host',
sshStatus: 'disconnected'
})
).toBe('Connect this ssh host before managing OpenClaw automations.')
).toBe('Connect this SSH host before managing OpenClaw automations.')
})
it('explains disabled SSH automation actions while the host is connecting', () => {
@@ -49,10 +48,9 @@ describe('external automation action availability', () => {
target: { type: 'ssh', connectionId: 'devbox' },
error: 'SSH target is not connected.'
}),
targetKindLabel: 'SSH host',
sshStatus: 'deploying-relay'
})
).toBe('Wait for this ssh host to finish connecting.')
).toBe('Wait for this SSH host to finish connecting.')
})
it('explains disabled SSH automation actions when the remote source tool is missing', () => {
@@ -1,6 +1,7 @@
import type { ExternalAutomationManager } from '../../../../shared/automations-types'
import type { SshConnectionStatus } from '../../../../shared/ssh-types'
import { isConnectingSshStatus } from '@/ssh/ssh-connection-recoverability'
import { translate } from '@/i18n/i18n'
export function isSshConnectionBusy(status: SshConnectionStatus | undefined): boolean {
return isConnectingSshStatus(status)
@@ -9,37 +10,52 @@ export function isSshConnectionBusy(status: SshConnectionStatus | undefined): bo
export function getExternalAutomationActionDisabledMessage(args: {
manager: ExternalAutomationManager
providerLabel?: string
targetKindLabel?: string
sshStatus?: SshConnectionStatus
actionInProgress?: boolean
}): string | null {
if (args.actionInProgress) {
return 'Another automation action is still running.'
return translate(
'auto.components.automations.externalActionDisabled.actionInProgress',
'Another automation action is still running.'
)
}
if (args.manager.canManage) {
return null
}
const providerLabel = args.providerLabel ?? 'OpenClaw'
const targetKindLabel =
args.targetKindLabel ?? (args.manager.target.type === 'ssh' ? 'SSH host' : 'Local')
const provider = args.providerLabel ?? 'OpenClaw'
if (args.manager.target.type === 'ssh') {
if (isSshConnectionBusy(args.sshStatus)) {
return `Wait for this ${targetKindLabel.toLowerCase()} to finish connecting.`
return translate(
'auto.components.automations.externalActionDisabled.sshConnecting',
'Wait for this SSH host to finish connecting.'
)
}
if (args.manager.error && !isSshDisconnectedError(args.manager.error)) {
return args.manager.error
}
if (args.sshStatus !== 'connected') {
return `Connect this ${targetKindLabel.toLowerCase()} before managing ${providerLabel} automations.`
return translate(
'auto.components.automations.externalActionDisabled.connectSshHost',
'Connect this SSH host before managing {{provider}} automations.',
{ provider }
)
}
return (
args.manager.error ??
`${providerLabel} cannot manage automations on this ${targetKindLabel.toLowerCase()}.`
translate(
'auto.components.automations.externalActionDisabled.cannotManageOnSshHost',
'{{provider}} cannot manage automations on this SSH host.',
{ provider }
)
)
}
return (
args.manager.error ??
`${providerLabel} cannot manage automations on this ${targetKindLabel.toLowerCase()}.`
translate(
'auto.components.automations.externalActionDisabled.cannotManageLocally',
'{{provider}} cannot manage automations on this machine.',
{ provider }
)
)
}
@@ -48,9 +48,15 @@ export function externalAutomationUncheckedNotice(
{ hostLabel: labels[0] }
)
}
return translate(
'auto.components.automations.externalScope.uncheckedHosts',
'External automation managers on {{count}} hosts could not be checked.',
{ count: labels.length }
)
return labels.length === 1
? translate(
'auto.components.automations.externalScope.uncheckedHostCount_one',
'External automation managers on {{count}} host could not be checked.',
{ count: labels.length }
)
: translate(
'auto.components.automations.externalScope.uncheckedHostCount_other',
'External automation managers on {{count}} hosts could not be checked.',
{ count: labels.length }
)
}
@@ -96,11 +96,19 @@ function hostMessage(hostPermissions: string[]): string | null {
}
)
}
return translate(
'browserExtensions.permission.manySites',
'Read and change your data on {{hosts}} and {{count}} other sites',
{ hosts: hosts.slice(0, MAX_NAMED_HOSTS).join(', '), count: hosts.length - MAX_NAMED_HOSTS }
)
const named = hosts.slice(0, MAX_NAMED_HOSTS).join(', ')
const count = hosts.length - MAX_NAMED_HOSTS
return count === 1
? translate(
'browserExtensions.permission.manyOtherSites_one',
'Read and change your data on {{hosts}} and {{count}} other site',
{ hosts: named, count }
)
: translate(
'browserExtensions.permission.manyOtherSites_other',
'Read and change your data on {{hosts}} and {{count}} other sites',
{ hosts: named, count }
)
}
/** Why skip unsupported ones: "It can" must not promise what Orca does not do; they get their own line. */
@@ -12,19 +12,19 @@ import type {
import { getProviderRateLimitScope } from '@/components/settings/provider-account-scope'
import { ProviderHostScopeControl } from '@/components/settings/ProviderHostScopeControl'
import { translate } from '@/i18n/i18n'
import { formatUiNarrowDuration } from '@/i18n/relative-time-format'
const REFRESH_INTERVAL_MS = 60_000
export function formatGitLabRateLimitReset(resetAt: number | null): string {
if (resetAt === null) {
return 'unknown'
return translate('auto.components.gitlab.gitlab.rate.limit.display.resetUnknown', 'unknown')
}
const deltaSec = Math.max(0, resetAt - Math.floor(Date.now() / 1000))
if (deltaSec < 60) {
return `${deltaSec}s`
return formatUiNarrowDuration(deltaSec, 'second')
}
const mins = Math.round(deltaSec / 60)
return `${mins}m`
return formatUiNarrowDuration(Math.round(deltaSec / 60), 'minute')
}
export function toneForGitLabBucket(remaining: number, limit: number): 'ok' | 'warn' | 'crit' {
@@ -136,14 +136,15 @@ function GitLabRateLimitRows({
tone === 'warn' && 'text-amber-700 dark:text-amber-300'
)}
>
{rest.remaining}{' '}
{translate('auto.components.gitlab.gitlab.rate.limit.display.ea8ad0bae8', 'of')}{' '}
{rest.limit}{' '}
{translate(
'auto.components.gitlab.gitlab.rate.limit.display.3e2c982cfa',
'left, resets in'
)}{' '}
{formatGitLabRateLimitReset(rest.resetAt)}
'auto.components.gitlab.gitlab.rate.limit.display.remainingOfLimit',
'{{remaining}} of {{limit}} left, resets in {{reset}}',
{
remaining: rest.remaining,
limit: rest.limit,
reset: formatGitLabRateLimitReset(rest.resetAt)
}
)}
</span>
</div>
</div>
@@ -0,0 +1,40 @@
import { translate } from '@/i18n/i18n'
export type IssueCopyTarget = 'url' | 'key' | 'identifier' | 'branchName' | 'prompt'
// Whole sentences per target: copied nouns need their own case/gender in other languages.
export function issueCopiedMessage(target: IssueCopyTarget): string {
switch (target) {
case 'url':
return translate('auto.components.issueCopy.urlCopied', 'URL copied')
case 'key':
return translate('auto.components.issueCopy.keyCopied', 'Key copied')
case 'identifier':
return translate('auto.components.issueCopy.identifierCopied', 'Identifier copied')
case 'branchName':
return translate('auto.components.issueCopy.branchNameCopied', 'Branch name copied')
case 'prompt':
return translate('auto.components.issueCopy.promptCopied', 'Prompt copied')
}
}
export function issueCopyFailedMessage(target: IssueCopyTarget): string {
switch (target) {
case 'url':
return translate('auto.components.issueCopy.urlCopyFailed', 'Failed to copy URL')
case 'key':
return translate('auto.components.issueCopy.keyCopyFailed', 'Failed to copy key')
case 'identifier':
return translate(
'auto.components.issueCopy.identifierCopyFailed',
'Failed to copy identifier'
)
case 'branchName':
return translate(
'auto.components.issueCopy.branchNameCopyFailed',
'Failed to copy branch name'
)
case 'prompt':
return translate('auto.components.issueCopy.promptCopyFailed', 'Failed to copy prompt')
}
}
@@ -1,4 +1,5 @@
import { translate } from '@/i18n/i18n'
import { Trans } from 'react-i18next'
import { i18n, translate } from '@/i18n/i18n'
export function JiraConnectCredentialGuide({
isServer,
@@ -27,20 +28,26 @@ export function JiraConnectCredentialGuide({
return (
<div className="space-y-2 text-xs text-muted-foreground">
<p>
{translate('auto.components.jira.connect.dialog.8090504a3e', 'Create a token in')}{' '}
<button
type="button"
className="text-primary underline-offset-2 hover:underline"
onClick={() =>
window.api.shell.openUrl('https://id.atlassian.com/manage-profile/security/api-tokens')
}
>
{translate(
'auto.components.jira.connect.dialog.fdd26d81cc',
'Atlassian account settings'
<Trans
i18n={i18n}
defaults={translate(
'auto.components.jira.connect.dialog.createTokenInSettings',
'Create a token in <link>Atlassian account settings</link>.'
)}
</button>
.
components={{
link: (
<button
type="button"
className="text-primary underline-offset-2 hover:underline"
onClick={() =>
window.api.shell.openUrl(
'https://id.atlassian.com/manage-profile/security/api-tokens'
)
}
/>
)
}}
/>
</p>
<p>
{supportsScopedTokens
@@ -11,6 +11,11 @@ import { applyJiraIssueKeyCasing } from '../../../shared/workspace-name'
import type { WorkspaceSeedNameOptions } from '../../../shared/workspace-name'
import { getJiraIssueKeyCasingSeedOptions } from '@/lib/jira-issue-key-casing'
import { buildJiraIssuePrompt } from './jira-prompt-templates'
import {
issueCopiedMessage,
issueCopyFailedMessage,
type IssueCopyTarget
} from './issue-copy-target-messages'
import type { JiraIssueWorkspaceAction } from './jira-issue-workspace-content'
export function useJiraIssueWorkspaceActions({
@@ -77,21 +82,16 @@ export function buildJiraBranchName(
)
}
export async function copyJiraTextToClipboard(text: string, label: string): Promise<boolean> {
export async function copyJiraTextToClipboard(
text: string,
target: IssueCopyTarget
): Promise<boolean> {
try {
await window.api.ui.writeClipboardText(text)
toast.success(
translate('auto.components.JiraIssueWorkspace.2ff69a3545', '{{value0}} copied', {
value0: label
})
)
toast.success(issueCopiedMessage(target))
return true
} catch {
toast.error(
translate('auto.components.JiraIssueWorkspace.6c41a9bcea', 'Failed to copy {{value0}}', {
value0: label.toLowerCase()
})
)
toast.error(issueCopyFailedMessage(target))
return false
}
}
@@ -106,12 +106,12 @@ export function getJiraIssueWorkspaceActions(issue: JiraIssue): JiraIssueWorkspa
{
label: translate('auto.components.JiraIssueWorkspace.779bb91ee0', 'Copy URL'),
icon: Clipboard,
action: () => void copyJiraTextToClipboard(issue.url, 'URL')
action: () => void copyJiraTextToClipboard(issue.url, 'url')
},
{
label: translate('auto.components.JiraIssueWorkspace.38839801e8', 'Copy key'),
icon: Clipboard,
action: () => void copyJiraTextToClipboard(issue.key, 'Key')
action: () => void copyJiraTextToClipboard(issue.key, 'key')
},
{
label: translate(
@@ -122,13 +122,13 @@ export function getJiraIssueWorkspaceActions(issue: JiraIssue): JiraIssueWorkspa
action: () =>
void copyJiraTextToClipboard(
buildJiraBranchName(issue, getJiraIssueKeyCasingSeedOptions()),
'Branch name'
'branchName'
)
},
{
label: translate('auto.components.JiraIssueWorkspace.0cc62bd690', 'Copy prompt'),
icon: Clipboard,
action: () => void copyJiraTextToClipboard(buildJiraIssuePrompt(issue), 'Prompt')
action: () => void copyJiraTextToClipboard(buildJiraIssuePrompt(issue), 'prompt')
}
]
}
@@ -1,5 +1,6 @@
import type { CSSProperties } from 'react'
import { translate } from '@/i18n/i18n'
import { formatUiNarrowDuration } from '@/i18n/relative-time-format'
export type JiraListColumnId =
| 'key'
@@ -161,11 +162,18 @@ export function formatJiraEstimate(seconds: number | undefined): string {
return '–'
}
if (seconds === 0) {
return '0m'
return formatUiNarrowDuration(0, 'minute')
}
const hours = Math.floor(seconds / 3600)
const minutes = Math.floor((seconds % 3600) / 60)
return [hours ? `${hours}h` : '', minutes ? `${minutes}m` : ''].filter(Boolean).join(' ') || '<1m'
return (
[
hours ? formatUiNarrowDuration(hours, 'hour') : '',
minutes ? formatUiNarrowDuration(minutes, 'minute') : ''
]
.filter(Boolean)
.join(' ') || `<${formatUiNarrowDuration(1, 'minute')}`
)
}
export function formatJiraStoryPoints(points: number | undefined): string {
@@ -40,7 +40,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.b673e7cf1b',
'Git is required for Git projects, source control, and workspace management.'
),
fixLabel: 'Install Git',
fixLabel: translate('auto.components.Landing.installGit', 'Install Git'),
fixUrl: 'https://git-scm.com/downloads'
})
}
@@ -58,7 +58,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.73e1ad4282',
'Orca uses the GitHub CLI (gh) to show pull requests, issues, and checks.'
),
fixLabel: 'Install GitHub CLI',
fixLabel: translate('auto.components.Landing.installGitHubCli', 'Install GitHub CLI'),
fixUrl: 'https://cli.github.com',
dismissible: true
})
@@ -70,7 +70,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.00cee697c1',
'Run "gh auth login" in a terminal to connect your GitHub account.'
),
fixLabel: 'Learn more',
fixLabel: translate('auto.components.Landing.learnMore', 'Learn more'),
fixUrl: 'https://cli.github.com/manual/gh_auth_login',
dismissible: true
})
@@ -71,10 +71,20 @@ export function LinearIssueActivity({
className="size-5"
/>
<span>
{issue.assignee?.displayName ??
translate('auto.components.LinearIssueWorkspace.8a33c85e9c', 'Someone')}{' '}
{translate('auto.components.LinearIssueWorkspace.fabbd3f974', 'updated the issue ·')}{' '}
{formatLinearIssueRelativeTime(issue.updatedAt)}
{issue.assignee?.displayName
? translate(
'auto.components.LinearIssueWorkspace.namedUserUpdatedIssue',
'{{name}} updated the issue · {{time}}',
{
name: issue.assignee.displayName,
time: formatLinearIssueRelativeTime(issue.updatedAt)
}
)
: translate(
'auto.components.LinearIssueWorkspace.someoneUpdatedIssue',
'Someone updated the issue · {{time}}',
{ time: formatLinearIssueRelativeTime(issue.updatedAt) }
)}
</span>
</div>
@@ -1,20 +1,16 @@
import { toast } from 'sonner'
import { translate } from '@/i18n/i18n'
import {
issueCopiedMessage,
issueCopyFailedMessage,
type IssueCopyTarget
} from './issue-copy-target-messages'
export async function copyLinearIssueText(text: string, label: string): Promise<void> {
export async function copyLinearIssueText(text: string, target: IssueCopyTarget): Promise<void> {
try {
await window.api.ui.writeClipboardText(text)
toast.success(
translate('auto.components.LinearIssueWorkspace.7835483c43', '{{value0}} copied', {
value0: label
})
)
toast.success(issueCopiedMessage(target))
} catch {
toast.error(
translate('auto.components.LinearIssueWorkspace.9bcbaa2737', 'Failed to copy {{value0}}', {
value0: label.toLowerCase()
})
)
toast.error(issueCopyFailedMessage(target))
}
}
@@ -83,7 +83,7 @@ export function LinearIssueWorkspaceHeader({
type="button"
variant="ghost"
size="icon-sm"
onClick={() => void copyLinearIssueText(issue.url, 'URL')}
onClick={() => void copyLinearIssueText(issue.url, 'url')}
aria-label={translate(
'auto.components.LinearIssueWorkspace.97c19a84f1',
'Copy Linear URL'
@@ -62,12 +62,12 @@ function LinearIssueActionsCard({
{
label: translate('auto.components.LinearIssueWorkspace.9a9a884236', 'Copy URL'),
icon: Clipboard,
action: () => void copyLinearIssueText(issue.url, 'URL')
action: () => void copyLinearIssueText(issue.url, 'url')
},
{
label: translate('auto.components.LinearIssueWorkspace.30c1242f3a', 'Copy identifier'),
icon: Clipboard,
action: () => void copyLinearIssueText(issue.identifier, 'Identifier')
action: () => void copyLinearIssueText(issue.identifier, 'identifier')
},
{
label: translate(
@@ -75,8 +75,7 @@ function LinearIssueActionsCard({
'Copy suggested branch name'
),
icon: GitBranch,
action: () =>
void copyLinearIssueText(buildLinearIssueBranchName(issue), 'Suggested branch name')
action: () => void copyLinearIssueText(buildLinearIssueBranchName(issue), 'branchName')
},
{
label: translate('auto.components.LinearIssueWorkspace.f6c6381593', 'Copy prompt'),
@@ -89,7 +88,7 @@ function LinearIssueActionsCard({
version: 1,
renderedText
}) ?? renderedText
void copyLinearIssueText(prompt, 'Prompt')
void copyLinearIssueText(prompt, 'prompt')
}
}
]
@@ -10,6 +10,7 @@ import {
getLinearStatePillStyle
} from '@/components/linear-state-pill-style'
import { LinearPriorityIcon } from '@/components/linear-priority-icon'
import { getLinearPriorityLabel } from '@/components/task-page/task-page-localized-options'
import { translate } from '@/i18n/i18n'
import {
LINEAR_EDIT_CHIP_CLASS,
@@ -17,7 +18,6 @@ import {
LINEAR_EDIT_MENU_ITEM_WITH_ICON_CLASS,
LINEAR_ESTIMATE_PRESETS,
LinearEditChipAdornment,
PRIORITY_LABELS,
formatLinearEstimateLabel
} from '@/components/linear-item-drawer-edit-controls'
import type { LinearIssueEditController } from '@/components/linear-item-drawer-edit-controller'
@@ -121,9 +121,7 @@ export function renderLinearIssueChipsLayout(
aria-busy={priorityPending}
>
<LinearPriorityIcon priority={localPriority} />
<span className="truncate">
{PRIORITY_LABELS[localPriority] ?? `P${localPriority}`}
</span>
<span className="truncate">{getLinearPriorityLabel(localPriority)}</span>
<LinearEditChipAdornment pending={priorityPending} />
</button>
</PopoverTrigger>
@@ -139,7 +137,7 @@ export function renderLinearIssueChipsLayout(
)}
>
<LinearPriorityIcon priority={p} />
{PRIORITY_LABELS[p]}
{getLinearPriorityLabel(p)}
</button>
))}
</PopoverContent>
@@ -1,13 +1,6 @@
import React from 'react'
import { ChevronDown, LoaderCircle } from 'lucide-react'
export const PRIORITY_LABELS: Record<number, string> = {
0: 'No priority',
1: 'Urgent',
2: 'High',
3: 'Medium',
4: 'Low'
}
import { translate } from '@/i18n/i18n'
export const LINEAR_EDIT_CHIP_CLASS =
'inline-flex h-6 min-w-0 max-w-[14rem] cursor-pointer items-center gap-1.5 rounded-full border border-border/70 bg-background/70 px-2.5 text-[11px] font-medium leading-none text-muted-foreground shadow-xs transition-[background-color,border-color,color,box-shadow] hover:border-border hover:bg-accent hover:text-accent-foreground hover:[--linear-state-pill-current-background:var(--linear-state-pill-hover-background)] hover:[--linear-state-pill-current-border:var(--linear-state-pill-hover-border)] hover:[--linear-state-pill-current-foreground:var(--linear-state-pill-hover-foreground)] focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-80'
@@ -21,7 +14,11 @@ export const LINEAR_EDIT_MENU_ITEM_WITH_ICON_CLASS =
export const LINEAR_ESTIMATE_PRESETS = [1, 2, 3, 5, 8] as const
export function formatLinearEstimateLabel(estimate: number | null | undefined): string {
return estimate === null || estimate === undefined ? 'Set estimate' : `Estimate ${estimate}`
return estimate === null || estimate === undefined
? translate('auto.components.LinearItemDrawer.setEstimate', 'Set estimate')
: translate('auto.components.LinearItemDrawer.estimateValue', 'Estimate {{estimate}}', {
estimate
})
}
export function formatLinearEstimateInput(estimate: number | null | undefined): string {
@@ -7,13 +7,13 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
import { cn } from '@/lib/utils'
import { getLinearStateMarkerStyle } from '@/components/linear-state-pill-style'
import { LinearPriorityIcon } from '@/components/linear-priority-icon'
import { getLinearPriorityLabel } from '@/components/task-page/task-page-localized-options'
import { translate } from '@/i18n/i18n'
import {
LINEAR_EDIT_MENU_ITEM_CLASS,
LINEAR_EDIT_MENU_ITEM_WITH_ICON_CLASS,
LINEAR_ESTIMATE_PRESETS,
LinearEditChipAdornment,
PRIORITY_LABELS,
formatLinearEstimateLabel
} from '@/components/linear-item-drawer-edit-controls'
import type { LinearIssueEditController } from '@/components/linear-item-drawer-edit-controller'
@@ -132,7 +132,7 @@ export function renderLinearIssuePropertiesLayout(
>
<LinearPriorityIcon priority={localPriority} />
<span className="min-w-0 flex-1 truncate">
{PRIORITY_LABELS[localPriority] ?? `P${localPriority}`}
{getLinearPriorityLabel(localPriority)}
</span>
<LinearEditChipAdornment pending={priorityPending} />
</button>
@@ -149,7 +149,7 @@ export function renderLinearIssuePropertiesLayout(
)}
>
<LinearPriorityIcon priority={p} />
{PRIORITY_LABELS[p]}
{getLinearPriorityLabel(p)}
</button>
))}
</PopoverContent>
@@ -2,19 +2,12 @@ import React from 'react'
import { cn } from '@/lib/utils'
import { translate } from '@/i18n/i18n'
import { getLinearPriorityLabel } from '@/components/task-page/task-page-localized-options'
// Use Linear’s brand priority fills instead of generic Orca state colors.
const LINEAR_PRIORITY_URGENT_FILL = 'lch(66 80 48)'
const LINEAR_PRIORITY_BAR_FILL = 'lch(39.576 1.25 282)'
const LINEAR_PRIORITY_ICON_LABELS: Record<number, string> = {
0: 'No priority',
1: 'Urgent',
2: 'High',
3: 'Medium',
4: 'Low'
}
function getLinearPriorityBarCount(priority: number): number {
if (priority === 2) {
return 3
@@ -29,7 +22,7 @@ function getLinearPriorityBarCount(priority: number): number {
}
export function getLinearPriorityIconLabel(priority: number): string {
return LINEAR_PRIORITY_ICON_LABELS[priority] ?? `P${priority}`
return getLinearPriorityLabel(priority)
}
export function LinearPriorityIcon({
@@ -53,7 +46,9 @@ export function LinearPriorityIcon({
>
<span aria-hidden="true">!</span>
<span className="sr-only">
{translate('auto.components.linear.priority.icon.c43d3e065b', 'Priority:')} {label}
{translate('auto.components.linear.priority.icon.priorityValue', 'Priority: {{label}}', {
label
})}
</span>
</span>
)
@@ -70,7 +65,9 @@ export function LinearPriorityIcon({
className="size-3 rounded-full border border-muted-foreground/55"
/>
<span className="sr-only">
{translate('auto.components.linear.priority.icon.c43d3e065b', 'Priority:')} {label}
{translate('auto.components.linear.priority.icon.priorityValue', 'Priority: {{label}}', {
label
})}
</span>
</span>
)
@@ -107,7 +104,9 @@ export function LinearPriorityIcon({
})}
</svg>
<span className="sr-only">
{translate('auto.components.linear.priority.icon.c43d3e065b', 'Priority:')} {label}
{translate('auto.components.linear.priority.icon.priorityValue', 'Priority: {{label}}', {
label
})}
</span>
</span>
)
@@ -8,7 +8,9 @@ import type {
LinearProjectSummary
} from '../../../shared/linear/project-types'
import {
linearProjectBacklogLabel,
linearProjectDateLabel,
linearProjectNoneLabel,
linearProjectMetadataLabels,
linearProjectPriorityLabel,
linearProjectProgressPercent,
@@ -95,11 +97,17 @@ export function LinearProjectOverviewContent({
<Progress value={Math.max(0, Math.min(100, progress))} />
{typeof presentation.scope === 'number' ? (
<div className="mt-2 text-xs text-muted-foreground">
{presentation.scope}{' '}
{translate(
'auto.components.linear.project.view.surfaces.3ad562bdf4',
'scoped issues'
)}
{presentation.scope === 1
? translate(
'auto.components.linear.project.view.surfaces.scopedIssueCount_one',
'{{count}} scoped issue',
{ count: presentation.scope }
)
: translate(
'auto.components.linear.project.view.surfaces.scopedIssueCount_other',
'{{count}} scoped issues',
{ count: presentation.scope }
)}
</div>
) : null}
</section>
@@ -143,11 +151,11 @@ export function LinearProjectOverviewContent({
<aside className="min-w-0 space-y-3">
<LinearProjectPropertyRow
label={translate('auto.components.linear.project.view.surfaces.9ddb58edbd', 'Status')}
value={linearProjectUnknownText(presentation.status) ?? 'Backlog'}
value={linearProjectUnknownText(presentation.status) ?? linearProjectBacklogLabel()}
/>
<LinearProjectPropertyRow
label={translate('auto.components.linear.project.view.surfaces.f5ef24cf46', 'Health')}
value={linearProjectUnknownText(presentation.health) ?? 'None'}
value={linearProjectUnknownText(presentation.health) ?? linearProjectNoneLabel()}
/>
<LinearProjectPropertyRow
label={translate(
@@ -1,3 +1,4 @@
import { getIntlLocale, translate } from '@/i18n/i18n'
import type {
LinearProjectDetail,
LinearProjectSummary
@@ -35,10 +36,10 @@ export function linearProjectUnknownText(value: unknown): string | null {
export function linearProjectDateLabel(value: string | null | undefined): string {
if (!value) {
return 'None'
return linearProjectNoneLabel()
}
const date = new Date(value)
return Number.isNaN(date.getTime()) ? value : date.toLocaleDateString()
return Number.isNaN(date.getTime()) ? value : date.toLocaleDateString(getIntlLocale())
}
export function linearProjectPriorityLabel(priority: unknown, fallback: unknown): string {
@@ -47,9 +48,17 @@ export function linearProjectPriorityLabel(priority: unknown, fallback: unknown)
return fromFallback
}
if (typeof priority === 'number') {
return priority === 0 ? 'None' : `P${priority}`
return priority === 0 ? linearProjectNoneLabel() : `P${priority}`
}
return linearProjectUnknownText(priority) ?? 'None'
return linearProjectUnknownText(priority) ?? linearProjectNoneLabel()
}
export function linearProjectNoneLabel(): string {
return translate('auto.components.linear.project.view.surfaces.8bbecb2510', 'None')
}
export function linearProjectBacklogLabel(): string {
return translate('auto.components.linear.project.view.surfaces.backlog', 'Backlog')
}
export function linearProjectProgressPercent(project: LinearProjectPresentation): number | null {
@@ -8,6 +8,7 @@ import { translate } from '@/i18n/i18n'
import { cn } from '@/lib/utils'
import type { LinearProjectSummary } from '../../../shared/linear/project-types'
import {
linearProjectBacklogLabel,
linearProjectDateLabel,
linearProjectMetadataLabels,
linearProjectPriorityLabel,
@@ -47,7 +48,7 @@ function LinearProjectStatusBadge({
}: {
project: LinearProjectPresentation
}): React.JSX.Element {
const label = linearProjectUnknownText(project.status) ?? 'Backlog'
const label = linearProjectUnknownText(project.status) ?? linearProjectBacklogLabel()
return (
<Badge variant="outline" className="max-w-full truncate text-[11px] font-medium">
{label}
@@ -105,16 +105,19 @@ function summarizeTeamKeys(
options: { activeAllWorkspaces: boolean; multipleWorkspaces: boolean }
): string {
const selectedTeams = teams.filter((team) => selectedTeamIds.has(team.id))
if (selectedTeams.length === 0) {
return 'All teams'
}
if (options.activeAllWorkspaces && options.multipleWorkspaces) {
const workspaceIds = new Set(selectedTeams.map((team) => team.workspaceId ?? ''))
const keys = selectedTeams.map((team) => team.key)
const keyCount = new Set(keys).size
if (workspaceIds.size > 1 || keyCount < keys.length) {
return `${selectedTeams.length} team${selectedTeams.length === 1 ? '' : 's'}`
return selectedTeams.length === 1
? translate('auto.components.linear.scope.selector.teamCount_one', '{{count}} team', {
count: selectedTeams.length
})
: translate('auto.components.linear.scope.selector.teamCount_other', '{{count}} teams', {
count: selectedTeams.length
})
}
}
@@ -138,19 +141,23 @@ export function getLinearScopeTriggerLabel({
: null
const allVisibleTeamsSelected =
teams.length > 0 && teams.every((team) => selectedTeamIds.has(team.id))
const teamLabel =
teamSelectionIsStickyAll || selectedTeamIds.size === 0 || allVisibleTeamsSelected
? 'All teams'
: summarizeTeamKeys(teams, selectedTeamIds, {
activeAllWorkspaces,
multipleWorkspaces
})
const allTeams =
teamSelectionIsStickyAll ||
allVisibleTeamsSelected ||
!teams.some((team) => selectedTeamIds.has(team.id))
const teamLabel = allTeams
? translate('auto.components.linear.scope.selector.7783361266', 'All teams')
: summarizeTeamKeys(teams, selectedTeamIds, { activeAllWorkspaces, multipleWorkspaces })
if (!multipleWorkspaces) {
return teamLabel
}
if (activeAllWorkspaces) {
return teamLabel === 'All teams' ? 'All workspaces' : `All workspaces / ${teamLabel}`
const allWorkspaces = translate(
'auto.components.linear.scope.selector.a14ce4df2b',
'All workspaces'
)
return allTeams ? allWorkspaces : `${allWorkspaces} / ${teamLabel}`
}
return `${selectedWorkspace?.organizationName ?? 'Linear'} / ${teamLabel}`
}
@@ -11,37 +11,43 @@ export type RestartContinuationOutcome = {
function continuedCountText(count: number): string {
return count === 1
? translate('auto.components.NativeChatResumeOnRestartModal.continuedOne', 'Resumed 1 chat')
? translate(
'auto.components.NativeChatResumeOnRestartModal.continuedCount_one',
'Resumed {{count}} chat',
{ count }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.continuedMany',
'Resumed {{value0}} chats',
{ value0: count }
'auto.components.NativeChatResumeOnRestartModal.continuedCount_other',
'Resumed {{count}} chats',
{ count }
)
}
function refusedCountText(count: number): string {
return count === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.notContinuedOne',
'1 chat couldn’t be resumed'
'auto.components.NativeChatResumeOnRestartModal.notContinuedCount_one',
'{{count}} chat couldn’t be resumed',
{ count }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.notContinuedMany',
'{{value0}} chats couldn’t be resumed',
{ value0: count }
'auto.components.NativeChatResumeOnRestartModal.notContinuedCount_other',
'{{count}} chats couldn’t be resumed',
{ count }
)
}
function unconfirmedCountText(count: number): string {
return count === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.notConfirmedOne',
'Couldn’t confirm 1 chat was resumed'
'auto.components.NativeChatResumeOnRestartModal.notConfirmedCount_one',
'Couldn’t confirm {{count}} chat was resumed',
{ count }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.notConfirmedMany',
'Couldn’t confirm {{value0}} chats were resumed',
{ value0: count }
'auto.components.NativeChatResumeOnRestartModal.notConfirmedCount_other',
'Couldn’t confirm {{count}} chats were resumed',
{ count }
)
}
@@ -49,13 +55,14 @@ function unconfirmedCountText(count: number): string {
function otherUnconfirmedCountText(count: number): string {
return count === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.notConfirmedOtherOne',
'Couldn’t confirm 1 other chat was resumed'
'auto.components.NativeChatResumeOnRestartModal.notConfirmedOtherCount_one',
'Couldn’t confirm {{count}} other chat was resumed',
{ count }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.notConfirmedOtherMany',
'Couldn’t confirm {{value0}} other chats were resumed',
{ value0: count }
'auto.components.NativeChatResumeOnRestartModal.notConfirmedOtherCount_other',
'Couldn’t confirm {{count}} other chats were resumed',
{ count }
)
}
@@ -59,11 +59,17 @@ export function resumeActivityLabel(
)
} else if (agents.length > 1) {
parts.push(
translate(
'auto.components.NativeChatResumeOnRestartModal.activitySubagentMany',
'{{value0}} subagents running',
{ value0: agents.length }
)
agents.length === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.activitySubagentCount_one',
'{{count}} subagent running',
{ count: agents.length }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.activitySubagentCount_other',
'{{count}} subagents running',
{ count: agents.length }
)
)
}
if (watches.length === 1 && onlyWatch) {
@@ -76,11 +82,17 @@ export function resumeActivityLabel(
)
} else if (watches.length > 1) {
parts.push(
translate(
'auto.components.NativeChatResumeOnRestartModal.activityMonitorMany',
'Monitoring {{value0}} background tasks',
{ value0: watches.length }
)
watches.length === 1
? translate(
'auto.components.NativeChatResumeOnRestartModal.activityMonitorCount_one',
'Monitoring {{count}} background task',
{ count: watches.length }
)
: translate(
'auto.components.NativeChatResumeOnRestartModal.activityMonitorCount_other',
'Monitoring {{count}} background tasks',
{ count: watches.length }
)
)
}
if (parts.length === 0) {
@@ -57,6 +57,6 @@ describe('getCheckCounts', () => {
pending: 0,
neutral: 1
})
expect(getChecksSummaryLabel(checks)).toBe('0 of 1 checks passing')
expect(getChecksSummaryLabel(checks)).toBe('0 of 1 check passing')
})
})
+38 -6
View File
@@ -90,20 +90,52 @@ export function getCheckCountChips(counts: PRCheckCounts): PRCheckCountChip[] {
export function getChecksSummaryLabel(checks: readonly PRCheckDetail[]): string {
const counts = getCheckCounts(checks)
if (checks.length === 0) {
return 'No checks found'
return translate('auto.components.prCheckCounts.noChecksFound', 'No checks found')
}
if (counts.failing > 0) {
return `${counts.failing} ${counts.failing === 1 ? 'check' : 'checks'} failing`
return counts.failing === 1
? translate('auto.components.prCheckCounts.checksFailing_one', '{{count}} check failing', {
count: counts.failing
})
: translate('auto.components.prCheckCounts.checksFailing_other', '{{count}} checks failing', {
count: counts.failing
})
}
// Why: action_required (e.g. workflow awaiting approval) blocks merge but isn't a failure, so surface it distinctly.
if (counts.needsAction > 0) {
return `${counts.needsAction} ${counts.needsAction === 1 ? 'check needs' : 'checks need'} action`
return counts.needsAction === 1
? translate(
'auto.components.prCheckCounts.checksNeedAction_one',
'{{count}} check needs action',
{ count: counts.needsAction }
)
: translate(
'auto.components.prCheckCounts.checksNeedAction_other',
'{{count}} checks need action',
{ count: counts.needsAction }
)
}
if (counts.pending > 0) {
return `${counts.pending} ${counts.pending === 1 ? 'check' : 'checks'} pending`
return counts.pending === 1
? translate('auto.components.prCheckCounts.checksPending_one', '{{count}} check pending', {
count: counts.pending
})
: translate('auto.components.prCheckCounts.checksPending_other', '{{count}} checks pending', {
count: counts.pending
})
}
if (counts.passing === checks.length) {
return 'All checks passing'
return translate('auto.components.prCheckCounts.allChecksPassing', 'All checks passing')
}
return `${counts.passing} of ${checks.length} checks passing`
return checks.length === 1
? translate(
'auto.components.prCheckCounts.checksPassingOfTotal_one',
'{{passing}} of {{count}} check passing',
{ count: checks.length, passing: counts.passing }
)
: translate(
'auto.components.prCheckCounts.checksPassingOfTotal_other',
'{{passing}} of {{count}} checks passing',
{ count: checks.length, passing: counts.passing }
)
}
@@ -0,0 +1,11 @@
import { translate } from '@/i18n/i18n'
export function projectHostCountLabel(count: number): string {
return count === 1
? translate('auto.components.task.project.source.combobox.hostCount_one', '{{count}} host', {
count
})
: translate('auto.components.task.project.source.combobox.hostCount_other', '{{count}} hosts', {
count
})
}
@@ -19,6 +19,7 @@ import {
captureFileExplorerOperationGuard,
getFileExplorerOperationOwner
} from './right-sidebar/file-explorer-operation-owner'
import { translate } from '@/i18n/i18n'
export async function openQuickOpenFile(
selectedPath: string,
@@ -66,7 +67,7 @@ export async function openQuickOpenFile(
const literalStats = await statUserOpenedPath(context, literalPath)
assertCurrent()
if (literalStats.isDirectory) {
throw new Error('Choose a file rather than a directory.')
throw new Error(chooseFileNotDirectoryMessage())
}
filePath = literalPath
relativePath = literalStats.escapesWorktree
@@ -122,7 +123,12 @@ export async function openQuickOpenFile(
!resolved.absolutePath ||
resolved.relativePath === null
) {
throw new Error('The host could not open this file path.')
throw new Error(
translate(
'auto.components.QuickOpen.hostCouldNotOpenPath',
'The host could not open this file path.'
)
)
} else {
filePath = resolved.absolutePath
relativePath = resolved.relativePath
@@ -134,7 +140,7 @@ export async function openQuickOpenFile(
relativePath = filePath
}
if (stats.isDirectory) {
throw new Error('Choose a file rather than a directory.')
throw new Error(chooseFileNotDirectoryMessage())
}
}
assertCurrent()
@@ -166,3 +172,10 @@ export async function openQuickOpenFile(
)
}
}
function chooseFileNotDirectoryMessage(): string {
return translate(
'auto.components.QuickOpen.chooseFileNotDirectory',
'Choose a file rather than a directory.'
)
}
@@ -241,8 +241,8 @@ function getCopy(kind: DaemonActionKind): DaemonActionCopy {
)}
</>
),
confirmLabel: 'Restart',
busyLabel: 'Restarting…'
confirmLabel: translate('auto.components.shared.useDaemonActions.confirmRestart', 'Restart'),
busyLabel: translate('auto.components.shared.useDaemonActions.busyRestarting', 'Restarting…')
}
}
return {
@@ -258,8 +258,11 @@ function getCopy(kind: DaemonActionKind): DaemonActionCopy {
)}
</>
),
confirmLabel: 'Kill all sessions',
busyLabel: 'Killing…'
confirmLabel: translate(
'auto.components.shared.useDaemonActions.confirmKillAll',
'Kill all sessions'
),
busyLabel: translate('auto.components.shared.useDaemonActions.busyKilling', 'Killing…')
}
}
@@ -11,7 +11,8 @@ import {
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { getWorktreeSymlinkPathFilterState } from '@/components/settings/worktree-symlink-path-filter'
import { joinPath } from '@/lib/path'
import { translate } from '@/i18n/i18n'
import { Trans } from 'react-i18next'
import { i18n, translate } from '@/i18n/i18n'
import {
getSparseBrowseTrail,
joinSparseBrowsePath,
@@ -185,10 +186,17 @@ export function SparseDirectoryPicker({
>
<Plus className="size-4 shrink-0 text-muted-foreground" />
<span className="truncate text-xs">
{translate('sparsePreset.addTypedPath', 'Add')}{' '}
<code className="rounded bg-muted px-1 py-0.5 font-mono text-[11px]">
{queryTrimmed}
</code>
<Trans
i18n={i18n}
defaults={translate('sparsePreset.addTypedPathCode', 'Add <path/>')}
components={{
path: (
<code className="rounded bg-muted px-1 py-0.5 font-mono text-[11px]">
{queryTrimmed}
</code>
)
}}
/>
</span>
</CommandItem>
)
@@ -121,7 +121,13 @@ export function TaskPageJiraBoardView({
? {
...current,
selected: transition,
error: error instanceof Error ? error.message : 'Failed to change status.'
error:
error instanceof Error
? error.message
: translate(
'auto.components.taskPageJiraBoard.changeStatusFailed',
'Failed to change status.'
)
}
: null
)
@@ -199,7 +205,13 @@ export function TaskPageJiraBoardView({
selected: null,
transitions: [],
loading: false,
error: error instanceof Error ? error.message : 'Failed to load status changes.'
error:
error instanceof Error
? error.message
: translate(
'auto.components.jiraIssue.loadStatusChangesFailed',
'Failed to load status changes.'
)
})
}
}
@@ -3,6 +3,7 @@ import type { LinkedJiraIssueRef } from '@/lib/jira-issue-workspace-attachment'
import type { TaskSourceContext } from '../../../shared/task-source-context'
import { readLinkedTaskIssuesWithLimit } from './read-linked-task-issues'
import { createTaskPageJiraLoadFailureState } from './task-page-jira-load-state'
import { translate } from '@/i18n/i18n'
export async function readLinkedJiraIssues(
refs: readonly LinkedJiraIssueRef[],
@@ -40,7 +41,10 @@ export async function readLinkedJiraIssues(
(results.some((result) => !result?.issue)
? createTaskPageJiraLoadFailureState(
new Error(
'Some Jira issues linked to workspaces could not be loaded. Refresh to try again.'
translate(
'auto.components.taskPageJiraLinkedIssues.someIssuesFailed',
'Some Jira issues linked to workspaces could not be loaded. Refresh to try again.'
)
)
).error
: null),
@@ -1,5 +1,6 @@
import type { JiraIssue } from '../../../shared/jira/jira-types'
import { parseJiraStatusError } from '../../../shared/jira/jira-status-error'
import { translate } from '@/i18n/i18n'
export type TaskPageJiraLoadError = {
title: string
@@ -12,7 +13,12 @@ export type TaskPageJiraLoadFailureState = {
}
function getErrorMessage(error: unknown): string {
return error instanceof Error ? error.message : 'Failed to load Jira issues.'
return error instanceof Error
? error.message
: translate(
'auto.components.taskPageJiraLoadState.failedToLoadIssues',
'Failed to load Jira issues.'
)
}
function inferErrorCode(message: string): number | null {
@@ -33,24 +39,45 @@ function inferErrorCode(message: string): number | null {
function getIssueSearchErrorSummary(message: string, code: number | null): string {
if (code === 401) {
return 'Jira authentication failed. Reconnect Jira in Settings, then try again.'
return translate(
'auto.components.taskPageJiraLoadState.authFailed',
'Jira authentication failed. Reconnect Jira in Settings, then try again.'
)
}
if (code === 403) {
return 'Jira denied access to this issue search. Check project permissions or try a different JQL query.'
return translate(
'auto.components.taskPageJiraLoadState.accessDenied',
'Jira denied access to this issue search. Check project permissions or try a different JQL query.'
)
}
if (code === 429) {
return 'Jira rate-limited this issue search. Try again in a moment.'
return translate(
'auto.components.taskPageJiraLoadState.rateLimited',
'Jira rate-limited this issue search. Try again in a moment.'
)
}
if (code !== null && code >= 500) {
return 'Jira had a server error while loading issues. Try again in a moment.'
return translate(
'auto.components.taskPageJiraLoadState.serverError',
'Jira had a server error while loading issues. Try again in a moment.'
)
}
if (/\bjql\b|\bsyntax\b/i.test(message)) {
return "Jira couldn't run this JQL query. Check the syntax and try again."
return translate(
'auto.components.taskPageJiraLoadState.jqlFailed',
"Jira couldn't run this JQL query. Check the syntax and try again."
)
}
if (/\bnetwork\b|\bfetch failed\b|\btimed? ?out\b|\beconn/i.test(message)) {
return "Couldn't reach Jira. Check your connection and try again."
return translate(
'auto.components.taskPageJiraLoadState.unreachable',
"Couldn't reach Jira. Check your connection and try again."
)
}
return "Couldn't load Jira issues. Try again in a moment."
return translate(
'auto.components.taskPageJiraLoadState.loadFailed',
"Couldn't load Jira issues. Try again in a moment."
)
}
/** Jira's reason when it rejected the request as malformed (HTTP 400); null for other failures. */
@@ -67,7 +94,14 @@ export function createTaskPageJiraLoadFailureState(error: unknown): TaskPageJira
return {
issues: [],
error: {
title: code === null ? summary : `Error ${code}: ${summary}`,
title:
code === null
? summary
: translate(
'auto.components.taskPageJiraLoadState.errorWithCode',
'Error {{code}}: {{summary}}',
{ code, summary }
),
details: (status?.details ?? message).trim() || null
}
}
@@ -1,6 +1,7 @@
import type { TaskPageComposerActionsModel } from './use-task-page-composer-actions'
import PullRequestPage from '@/components/PullRequestPage'
import GitHubItemDialog from '@/components/GitHubItemDialog'
import { translate } from '@/i18n/i18n'
import ProjectViewWrapper from '@/components/github-project/ProjectViewWrapper'
import { TaskPageGitHubList } from './github/List'
import { TaskPageGitLabTodoList } from './gitlab/TodoList'
@@ -34,7 +35,7 @@ export function TaskPageContent({
repoPath={dialogRepoPath}
repoId={dialogWorkItem.repoId}
sourceContext={dialogSourceContext}
backLabel="Pull requests"
backLabel={translate('auto.components.TaskPage.backToPullRequests', 'Pull requests')}
onUse={(item) => {
setDialogWorkItem(null)
handleUseWorkItem(item)
@@ -49,7 +50,7 @@ export function TaskPageContent({
repoPath={dialogRepoPath}
repoId={dialogWorkItem.repoId}
sourceContext={dialogSourceContext}
backLabel="GitHub list"
backLabel={translate('auto.components.TaskPage.backToGitHubList', 'GitHub list')}
onUse={(item) => {
setDialogWorkItem(null)
handleUseWorkItem(item)
@@ -146,7 +146,12 @@ export function GHAssigneesCell({
}
return res
}
throw new Error('No GitHub repository context available for this issue.')
throw new Error(
translate(
'auto.components.TaskPage.noGitHubRepositoryContext',
'No GitHub repository context available for this issue.'
)
)
}
})
} finally {
@@ -87,11 +87,17 @@ export function TaskPageGitHubIssueDialog({
const issuesSlug = entry?.sources?.issues
? `${entry.sources.issues.owner}/${entry.sources.issues.repo}`
: null
const fallback = newIssueTargetRepo?.displayName ?? 'this repository'
const target = issuesSlug ?? newIssueTargetRepo?.displayName
return (
<DialogDescription>
{translate('auto.components.TaskPage.9f2b4c03a6', 'Filing in')}
{issuesSlug ?? fallback}
{target
? translate('auto.components.TaskPage.filingInTarget', 'Filing in {{target}}', {
target
})
: translate(
'auto.components.TaskPage.filingInThisRepository',
'Filing in this repository'
)}
</DialogDescription>
)
})()}
@@ -211,7 +217,9 @@ export function TaskPageGitHubIssueDialog({
/>
</div>
<p className="text-[10px] text-muted-foreground">
{submitShortcutLabel} {translate('auto.components.TaskPage.fc0d8a1fa4', 'to submit.')}
{translate('auto.components.TaskPage.shortcutToSubmit', '{{shortcut}} to submit.', {
shortcut: submitShortcutLabel
})}
</p>
</div>
<DialogFooter>
@@ -136,9 +136,17 @@ export function TaskPageGitHubList({
{!tasksError && !githubUnavailable && failedCount > 0 ? (
// Why: per-repo partial-failure signal, distinct from a hard IPC reject (tasksError); the two are mutually exclusive.
<div className="border-b border-border/50 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-200">
{failedCount} {translate('auto.components.TaskPage.7762f4b03a', 'of')}{' '}
{selectedRepos.length}{' '}
{translate('auto.components.TaskPage.d1766fd62d', 'projects failed to load')}
{selectedRepos.length === 1
? translate(
'auto.components.TaskPage.projectsFailedToLoad_one',
'{{failed}} of {{count}} project failed to load',
{ failed: failedCount, count: selectedRepos.length }
)
: translate(
'auto.components.TaskPage.projectsFailedToLoad_other',
'{{failed}} of {{count}} projects failed to load',
{ failed: failedCount, count: selectedRepos.length }
)}
</div>
) : null}
@@ -82,7 +82,23 @@ export function TaskPageGitHubRows({
<span
// Avoid a pill fill that would stack with the row hover tint.
className="inline-flex items-center gap-1 rounded-md border border-border/40 px-1.5 py-0.5 text-muted-foreground"
aria-label={`${item.type === 'pr' ? (isTaskPageGitHubDraftPR(item) ? 'Draft pull request' : 'Pull request') : 'Issue'} #${item.number}`}
aria-label={
item.type === 'pr'
? isTaskPageGitHubDraftPR(item)
? translate(
'auto.components.TaskPage.draftPullRequestNumber',
'Draft pull request #{{number}}',
{ number: item.number }
)
: translate(
'auto.components.TaskPage.pullRequestNumber',
'Pull request #{{number}}',
{ number: item.number }
)
: translate('auto.components.TaskPage.issueNumber', 'Issue #{{number}}', {
number: item.number
})
}
>
{item.type === 'pr' ? (
isTaskPageGitHubDraftPR(item) ? (
@@ -165,7 +165,12 @@ export function GHStatusCell({
})
}
if (!repo) {
throw new Error('No GitHub repository context available for this issue.')
throw new Error(
translate(
'auto.components.TaskPage.noGitHubRepositoryContext',
'No GitHub repository context available for this issue.'
)
)
}
const runtimeRepoId =
sourceContext?.provider === 'github' ? (sourceContext.repoId ?? repo.id) : repo.id
@@ -22,6 +22,7 @@ import {
shouldResetTaskPagePaginationAfterLandingRefresh,
reconcileTaskPagePagesAfterLandingRefresh
} from '@/components/task-page/task-page-cache-selectors'
import { translate } from '@/i18n/i18n'
export function runTaskPageGitHubLandingRefresh(model: TaskPageGitHubSearchPaginationModel) {
const {
fetchWorkItemsAcrossRepos,
@@ -356,7 +357,14 @@ export function runTaskPageGitHubLandingRefresh(model: TaskPageGitHubSearchPagin
if (cancelled) {
return
}
setTasksError(err instanceof Error ? err.message : 'Failed to load GitHub work.')
setTasksError(
err instanceof Error
? err.message
: translate(
'auto.components.TaskPage.loadGitHubWorkFailed',
'Failed to load GitHub work.'
)
)
setFailedCount(0) // the per-repo banner would be misleading next to tasksError
setGithubUnavailable(false)
if (targetPage === 0 || cachedTargetPage) {
@@ -36,7 +36,12 @@ export function TaskPageGitLabFilters({
<div className="flex items-center gap-1 text-xs">
{(['issues', 'mrs', 'todos'] as const).map((view) => {
const active = gitlabView === view
const label = view === 'issues' ? 'Issues' : view === 'mrs' ? 'MRs' : 'My Todos'
const label =
view === 'issues'
? translate('auto.components.TaskPage.gitlabViewIssues', 'Issues')
: view === 'mrs'
? translate('auto.components.TaskPage.gitlabViewMrs', 'MRs')
: translate('auto.components.TaskPage.gitlabViewTodos', 'My Todos')
return (
<button
key={view}
@@ -114,14 +114,19 @@ export function TaskPageGitLabItemList({
event.stopPropagation()
handleUseGitLabItem(item)
}}
aria-label={translate(
'auto.components.TaskPage.5e8061b088',
'Start workspace from {{value0}} {{value1}}',
{
value0: item.type === 'mr' ? 'MR' : 'issue',
value1: item.number
}
)}
aria-label={
item.type === 'mr'
? translate(
'auto.components.TaskPage.startWorkspaceFromMr',
'Start workspace from MR {{number}}',
{ number: item.number }
)
: translate(
'auto.components.TaskPage.startWorkspaceFromIssue',
'Start workspace from issue {{number}}',
{ number: item.number }
)
}
>
<ArrowRight className="size-3.5" />
</Button>
@@ -118,8 +118,13 @@ export function TaskPageJiraContent({
/>
<div className="flex shrink-0 items-center gap-2 text-2xs text-muted-foreground">
<span>
{displayedJiraIssues.length}{' '}
{translate('auto.components.TaskPage.b7bae28b6a', 'shown')}
{displayedJiraIssues.length === 1
? translate('auto.components.TaskPage.shownCount_one', '{{count}} shown', {
count: displayedJiraIssues.length
})
: translate('auto.components.TaskPage.shownCount_other', '{{count}} shown', {
count: displayedJiraIssues.length
})}
</span>
{jiraViewMode === 'list' ? (
<JiraListColumnsMenu ids={jiraColumnIds} onToggle={toggleJiraColumn} />
@@ -352,7 +352,9 @@ export function TaskPageJiraIssueDialog({
</div>
) : null}
<p className="text-[10px] text-muted-foreground">
{submitShortcutLabel} {translate('auto.components.TaskPage.fc0d8a1fa4', 'to submit.')}
{translate('auto.components.TaskPage.shortcutToSubmit', '{{shortcut}} to submit.', {
shortcut: submitShortcutLabel
})}
</p>
</div>
<DialogFooter>
@@ -254,7 +254,10 @@ export function TaskPageLinearIssueAttributes({
const selectedProj = newLinearIssueProjects.find(
(p) => p.id === newLinearIssueProjectId
)
return selectedProj?.name || 'Project'
return (
selectedProj?.name ||
translate('auto.components.TaskPage.linearProjectPlaceholder', 'Project')
)
})()}
</span>
<ChevronDown className="size-3 text-muted-foreground/70" />
@@ -132,7 +132,9 @@ export function TaskPageLinearIssueDialog({
<div className="flex items-center justify-between border-t border-border/60 px-6 py-4 bg-muted/5">
<span className="text-[10px] text-muted-foreground/60 font-medium">
{submitShortcutLabel} {translate('auto.components.TaskPage.fc0d8a1fa4', 'to submit.')}
{translate('auto.components.TaskPage.shortcutToSubmit', '{{shortcut}} to submit.', {
shortcut: submitShortcutLabel
})}
</span>
<div className="flex items-center gap-2">
<Button
@@ -189,7 +189,13 @@ export function TaskPageLinearIssueToolbar({
</DropdownMenuContent>
</DropdownMenu>
<div className="text-[11px] text-muted-foreground">
{pagedLinearIssues.length} {translate('auto.components.TaskPage.b7bae28b6a', 'shown')}
{pagedLinearIssues.length === 1
? translate('auto.components.TaskPage.shownCount_one', '{{count}} shown', {
count: pagedLinearIssues.length
})
: translate('auto.components.TaskPage.shownCount_other', '{{count}} shown', {
count: pagedLinearIssues.length
})}
</div>
</div>
</div>
@@ -360,7 +360,9 @@ export function TaskPageLinearProjectFields({
/>
</div>
<p className="text-[10px] text-muted-foreground">
{submitShortcutLabel} {translate('auto.components.TaskPage.fc0d8a1fa4', 'to submit.')}
{translate('auto.components.TaskPage.shortcutToSubmit', '{{shortcut}} to submit.', {
shortcut: submitShortcutLabel
})}
</p>
</div>
)
@@ -2,13 +2,13 @@ import { translate } from '@/i18n/i18n'
// Callers only pass counts of one or more.
export function linearLabelCountLabel(count: number): string {
return count > 1
? translate('auto.components.TaskPage.labelCountPlural', '{{count}} labels', { count })
: translate('auto.components.TaskPage.labelCountSingular', '{{count}} label', { count })
return count === 1
? translate('auto.components.TaskPage.labelCount_one', '{{count}} label', { count })
: translate('auto.components.TaskPage.labelCount_other', '{{count}} labels', { count })
}
export function linearMemberCountLabel(count: number): string {
return count > 1
? translate('auto.components.TaskPage.memberCountPlural', '{{count}} members', { count })
: translate('auto.components.TaskPage.memberCountSingular', '{{count}} member', { count })
return count === 1
? translate('auto.components.TaskPage.memberCount_one', '{{count}} member', { count })
: translate('auto.components.TaskPage.memberCount_other', '{{count}} members', { count })
}
@@ -52,7 +52,9 @@ export function getLinearIssueGroup(
if (groupBy === 'assignee') {
return {
key: `assignee:${issue.assignee?.id ?? 'unassigned'}`,
label: issue.assignee?.displayName ?? 'Unassigned'
label:
issue.assignee?.displayName ??
translate('auto.components.TaskPage.groupUnassigned', 'Unassigned')
}
}
if (groupBy === 'priority') {
@@ -1,6 +1,7 @@
import type { TaskPageProviderMetadataModel } from '../use-task-page-provider-metadata'
import { useState, useMemo, useEffect } from 'react'
import { LINEAR_ISSUE_LIST_MAX } from '../../../../../shared/linear/issue-read-limits'
import { translate } from '@/i18n/i18n'
import { findTaskPageLinearIssue } from './task-page-linear-cache-selectors'
import type { LinearTeam } from '../../../../../shared/linear/workspace-types'
import {
@@ -84,9 +85,13 @@ export function useTaskPageLinearListSelectionPrelude(model: TaskPageProviderMet
: undefined
const activeLinearIssueHasCollectionError = (activeLinearIssueCollectionErrors?.length ?? 0) > 0
const activeLinearIssueContextLabel = selectedLinearProject
? `Project: ${selectedLinearProject.name}`
? translate('auto.components.TaskPage.linearProjectContext', 'Project: {{name}}', {
name: selectedLinearProject.name
})
: selectedLinearCustomView?.model === 'issue'
? `View: ${selectedLinearCustomView.name}`
? translate('auto.components.TaskPage.linearViewContext', 'View: {{name}}', {
name: selectedLinearCustomView.name
})
: null
const canLoadMorePlainLinearIssues =
!activeLinearIssueContextLabel &&
@@ -1,3 +1,4 @@
import { translate } from '@/i18n/i18n'
import type { GitHubWorkItem } from '../../../../shared/github/work-item-types'
export function formatPRDelta(item: GitHubWorkItem): string | null {
@@ -9,7 +10,15 @@ export function formatPRDelta(item: GitHubWorkItem): string | null {
parts.push(`-${item.deletions}`)
}
if (typeof item.changedFiles === 'number') {
parts.push(`${item.changedFiles} ${item.changedFiles === 1 ? 'file' : 'files'}`)
parts.push(
item.changedFiles === 1
? translate('auto.components.TaskPage.changedFileCount_one', '{{count}} file', {
count: item.changedFiles
})
: translate('auto.components.TaskPage.changedFileCount_other', '{{count}} files', {
count: item.changedFiles
})
)
}
return parts.length > 0 ? parts.join(' ') : null
}
@@ -4,6 +4,7 @@ import { resolveVisibleTaskProvider } from '../../../../shared/task-providers'
import { normalizeGitHubTaskPreset } from '../../../../shared/task-github-search'
import { getTaskPresetQuery } from '../../../../shared/task-preset-query'
import { loadLinearIssueView } from '../linear-issue-view-storage'
import { translate } from '@/i18n/i18n'
export function useTaskPageResumeRestoration(model: TaskPageJiraListStateModel) {
const {
settings,
@@ -149,7 +150,12 @@ export function useTaskPageResumeRestoration(model: TaskPageJiraListStateModel)
setSelectedLinearProject(null)
setSelectedLinearProjectDetail(null)
setLinearProjectParentView(null)
setLinearProjectsError('Saved Linear project was not found.')
setLinearProjectsError(
translate(
'auto.components.TaskPage.resumeRestoration.linearProjectNotFound',
'Saved Linear project was not found.'
)
)
setTaskResumeState({
linearContext: undefined
})
@@ -164,7 +170,12 @@ export function useTaskPageResumeRestoration(model: TaskPageJiraListStateModel)
setSelectedLinearProject(null)
setSelectedLinearProjectDetail(null)
setLinearProjectParentView(null)
setLinearProjectsError('Failed to restore saved Linear project.')
setLinearProjectsError(
translate(
'auto.components.TaskPage.resumeRestoration.linearProjectRestoreFailed',
'Failed to restore saved Linear project.'
)
)
setTaskResumeState({
linearContext: undefined
})
@@ -189,7 +200,12 @@ export function useTaskPageResumeRestoration(model: TaskPageJiraListStateModel)
setLinearCustomViewsLoading(false)
if (!restoredView) {
setSelectedLinearCustomView(null)
setLinearCustomViewsError('Saved Linear view was not found.')
setLinearCustomViewsError(
translate(
'auto.components.TaskPage.resumeRestoration.linearViewNotFound',
'Saved Linear view was not found.'
)
)
setTaskResumeState({
linearContext: undefined
})
@@ -201,7 +217,12 @@ export function useTaskPageResumeRestoration(model: TaskPageJiraListStateModel)
if (!cancelled) {
setSelectedLinearCustomView(null)
setLinearCustomViewsLoading(false)
setLinearCustomViewsError('Failed to restore saved Linear view.')
setLinearCustomViewsError(
translate(
'auto.components.TaskPage.resumeRestoration.linearViewRestoreFailed',
'Failed to restore saved Linear view.'
)
)
setTaskResumeState({
linearContext: undefined
})
@@ -7,6 +7,7 @@ import RepoBadgeLabel from '@/components/repo/RepoBadgeLabel'
import { isRepoSearchQueryTooLarge, searchRepos } from '@/lib/repo-search'
import { cn } from '@/lib/utils'
import { translate } from '@/i18n/i18n'
import { projectHostCountLabel } from './project-host-count-label'
import type { Repo } from '../../../shared/repo-types'
import type { TaskProjectPickerGroup } from './task-page/task-page-default-repo-selection'
import {
@@ -77,13 +78,7 @@ function getProjectDetail(
const selectedSource = getSelectedTaskProjectSource(group, selected)
const hostLabel = showHostLabels ? getRepoHostLabel?.(selectedSource)?.trim() : ''
if (hasMultipleTaskProjectHostsInGroup(group)) {
const hostCount = translate(
'auto.components.task.project.source.combobox.hostCount',
'{{value0}} hosts',
{
value0: String(group.sources.length)
}
)
const hostCount = projectHostCountLabel(group.sources.length)
return hostLabel ? `${hostLabel} · ${hostCount}` : hostCount
}
return hostLabel ? `${hostLabel} · ${selectedSource.path}` : selectedSource.path
@@ -5,6 +5,17 @@ import type { ExecutionHostHealth } from '../../../shared/execution-host-registr
import type { SshConnectionStatus } from '../../../shared/ssh-types'
import type { TaskProvider } from '../../../shared/task-providers'
import type { TaskProviderIdentity, TaskSourceContext } from '../../../shared/task-source-context'
import {
accountTitlePart,
availabilityTitlePart,
formatHostStatus,
getAvailabilityLabel,
getAvailabilityStatusLabel,
hostTitlePart,
projectCountLabel,
selectedProjectCountLabel,
sourceHostCountLabel
} from './task-source-host-status-labels'
export type TaskSourceContextSummary = {
label: string
@@ -79,9 +90,11 @@ export function getTaskSourceAvailabilityNotice(args: {
}
const sourceCount = Math.max(args.sourceCount ?? unavailableHosts.length, unavailableHosts.length)
const blocking = unavailableHosts.length >= sourceCount
const hostStatusLabels = unavailableHosts.map((host) => `${host.hostLabel} ${host.statusLabel}`)
const hostStatusLabels = unavailableHosts.map(formatHostStatus)
const target =
unavailableHosts.length === 1 ? hostStatusLabels[0] : `${unavailableHosts.length} source hosts`
unavailableHosts.length === 1
? hostStatusLabels[0]
: sourceHostCountLabel(unavailableHosts.length)
return {
label: blocking
? translate(
@@ -121,25 +134,31 @@ function getRepoBackedTaskSourceSummary(args: {
)
const accountLabels = uniqueLabels(contexts.map((context) => context.accountLabel))
const repoCount = args.selectedRepoCount ?? contexts.length
const hostLabel = hostLabels.length === 0 ? 'No host' : formatShortList(hostLabels)
const accountLabel = accountLabels.length > 0 ? `Account: ${formatLongList(accountLabels)}` : null
const hostLabel =
hostLabels.length === 0
? translate('auto.components.taskSourceContextSummary.noHost', 'No host')
: formatShortList(hostLabels)
const accountLabel =
accountLabels.length > 0 ? accountTitlePart(formatLongList(accountLabels)) : null
const targetLabel =
accountLabels.length > 1
? formatShortList(accountLabels)
: repoCount > 1
? `${repoCount} projects`
: (identityLabels[0] ?? contexts[0]?.accountLabel ?? 'Selected project')
? projectCountLabel(repoCount)
: (identityLabels[0] ??
contexts[0]?.accountLabel ??
translate('auto.components.taskSourceContextSummary.selectedProject', 'Selected project'))
const titleParts = [
args.providerLabel,
hostLabels.length > 0 ? `Host: ${formatLongList(hostLabels)}` : null,
unavailableHosts.length > 0
? `Availability: ${formatLongList(
unavailableHosts.map((host) => `${host.hostLabel} ${host.statusLabel}`)
)}`
: null,
hostLabels.length > 0 ? hostTitlePart(formatLongList(hostLabels)) : null,
unavailableHosts.length > 0 ? availabilityTitlePart(unavailableHosts) : null,
accountLabel,
identityLabels.length > 0 ? `Source: ${formatLongList(identityLabels)}` : null,
repoCount > 1 ? `${repoCount} selected projects` : null
identityLabels.length > 0
? translate('auto.components.taskSourceContextSummary.sourceTitle', 'Source: {{source}}', {
source: formatLongList(identityLabels)
})
: null,
repoCount > 1 ? selectedProjectCountLabel(repoCount) : null
].filter((part): part is string => Boolean(part))
return {
@@ -159,19 +178,21 @@ export function getAccountBackedTaskSourceSummary(
hostAvailability?: readonly TaskSourceHostAvailability[]
}
): TaskSourceContextSummary {
const target = args.accountLabel?.trim() || 'Current account'
const target =
args.accountLabel?.trim() ||
translate('auto.components.taskSourceContextSummary.currentAccount', 'Current account')
const hostLabel = getHostLabel(args.accountHostId ?? 'local', args.hostLabelById)
const unavailableHosts = getUnavailableHosts(args.hostAvailability ?? [], args.hostLabelById)
const availabilityLabel = getAvailabilityLabel(unavailableHosts)
const titleParts = [
`${providerLabel} source`,
`Host: ${hostLabel}`,
availabilityLabel
? `Availability: ${formatLongList(
unavailableHosts.map((host) => `${host.hostLabel} ${host.statusLabel}`)
)}`
: null,
`Account: ${target}`
translate(
'auto.components.taskSourceContextSummary.providerSourceTitle',
'{{provider}} source',
{ provider: providerLabel }
),
hostTitlePart(hostLabel),
availabilityLabel ? availabilityTitlePart(unavailableHosts) : null,
accountTitlePart(target)
].filter((part): part is string => Boolean(part))
return {
label: [providerLabel, hostLabel, availabilityLabel, target]
@@ -240,70 +261,6 @@ function getUnavailableHosts(
return unavailableHosts
}
function getAvailabilityStatusLabel(availability: TaskSourceHostAvailability): string | null {
switch (availability.reason) {
case undefined:
break
case 'checking-task-source-capability':
return 'checking server capabilities'
case 'missing-task-source-capability':
return 'server update needed for task sources'
case 'missing-provider-auth':
return 'provider auth needed'
case 'unavailable-source-tool':
return 'source tool unavailable'
case 'unsupported-provider':
return 'provider unsupported on this host'
}
if (availability.status) {
return availability.status === 'connected' ? null : getSshStatusLabel(availability.status)
}
switch (availability.health) {
case 'local':
case 'available':
case undefined:
return null
case 'connecting':
return 'connecting'
case 'blocked':
return 'server update needed'
case 'disconnected':
return 'disconnected'
case 'error':
return 'connection issue'
}
}
function getAvailabilityLabel(
unavailableHosts: readonly { hostLabel: string; statusLabel: string }[]
): string | null {
if (unavailableHosts.length === 0) {
return null
}
if (unavailableHosts.length === 1) {
return unavailableHosts[0].statusLabel
}
return `${unavailableHosts.length} unavailable`
}
function getSshStatusLabel(status: SshConnectionStatus): string {
switch (status) {
case 'connected':
return 'connected'
case 'connecting':
case 'deploying-relay':
case 'reconnecting':
return 'connecting'
case 'auth-failed':
return 'auth needed'
case 'reconnection-failed':
case 'error':
return 'connection issue'
case 'disconnected':
return 'disconnected'
}
}
function formatShortList(labels: readonly string[]): string {
if (labels.length <= 2) {
return labels.join(', ')
@@ -0,0 +1,183 @@
import { translate } from '@/i18n/i18n'
import type { SshConnectionStatus } from '../../../shared/ssh-types'
import type { TaskSourceHostAvailability } from './task-source-context-summary'
export function getAvailabilityStatusLabel(
availability: TaskSourceHostAvailability
): string | null {
switch (availability.reason) {
case undefined:
break
case 'checking-task-source-capability':
return translate(
'auto.components.taskSourceContextSummary.statusCheckingCapabilities',
'checking server capabilities'
)
case 'missing-task-source-capability':
return translate(
'auto.components.taskSourceContextSummary.statusServerUpdateForTaskSources',
'server update needed for task sources'
)
case 'missing-provider-auth':
return translate(
'auto.components.taskSourceContextSummary.statusProviderAuthNeeded',
'provider auth needed'
)
case 'unavailable-source-tool':
return translate(
'auto.components.taskSourceContextSummary.statusSourceToolUnavailable',
'source tool unavailable'
)
case 'unsupported-provider':
return translate(
'auto.components.taskSourceContextSummary.statusProviderUnsupported',
'provider unsupported on this host'
)
}
if (availability.status) {
return availability.status === 'connected' ? null : getSshStatusLabel(availability.status)
}
switch (availability.health) {
case 'local':
case 'available':
case undefined:
return null
case 'connecting':
return connectingStatusLabel()
case 'blocked':
return translate(
'auto.components.taskSourceContextSummary.statusServerUpdateNeeded',
'server update needed'
)
case 'disconnected':
return disconnectedStatusLabel()
case 'error':
return connectionIssueStatusLabel()
}
}
function getSshStatusLabel(status: SshConnectionStatus): string {
switch (status) {
case 'connected':
return translate('auto.components.taskSourceContextSummary.statusConnected', 'connected')
case 'connecting':
case 'deploying-relay':
case 'reconnecting':
return connectingStatusLabel()
case 'auth-failed':
return translate('auto.components.taskSourceContextSummary.statusAuthNeeded', 'auth needed')
case 'reconnection-failed':
case 'error':
return connectionIssueStatusLabel()
case 'disconnected':
return disconnectedStatusLabel()
}
}
function connectingStatusLabel(): string {
return translate('auto.components.taskSourceContextSummary.statusConnecting', 'connecting')
}
function connectionIssueStatusLabel(): string {
return translate(
'auto.components.taskSourceContextSummary.statusConnectionIssue',
'connection issue'
)
}
function disconnectedStatusLabel(): string {
return translate('auto.components.taskSourceContextSummary.statusDisconnected', 'disconnected')
}
export function formatHostStatus(host: { hostLabel: string; statusLabel: string }): string {
return translate('auto.components.taskSourceContextSummary.hostStatus', '{{host}} {{status}}', {
host: host.hostLabel,
status: host.statusLabel
})
}
export function hostTitlePart(hosts: string): string {
return translate('auto.components.taskSourceContextSummary.hostTitle', 'Host: {{hosts}}', {
hosts
})
}
export function accountTitlePart(accounts: string): string {
return translate(
'auto.components.taskSourceContextSummary.accountTitle',
'Account: {{accounts}}',
{ accounts }
)
}
export function availabilityTitlePart(
unavailableHosts: readonly { hostLabel: string; statusLabel: string }[]
): string {
return translate(
'auto.components.taskSourceContextSummary.availabilityTitle',
'Availability: {{hosts}}',
{ hosts: unavailableHosts.map(formatHostStatus).join(', ') }
)
}
export function getAvailabilityLabel(
unavailableHosts: readonly { hostLabel: string; statusLabel: string }[]
): string | null {
if (unavailableHosts.length === 0) {
return null
}
if (unavailableHosts.length === 1) {
return unavailableHosts[0].statusLabel
}
return unavailableHosts.length === 1
? translate(
'auto.components.taskSourceContextSummary.unavailableCount_one',
'{{count}} unavailable',
{ count: unavailableHosts.length }
)
: translate(
'auto.components.taskSourceContextSummary.unavailableCount_other',
'{{count}} unavailable',
{ count: unavailableHosts.length }
)
}
export function sourceHostCountLabel(count: number): string {
return count === 1
? translate(
'auto.components.taskSourceContextSummary.sourceHostCount_one',
'{{count}} source host',
{ count }
)
: translate(
'auto.components.taskSourceContextSummary.sourceHostCount_other',
'{{count}} source hosts',
{ count }
)
}
export function projectCountLabel(count: number): string {
return count === 1
? translate('auto.components.taskSourceContextSummary.projectCount_one', '{{count}} project', {
count
})
: translate(
'auto.components.taskSourceContextSummary.projectCount_other',
'{{count}} projects',
{ count }
)
}
export function selectedProjectCountLabel(count: number): string {
return count === 1
? translate(
'auto.components.taskSourceContextSummary.selectedProjectCount_one',
'{{count}} selected project',
{ count }
)
: translate(
'auto.components.taskSourceContextSummary.selectedProjectCount_other',
'{{count}} selected projects',
{ count }
)
}
@@ -67,7 +67,10 @@ export function useJiraIssueCommentSubmission({
id: result.id || createBrowserUuid(),
body: bodyState.body,
createdAt: new Date().toISOString(),
user: { accountId: 'local', displayName: 'You' }
user: {
accountId: 'local',
displayName: translate('auto.components.issueComments.you', 'You')
}
}
optimisticCommentsRef.current.push(comment)
setComments((previous) => [...previous, comment])
@@ -5,6 +5,7 @@ import {
} from '@/runtime/runtime-jira-client'
import type { RuntimeClientTarget } from '../../../shared/runtime-client-target'
import type { JiraComment, JiraIssue, JiraTransition } from '../../../shared/jira/jira-types'
import { translate } from '@/i18n/i18n'
export function useJiraIssueRemoteDetails(
target: RuntimeClientTarget,
@@ -40,7 +41,14 @@ export function useJiraIssueRemoteDetails(
setComments(fetched)
} catch (error) {
if (requestId === requestIdRef.current && readId === commentReadIdRef.current) {
setCommentsError(error instanceof Error ? error.message : 'Failed to load comments.')
setCommentsError(
error instanceof Error
? error.message
: translate(
'auto.components.jiraIssue.loadCommentsFailed',
'Failed to load comments.'
)
)
}
} finally {
if (requestId === requestIdRef.current && readId === commentReadIdRef.current) {
@@ -72,7 +80,12 @@ export function useJiraIssueRemoteDetails(
} catch (error) {
if (requestId === requestIdRef.current && readId === transitionReadIdRef.current) {
setTransitionsError(
error instanceof Error ? error.message : 'Failed to load status changes.'
error instanceof Error
? error.message
: translate(
'auto.components.jiraIssue.loadStatusChangesFailed',
'Failed to load status changes.'
)
)
}
} finally {
@@ -182,22 +182,31 @@ export function WorktreeJumpPaletteSurface({
})} `
: ''}
{controller.deferredQuery.trim()
? translate(
'auto.components.WorktreeJumpPalette.bb72c08e63',
'{{value0}} results found{{value1}}',
{
value0: resultCount,
value1: controller.showCreateAction ? ', create worktree action available' : ''
}
)
: translate(
'auto.components.WorktreeJumpPalette.20af998bff',
'{{value0}} items available{{value1}}',
{
value0: resultCount,
value1: controller.showCreateAction ? ', create worktree action available' : ''
}
)}
? resultCount === 1
? translate(
'auto.components.WorktreeJumpPalette.resultsFound_one',
'{{count}} result found.',
{ count: resultCount }
)
: translate(
'auto.components.WorktreeJumpPalette.resultsFound_other',
'{{count}} results found.',
{ count: resultCount }
)
: resultCount === 1
? translate(
'auto.components.WorktreeJumpPalette.itemsAvailable_one',
'{{count}} item available.',
{ count: resultCount }
)
: translate(
'auto.components.WorktreeJumpPalette.itemsAvailable_other',
'{{count}} items available.',
{ count: resultCount }
)}
{controller.showCreateAction
? ` ${translate('auto.components.WorktreeJumpPalette.createActionAvailable', 'Create worktree action available.')}`
: ''}
</div>
</CommandDialog>
)
+142 -2
View File
@@ -1,4 +1,16 @@
{
"accounts": {
"claude": {
"switchSessions": {
"body_one": "{{count}} Claude session is still running on {{previous}}. Restarting continues the conversation on {{next}}. Busy sessions wait for idle before restarting.",
"body_other": "{{count}} Claude sessions are still running on {{previous}}. Restarting continues each conversation on {{next}}. Busy sessions wait for idle before restarting.",
"restartCount_one": "Restart {{count}} session",
"restartCount_other": "Restart {{count}} sessions",
"reviewBody_one": "{{count}} other Claude session wasn't moved to {{next}}.",
"reviewBody_other": "{{count}} other Claude sessions weren't moved to {{next}}."
}
}
},
"agentLaunch": {
"opencode": {
"invalidConfig": "OpenCode could not apply this model choice to the launch configuration. Check the OpenCode launch configuration and try again, or omit the model choice.",
@@ -9,10 +21,50 @@
"auto": {
"components": {
"NativeChatResumeOnRestartModal": {
"activityMonitorCount_one": "Monitoring {{count}} background task",
"activityMonitorCount_other": "Monitoring {{count}} background tasks",
"activitySubagentCount_one": "{{count}} subagent running",
"activitySubagentCount_other": "{{count}} subagents running",
"continuedCount_one": "Resumed {{count}} chat",
"continuedCount_other": "Resumed {{count}} chats",
"notConfirmedCount_one": "Couldn’t confirm {{count}} chat was resumed",
"notConfirmedCount_other": "Couldn’t confirm {{count}} chats were resumed",
"notConfirmedOtherCount_one": "Couldn’t confirm {{count}} other chat was resumed",
"notConfirmedOtherCount_other": "Couldn’t confirm {{count}} other chats were resumed",
"notContinuedCount_one": "{{count}} chat couldn’t be resumed",
"notContinuedCount_other": "{{count}} chats couldn’t be resumed",
"resumeChats_one": "Resume {{count}} chat",
"resumeChats_other": "Resume {{count}} chats",
"serverResumeHere": "Resume {{count}} chats started here",
"serverResumeHereOne": "Resume 1 chat started here"
"serverResumeHereCount_one": "Resume {{count}} chat started here",
"serverResumeHereCount_other": "Resume {{count}} chats started here"
},
"NativeChatResumeRunPanel": {
"resumedOfTotal_one": "Resumed {{resumed}} of {{count}} chat",
"resumedOfTotal_other": "Resumed {{resumed}} of {{count}} chats",
"resumingCount_one": "Resuming {{count}} chat",
"resumingCount_other": "Resuming {{count}} chats"
},
"QuickOpen": {
"filesFound_one": "{{count}} file found",
"filesFound_other": "{{count}} files found"
},
"TaskPage": {
"changedFileCount_one": "{{count}} file",
"changedFileCount_other": "{{count}} files",
"labelCount_one": "{{count}} label",
"labelCount_other": "{{count}} labels",
"memberCount_one": "{{count}} member",
"memberCount_other": "{{count}} members",
"projectsFailedToLoad_one": "{{failed}} of {{count}} project failed to load",
"projectsFailedToLoad_other": "{{failed}} of {{count}} projects failed to load",
"shownCount_one": "{{count}} shown",
"shownCount_other": "{{count}} shown"
},
"WorktreeJumpPalette": {
"itemsAvailable_one": "{{count}} item available.",
"itemsAvailable_other": "{{count}} items available.",
"resultsFound_one": "{{count}} result found.",
"resultsFound_other": "{{count}} results found."
},
"activity": {
"ActivityThreadContextMenu": {
@@ -25,6 +77,14 @@
}
},
"automations": {
"AutomationDetail": {
"graceHours_one": "{{count}} hour",
"graceHours_other": "{{count}} hours",
"graceMinutes_one": "{{count}} minute",
"graceMinutes_other": "{{count}} minutes",
"usageCoverageRuns_one": "{{known}}/{{count}} run",
"usageCoverageRuns_other": "{{known}}/{{count}} runs"
},
"AutomationRunsDashboard": {
"local": "Local",
"remote": "Remote"
@@ -39,9 +99,31 @@
"AutomationsPage": {
"moveOriginalKept": "Created on {host}, but the original could not be deleted. Remove it on the old host.",
"moveOriginalUnverified": "Created on {host}, but the original deletion could not be verified. Check the old host before retrying.",
"runUsageSummaryTokens_one": "{{cost}} est. · {{tokens}} token",
"runUsageSummaryTokens_other": "{{cost}} est. · {{tokens}} tokens",
"tableLastRun": "Last run",
"tableName": "Name",
"tableProject": "Project"
},
"ExternalAutomationManagers": {
"automationCount_one": "{{count}} automation",
"automationCount_other": "{{count}} automations"
},
"externalScope": {
"uncheckedHostCount_one": "External automation managers on {{count}} host could not be checked.",
"uncheckedHostCount_other": "External automation managers on {{count}} hosts could not be checked."
},
"runHistory": {
"occurrencesCount_one": "{{count}} time",
"occurrencesCount_other": "{{count}} times",
"occurrencesWithLatestCount_one": "{{count}} time, most recently {{date}}",
"occurrencesWithLatestCount_other": "{{count}} times, most recently {{date}}",
"runCountSummary_one": "{{count}} run · {{completed}} completed",
"runCountSummary_other": "{{count}} runs · {{completed}} completed"
},
"usage": {
"tokensAndCost_one": "{{tokens}} token · {{cost}}",
"tokensAndCost_other": "{{tokens}} tokens · {{cost}}"
}
},
"browser-pane": {
@@ -112,6 +194,32 @@
"moreHosts_one": "{{count}} more host. Search by name to find it.",
"moreHosts_other": "{{count}} more hosts. Search by name to find one."
},
"linear": {
"project": {
"view": {
"surfaces": {
"scopedIssueCount_one": "{{count}} scoped issue",
"scopedIssueCount_other": "{{count}} scoped issues"
}
}
},
"scope": {
"selector": {
"teamCount_one": "{{count}} team",
"teamCount_other": "{{count}} teams"
}
}
},
"prCheckCounts": {
"checksFailing_one": "{{count}} check failing",
"checksFailing_other": "{{count}} checks failing",
"checksNeedAction_one": "{{count}} check needs action",
"checksNeedAction_other": "{{count}} checks need action",
"checksPassingOfTotal_one": "{{passing}} of {{count}} check passing",
"checksPassingOfTotal_other": "{{passing}} of {{count}} checks passing",
"checksPending_one": "{{count}} check pending",
"checksPending_other": "{{count}} checks pending"
},
"right": {
"sidebar": {
"AiVaultScanProgressStrip": {
@@ -522,6 +630,26 @@
}
}
},
"task": {
"project": {
"source": {
"combobox": {
"hostCount_one": "{{count}} host",
"hostCount_other": "{{count}} hosts"
}
}
}
},
"taskSourceContextSummary": {
"projectCount_one": "{{count}} project",
"projectCount_other": "{{count}} projects",
"selectedProjectCount_one": "{{count}} selected project",
"selectedProjectCount_other": "{{count}} selected projects",
"sourceHostCount_one": "{{count}} source host",
"sourceHostCount_other": "{{count}} source hosts",
"unavailableCount_one": "{{count}} unavailable",
"unavailableCount_other": "{{count}} unavailable"
},
"terminal": {
"pane": {
"TerminalErrorToast": {
@@ -586,6 +714,12 @@
"waitingForServer": "Reloads when the server starts"
}
},
"browserExtensions": {
"permission": {
"manyOtherSites_one": "Read and change your data on {{hosts}} and {{count}} other site",
"manyOtherSites_other": "Read and change your data on {{hosts}} and {{count}} other sites"
}
},
"components": {
"native-chat": {
"approval": {
@@ -984,6 +1118,12 @@
"subagents_other": "{{count}} subagents"
}
},
"jira": {
"workspace": {
"linkedCount_one": "{{count}} workspace linked to {{key}}",
"linkedCount_other": "{{count}} workspaces linked to {{key}}"
}
},
"localBuild": {
"liveTerminals_one": "{{count}} live terminal will reconnect after restart.",
"liveTerminals_other": "{{count}} live terminals will reconnect after restart."
+321 -88
View File
@@ -2065,14 +2065,11 @@
"69da9a208c": "In Jira öffnen",
"fa132c8aed": "Der Kommentar konnte nicht hinzugefügt werden.",
"ea21952aa3": "Das Jira-Issue konnte nicht aktualisiert werden.",
"6c41a9bcea": "{{value0}} konnte nicht kopiert werden",
"2ff69a3545": "{{value0}} kopiert",
"666cfdd835": "Unbekannt",
"ef21405c6d": "Jira-Issue",
"commentTooLarge": "Der Kommentar ist zu groß, um ihn sicher zu senden."
},
"Landing": {
"76a95f7f47": "Erstellen",
"f9eaa9e12d": "Projekt hinzufügen",
"6ca6ff404e": "ORCA",
"520304a067": "Orca-Logo",
@@ -2088,7 +2085,12 @@
"0d0ace8861": "Stern auf GitHub vergeben",
"ec43b38ba7": "Auf GitHub mit einem Stern markiert",
"157bb5ecbb": "GitHub öffnen",
"preflightDismiss": "Ausblenden"
"preflightDismiss": "Ausblenden",
"moveUpWorkspace": "Vorherigen Arbeitsbereich auswählen",
"moveDownWorkspace": "Nächsten Arbeitsbereich auswählen",
"installGit": "Git installieren",
"installGitHubCli": "GitHub CLI installieren",
"learnMore": "Mehr erfahren"
},
"LinearIssueMarkdownDescriptionEditor": {
"d9c47069ef": "Markdown",
@@ -2119,7 +2121,6 @@
"ad5dec37b7": "Das ausgewählte Issue in der Vorschau anzeigen, bearbeiten und die Arbeit daran starten.",
"c23e79e5c0": "Aktionen",
"b0eac92d85": "Erneut versuchen",
"fabbd3f974": "hat das Issue aktualisiert ·",
"543970c87a": "Aktivität",
"df4c86ed12": "Schließen",
"7a4997d8bb": "Vorschau des Linear-Issues schließen",
@@ -2143,11 +2144,8 @@
"b25e453c9d": "Erstellen des Unter-Issues fehlgeschlagen",
"aeed19d003": "{{value0}} erstellt",
"9a1317cdd3": "Laden des Unter-Issues fehlgeschlagen",
"9bcbaa2737": "{{value0}} konnte nicht kopiert werden",
"7835483c43": "{{value0}} kopiert",
"61f424f8ca": "Linear-Issue",
"ca8778c124": "Unbekannt",
"8a33c85e9c": "Jemand",
"65239a714b": "Linear",
"76ffd3c937": "Nach einem Projekt zum Hinzufügen suchen.",
"c11b4e3cc2": "Keine Projekte gefunden.",
@@ -2158,7 +2156,10 @@
"moreWorkspaceActions": "Weitere Aktionen für den Issue-Arbeitsbereich",
"startNewWorkspace": "Neuen Arbeitsbereich starten",
"workspaceSection": "Arbeitsbereich",
"noWorkspaceYet": "Noch keiner"
"noWorkspaceYet": "Noch keiner",
"issueDescriptionLabel": "Issue-Beschreibung",
"namedUserUpdatedIssue": "{{name}} hat das Issue aktualisiert · {{time}}",
"someoneUpdatedIssue": "Jemand hat das Issue aktualisiert · {{time}}"
},
"LinearItemDrawer": {
"04008e6c46": "Arbeitsbereich aus Issue starten",
@@ -2194,7 +2195,9 @@
"openAttachedWorkspace": "Mit dem Issue verknüpften Arbeitsbereich öffnen",
"openWorkspace": "Arbeitsbereich öffnen",
"moreWorkspaceActions": "Weitere Aktionen für den Issue-Arbeitsbereich",
"startNewWorkspace": "Neuen Arbeitsbereich starten"
"startNewWorkspace": "Neuen Arbeitsbereich starten",
"setEstimate": "Schätzung festlegen",
"estimateValue": "Schätzung {{estimate}}"
},
"NewWorkspaceComposerCard": {
"reuseExistingBranch": "Branch wiederverwenden",
@@ -2256,7 +2259,22 @@
"addSshHostHint": "Einen vorhandenen Rechner über SSH verwenden",
"addRemoteOrcaServer": "Entfernten Orca-Server hinzufügen",
"addRemoteOrcaServerHint": "Eine weitere Orca-Laufzeitumgebung koppeln",
"hostConnectionFailed": "Verbindung fehlgeschlagen"
"hostConnectionFailed": "Verbindung fehlgeschlagen",
"connect": "Verbinden",
"reconnect": "Erneut verbinden",
"setupConfigDefaultTabs": "Standard-Tab-Befehle",
"setupConfigSetupAndDefaultTabs": "Einrichtung und Standard-Tab-Befehle",
"setupConfigSetupScript": "Einrichtungsskript",
"runDefaultTabCommands": "Standard-Tab-Befehle ausführen",
"runSetupAndDefaultTabCommands": "Einrichtung und Standard-Tab-Befehle ausführen",
"runSetupCommand": "Einrichtungsbefehl ausführen",
"askRunDefaultTabCommands": "Standard-Tab-Befehle jetzt ausführen?",
"askRunSetupAndDefaultTabCommands": "Einrichtung und Standard-Tab-Befehle jetzt ausführen?",
"askRunSetup": "Einrichtung jetzt ausführen?",
"runSetupNow": "Einrichtung jetzt ausführen",
"runCommandsNow": "Befehle jetzt ausführen",
"skipForNow": "Vorerst überspringen",
"skipCommands": "Befehle überspringen"
},
"NewWorkspaceComposerModal": {
"createWorktree": "Worktree erstellen",
@@ -2435,9 +2453,12 @@
"9e97f08d0f": "Nach einer Datei zum Öffnen suchen",
"ec31e058f7": "Zu Datei wechseln",
"73b44e7bde": "Installationsbefehl kopieren",
"b227d88520": "{{value0}} Dateien gefunden",
"995be8ea22": "Kopieren",
"cf144856dc": "Kopiert"
"cf144856dc": "Kopiert",
"filesFound_one": "{{count}} Datei gefunden",
"filesFound_other": "{{count}} Dateien gefunden",
"hostCouldNotOpenPath": "Der Host konnte diesen Dateipfad nicht öffnen.",
"chooseFileNotDirectory": "Eine Datei statt eines Verzeichnisses auswählen."
},
"SelectedTextCopyMenu": {
"9b40d7b018": "Kopieren"
@@ -2447,8 +2468,6 @@
"serverBody": "Diese Chats waren aktiv, als Orca auf {{machine}} neu gestartet wurde. Beim Fortsetzen wird jeder Chat an der Stelle wiederhergestellt, an der er unterbrochen wurde, und der Agent wird zum Fortfahren aufgefordert. Der ursprüngliche Prompt wird nicht erneut gesendet.",
"serverDismiss": "Verwerfen",
"serverResumeAll": "Alle {{count}} auf {{machine}} fortsetzen",
"serverResumeHereOne": "1 hier gestarteten Chat fortsetzen",
"serverResumeHere": "{{count}} hier gestartete Chats fortsetzen",
"title": "Unterbrochene Chats fortsetzen?",
"body": "Diese Chats waren aktiv, als Orca geschlossen wurde. Beim Fortsetzen wird jeder Chat mit seinem vollständigen Kontext an der Stelle wiederhergestellt, an der er unterbrochen wurde. Der Agent wird aufgefordert, vor dem Fortfahren seine bisherige Tätigkeit zu prüfen. Der ursprüngliche Prompt wird nicht erneut gesendet.",
"updateBody": "Diese Chats waren aktiv, als Orca ein Update installiert hat. Beim Fortsetzen wird jeder Chat mit seinem vollständigen Kontext an der Stelle wiederhergestellt, an der er unterbrochen wurde. Der Agent wird aufgefordert, vor dem Fortfahren seine bisherige Tätigkeit zu prüfen. Der ursprüngliche Prompt wird nicht erneut gesendet.",
@@ -2457,16 +2476,8 @@
"listLabel": "Chats, die fortgesetzt würden",
"dontAskAgain": "Nicht erneut fragen (automatisch fortsetzen)",
"dontAskAgainHint": "Lässt sich unter Einstellungen → Experimentell → Chat-Oberfläche deaktivieren.",
"continuedOne": "1 Chat fortgesetzt",
"continuedMany": "{{value0}} Chats fortgesetzt",
"selectAgent": "{{value0}}-Chat „{{value1}}“ in {{value2}} fortsetzen",
"dismissAll": "Alle verwerfen",
"notContinuedOne": "1 Chat konnte nicht fortgesetzt werden",
"notContinuedMany": "{{value0}} Chats konnten nicht fortgesetzt werden",
"notConfirmedOne": "Fortsetzen von 1 Chat konnte nicht bestätigt werden",
"notConfirmedMany": "Fortsetzen von {{value0}} Chats konnte nicht bestätigt werden",
"notConfirmedOtherOne": "Es konnte nicht bestätigt werden, dass 1 weiterer Chat fortgesetzt wurde",
"notConfirmedOtherMany": "Fortsetzen von {{value0}} weiteren Chats konnte nicht bestätigt werden",
"viewChats": "Chats anzeigen",
"review": "Prüfen",
"activityUnnamed": "unbenannt",
@@ -2474,9 +2485,7 @@
"activityQuestion": "Wartet auf Antwort: {{value0}}",
"activityMidReply": "Wurde während einer Antwort unterbrochen",
"activitySubagentOne": "Unteragent aktiv: {{value0}}",
"activitySubagentMany": "{{value0}} Unteragenten aktiv",
"activityMonitorOne": "Wird überwacht: {{value0}}",
"activityMonitorMany": "{{value0}} Hintergrundaufgaben werden überwacht",
"selectWorkspace": "Alle Chats in {{value0}} auswählen",
"workspaceSelectedCount": "{{value0}} von {{value1}}",
"selectAll": "Alle Chats auswählen",
@@ -2490,7 +2499,21 @@
"done": "Abschließen",
"resultListLabel": "Chats dieses Fortsetzungsvorgangs",
"resumeChats_one": "{{count}} Chat fortsetzen",
"resumeChats_other": "{{count}} Chats fortsetzen"
"resumeChats_other": "{{count}} Chats fortsetzen",
"serverResumeHereCount_one": "{{count}} hier gestarteten Chat fortsetzen",
"serverResumeHereCount_other": "{{count}} hier gestartete Chats fortsetzen",
"continuedCount_one": "{{count}} Chat fortgesetzt",
"continuedCount_other": "{{count}} Chats fortgesetzt",
"notContinuedCount_one": "{{count}} Chat konnte nicht fortgesetzt werden",
"notContinuedCount_other": "{{count}} Chats konnten nicht fortgesetzt werden",
"notConfirmedCount_one": "Fortsetzung von {{count}} Chat konnte nicht bestätigt werden",
"notConfirmedCount_other": "Fortsetzung von {{count}} Chats konnte nicht bestätigt werden",
"notConfirmedOtherCount_one": "Fortsetzung von {{count}} weiteren Chat konnte nicht bestätigt werden",
"notConfirmedOtherCount_other": "Fortsetzung von {{count}} weiteren Chats konnte nicht bestätigt werden",
"activitySubagentCount_one": "{{count}} Unteragent läuft",
"activitySubagentCount_other": "{{count}} Unteragenten laufen",
"activityMonitorCount_one": "{{count}} Hintergrundaufgabe wird überwacht",
"activityMonitorCount_other": "{{count}} Hintergrundaufgaben werden überwacht"
},
"StarNagCard": {
"30c36231c1": "Orca ist Open Source. Wenn es heute hilfreich war, hilft ein Stern auf GitHub anderen Entwicklern, Orca zu finden.",
@@ -2505,7 +2528,6 @@
"TaskPage": {
"ff69a30681": "Abbrechen",
"8ff6fdc368": "Wird erstellt…",
"fc0d8a1fa4": "zum Absenden.",
"919a20dd5b": "{{value0}} eingeben",
"56cdb413a2": "Durch Kommas getrennte Werte",
"1f0fce91e3": "{{value0}} auswählen",
@@ -2553,11 +2575,9 @@
"bdebffcbfe": "Ein Linear-Projekt für das ausgewählte Team erstellen.",
"1361275ec3": "Neues Linear-Projekt",
"7f3f7b4c18": "Beschreibung (optional, Markdown)",
"9f2b4c03a6": "Erstellen in",
"d3d0998b7d": "Neues GitHub-Issue",
"6244a02f46": "In Linear öffnen",
"606a85c774": "Offen",
"5e8061b088": "Arbeitsbereich aus {{value0}} {{value1}} starten",
"592a55611b": "Weitere Teams auswählen oder aktualisieren; Teamfilter gelten für die aktuell abgerufenen Issues.",
"618107fab3": "Keine abgerufenen Issues entsprechen den ausgewählten Teams",
"903c7af49f": "Keine Linear-Issues gefunden",
@@ -2566,7 +2586,6 @@
"f362667d55": "Aktualisiert",
"b1eaa18ace": "Issue",
"37e7ee311e": "Schlüssel",
"b7bae28b6a": "angezeigt",
"a26a48252e": "Anzeigeeigenschaften",
"5d2d835467": "Sortierung",
"5659da12fc": "Gruppierung",
@@ -2606,8 +2625,6 @@
"054bf695cc": "Entwurf",
"5b6b2af943": "Wird erneut versucht…",
"0c0de0fc0e": "Fehler beim Laden der Issues aus",
"d1766fd62d": "Projekte konnten nicht geladen werden",
"7762f4b03a": "von",
"443f7dd928": "Merge",
"a7396b05c6": "Checks",
"f6fa3c97d0": "Prüfer",
@@ -2789,10 +2806,41 @@
"linearOpenAttachedWorkspace": "Mit {{value0}} verknüpften Arbeitsbereich öffnen",
"linearWorktreesColumn": "Arbeitsbereiche",
"jiraBoardEmptyColumn": "Keine Issues",
"labelCountPlural": "{{count}} Labels",
"labelCountSingular": "{{count}} Label",
"memberCountPlural": "{{count}} Mitglieder",
"memberCountSingular": "{{count}} Mitglied"
"backToPullRequests": "Pull Requests",
"backToGitHubList": "GitHub-Liste",
"noGitHubRepositoryContext": "Für dieses Issue ist kein GitHub-Repository-Kontext verfügbar.",
"filingInTarget": "Wird in {{target}} erstellt",
"filingInThisRepository": "Wird in diesem Repository erstellt",
"shortcutToSubmit": "{{shortcut}} zum Absenden.",
"projectsFailedToLoad_one": "Projekte nicht geladen: {{failed}} von {{count}}",
"projectsFailedToLoad_other": "Projekte nicht geladen: {{failed}} von {{count}}",
"draftPullRequestNumber": "Pull-Request-Entwurf #{{number}}",
"pullRequestNumber": "Pull Request #{{number}}",
"issueNumber": "Issue #{{number}}",
"loadGitHubWorkFailed": "GitHub-Aufgaben konnten nicht geladen werden.",
"gitlabViewIssues": "Issues",
"gitlabViewMrs": "MRs",
"gitlabViewTodos": "Meine Aufgaben",
"startWorkspaceFromMr": "Arbeitsbereich aus MR {{number}} starten",
"startWorkspaceFromIssue": "Arbeitsbereich aus Issue {{number}} starten",
"shownCount_one": "{{count}} angezeigt",
"shownCount_other": "{{count}} angezeigt",
"linearProjectPlaceholder": "Projekt",
"labelCount_one": "{{count}} Label",
"labelCount_other": "{{count}} Labels",
"memberCount_one": "{{count}} Mitglied",
"memberCount_other": "{{count}} Mitglieder",
"groupUnassigned": "Nicht zugewiesen",
"linearProjectContext": "Projekt: {{name}}",
"linearViewContext": "Ansicht: {{name}}",
"changedFileCount_one": "{{count}} Datei",
"changedFileCount_other": "{{count}} Dateien",
"resumeRestoration": {
"linearProjectNotFound": "Gespeichertes Linear-Projekt wurde nicht gefunden.",
"linearProjectRestoreFailed": "Gespeichertes Linear-Projekt konnte nicht wiederhergestellt werden.",
"linearViewNotFound": "Gespeicherte Linear-Ansicht wurde nicht gefunden.",
"linearViewRestoreFailed": "Gespeicherte Linear-Ansicht konnte nicht wiederhergestellt werden."
}
},
"Terminal": {
"73768427cf": "Schließen",
@@ -2867,7 +2915,8 @@
"b1e390250d": "Der Wechsel zum lokalen Build konnte nicht abgeschlossen werden.",
"d29740d175": "Der ausgewählte Build konnte nicht verwendet werden.",
"37d45c9ec1": "Anderen Build auswählen",
"7f1a4c9e02": "Orca wurde über die Paketverwaltung des Systems installiert und muss darüber aktualisiert werden — Orca kann diese Version nicht selbst installieren."
"7f1a4c9e02": "Orca wurde über die Paketverwaltung des Systems installiert und muss darüber aktualisiert werden — Orca kann diese Version nicht selbst installieren.",
"compatibilityModeFailed": "Kompatibilitätsmodus konnte nicht aktiviert werden. {{message}}"
},
"WorktreeJumpPalette": {
"ac037cfac2": "Navigieren",
@@ -2893,8 +2942,6 @@
"d7d496a451": "Browser-Seite existiert nicht mehr",
"50a1d11d5b": "Offene Tabs",
"088d66d980": "Aktionen & Einstellungen",
"20af998bff": "{{value0}} Elemente verfügbar{{value1}}",
"bb72c08e63": "{{value0}} Ergebnisse gefunden{{value1}}",
"34c8fbb46e": "SSH-Host",
"63c2be1914": "SSH-Verbindung getrennt",
"95be6587d3": "Worktree „{{value0}}“ erstellen",
@@ -2911,7 +2958,12 @@
"recentChatsTerminalsHeader": "Zuletzt verwendete Chats & Terminals",
"27f10cca63": "Chats, Terminals, Arbeitsbereiche, Aufgaben, Einstellungen und Aktionen suchen…",
"2770f02910": "Chats, Terminals, Arbeitsbereiche, Aufgaben, Einstellungen und Aktionen suchen",
"lastActiveTime": "Zuletzt vor {{value0}} aktiv"
"lastActiveTime": "Zuletzt vor {{value0}} aktiv",
"resultsFound_one": "{{count}} Ergebnis gefunden.",
"resultsFound_other": "{{count}} Ergebnisse gefunden.",
"itemsAvailable_one": "{{count}} Eintrag verfügbar.",
"itemsAvailable_other": "{{count}} Einträge verfügbar.",
"createActionAvailable": "Aktion zum Erstellen eines Worktrees verfügbar."
},
"github": {
"pr": {
@@ -3213,11 +3265,6 @@
}
}
},
"priority": {
"icon": {
"c43d3e065b": "Priorität:"
}
},
"project": {
"view": {
"surfaces": {
@@ -3236,7 +3283,6 @@
"c8db98b73b": "Ressourcen",
"bb1405eff8": "Meilensteine",
"5d99315fb8": "Planung",
"3ad562bdf4": "berücksichtigte Issues",
"563501f191": "Fortschritt",
"bb5664d456": "Keine Projektbeschreibung.",
"7b147907dc": "Linear",
@@ -3261,7 +3307,10 @@
"df4bd63c1d": "Nicht zugewiesen",
"30402d2c6e": "Suche oder Aktualisierung versuchen.",
"a2f31c4cd6": "Keine Linear-Projekte gefunden",
"c9b6e9f90d": "Linear-Projekte konnten nicht geladen werden"
"c9b6e9f90d": "Linear-Projekte konnten nicht geladen werden",
"scopedIssueCount_one": "{{count}} Issue im ausgewählten Bereich",
"scopedIssueCount_other": "{{count}} Issues im ausgewählten Bereich",
"backlog": "Backlog"
}
}
},
@@ -3274,7 +3323,14 @@
"05baa5ae90": "Arbeitsbereich",
"89f6580dbf": "Teams suchen…",
"b3488fad3c": "Es wurden keine Teams abgerufen. Der Zugriff kann vom Berechtigungsumfang des Schlüssels, der Mitgliedschaft in privaten Teams, archivierten Teams, Berechtigungen oder einem Fehler beim Abrufen abhängen.",
"405b33c378": "Keines der abgerufenen Teams entspricht der Suche."
"405b33c378": "Keines der abgerufenen Teams entspricht der Suche.",
"teamCount_one": "{{count}} Team",
"teamCount_other": "{{count}} Teams"
}
},
"priority": {
"icon": {
"priorityValue": "Priorität: {{label}}"
}
}
},
@@ -6658,7 +6714,11 @@
"c34fb1098d": "Terminal-Tabs geschlossen und Beenden angefordert.",
"d9657ac204": "Beenden der Terminalsitzung angefordert.",
"e8f25bd903": "Terminalbereinigung konnte nicht abgeschlossen werden.",
"a702d4196e": "Dies schließt alle Terminal-Tabs in sämtlichen Arbeitsbereichen und fordert das Beenden ihrer aktuellen Terminalsitzungen an. Nicht gespeicherte Arbeit in Terminals geht verloren. Der Daemon selbst läuft weiter, und neue Terminals können sofort geöffnet werden. Dies kann nicht rückgängig gemacht werden."
"a702d4196e": "Dies schließt alle Terminal-Tabs in sämtlichen Arbeitsbereichen und fordert das Beenden ihrer aktuellen Terminalsitzungen an. Nicht gespeicherte Arbeit in Terminals geht verloren. Der Daemon selbst läuft weiter, und neue Terminals können sofort geöffnet werden. Dies kann nicht rückgängig gemacht werden.",
"confirmRestart": "Neu starten",
"busyRestarting": "Neustart läuft…",
"confirmKillAll": "Alle Sitzungen beenden",
"busyKilling": "Wird beendet…"
},
"MacFolderAccessFixDialog": {
"stepAllow": "Orca unter „Files and Folders“ zulassen",
@@ -14462,11 +14522,11 @@
"a2f68645ac": "GitLab-API-Kontingent aktualisieren",
"2f9c16d6c3": "Orca nutzt REST über die GitLab-CLI.",
"14e144f7a7": "GitLab-API-Kontingent",
"3e2c982cfa": "übrig, Zurücksetzung in",
"ea8ad0bae8": "von",
"0a891e8935": "REST-API",
"953f7c6062": "Dieser GitLab-Host hat keine Header zum Ratenlimit zurückgegeben.",
"budget_scope_prefix": "Geltungsbereich des Kontingents"
"budget_scope_prefix": "Geltungsbereich des Kontingents",
"resetUnknown": "unbekannt",
"remainingOfLimit": "{{remaining}} von {{limit}} übrig, Zurücksetzung in {{reset}}"
}
}
}
@@ -16366,7 +16426,21 @@
"b09b2384fd": "Pausiert",
"eaa02014f8": "Aktiviert",
"29baf8f4c2": "Quelle",
"lastRunFailed": "Die letzte Ausführung ist fehlgeschlagen."
"lastRunFailed": "Die letzte Ausführung ist fehlgeschlagen.",
"noGrace": "Keine Nachholfrist",
"graceMinutes_one": "{{count}} Minute",
"graceMinutes_other": "{{count}} Minuten",
"graceHours_one": "{{count}} Stunde",
"graceHours_other": "{{count}} Stunden",
"usageCoverageRuns_one": "{{known}}/{{count}} Ausführung",
"usageCoverageRuns_other": "{{known}}/{{count}} Ausführungen",
"usageUnavailable": "Nicht verfügbar",
"noRuns": "Keine Ausführungen",
"projectDefault": "Projektstandard",
"reuseLiveSession": "Laufende Sitzung wiederverwenden",
"freshEachRun": "Bei jeder Ausführung neu",
"precheckEnabled": "Aktiviert, {{timeout}}",
"precheckNone": "Keine"
},
"AutomationEditorDialog": {
"fb1896a5e7": "Abbrechen",
@@ -16470,11 +16544,8 @@
"2faecab10b": "Jetzt ausführen",
"13118faadf": "Unbekanntes Projekt",
"73f630b49d": "Abbrechen",
"1b586f0e2b": "auf",
"02a33e3204": "von",
"9adfab2596": "Externe Automatisierung löschen",
"1e2e41392f": "Nicht erneut fragen",
"b264564427": "und ihren Ausführungsverlauf. Arbeitsbereiche aus früheren Ausführungen werden nicht gelöscht.",
"080dcb5fbb": "Automatisierung löschen",
"19a6e30eae": "Automatisierungen aktualisieren",
"77c2778945": "Automatisierungen",
@@ -16509,7 +16580,6 @@
"pendingAutomationRunMissing": "Der Ausführungsverlauf ist nicht mehr verfügbar.",
"paused": "Pausiert",
"missingWorkspace": "Arbeitsbereich fehlt",
"runUsageSummary": "{{cost}} geschätzt · {{tokens}} Token",
"usageUnavailable": "Nutzungsdaten nicht verfügbar",
"noRunUsageYet": "Noch keine Nutzungsdaten zu Ausführungen",
"noWorkspace": "Kein Arbeitsbereich",
@@ -16524,7 +16594,11 @@
"rowActions": "Automatisierungsaktionen",
"tableLastRun": "Letzte Ausführung",
"ownerChanged": "Der Host dieser Automatisierung hat sich geändert. Aktualisieren und erneut versuchen.",
"runError": "Fehler:"
"runError": "Fehler:",
"deleteAutomationDescription": "<name/> und den Ausführungsverlauf löschen. Arbeitsbereiche aus früheren Ausführungen werden nicht gelöscht.",
"deleteExternalAutomationDescription": "<name/> aus <provider/> auf <host/> löschen.",
"runUsageSummaryTokens_one": "ca. {{cost}} · {{tokens}} Token",
"runUsageSummaryTokens_other": "ca. {{cost}} · {{tokens}} Tokens"
},
"AutomationsPageSkeleton": {
"55527b7bcf": "Automatisierungen werden geladen"
@@ -16554,8 +16628,8 @@
"92405f1431": "Nicht verfügbar",
"dbdcec22bd": "Schreibgeschützt",
"0a2d4359a8": "Verwaltbar",
"e2532150ed": "Automatisierungen",
"701515f010": "Automatisierung"
"automationCount_one": "{{count}} Automatisierung",
"automationCount_other": "{{count}} Automatisierungen"
},
"WorkspaceCombobox": {
"ee5b280eba": "Keine Arbeitsbereiche gefunden.",
@@ -16597,7 +16671,8 @@
"last": {
"run": {
"done": "Abgeschlossen",
"failed": "Fehlgeschlagen"
"failed": "Fehlgeschlagen",
"statusWithRelative": "{{status}} · {{relative}}"
}
}
},
@@ -16742,15 +16817,12 @@
},
"externalScope": {
"uncheckedHost": "Externe Automatisierungsmanager auf {{hostLabel}} konnten nicht geprüft werden.",
"uncheckedHosts": "Externe Automatisierungsmanager auf {{count}} Hosts konnten nicht geprüft werden."
"uncheckedHostCount_one": "Externe Automatisierungsmanager auf {{count}} Host konnten nicht geprüft werden.",
"uncheckedHostCount_other": "Externe Automatisierungsmanager auf {{count}} Hosts konnten nicht geprüft werden."
},
"enablement": {
"paused": "Pausiert"
},
"runHistory": {
"occurrencesWithLatest": "{{times}} Mal, zuletzt {{date}}",
"occurrences": "{{times}} Mal"
},
"createDestination": {
"label": "Host",
"placeholder": "Host auswählen",
@@ -16804,6 +16876,71 @@
"useFreshSessions": "Neue Sitzungen verwenden",
"helper": "Werden bei jeder neuen Sitzung zu den Standardargumenten dieses Hosts hinzugefügt.",
"detailLabel": "Zusätzliche Argumente"
},
"runHistory": {
"runCountSummary_one": "{{count}} Ausführung · {{completed}} abgeschlossen",
"runCountSummary_other": "{{count}} Ausführungen · {{completed}} abgeschlossen",
"occurrencesWithLatestCount_one": "{{count}} Mal, zuletzt {{date}}",
"occurrencesWithLatestCount_other": "{{count}} Mal, zuletzt {{date}}",
"occurrencesCount_one": "{{count}} Mal",
"occurrencesCount_other": "{{count}} Mal"
},
"capabilityProbe": {
"createIdempotencyUpdateRequired": "Zum Verschieben von Automatisierungen auf diesen Host ist ein neuerer Orca-Server erforderlich. HUB aktualisieren und erneut versuchen."
},
"editDraft": {
"unsupportedSchedule": "Diese Automatisierung hat einen nicht unterstützten gespeicherten Zeitplan. Vor dem Speichern einen unterstützten Zeitplan auswählen."
},
"hostCatalog": {
"orphanEntryLabel": "Nicht zugewiesene ältere Automatisierungen"
},
"automationPageParts": {
"never": "Nie",
"now": "gerade eben",
"runStatusPending": "In der Warteschlange",
"runStatusDispatching": "Wird gestartet",
"runStatusDispatched": "Gestartet",
"runStatusCompleted": "Erledigt",
"runStatusSkippedPrecheck": "Durch Vorabprüfung übersprungen",
"runStatusSkippedMissed": "Übersprungen",
"runStatusSkippedUnavailable": "Nicht verfügbar",
"runStatusSkippedNeedsInteractiveAuth": "Zugangsdaten erforderlich",
"runStatusDispatchFailed": "Fehlgeschlagen"
},
"runContent": {
"noOutput": "Keine Ausgabe verfügbar."
},
"runViewState": {
"viewRun": "Ausführung anzeigen",
"runOpen": "Ausführung ist geöffnet",
"terminalOnPairedServer": "Das Ausführungsterminal befindet sich auf dem gekoppelten Server.",
"terminalUnavailable": "Das Ausführungsterminal ist nicht verfügbar.",
"openWorkspace": "Arbeitsbereich öffnen",
"workspaceAvailable": "Arbeitsbereich ist verfügbar.",
"snapshotSaved": "Snapshot gespeichert",
"showingSnapshot": "Gespeicherter Ausführungs-Snapshot wird angezeigt.",
"namedWorkspaceGone": "{{name}} nicht mehr verfügbar",
"workspaceGone": "Arbeitsbereich nicht mehr verfügbar",
"noWorkspaceLaunched": "Kein Arbeitsbereich gestartet"
},
"runWorkspaceDisplay": {
"notLaunched": "Nicht gestartet",
"namedWorkspaceGone": "{{name}} (nicht mehr verfügbar)"
},
"usage": {
"tokensAndCost_one": "{{tokens}} Token · {{cost}}",
"tokensAndCost_other": "{{tokens}} Tokens · {{cost}}"
},
"externalDisplay": {
"sshHost": "SSH-Host",
"local": "Lokal"
},
"externalActionDisabled": {
"actionInProgress": "Eine andere Automatisierungsaktion läuft noch.",
"sshConnecting": "Warten, bis dieser SSH-Host verbunden ist.",
"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."
}
},
"agent": {
@@ -16944,8 +17081,6 @@
"63ce735809": "Verbinden",
"4a2ab52781": "Wird überprüft…",
"79e7aaed39": "Abbrechen",
"fdd26d81cc": "Atlassian-Kontoeinstellungen",
"8090504a3e": "Token erstellen unter",
"7b3967c12f": "Atlassian-API-Token",
"3d81bf3ab3": "API-Token",
"e91b9a4073": "you@example.com",
@@ -16970,7 +17105,8 @@
"be9eba0a1b": "Benutzername",
"70035652d7": "Passwort",
"c50abbf340": "Passwort des Jira-Kontos",
"d8737db691": "Benutzernamen und Passwort des Kontos für Jira Server oder Data Center verwenden."
"d8737db691": "Benutzernamen und Passwort des Kontos für Jira Server oder Data Center verwenden.",
"createTokenInSettings": "In den <link>Atlassian-Kontoeinstellungen</link> einen Token erstellen."
}
}
},
@@ -17079,10 +17215,11 @@
"combobox": {
"noProjects": "Keine Projekte",
"allProjects": "Alle Projekte",
"hostCount": "{{value0}} Hosts",
"searchProjects": "Projekte suchen…",
"noMatches": "Keine Projekte entsprechen der Suche.",
"chooseSource": "Aufgabenquelle auswählen"
"chooseSource": "Aufgabenquelle auswählen",
"hostCount_one": "{{count}} Host",
"hostCount_other": "{{count}} Hosts"
}
}
},
@@ -17119,7 +17256,35 @@
"taskSourceContextSummary": {
"sourceUnavailable": "{{value0}}-Quelle nicht verfügbar: {{value1}}",
"someSourceHostsUnavailable": "Einige Hosts der {{value0}}-Quelle sind nicht verfügbar: {{value1}}",
"reconnectOrUpdateTitle": "{{value0}} erneut verbinden oder aktualisieren, um diese Quelle zu laden."
"reconnectOrUpdateTitle": "{{value0}} erneut verbinden oder aktualisieren, um diese Quelle zu laden.",
"providerSourceTitle": "{{provider}}-Quelle",
"hostTitle": "Host: {{hosts}}",
"accountTitle": "Konto: {{accounts}}",
"sourceTitle": "Quelle: {{source}}",
"sourceHostCount_one": "{{count}} Quellhost",
"sourceHostCount_other": "{{count}} Quellhosts",
"noHost": "Kein Host",
"projectCount_one": "{{count}} Projekt",
"projectCount_other": "{{count}} Projekte",
"selectedProject": "Ausgewähltes Projekt",
"selectedProjectCount_one": "{{count}} ausgewähltes Projekt",
"selectedProjectCount_other": "{{count}} ausgewählte Projekte",
"currentAccount": "Aktuelles Konto",
"statusCheckingCapabilities": "prüft Serverfunktionen",
"statusServerUpdateForTaskSources": "benötigt Serverupdate für Aufgabenquellen",
"statusProviderAuthNeeded": "benötigt Anbieteranmeldung",
"statusSourceToolUnavailable": "Quellwerkzeug nicht verfügbar",
"statusProviderUnsupported": "Anbieter auf diesem Host nicht unterstützt",
"statusServerUpdateNeeded": "benötigt Serverupdate",
"unavailableCount_one": "{{count}} nicht verfügbar",
"unavailableCount_other": "{{count}} nicht verfügbar",
"statusConnected": "verbunden",
"statusAuthNeeded": "Anmeldung erforderlich",
"statusConnecting": "verbindet",
"statusConnectionIssue": "Verbindungsproblem",
"statusDisconnected": "getrennt",
"hostStatus": "{{host}} {{status}}",
"availabilityTitle": "Verfügbarkeit: {{hosts}}"
},
"ShortcutKeyCombo": {
"07eb4985a1": "{{value0}} zweimal drücken"
@@ -17512,15 +17677,15 @@
}
},
"NativeChatResumeRunPanel": {
"resumedTitle": "{{value0}} von {{value1}} Chats fortgesetzt",
"resumingTitleOne": "1 Chat wird fortgesetzt",
"resumingTitle": "{{value0}} Chats werden fortgesetzt",
"description": "Jeder Chat wird mit seinem vollständigen Kontext wiederhergestellt und aufgefordert, zu prüfen, wo er aufgehört hat. Dieses Panel kann geschlossen werden; der Fortschritt wird in der Statusleiste angezeigt.",
"resumedTitleOne": "{{value0}} von 1 Chat fortgesetzt",
"finished": "Diese Chats waren aktiv, als Orca geschlossen wurde. Orca hat jeden Chat mit seinem vollständigen Kontext an der Stelle wiederhergestellt, an der er aufgehört hatte, und den Agenten gebeten, vor dem Fortfahren die zuletzt ausgeführte Aufgabe zu prüfen. Eigene Prompts wurden nicht erneut gesendet.",
"finishedUpdate": "Diese Chats waren aktiv, als Orca ein Update installierte. Orca hat jeden Chat mit seinem vollständigen Kontext an der Stelle wiederhergestellt, an der er aufgehört hatte, und den Agenten gebeten, vor dem Fortfahren die zuletzt ausgeführte Aufgabe zu prüfen. Eigene Prompts wurden nicht erneut gesendet.",
"finishedPartial": "Diese Chats waren aktiv, als Orca geschlossen wurde. Die von Orca fortgesetzten Chats wurden mit ihrem vollständigen Kontext an der Stelle wiederhergestellt, an der sie aufgehört hatten, und aufgefordert, vor dem Fortfahren die zuletzt ausgeführte Aufgabe zu prüfen. Eigene Prompts wurden nicht erneut gesendet. In der Liste prüfen, welche Chats noch Aufmerksamkeit benötigen oder fortgesetzt werden können.",
"finishedPartialUpdate": "Diese Chats waren aktiv, als Orca ein Update installierte. Die von Orca fortgesetzten Chats wurden mit ihrem vollständigen Kontext an der Stelle wiederhergestellt, an der sie aufgehört hatten, und aufgefordert, vor dem Fortfahren die zuletzt ausgeführte Aufgabe zu prüfen. Eigene Prompts wurden nicht erneut gesendet. In der Liste prüfen, welche Chats noch Aufmerksamkeit benötigen oder fortgesetzt werden können."
"finishedPartialUpdate": "Diese Chats waren aktiv, als Orca ein Update installierte. Die von Orca fortgesetzten Chats wurden mit ihrem vollständigen Kontext an der Stelle wiederhergestellt, an der sie aufgehört hatten, und aufgefordert, vor dem Fortfahren die zuletzt ausgeführte Aufgabe zu prüfen. Eigene Prompts wurden nicht erneut gesendet. In der Liste prüfen, welche Chats noch Aufmerksamkeit benötigen oder fortgesetzt werden können.",
"resumedOfTotal_one": "{{resumed}} von {{count}} Chat fortgesetzt",
"resumedOfTotal_other": "{{resumed}} von {{count}} Chats fortgesetzt",
"resumingCount_one": "{{count}} Chat wird fortgesetzt",
"resumingCount_other": "{{count}} Chats werden fortgesetzt"
},
"NativeChatResumeRunStatusIcon": {
"waitingForReply": "Warten auf eine Antwort",
@@ -17585,6 +17750,72 @@
"cancelled": "Dieses einfache SSH-Terminal wurde vor dem Start geschlossen.",
"terminalUnavailable": "Orca konnte hier kein Terminal öffnen.",
"openHint": "Ermöglicht die weitere Arbeit auf dem Host, während Orca dort nicht eingerichtet werden kann."
},
"AgentStateDot": {
"working": "Arbeitet",
"monitoring": "Überwacht Hintergrundaufgaben",
"blocked": "Blockiert",
"waiting": "Wartet auf Eingabe",
"interrupted": "Unterbrochen",
"failed": "Fehlgeschlagen",
"done": "Erledigt",
"idle": "Inaktiv",
"unverifiable": "Keine aktuelle Meldung",
"unconfirmed": "Nicht bestätigt",
"permission": "Aufmerksamkeit erforderlich"
},
"issueComments": {
"you": "du"
},
"ZoomOverlay": {
"uiZoom": "Oberflächenzoom",
"editorZoom": "Editorzoom",
"terminalZoom": "Terminalzoom"
},
"issueCopy": {
"urlCopied": "URL kopiert",
"keyCopied": "Schlüssel kopiert",
"identifierCopied": "Kennung kopiert",
"branchNameCopied": "Branch-Name kopiert",
"promptCopied": "Prompt kopiert",
"urlCopyFailed": "URL konnte nicht kopiert werden",
"keyCopyFailed": "Schlüssel konnte nicht kopiert werden",
"identifierCopyFailed": "Kennung konnte nicht kopiert werden",
"branchNameCopyFailed": "Branch-Name konnte nicht kopiert werden",
"promptCopyFailed": "Prompt konnte nicht kopiert werden"
},
"prCheckCounts": {
"noChecksFound": "Keine Checks gefunden",
"checksFailing_one": "{{count}} Check fehlgeschlagen",
"checksFailing_other": "{{count}} Checks fehlgeschlagen",
"checksNeedAction_one": "{{count}} Check erfordert eine Aktion",
"checksNeedAction_other": "{{count}} Checks erfordern eine Aktion",
"checksPending_one": "{{count}} Check ausstehend",
"checksPending_other": "{{count}} Checks ausstehend",
"allChecksPassing": "Alle Checks erfolgreich",
"checksPassingOfTotal_one": "{{passing}} von {{count}} Check erfolgreich",
"checksPassingOfTotal_other": "{{passing}} von {{count}} Checks erfolgreich"
},
"taskPageJiraBoard": {
"changeStatusFailed": "Status konnte nicht geändert werden."
},
"jiraIssue": {
"loadStatusChangesFailed": "Statusänderungen konnten nicht geladen werden.",
"loadCommentsFailed": "Kommentare konnten nicht geladen werden."
},
"taskPageJiraLinkedIssues": {
"someIssuesFailed": "Einige mit Arbeitsbereichen verknüpfte Jira-Issues konnten nicht geladen werden. Zum erneuten Versuchen aktualisieren."
},
"taskPageJiraLoadState": {
"failedToLoadIssues": "Jira-Issues konnten nicht geladen werden.",
"authFailed": "Jira-Authentifizierung fehlgeschlagen. Jira in den Einstellungen erneut verbinden und erneut versuchen.",
"accessDenied": "Jira hat den Zugriff auf diese Issue-Suche verweigert. Projektberechtigungen prüfen oder eine andere JQL-Abfrage versuchen.",
"rateLimited": "Jira hat diese Issue-Suche wegen des Ratenlimits eingeschränkt. In Kürze erneut versuchen.",
"serverError": "Beim Laden der Issues ist ein Jira-Serverfehler aufgetreten. In Kürze erneut versuchen.",
"jqlFailed": "Jira konnte diese JQL-Abfrage nicht ausführen. Syntax prüfen und erneut versuchen.",
"unreachable": "Jira konnte nicht erreicht werden. Verbindung prüfen und erneut versuchen.",
"loadFailed": "Jira-Issues konnten nicht geladen werden. In Kürze erneut versuchen.",
"errorWithCode": "Fehler {{code}}: {{summary}}"
}
},
"i18n": {
@@ -19707,9 +19938,9 @@
"pathAdded": "Hinzugefügt",
"openFolder": "{{name}} öffnen",
"findOrTypePath": "Ordner suchen oder einen beliebigen Pfad eingeben…",
"addTypedPath": "Hinzufügen",
"noDirectories": "Noch keine Ordner hinzugefügt.",
"removePath": "{{name}} entfernen"
"removePath": "{{name}} entfernen",
"addTypedPathCode": "<path/> hinzufügen"
},
"accounts": {
"wslAccountNotApplied": {
@@ -19786,13 +20017,10 @@
"signInLinkCopyFailed": "Der Link konnte nicht kopiert werden.",
"switchSessions": {
"title": "Zu {{account}} gewechselt",
"bodyOne": "1 Claude-Sitzung läuft noch mit {{previous}}. Ein Neustart setzt das Gespräch mit {{next}} fort. Beschäftigte Sitzungen werden erst im Leerlauf neu gestartet.",
"bodyOther": "{{count}} Claude-Sitzungen laufen noch mit {{previous}}. Ein Neustart setzt jedes Gespräch mit {{next}} fort. Beschäftigte Sitzungen werden erst im Leerlauf neu gestartet.",
"dontAskAgain": "Nicht erneut fragen (automatisch neu starten)",
"dontAskAgainHint": "Dies lässt sich unter Einstellungen → Konten für KI-Anbieter deaktivieren.",
"keep": "Beibehalten",
"restartOne": "Sitzung neu starten",
"restartOther": "{{count}} Sitzungen neu starten",
"listLabel": "Neu zu startende Claude-Sitzungen",
"session": "Claude-Sitzung",
"busy": "In Arbeit",
@@ -19818,11 +20046,15 @@
"reasonOwnFolder": "Verwendet den eigenen Claude-Ordner",
"reasonUnknownAccount": "Konto unbekannt",
"reasonNoSession": "Fortsetzen nicht möglich",
"reviewBodyOne": "1 weitere Claude-Sitzung wurde nicht auf {{next}} umgestellt.",
"reviewBodyOther": "{{count}} weitere Claude-Sitzungen wurden nicht auf {{next}} umgestellt.",
"notMovedOne": "1 weitere Sitzung wurde nicht umgestellt.",
"notMovedOther": "{{count}} weitere Sitzungen wurden nicht umgestellt.",
"review": "Prüfen"
"review": "Prüfen",
"restartCount_one": "{{count}} Sitzung neu starten",
"restartCount_other": "{{count}} Sitzungen neu starten",
"reviewBody_one": "{{count}} weitere Claude-Sitzung wurde nicht zu {{next}} verschoben.",
"reviewBody_other": "{{count}} weitere Claude-Sitzungen wurden nicht zu {{next}} verschoben.",
"body_one": "{{count}} Claude-Sitzung läuft noch auf {{previous}}. Ein Neustart setzt das Gespräch auf {{next}} fort. Beschäftigte Sitzungen warten vor dem Neustart, bis sie inaktiv sind.",
"body_other": "{{count}} Claude-Sitzungen laufen noch auf {{previous}}. Ein Neustart setzt jedes Gespräch auf {{next}} fort. Beschäftigte Sitzungen warten vor dem Neustart, bis sie inaktiv sind."
}
},
"managedData": {
@@ -20136,13 +20368,13 @@
"optionalEmail": "Atlassian-E-Mail-Adresse (bei Token mit Geltungsbereichen optional)"
},
"workspace": {
"count": "{{count}} Arbeitsbereiche mit {{key}} verknüpft",
"startAnother": "Neuen Arbeitsbereich starten",
"empty": "Ein Jira-Issue mit einem Arbeitsbereich verknüpfen oder eine andere Ansicht auswählen.",
"openFailed": "Der mit diesem Jira-Issue verknüpfte Arbeitsbereich konnte nicht geöffnet werden.",
"mode": "Mit Arbeitsbereich",
"search": "Verknüpfte Issues suchen",
"single": "1 Arbeitsbereich mit {{key}} verknüpft"
"linkedCount_one": "{{count}} Arbeitsbereich mit {{key}} verknüpft",
"linkedCount_other": "{{count}} Arbeitsbereiche mit {{key}} verknüpft"
},
"prompt": {
"dialogTitle": "Prompt aus Vorlage kopieren",
@@ -20536,7 +20768,8 @@
"email": "E-Mail-Adresse einsehen",
"allSites": "Alle Daten auf allen Websites lesen und ändern",
"someSites": "Daten auf {{hosts}} lesen und ändern",
"manySites": "Daten auf {{hosts}} und {{count}} weiteren Websites lesen und ändern"
"manyOtherSites_one": "Deine Daten auf {{hosts}} und {{count}} weiteren Website lesen und ändern",
"manyOtherSites_other": "Deine Daten auf {{hosts}} und {{count}} weiteren Websites lesen und ändern"
},
"install": {
"title": "{{name}} hinzufügen?",
+321 -88
View File
@@ -2080,14 +2080,11 @@
"69da9a208c": "Open in Jira",
"fa132c8aed": "Failed to add comment.",
"ea21952aa3": "Failed to update Jira issue.",
"6c41a9bcea": "Failed to copy {{value0}}",
"2ff69a3545": "{{value0}} copied",
"666cfdd835": "Unknown",
"ef21405c6d": "Jira issue",
"commentTooLarge": "Comment is too large to submit safely."
},
"Landing": {
"76a95f7f47": "Create",
"f9eaa9e12d": "Add project",
"6ca6ff404e": "ORCA",
"520304a067": "Orca logo",
@@ -2103,7 +2100,12 @@
"0d0ace8861": "Star on GitHub",
"ec43b38ba7": "Starred on GitHub",
"157bb5ecbb": "Open GitHub",
"preflightDismiss": "Dismiss"
"preflightDismiss": "Dismiss",
"moveUpWorkspace": "Move up workspace",
"moveDownWorkspace": "Move down workspace",
"installGit": "Install Git",
"installGitHubCli": "Install GitHub CLI",
"learnMore": "Learn more"
},
"LinearIssueMarkdownDescriptionEditor": {
"d9c47069ef": "Markdown",
@@ -2134,7 +2136,6 @@
"ad5dec37b7": "Preview, edit, and start work from the selected issue.",
"c23e79e5c0": "Actions",
"b0eac92d85": "Retry",
"fabbd3f974": "updated the issue ·",
"543970c87a": "Activity",
"df4c86ed12": "Close",
"7a4997d8bb": "Close Linear issue preview",
@@ -2158,11 +2159,8 @@
"b25e453c9d": "Failed to create sub-issue",
"aeed19d003": "Created {{value0}}",
"9a1317cdd3": "Failed to load sub-issue",
"9bcbaa2737": "Failed to copy {{value0}}",
"7835483c43": "{{value0}} copied",
"61f424f8ca": "Linear issue",
"ca8778c124": "Unknown",
"8a33c85e9c": "Someone",
"65239a714b": "Linear",
"76ffd3c937": "Search for a project to add.",
"c11b4e3cc2": "No projects found.",
@@ -2173,7 +2171,10 @@
"moreWorkspaceActions": "More issue workspace actions",
"startNewWorkspace": "Start new workspace",
"workspaceSection": "Workspace",
"noWorkspaceYet": "None yet"
"noWorkspaceYet": "None yet",
"issueDescriptionLabel": "Issue description",
"namedUserUpdatedIssue": "{{name}} updated the issue · {{time}}",
"someoneUpdatedIssue": "Someone updated the issue · {{time}}"
},
"LinearItemDrawer": {
"04008e6c46": "Start workspace from issue",
@@ -2209,7 +2210,9 @@
"openAttachedWorkspace": "Open workspace attached to issue",
"openWorkspace": "Open workspace",
"moreWorkspaceActions": "More issue workspace actions",
"startNewWorkspace": "Start new workspace"
"startNewWorkspace": "Start new workspace",
"setEstimate": "Set estimate",
"estimateValue": "Estimate {{estimate}}"
},
"NewWorkspaceComposerCard": {
"reuseExistingBranch": "Reuse branch",
@@ -2271,7 +2274,22 @@
"addSshHostHint": "Use an existing machine over SSH",
"addRemoteOrcaServer": "Add Remote Orca Server",
"addRemoteOrcaServerHint": "Pair another Orca runtime",
"hostConnectionFailed": "Connection failed"
"hostConnectionFailed": "Connection failed",
"connect": "Connect",
"reconnect": "Reconnect",
"setupConfigDefaultTabs": "Default tab commands",
"setupConfigSetupAndDefaultTabs": "Setup and default tab commands",
"setupConfigSetupScript": "Setup script",
"runDefaultTabCommands": "Run default tab commands",
"runSetupAndDefaultTabCommands": "Run setup and default tab commands",
"runSetupCommand": "Run setup command",
"askRunDefaultTabCommands": "Run default tab commands now?",
"askRunSetupAndDefaultTabCommands": "Run setup and default tab commands now?",
"askRunSetup": "Run setup now?",
"runSetupNow": "Run setup now",
"runCommandsNow": "Run commands now",
"skipForNow": "Skip for now",
"skipCommands": "Skip commands"
},
"NewWorkspaceComposerModal": {
"createWorktree": "Create worktree",
@@ -2450,9 +2468,12 @@
"9e97f08d0f": "Search for a file to open",
"ec31e058f7": "Go to file",
"73b44e7bde": "Copy install command",
"b227d88520": "{{value0}} files found",
"995be8ea22": "Copy",
"cf144856dc": "Copied"
"cf144856dc": "Copied",
"filesFound_one": "{{count}} file found",
"filesFound_other": "{{count}} files found",
"hostCouldNotOpenPath": "The host could not open this file path.",
"chooseFileNotDirectory": "Choose a file rather than a directory."
},
"SelectedTextCopyMenu": {
"9b40d7b018": "Copy"
@@ -2462,8 +2483,6 @@
"serverBody": "These chats were working when Orca on {{machine}} restarted. Resuming restores each one where it stopped and asks the agent to carry on. Your own prompt is not re-sent.",
"serverDismiss": "Dismiss",
"serverResumeAll": "Resume all {{count}} on {{machine}}",
"serverResumeHereOne": "Resume 1 chat started here",
"serverResumeHere": "Resume {{count}} chats started here",
"title": "Resume interrupted chats?",
"body": "These chats were working when Orca closed. Resuming restores each one where it stopped, with its full context, and asks the agent to check what it was doing before carrying on. Your own prompt is not re-sent.",
"updateBody": "These chats were working when Orca installed an update. Resuming restores each one where it stopped, with its full context, and asks the agent to check what it was doing before carrying on. Your own prompt is not re-sent.",
@@ -2472,16 +2491,8 @@
"listLabel": "Chats that would be resumed",
"dontAskAgain": "Don't ask again (resume automatically)",
"dontAskAgainHint": "You can turn this off in Settings → Chat → Behavior.",
"continuedOne": "Resumed 1 chat",
"continuedMany": "Resumed {{value0}} chats",
"selectAgent": "Resume {{value0}} chat \"{{value1}}\" in {{value2}}",
"dismissAll": "Dismiss all",
"notContinuedOne": "1 chat couldn’t be resumed",
"notContinuedMany": "{{value0}} chats couldn’t be resumed",
"notConfirmedOne": "Couldn’t confirm 1 chat was resumed",
"notConfirmedMany": "Couldn’t confirm {{value0}} chats were resumed",
"notConfirmedOtherOne": "Couldn’t confirm 1 other chat was resumed",
"notConfirmedOtherMany": "Couldn’t confirm {{value0}} other chats were resumed",
"viewChats": "View chats",
"review": "Review",
"activityUnnamed": "unnamed",
@@ -2489,9 +2500,7 @@
"activityQuestion": "Waiting for your answer: {{value0}}",
"activityMidReply": "Was mid-reply",
"activitySubagentOne": "Subagent running: {{value0}}",
"activitySubagentMany": "{{value0}} subagents running",
"activityMonitorOne": "Monitoring: {{value0}}",
"activityMonitorMany": "Monitoring {{value0}} background tasks",
"selectWorkspace": "Select all chats in {{value0}}",
"workspaceSelectedCount": "{{value0}} of {{value1}}",
"selectAll": "Select all chats",
@@ -2505,7 +2514,21 @@
"done": "Done",
"resultListLabel": "Chats in this resume",
"resumeChats_one": "Resume {{count}} chat",
"resumeChats_other": "Resume {{count}} chats"
"resumeChats_other": "Resume {{count}} chats",
"serverResumeHereCount_one": "Resume {{count}} chat started here",
"serverResumeHereCount_other": "Resume {{count}} chats started here",
"continuedCount_one": "Resumed {{count}} chat",
"continuedCount_other": "Resumed {{count}} chats",
"notContinuedCount_one": "{{count}} chat couldn’t be resumed",
"notContinuedCount_other": "{{count}} chats couldn’t be resumed",
"notConfirmedCount_one": "Couldn’t confirm {{count}} chat was resumed",
"notConfirmedCount_other": "Couldn’t confirm {{count}} chats were resumed",
"notConfirmedOtherCount_one": "Couldn’t confirm {{count}} other chat was resumed",
"notConfirmedOtherCount_other": "Couldn’t confirm {{count}} other chats were resumed",
"activitySubagentCount_other": "{{count}} subagents running",
"activityMonitorCount_other": "Monitoring {{count}} background tasks",
"activityMonitorCount_one": "Monitoring {{count}} background task",
"activitySubagentCount_one": "{{count}} subagent running"
},
"StarNagCard": {
"30c36231c1": "Orca is open source. If it helped today, a GitHub star helps other developers find it.",
@@ -2520,7 +2543,6 @@
"TaskPage": {
"ff69a30681": "Cancel",
"8ff6fdc368": "Creating…",
"fc0d8a1fa4": "to submit.",
"919a20dd5b": "Enter {{value0}}",
"56cdb413a2": "Comma-separated values",
"1f0fce91e3": "Select {{value0}}",
@@ -2568,11 +2590,9 @@
"bdebffcbfe": "Create a Linear project for the selected team.",
"1361275ec3": "New Linear project",
"7f3f7b4c18": "Description (optional, markdown)",
"9f2b4c03a6": "Filing in",
"d3d0998b7d": "New GitHub issue",
"6244a02f46": "Open in Linear",
"606a85c774": "Open",
"5e8061b088": "Start workspace from {{value0}} {{value1}}",
"592a55611b": "Try selecting more teams or refreshing; team filters apply to the current fetched issue set.",
"618107fab3": "No fetched issues match the selected teams",
"903c7af49f": "No Linear issues found",
@@ -2581,7 +2601,6 @@
"f362667d55": "Updated",
"b1eaa18ace": "Issue",
"37e7ee311e": "Key",
"b7bae28b6a": "shown",
"a26a48252e": "Display properties",
"5d2d835467": "Ordering",
"5659da12fc": "Grouping",
@@ -2621,8 +2640,6 @@
"054bf695cc": "Draft",
"5b6b2af943": "Retrying…",
"0c0de0fc0e": "Couldn't load issues from",
"d1766fd62d": "projects failed to load",
"7762f4b03a": "of",
"443f7dd928": "Merge",
"a7396b05c6": "Checks",
"f6fa3c97d0": "Reviewers",
@@ -2804,10 +2821,41 @@
"linearOpenAttachedWorkspace": "Open workspace attached to {{value0}}",
"linearWorktreesColumn": "Workspaces",
"jiraBoardEmptyColumn": "No issues",
"labelCountPlural": "{{count}} labels",
"labelCountSingular": "{{count}} label",
"memberCountPlural": "{{count}} members",
"memberCountSingular": "{{count}} member"
"backToPullRequests": "Pull requests",
"backToGitHubList": "GitHub list",
"noGitHubRepositoryContext": "No GitHub repository context available for this issue.",
"filingInTarget": "Filing in {{target}}",
"filingInThisRepository": "Filing in this repository",
"shortcutToSubmit": "{{shortcut}} to submit.",
"projectsFailedToLoad_one": "{{failed}} of {{count}} project failed to load",
"projectsFailedToLoad_other": "{{failed}} of {{count}} projects failed to load",
"draftPullRequestNumber": "Draft pull request #{{number}}",
"pullRequestNumber": "Pull request #{{number}}",
"issueNumber": "Issue #{{number}}",
"loadGitHubWorkFailed": "Failed to load GitHub work.",
"gitlabViewIssues": "Issues",
"gitlabViewMrs": "MRs",
"gitlabViewTodos": "My Todos",
"startWorkspaceFromMr": "Start workspace from MR {{number}}",
"startWorkspaceFromIssue": "Start workspace from issue {{number}}",
"shownCount_other": "{{count}} shown",
"linearProjectPlaceholder": "Project",
"labelCount_one": "{{count}} label",
"labelCount_other": "{{count}} labels",
"memberCount_one": "{{count}} member",
"memberCount_other": "{{count}} members",
"groupUnassigned": "Unassigned",
"linearProjectContext": "Project: {{name}}",
"linearViewContext": "View: {{name}}",
"changedFileCount_one": "{{count}} file",
"changedFileCount_other": "{{count}} files",
"resumeRestoration": {
"linearProjectNotFound": "Saved Linear project was not found.",
"linearProjectRestoreFailed": "Failed to restore saved Linear project.",
"linearViewNotFound": "Saved Linear view was not found.",
"linearViewRestoreFailed": "Failed to restore saved Linear view."
},
"shownCount_one": "{{count}} shown"
},
"Terminal": {
"73768427cf": "Close",
@@ -2882,7 +2930,8 @@
"b1e390250d": "Could not complete the local build switch.",
"d29740d175": "The selected build could not be used.",
"37d45c9ec1": "Choose Another Build",
"7f1a4c9e02": "Your system package manager installed Orca, so update it from there — Orca cannot install this release itself."
"7f1a4c9e02": "Your system package manager installed Orca, so update it from there — Orca cannot install this release itself.",
"compatibilityModeFailed": "Could not enable compatibility mode. {{message}}"
},
"WorktreeJumpPalette": {
"ac037cfac2": "Move",
@@ -2908,8 +2957,6 @@
"d7d496a451": "Browser page no longer exists",
"50a1d11d5b": "Open Tabs",
"088d66d980": "Actions & Settings",
"20af998bff": "{{value0}} items available{{value1}}",
"bb72c08e63": "{{value0}} results found{{value1}}",
"34c8fbb46e": "SSH remote",
"63c2be1914": "SSH disconnected",
"95be6587d3": "Create worktree \"{{value0}}\"",
@@ -2926,7 +2973,12 @@
"recentChatsTerminalsHeader": "Recent Chats & Terminals",
"27f10cca63": "Search chats, terminals, workspaces, tasks, settings, and actions...",
"2770f02910": "Search chats, terminals, workspaces, tasks, settings, and actions",
"lastActiveTime": "Last active {{value0}} ago"
"lastActiveTime": "Last active {{value0}} ago",
"resultsFound_one": "{{count}} result found.",
"resultsFound_other": "{{count}} results found.",
"itemsAvailable_one": "{{count}} item available.",
"itemsAvailable_other": "{{count}} items available.",
"createActionAvailable": "Create worktree action available."
},
"github": {
"pr": {
@@ -3228,11 +3280,6 @@
}
}
},
"priority": {
"icon": {
"c43d3e065b": "Priority:"
}
},
"project": {
"view": {
"surfaces": {
@@ -3251,7 +3298,6 @@
"c8db98b73b": "Resources",
"bb1405eff8": "Milestones",
"5d99315fb8": "Planning",
"3ad562bdf4": "scoped issues",
"563501f191": "Progress",
"bb5664d456": "No project description.",
"7b147907dc": "Linear",
@@ -3276,7 +3322,10 @@
"df4bd63c1d": "Unassigned",
"30402d2c6e": "Try search or refresh.",
"a2f31c4cd6": "No Linear projects found",
"c9b6e9f90d": "Unable to load Linear projects"
"c9b6e9f90d": "Unable to load Linear projects",
"scopedIssueCount_one": "{{count}} scoped issue",
"scopedIssueCount_other": "{{count}} scoped issues",
"backlog": "Backlog"
}
}
},
@@ -3289,7 +3338,14 @@
"05baa5ae90": "Workspace",
"89f6580dbf": "Search teams...",
"b3488fad3c": "No teams were fetched. Access can depend on key scope, private-team membership, archived teams, permissions, or a fetch failure.",
"405b33c378": "No fetched teams match your search."
"405b33c378": "No fetched teams match your search.",
"teamCount_one": "{{count}} team",
"teamCount_other": "{{count}} teams"
}
},
"priority": {
"icon": {
"priorityValue": "Priority: {{label}}"
}
}
},
@@ -6690,7 +6746,11 @@
"c34fb1098d": "Terminal tabs closed and shutdown requested.",
"d9657ac204": "Terminal session shutdown requested.",
"e8f25bd903": "Couldn’t finish terminal cleanup.",
"a702d4196e": "This closes every terminal tab across all workspaces and requests shutdown for its current terminal sessions. Any unsaved terminal work is lost. The daemon itself keeps running, and new terminals can be opened immediately. This can't be undone."
"a702d4196e": "This closes every terminal tab across all workspaces and requests shutdown for its current terminal sessions. Any unsaved terminal work is lost. The daemon itself keeps running, and new terminals can be opened immediately. This can't be undone.",
"confirmRestart": "Restart",
"busyRestarting": "Restarting…",
"confirmKillAll": "Kill all sessions",
"busyKilling": "Killing…"
},
"MacFolderAccessFixDialog": {
"stepAllow": "Allow Orca under Files and Folders",
@@ -14498,11 +14558,11 @@
"a2f68645ac": "Refresh GitLab API budget",
"2f9c16d6c3": "Orca uses REST through the GitLab CLI.",
"14e144f7a7": "GitLab API Budget",
"3e2c982cfa": "left, resets in",
"ea8ad0bae8": "of",
"0a891e8935": "REST API",
"953f7c6062": "This GitLab host did not return rate-limit headers.",
"budget_scope_prefix": "Budget scope"
"budget_scope_prefix": "Budget scope",
"resetUnknown": "unknown",
"remainingOfLimit": "{{remaining}} of {{limit}} left, resets in {{reset}}"
}
}
}
@@ -16402,7 +16462,21 @@
"b09b2384fd": "Paused",
"eaa02014f8": "Enabled",
"29baf8f4c2": "Source",
"lastRunFailed": "Last run failed."
"lastRunFailed": "Last run failed.",
"noGrace": "No grace",
"graceMinutes_one": "{{count}} minute",
"graceMinutes_other": "{{count}} minutes",
"graceHours_one": "{{count}} hour",
"graceHours_other": "{{count}} hours",
"usageCoverageRuns_one": "{{known}}/{{count}} run",
"usageCoverageRuns_other": "{{known}}/{{count}} runs",
"usageUnavailable": "Unavailable",
"noRuns": "No runs",
"projectDefault": "Project default",
"reuseLiveSession": "Reuse live session",
"freshEachRun": "Fresh each run",
"precheckEnabled": "Enabled, {{timeout}}",
"precheckNone": "None"
},
"AutomationEditorDialog": {
"fb1896a5e7": "Cancel",
@@ -16506,11 +16580,8 @@
"2faecab10b": "Run Now",
"13118faadf": "Unknown project",
"73f630b49d": "Cancel",
"1b586f0e2b": "on",
"02a33e3204": "from",
"9adfab2596": "Delete External Automation",
"1e2e41392f": "Don't ask again",
"b264564427": "and its run history. Workspaces created by previous runs are not deleted.",
"080dcb5fbb": "Delete Automation",
"19a6e30eae": "Refresh automations",
"77c2778945": "Automations",
@@ -16545,7 +16616,6 @@
"pendingAutomationRunMissing": "Run history no longer available.",
"paused": "Paused",
"missingWorkspace": "Missing workspace",
"runUsageSummary": "{{cost}} est. · {{tokens}} tokens",
"usageUnavailable": "Usage unavailable",
"noRunUsageYet": "No run usage yet",
"noWorkspace": "No workspace",
@@ -16560,7 +16630,11 @@
"rowActions": "Automation actions",
"tableLastRun": "Last run",
"ownerChanged": "This automation changed hosts. Refresh and try again.",
"runError": "Error:"
"runError": "Error:",
"deleteAutomationDescription": "Delete <name/> and its run history. Workspaces created by previous runs are not deleted.",
"deleteExternalAutomationDescription": "Delete <name/> from <provider/> on <host/>.",
"runUsageSummaryTokens_one": "{{cost}} est. · {{tokens}} token",
"runUsageSummaryTokens_other": "{{cost}} est. · {{tokens}} tokens"
},
"AutomationsPageSkeleton": {
"55527b7bcf": "Loading automations"
@@ -16590,8 +16664,8 @@
"92405f1431": "Unavailable",
"dbdcec22bd": "Read-only",
"0a2d4359a8": "Manageable",
"e2532150ed": "automations",
"701515f010": "automation"
"automationCount_one": "{{count}} automation",
"automationCount_other": "{{count}} automations"
},
"WorkspaceCombobox": {
"ee5b280eba": "No workspaces found.",
@@ -16633,7 +16707,8 @@
"last": {
"run": {
"done": "Done",
"failed": "Failed"
"failed": "Failed",
"statusWithRelative": "{{status}} {{relative}}"
}
}
},
@@ -16778,15 +16853,12 @@
},
"externalScope": {
"uncheckedHost": "External automation managers on {{hostLabel}} could not be checked.",
"uncheckedHosts": "External automation managers on {{count}} hosts could not be checked."
"uncheckedHostCount_other": "External automation managers on {{count}} hosts could not be checked.",
"uncheckedHostCount_one": "External automation managers on {{count}} host could not be checked."
},
"enablement": {
"paused": "Paused"
},
"runHistory": {
"occurrencesWithLatest": "{{times}} times, most recently {{date}}",
"occurrences": "{{times}} times"
},
"createDestination": {
"label": "Host",
"placeholder": "Select a host",
@@ -16840,6 +16912,71 @@
"useFreshSessions": "Use fresh sessions",
"helper": "Added to this host's default arguments for each fresh session.",
"detailLabel": "Extra arguments"
},
"runHistory": {
"runCountSummary_one": "{{count}} run · {{completed}} completed",
"runCountSummary_other": "{{count}} runs · {{completed}} completed",
"occurrencesWithLatestCount_other": "{{count}} times, most recently {{date}}",
"occurrencesCount_other": "{{count}} times",
"occurrencesCount_one": "{{count}} time",
"occurrencesWithLatestCount_one": "{{count}} time, most recently {{date}}"
},
"capabilityProbe": {
"createIdempotencyUpdateRequired": "Moving automations to this host requires a newer Orca server. Update the HUB and try again."
},
"editDraft": {
"unsupportedSchedule": "This automation has an unsupported saved schedule. Pick a supported schedule before saving changes."
},
"hostCatalog": {
"orphanEntryLabel": "Unassigned legacy automations"
},
"automationPageParts": {
"never": "Never",
"now": "now",
"runStatusPending": "Queued",
"runStatusDispatching": "Starting",
"runStatusDispatched": "Launched",
"runStatusCompleted": "Done",
"runStatusSkippedPrecheck": "Precheck skipped",
"runStatusSkippedMissed": "Skipped",
"runStatusSkippedUnavailable": "Unavailable",
"runStatusSkippedNeedsInteractiveAuth": "Needs credentials",
"runStatusDispatchFailed": "Failed"
},
"runContent": {
"noOutput": "No output content available."
},
"runViewState": {
"viewRun": "View run",
"runOpen": "Run is open",
"terminalOnPairedServer": "Run terminal is on the paired server.",
"terminalUnavailable": "Run terminal is unavailable.",
"openWorkspace": "Open workspace",
"workspaceAvailable": "Workspace is available.",
"snapshotSaved": "Snapshot saved",
"showingSnapshot": "Showing saved run snapshot.",
"namedWorkspaceGone": "{{name}} no longer available",
"workspaceGone": "Workspace no longer available",
"noWorkspaceLaunched": "No workspace launched"
},
"runWorkspaceDisplay": {
"notLaunched": "Not launched",
"namedWorkspaceGone": "{{name}} (no longer available)"
},
"usage": {
"tokensAndCost_one": "{{tokens}} token · {{cost}}",
"tokensAndCost_other": "{{tokens}} tokens · {{cost}}"
},
"externalDisplay": {
"sshHost": "SSH host",
"local": "Local"
},
"externalActionDisabled": {
"actionInProgress": "Another automation action is still running.",
"sshConnecting": "Wait for this SSH host to finish connecting.",
"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."
}
},
"agent": {
@@ -16980,8 +17117,6 @@
"63ce735809": "Connect",
"4a2ab52781": "Verifying…",
"79e7aaed39": "Cancel",
"fdd26d81cc": "Atlassian account settings",
"8090504a3e": "Create a token in",
"7b3967c12f": "Atlassian API token",
"3d81bf3ab3": "API token",
"e91b9a4073": "you@example.com",
@@ -17006,7 +17141,8 @@
"be9eba0a1b": "username",
"70035652d7": "Password",
"c50abbf340": "Jira account password",
"d8737db691": "Use your Jira Server or Data Center account username and password."
"d8737db691": "Use your Jira Server or Data Center account username and password.",
"createTokenInSettings": "Create a token in <link>Atlassian account settings</link>."
}
}
},
@@ -17115,10 +17251,11 @@
"combobox": {
"noProjects": "No projects",
"allProjects": "All projects",
"hostCount": "{{value0}} hosts",
"searchProjects": "Search projects...",
"noMatches": "No projects match your search.",
"chooseSource": "Choose task source"
"chooseSource": "Choose task source",
"hostCount_other": "{{count}} hosts",
"hostCount_one": "{{count}} host"
}
}
},
@@ -17155,7 +17292,35 @@
"taskSourceContextSummary": {
"sourceUnavailable": "{{value0}} source unavailable: {{value1}}",
"someSourceHostsUnavailable": "Some {{value0}} source hosts unavailable: {{value1}}",
"reconnectOrUpdateTitle": "Reconnect or update {{value0}} to load this source."
"reconnectOrUpdateTitle": "Reconnect or update {{value0}} to load this source.",
"providerSourceTitle": "{{provider}} source",
"hostTitle": "Host: {{hosts}}",
"accountTitle": "Account: {{accounts}}",
"sourceTitle": "Source: {{source}}",
"sourceHostCount_other": "{{count}} source hosts",
"noHost": "No host",
"projectCount_other": "{{count}} projects",
"selectedProject": "Selected project",
"selectedProjectCount_other": "{{count}} selected projects",
"currentAccount": "Current account",
"statusCheckingCapabilities": "checking server capabilities",
"statusServerUpdateForTaskSources": "server update needed for task sources",
"statusProviderAuthNeeded": "provider auth needed",
"statusSourceToolUnavailable": "source tool unavailable",
"statusProviderUnsupported": "provider unsupported on this host",
"statusServerUpdateNeeded": "server update needed",
"unavailableCount_other": "{{count}} unavailable",
"statusConnected": "connected",
"statusAuthNeeded": "auth needed",
"statusConnecting": "connecting",
"statusConnectionIssue": "connection issue",
"statusDisconnected": "disconnected",
"hostStatus": "{{host}} {{status}}",
"availabilityTitle": "Availability: {{hosts}}",
"projectCount_one": "{{count}} project",
"selectedProjectCount_one": "{{count}} selected project",
"sourceHostCount_one": "{{count}} source host",
"unavailableCount_one": "{{count}} unavailable"
},
"ShortcutKeyCombo": {
"07eb4985a1": "Double-tap {{value0}}"
@@ -17548,15 +17713,15 @@
}
},
"NativeChatResumeRunPanel": {
"resumedTitle": "Resumed {{value0}} of {{value1}} chats",
"resumingTitleOne": "Resuming 1 chat",
"resumingTitle": "Resuming {{value0}} chats",
"description": "Each chat is restored with its full context and asked to check where it stopped. You can close this; the status bar keeps track.",
"resumedTitleOne": "Resumed {{value0}} of 1 chat",
"finished": "These chats were working when Orca closed. Orca restored each one where it stopped, with its full context, and asked the agent to check what it was doing before carrying on. Your own prompts weren’t re-sent.",
"finishedUpdate": "These chats were working when Orca installed an update. Orca restored each one where it stopped, with its full context, and asked the agent to check what it was doing before carrying on. Your own prompts weren’t re-sent.",
"finishedPartial": "These chats were working when Orca closed. The ones Orca resumed were restored where they stopped, with their full context, and asked to check what they were doing before carrying on. Your own prompts weren’t re-sent. Check the list for chats that still need attention or can be resumed.",
"finishedPartialUpdate": "These chats were working when Orca installed an update. The ones Orca resumed were restored where they stopped, with their full context, and asked to check what they were doing before carrying on. Your own prompts weren’t re-sent. Check the list for chats that still need attention or can be resumed."
"finishedPartialUpdate": "These chats were working when Orca installed an update. The ones Orca resumed were restored where they stopped, with their full context, and asked to check what they were doing before carrying on. Your own prompts weren’t re-sent. Check the list for chats that still need attention or can be resumed.",
"resumedOfTotal_one": "Resumed {{resumed}} of {{count}} chat",
"resumedOfTotal_other": "Resumed {{resumed}} of {{count}} chats",
"resumingCount_one": "Resuming {{count}} chat",
"resumingCount_other": "Resuming {{count}} chats"
},
"NativeChatResumeRunStatusIcon": {
"waitingForReply": "Waiting for a reply",
@@ -17621,6 +17786,72 @@
"cancelled": "This plain SSH terminal was closed before it started.",
"terminalUnavailable": "Orca couldn’t open a terminal here.",
"openHint": "Keeps you working on the host while Orca can’t set up there."
},
"AgentStateDot": {
"working": "Working",
"monitoring": "Monitoring background tasks",
"blocked": "Blocked",
"waiting": "Waiting for input",
"interrupted": "Interrupted",
"failed": "Failed",
"done": "Done",
"idle": "Idle",
"unverifiable": "No recent update",
"unconfirmed": "Couldn’t confirm",
"permission": "Needs attention"
},
"issueComments": {
"you": "You"
},
"ZoomOverlay": {
"uiZoom": "UI Zoom",
"editorZoom": "Editor Zoom",
"terminalZoom": "Terminal Zoom"
},
"issueCopy": {
"urlCopied": "URL copied",
"keyCopied": "Key copied",
"identifierCopied": "Identifier copied",
"branchNameCopied": "Branch name copied",
"promptCopied": "Prompt copied",
"urlCopyFailed": "Failed to copy URL",
"keyCopyFailed": "Failed to copy key",
"identifierCopyFailed": "Failed to copy identifier",
"branchNameCopyFailed": "Failed to copy branch name",
"promptCopyFailed": "Failed to copy prompt"
},
"prCheckCounts": {
"noChecksFound": "No checks found",
"checksFailing_one": "{{count}} check failing",
"checksFailing_other": "{{count}} checks failing",
"checksNeedAction_one": "{{count}} check needs action",
"checksNeedAction_other": "{{count}} checks need action",
"checksPending_one": "{{count}} check pending",
"checksPending_other": "{{count}} checks pending",
"allChecksPassing": "All checks passing",
"checksPassingOfTotal_one": "{{passing}} of {{count}} check passing",
"checksPassingOfTotal_other": "{{passing}} of {{count}} checks passing"
},
"taskPageJiraBoard": {
"changeStatusFailed": "Failed to change status."
},
"jiraIssue": {
"loadStatusChangesFailed": "Failed to load status changes.",
"loadCommentsFailed": "Failed to load comments."
},
"taskPageJiraLinkedIssues": {
"someIssuesFailed": "Some Jira issues linked to workspaces could not be loaded. Refresh to try again."
},
"taskPageJiraLoadState": {
"failedToLoadIssues": "Failed to load Jira issues.",
"authFailed": "Jira authentication failed. Reconnect Jira in Settings, then try again.",
"accessDenied": "Jira denied access to this issue search. Check project permissions or try a different JQL query.",
"rateLimited": "Jira rate-limited this issue search. Try again in a moment.",
"serverError": "Jira had a server error while loading issues. Try again in a moment.",
"jqlFailed": "Jira couldn't run this JQL query. Check the syntax and try again.",
"unreachable": "Couldn't reach Jira. Check your connection and try again.",
"loadFailed": "Couldn't load Jira issues. Try again in a moment.",
"errorWithCode": "Error {{code}}: {{summary}}"
}
},
"i18n": {
@@ -19743,9 +19974,9 @@
"pathAdded": "Added",
"openFolder": "Open {{name}}",
"findOrTypePath": "Find a folder, or type any path…",
"addTypedPath": "Add",
"noDirectories": "No folders added yet.",
"removePath": "Remove {{name}}"
"removePath": "Remove {{name}}",
"addTypedPathCode": "Add <path/>"
},
"accounts": {
"wslAccountNotApplied": {
@@ -19822,13 +20053,10 @@
"signInLinkCopyFailed": "Could not copy the link.",
"switchSessions": {
"title": "Switched to {{account}}",
"bodyOne": "1 Claude session is still running on {{previous}}. Restarting continues the conversation on {{next}}. Busy sessions wait for idle before restarting.",
"bodyOther": "{{count}} Claude sessions are still running on {{previous}}. Restarting continues each conversation on {{next}}. Busy sessions wait for idle before restarting.",
"dontAskAgain": "Don't ask again (restart automatically)",
"dontAskAgainHint": "You can turn this off in Settings → AI Provider Accounts.",
"keep": "Keep as is",
"restartOne": "Restart session",
"restartOther": "Restart {{count}} sessions",
"listLabel": "Claude sessions to restart",
"session": "Claude session",
"busy": "Working",
@@ -19854,11 +20082,15 @@
"reasonOwnFolder": "Uses your own Claude folder",
"reasonUnknownAccount": "Account unknown",
"reasonNoSession": "Can't resume",
"reviewBodyOne": "1 other Claude session wasn't moved to {{next}}.",
"reviewBodyOther": "{{count}} other Claude sessions weren't moved to {{next}}.",
"notMovedOne": "1 other session wasn't moved.",
"notMovedOther": "{{count}} other sessions weren't moved.",
"review": "Review"
"review": "Review",
"restartCount_other": "Restart {{count}} sessions",
"reviewBody_one": "{{count}} other Claude session wasn't moved to {{next}}.",
"reviewBody_other": "{{count}} other Claude sessions weren't moved to {{next}}.",
"body_one": "{{count}} Claude session is still running on {{previous}}. Restarting continues the conversation on {{next}}. Busy sessions wait for idle before restarting.",
"body_other": "{{count}} Claude sessions are still running on {{previous}}. Restarting continues each conversation on {{next}}. Busy sessions wait for idle before restarting.",
"restartCount_one": "Restart {{count}} session"
}
},
"managedData": {
@@ -20172,13 +20404,13 @@
"optionalEmail": "Atlassian email (optional for scoped tokens)"
},
"workspace": {
"count": "{{count}} workspaces linked to {{key}}",
"startAnother": "Start new workspace",
"empty": "Link a Jira issue to a workspace, or choose another view.",
"openFailed": "Unable to open the workspace linked to this Jira issue.",
"mode": "Has Workspace",
"search": "Search linked issues",
"single": "1 workspace linked to {{key}}"
"linkedCount_one": "{{count}} workspace linked to {{key}}",
"linkedCount_other": "{{count}} workspaces linked to {{key}}"
},
"prompt": {
"dialogTitle": "Copy prompt from template",
@@ -20572,7 +20804,8 @@
"email": "Know your email address",
"allSites": "Read and change all your data on all websites",
"someSites": "Read and change your data on {{hosts}}",
"manySites": "Read and change your data on {{hosts}} and {{count}} other sites"
"manyOtherSites_one": "Read and change your data on {{hosts}} and {{count}} other site",
"manyOtherSites_other": "Read and change your data on {{hosts}} and {{count}} other sites"
},
"install": {
"title": "Add {{name}}?",
+321 -88
View File
@@ -1779,14 +1779,11 @@
"69da9a208c": "Abrir en Jira",
"fa132c8aed": "No se pudo agregar el comentario.",
"ea21952aa3": "No se pudo actualizar el issue de Jira.",
"6c41a9bcea": "No se pudo copiar {{value0}}",
"2ff69a3545": "{{value0}} copiado",
"666cfdd835": "Desconocido",
"ef21405c6d": "Issue de Jira",
"commentTooLarge": "El comentario es demasiado grande para enviarlo de forma segura."
},
"Landing": {
"76a95f7f47": "Crear",
"f9eaa9e12d": "Agregar proyecto",
"6ca6ff404e": "ORCA",
"520304a067": "logotipo de Orca",
@@ -1802,7 +1799,12 @@
"0d0ace8861": "Dar estrella en GitHub",
"ec43b38ba7": "Con estrella en GitHub",
"157bb5ecbb": "Abrir GitHub",
"preflightDismiss": "Descartar"
"preflightDismiss": "Descartar",
"moveUpWorkspace": "Seleccionar espacio de trabajo anterior",
"moveDownWorkspace": "Seleccionar espacio de trabajo siguiente",
"installGit": "Instalar Git",
"installGitHubCli": "Instalar GitHub CLI",
"learnMore": "Más información"
},
"LinearIssueMarkdownDescriptionEditor": {
"d9c47069ef": "Markdown",
@@ -1833,7 +1835,6 @@
"ad5dec37b7": "Previsualiza, edita y empieza a trabajar desde el issue seleccionado.",
"c23e79e5c0": "Acciones",
"b0eac92d85": "Reintentar",
"fabbd3f974": "actualizó el issue ·",
"543970c87a": "Actividad",
"df4c86ed12": "Cerrar",
"7a4997d8bb": "Cerrar vista previa del issue de Linear",
@@ -1857,11 +1858,8 @@
"b25e453c9d": "No se pudo crear el sub-issue",
"aeed19d003": "Se creó {{value0}}",
"9a1317cdd3": "No se pudo cargar el sub-issue",
"9bcbaa2737": "No se pudo copiar {{value0}}",
"7835483c43": "{{value0}} copiado",
"61f424f8ca": "Issue de Linear",
"ca8778c124": "Desconocido",
"8a33c85e9c": "Alguien",
"65239a714b": "Linear",
"76ffd3c937": "Busca un proyecto para agregar.",
"c11b4e3cc2": "No se encontraron proyectos.",
@@ -1872,7 +1870,10 @@
"moreWorkspaceActions": "Más acciones del espacio de trabajo del issue",
"startNewWorkspace": "Iniciar un espacio de trabajo nuevo",
"workspaceSection": "Espacio de trabajo",
"noWorkspaceYet": "Ninguno todavía"
"noWorkspaceYet": "Ninguno todavía",
"issueDescriptionLabel": "Descripción del issue",
"namedUserUpdatedIssue": "{{name}} actualizó el issue · {{time}}",
"someoneUpdatedIssue": "Alguien actualizó el issue · {{time}}"
},
"LinearItemDrawer": {
"04008e6c46": "Iniciar espacio de trabajo desde el issue",
@@ -1908,7 +1909,9 @@
"openAttachedWorkspace": "Abrir el espacio de trabajo vinculado al issue",
"openWorkspace": "Abrir espacio de trabajo",
"moreWorkspaceActions": "Más acciones del espacio de trabajo del issue",
"startNewWorkspace": "Iniciar un espacio de trabajo nuevo"
"startNewWorkspace": "Iniciar un espacio de trabajo nuevo",
"setEstimate": "Establecer estimación",
"estimateValue": "Estimación {{estimate}}"
},
"NewWorkspaceComposerCard": {
"cbb47ee0dc": "Solo disponible para proyectos Git locales.",
@@ -1970,7 +1973,22 @@
"defaultBranchUpdateFailed": "No se pudo actualizar la rama predeterminada del proyecto. Inténtalo de nuevo.",
"setLocation": "Establecer ubicación del proyecto",
"setLocationOnHost": "Establecer ubicación del proyecto en {{host}}",
"setLocationTooltip": "Elige una carpeta o clona este proyecto en {{host}}."
"setLocationTooltip": "Elige una carpeta o clona este proyecto en {{host}}.",
"connect": "Conectar",
"reconnect": "Reconectar",
"setupConfigDefaultTabs": "Comandos de pestañas predeterminadas",
"setupConfigSetupAndDefaultTabs": "Configuración y comandos de pestañas predeterminadas",
"setupConfigSetupScript": "Script de configuración",
"runDefaultTabCommands": "Ejecutar comandos de pestañas predeterminadas",
"runSetupAndDefaultTabCommands": "Ejecutar configuración y comandos de pestañas predeterminadas",
"runSetupCommand": "Ejecutar comando de configuración",
"askRunDefaultTabCommands": "¿Ejecutar ahora los comandos de pestañas predeterminadas?",
"askRunSetupAndDefaultTabCommands": "¿Ejecutar ahora la configuración y los comandos de pestañas predeterminadas?",
"askRunSetup": "¿Ejecutar la configuración ahora?",
"runSetupNow": "Ejecutar configuración ahora",
"runCommandsNow": "Ejecutar comandos ahora",
"skipForNow": "Omitir por ahora",
"skipCommands": "Omitir comandos"
},
"NewWorkspaceComposerModal": {
"createWorktree": "Crear worktree",
@@ -2149,9 +2167,12 @@
"9e97f08d0f": "Buscar un archivo para abrir",
"ec31e058f7": "Ir al archivo",
"73b44e7bde": "Copiar comando de instalación",
"b227d88520": "{{value0}} archivos encontrados",
"995be8ea22": "Copiar",
"cf144856dc": "Copiado"
"cf144856dc": "Copiado",
"filesFound_one": "{{count}} archivo encontrado",
"filesFound_other": "{{count}} archivos encontrados",
"hostCouldNotOpenPath": "El host no pudo abrir esta ruta de archivo.",
"chooseFileNotDirectory": "Elige un archivo en lugar de un directorio."
},
"SelectedTextCopyMenu": {
"9b40d7b018": "Copiar"
@@ -2169,7 +2190,6 @@
"TaskPage": {
"ff69a30681": "Cancelar",
"8ff6fdc368": "Creando…",
"fc0d8a1fa4": "para enviar.",
"919a20dd5b": "Ingresa {{value0}}",
"56cdb413a2": "Valores separados por comas",
"1f0fce91e3": "Selecciona {{value0}}",
@@ -2217,11 +2237,9 @@
"bdebffcbfe": "Crea un proyecto Linear para el equipo seleccionado.",
"1361275ec3": "Nuevo proyecto Linear",
"7f3f7b4c18": "Descripción (opcional, markdown)",
"9f2b4c03a6": "Creando en",
"d3d0998b7d": "Nuevo issue de GitHub",
"6244a02f46": "Abrir en Linear",
"606a85c774": "Abierto",
"5e8061b088": "Iniciar espacio de trabajo desde {{value0}} {{value1}}",
"592a55611b": "Prueba a seleccionar más equipos o actualizar; los filtros de equipo se aplican al conjunto de issues obtenido actualmente.",
"618107fab3": "No hay issues obtenidos que coincidan con los equipos seleccionados.",
"903c7af49f": "No se encontraron issues de Linear",
@@ -2230,7 +2248,6 @@
"f362667d55": "Actualizado",
"b1eaa18ace": "Issue",
"37e7ee311e": "Clave",
"b7bae28b6a": "mostrado",
"a26a48252e": "Propiedades de visualización",
"5d2d835467": "Orden",
"5659da12fc": "Agrupación",
@@ -2270,8 +2287,6 @@
"054bf695cc": "Borrador",
"5b6b2af943": "Reintentando…",
"0c0de0fc0e": "No se pudieron cargar los issues de",
"d1766fd62d": "los proyectos no pudieron cargarse",
"7762f4b03a": "de",
"443f7dd928": "Merge",
"a7396b05c6": "Checks",
"f6fa3c97d0": "Revisores",
@@ -2453,10 +2468,41 @@
"jiraColumnOriginalEstimate": "Estimación",
"jiraColumnRemainingEstimate": "Restante",
"jiraBoardEmptyColumn": "Sin incidencias",
"labelCountPlural": "{{count}} etiquetas",
"labelCountSingular": "{{count}} etiqueta",
"memberCountPlural": "{{count}} miembros",
"memberCountSingular": "{{count}} miembro"
"backToPullRequests": "Pull requests",
"backToGitHubList": "Lista de GitHub",
"noGitHubRepositoryContext": "No hay contexto de repositorio de GitHub disponible para este issue.",
"filingInTarget": "Se creará en {{target}}",
"filingInThisRepository": "Se creará en este repositorio",
"shortcutToSubmit": "{{shortcut}} para enviar.",
"projectsFailedToLoad_one": "Error al cargar proyectos: {{failed}} de {{count}}",
"projectsFailedToLoad_other": "Error al cargar proyectos: {{failed}} de {{count}}",
"draftPullRequestNumber": "Pull request en borrador #{{number}}",
"pullRequestNumber": "Pull request #{{number}}",
"issueNumber": "Issue #{{number}}",
"loadGitHubWorkFailed": "No se pudo cargar el trabajo de GitHub.",
"gitlabViewIssues": "Issues",
"gitlabViewMrs": "MRs",
"gitlabViewTodos": "Mis tareas pendientes",
"startWorkspaceFromMr": "Iniciar espacio de trabajo desde MR {{number}}",
"startWorkspaceFromIssue": "Iniciar espacio de trabajo desde issue {{number}}",
"shownCount_one": "{{count}} mostrado",
"shownCount_other": "{{count}} mostrados",
"linearProjectPlaceholder": "Proyecto",
"labelCount_one": "{{count}} etiqueta",
"labelCount_other": "{{count}} etiquetas",
"memberCount_one": "{{count}} miembro",
"memberCount_other": "{{count}} miembros",
"groupUnassigned": "Sin asignar",
"linearProjectContext": "Proyecto: {{name}}",
"linearViewContext": "Vista: {{name}}",
"changedFileCount_one": "{{count}} archivo",
"changedFileCount_other": "{{count}} archivos",
"resumeRestoration": {
"linearProjectNotFound": "No se encontró el proyecto de Linear guardado.",
"linearProjectRestoreFailed": "No se pudo restaurar el proyecto de Linear guardado.",
"linearViewNotFound": "No se encontró la vista de Linear guardada.",
"linearViewRestoreFailed": "No se pudo restaurar la vista de Linear guardada."
}
},
"Terminal": {
"73768427cf": "Cerrar",
@@ -2531,7 +2577,8 @@
"b1e390250d": "No se pudo completar el cambio de compilación local.",
"d29740d175": "La compilación seleccionada no pudo ser usada.",
"37d45c9ec1": "Elegir otra compilación",
"7f1a4c9e02": "Tu gestor de paquetes del sistema instaló Orca, así que actualízalo desde allí; Orca no puede instalar esta versión por sí mismo."
"7f1a4c9e02": "Tu gestor de paquetes del sistema instaló Orca, así que actualízalo desde allí; Orca no puede instalar esta versión por sí mismo.",
"compatibilityModeFailed": "No se pudo activar el modo de compatibilidad. {{message}}"
},
"WorktreeJumpPalette": {
"ac037cfac2": "Mover",
@@ -2557,8 +2604,6 @@
"d7d496a451": "La página del navegador ya no existe",
"50a1d11d5b": "Pestañas abiertas",
"088d66d980": "Acciones y ajustes",
"20af998bff": "{{value0}} elementos disponibles{{value1}}",
"bb72c08e63": "{{value0}} resultados encontrados{{value1}}",
"34c8fbb46e": "SSH remoto",
"63c2be1914": "SSH desconectado",
"95be6587d3": "Crear worktree \"{{value0}}\"",
@@ -2575,7 +2620,12 @@
"27f10cca63": "Busca chats, terminales, espacios de trabajo, tareas, ajustes y acciones...",
"2770f02910": "Busca chats, terminales, espacios de trabajo, tareas, ajustes y acciones",
"recentChatsTerminalsHeader": "Chats y terminales recientes",
"lastActiveTime": "Última actividad hace {{value0}}"
"lastActiveTime": "Última actividad hace {{value0}}",
"resultsFound_one": "{{count}} resultado encontrado.",
"resultsFound_other": "{{count}} resultados encontrados.",
"itemsAvailable_one": "{{count}} elemento disponible.",
"itemsAvailable_other": "{{count}} elementos disponibles.",
"createActionAvailable": "Acción para crear un worktree disponible."
},
"github": {
"pr": {
@@ -2877,11 +2927,6 @@
}
}
},
"priority": {
"icon": {
"c43d3e065b": "Prioridad:"
}
},
"project": {
"view": {
"surfaces": {
@@ -2900,7 +2945,6 @@
"c8db98b73b": "Recursos",
"bb1405eff8": "Hitos",
"5d99315fb8": "Planificación",
"3ad562bdf4": "issues con alcance",
"563501f191": "Progreso",
"bb5664d456": "Sin descripción del proyecto.",
"7b147907dc": "Linear",
@@ -2925,7 +2969,10 @@
"df4bd63c1d": "No asignado",
"30402d2c6e": "Intenta buscar o actualizar.",
"a2f31c4cd6": "No se encontraron proyectos de Linear",
"c9b6e9f90d": "No se pueden cargar proyectos de Linear"
"c9b6e9f90d": "No se pueden cargar proyectos de Linear",
"scopedIssueCount_one": "{{count}} issue en el ámbito seleccionado",
"scopedIssueCount_other": "{{count}} issues en el ámbito seleccionado",
"backlog": "Backlog"
}
}
},
@@ -2938,7 +2985,14 @@
"05baa5ae90": "Espacio de trabajo",
"89f6580dbf": "Buscar equipos...",
"b3488fad3c": "No se obtuvo ningún equipo. El acceso puede depender del scope de la clave, membresía en equipos privados, equipos archivados, permisos o un error al obtener datos.",
"405b33c378": "Ningún equipo obtenido coincide con tu búsqueda."
"405b33c378": "Ningún equipo obtenido coincide con tu búsqueda.",
"teamCount_one": "{{count}} equipo",
"teamCount_other": "{{count}} equipos"
}
},
"priority": {
"icon": {
"priorityValue": "Prioridad: {{label}}"
}
}
},
@@ -6322,7 +6376,11 @@
"e8f25bd903": "No se pudo completar la limpieza del terminal.",
"a702d4196e": "Esto cierra cada pestaña de terminal en todos los espacios de trabajo y solicita el apagado de sus sesiones de terminal actuales. Cualquier trabajo de terminal no guardado se pierde. El daemon en sí continúa ejecutándose y se pueden abrir terminales nuevas inmediatamente. Esta acción no se puede deshacer.",
"01d6b7c64e": "Las terminales abiertas y los agentes se reiniciarán. Los terminales en hosts remotos no se ven afectados.",
"922548bc66": "¿Reiniciar el servicio de terminal?"
"922548bc66": "¿Reiniciar el servicio de terminal?",
"confirmRestart": "Reiniciar",
"busyRestarting": "Reiniciando…",
"confirmKillAll": "Terminar todas las sesiones",
"busyKilling": "Terminando…"
},
"MacFolderAccessFixDialog": {
"stepAllow": "Permitir Orca en Archivos y Carpetas",
@@ -14131,11 +14189,11 @@
"a2f68645ac": "Actualizar la cuota de la API de GitLab",
"2f9c16d6c3": "Orca usa REST a través de la CLI de GitLab.",
"14e144f7a7": "Cuota de la API de GitLab",
"3e2c982cfa": "restantes, se restablece en",
"ea8ad0bae8": "de",
"0a891e8935": "API REST",
"953f7c6062": "Este host de GitLab no devolvió cabeceras de rate limit.",
"budget_scope_prefix": "Ámbito de la cuota"
"budget_scope_prefix": "Ámbito de la cuota",
"resetUnknown": "desconocido",
"remainingOfLimit": "Quedan {{remaining}} de {{limit}}, se restablece en {{reset}}"
}
}
}
@@ -16064,7 +16122,21 @@
"b09b2384fd": "En pausa",
"eaa02014f8": "Activado",
"29baf8f4c2": "Source",
"lastRunFailed": "La última ejecución falló."
"lastRunFailed": "La última ejecución falló.",
"noGrace": "Sin período de gracia",
"graceMinutes_one": "{{count}} minuto",
"graceMinutes_other": "{{count}} minutos",
"graceHours_one": "{{count}} hora",
"graceHours_other": "{{count}} horas",
"usageCoverageRuns_one": "{{known}}/{{count}} ejecución",
"usageCoverageRuns_other": "{{known}}/{{count}} ejecuciones",
"usageUnavailable": "No disponible",
"noRuns": "Sin ejecuciones",
"projectDefault": "Predeterminado del proyecto",
"reuseLiveSession": "Reutilizar sesión activa",
"freshEachRun": "Nueva en cada ejecución",
"precheckEnabled": "Activada, {{timeout}}",
"precheckNone": "Ninguna"
},
"AutomationEditorDialog": {
"fb1896a5e7": "Cancelar",
@@ -16165,11 +16237,8 @@
"2faecab10b": "Ejecutar ahora",
"13118faadf": "Proyecto desconocido",
"73f630b49d": "Cancelar",
"1b586f0e2b": "en",
"02a33e3204": "de",
"9adfab2596": "Eliminar automatización externa",
"1e2e41392f": "no vuelvas a preguntar",
"b264564427": "y su historial de ejecución. Los espacios de trabajo creados por ejecuciones anteriores no se eliminan.",
"080dcb5fbb": "Eliminar automatización",
"19a6e30eae": "Actualizar automatizaciones",
"77c2778945": "Automatizaciones",
@@ -16204,7 +16273,6 @@
"pendingAutomationRunMissing": "El historial de ejecuciones ya no está disponible.",
"paused": "Pausada",
"missingWorkspace": "Espacio de trabajo ausente",
"runUsageSummary": "{{cost}} aprox. · {{tokens}} tokens",
"usageUnavailable": "Uso no disponible",
"noRunUsageYet": "Aún no hay uso de ejecución",
"noWorkspace": "Sin espacio de trabajo",
@@ -16219,7 +16287,11 @@
"rowActions": "Acciones de automatización",
"tableLastRun": "Última ejecución",
"ownerChanged": "Esta automatización cambió de host. Actualiza e inténtalo de nuevo.",
"runError": "Error:"
"runError": "Error:",
"deleteAutomationDescription": "Eliminar <name/> y su historial de ejecuciones. No se eliminarán los espacios de trabajo creados por ejecuciones anteriores.",
"deleteExternalAutomationDescription": "Eliminar <name/> de <provider/> en <host/>.",
"runUsageSummaryTokens_one": "{{cost}} aprox. · {{tokens}} token",
"runUsageSummaryTokens_other": "{{cost}} aprox. · {{tokens}} tokens"
},
"CreateFromPicker": {
"f061f49e3f": "Buscar ramas del repositorio...",
@@ -16246,8 +16318,8 @@
"92405f1431": "Indisponible",
"dbdcec22bd": "Sólo lectura",
"0a2d4359a8": "Manejable",
"e2532150ed": "automatizaciones",
"701515f010": "automatización"
"automationCount_one": "{{count}} automatización",
"automationCount_other": "{{count}} automatizaciones"
},
"WorkspaceCombobox": {
"ee5b280eba": "No se encontraron espacios de trabajo.",
@@ -16299,7 +16371,8 @@
"last": {
"run": {
"done": "Hecho",
"failed": "Fallido"
"failed": "Fallido",
"statusWithRelative": "{{status}} · {{relative}}"
}
}
}
@@ -16455,15 +16528,12 @@
},
"externalScope": {
"uncheckedHost": "No se pudieron comprobar los gestores de automatizaciones externas en {{hostLabel}}.",
"uncheckedHosts": "No se pudieron comprobar los gestores de automatizaciones externas en {{count}} hosts."
"uncheckedHostCount_one": "No se pudieron comprobar los gestores de automatizaciones externos en {{count}} host.",
"uncheckedHostCount_other": "No se pudieron comprobar los gestores de automatizaciones externos en {{count}} hosts."
},
"enablement": {
"paused": "En pausa"
},
"runHistory": {
"occurrencesWithLatest": "{{times}} veces, la más reciente {{date}}",
"occurrences": "{{times}} veces"
},
"extraAgentArgs": {
"advanced": "Avanzado",
"clear": "Borrar argumentos",
@@ -16473,6 +16543,71 @@
"useFreshSessions": "Usar sesiones nuevas",
"helper": "Se añaden a los argumentos predeterminados de este host en cada sesión nueva.",
"detailLabel": "Argumentos adicionales"
},
"runHistory": {
"runCountSummary_one": "{{count}} ejecución · completadas: {{completed}}",
"runCountSummary_other": "{{count}} ejecuciones · completadas: {{completed}}",
"occurrencesWithLatestCount_one": "{{count}} vez, la última el {{date}}",
"occurrencesWithLatestCount_other": "{{count}} veces, la última el {{date}}",
"occurrencesCount_one": "{{count}} vez",
"occurrencesCount_other": "{{count}} veces"
},
"capabilityProbe": {
"createIdempotencyUpdateRequired": "Mover automatizaciones a este host requiere un servidor de Orca más reciente. Actualiza el HUB y vuelve a intentarlo."
},
"editDraft": {
"unsupportedSchedule": "Esta automatización tiene una programación guardada no compatible. Elige una programación compatible antes de guardar los cambios."
},
"hostCatalog": {
"orphanEntryLabel": "Automatizaciones antiguas sin asignar"
},
"automationPageParts": {
"never": "Nunca",
"now": "ahora mismo",
"runStatusPending": "En cola",
"runStatusDispatching": "Iniciando",
"runStatusDispatched": "Iniciada",
"runStatusCompleted": "Completada",
"runStatusSkippedPrecheck": "Omitida por verificación previa",
"runStatusSkippedMissed": "Omitida",
"runStatusSkippedUnavailable": "No disponible",
"runStatusSkippedNeedsInteractiveAuth": "Requiere credenciales",
"runStatusDispatchFailed": "Fallida"
},
"runContent": {
"noOutput": "No hay contenido de salida disponible."
},
"runViewState": {
"viewRun": "Ver ejecución",
"runOpen": "La ejecución está abierta",
"terminalOnPairedServer": "El terminal de la ejecución está en el servidor vinculado.",
"terminalUnavailable": "El terminal de la ejecución no está disponible.",
"openWorkspace": "Abrir espacio de trabajo",
"workspaceAvailable": "El espacio de trabajo está disponible.",
"snapshotSaved": "Instantánea guardada",
"showingSnapshot": "Mostrando la instantánea guardada de la ejecución.",
"namedWorkspaceGone": "{{name}} ya no está disponible",
"workspaceGone": "El espacio de trabajo ya no está disponible",
"noWorkspaceLaunched": "No se inició ningún espacio de trabajo"
},
"runWorkspaceDisplay": {
"notLaunched": "No iniciado",
"namedWorkspaceGone": "{{name}} (ya no disponible)"
},
"usage": {
"tokensAndCost_one": "{{tokens}} token · {{cost}}",
"tokensAndCost_other": "{{tokens}} tokens · {{cost}}"
},
"externalDisplay": {
"sshHost": "Host SSH",
"local": "Local"
},
"externalActionDisabled": {
"actionInProgress": "Otra acción de automatización sigue en ejecución.",
"sshConnecting": "Espera a que este host SSH termine de conectarse.",
"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."
}
},
"agent": {
@@ -16613,8 +16748,6 @@
"63ce735809": "Conectar",
"4a2ab52781": "Verificando…",
"79e7aaed39": "Cancelar",
"fdd26d81cc": "Ajustes de cuenta de Atlassian",
"8090504a3e": "Crea un token en",
"7b3967c12f": "Token API de Atlassian",
"3d81bf3ab3": "Token de API",
"e91b9a4073": "you@example.com",
@@ -16639,7 +16772,8 @@
"be9eba0a1b": "username",
"70035652d7": "Password",
"c50abbf340": "Jira account password",
"d8737db691": "Usa el nombre de usuario y la contraseña de tu cuenta de Jira Server o Data Center."
"d8737db691": "Usa el nombre de usuario y la contraseña de tu cuenta de Jira Server o Data Center.",
"createTokenInSettings": "Crea un token en la <link>configuración de tu cuenta de Atlassian</link>."
}
}
},
@@ -16748,10 +16882,11 @@
"combobox": {
"noProjects": "Sin proyectos",
"allProjects": "Todos los proyectos",
"hostCount": "{{value0}} hosts",
"searchProjects": "Buscar proyectos...",
"noMatches": "Ningún proyecto coincide con tu búsqueda.",
"chooseSource": "Elige el origen de tareas"
"chooseSource": "Elige el origen de tareas",
"hostCount_one": "{{count}} host",
"hostCount_other": "{{count}} hosts"
}
}
},
@@ -16788,7 +16923,35 @@
"taskSourceContextSummary": {
"sourceUnavailable": "Origen {{value0}} no disponible: {{value1}}",
"someSourceHostsUnavailable": "Algunos hosts de origen de {{value0}} no están disponibles: {{value1}}",
"reconnectOrUpdateTitle": "Reconecta o actualiza {{value0}} para cargar este origen."
"reconnectOrUpdateTitle": "Reconecta o actualiza {{value0}} para cargar este origen.",
"providerSourceTitle": "Fuente de {{provider}}",
"hostTitle": "Host: {{hosts}}",
"accountTitle": "Cuenta: {{accounts}}",
"sourceTitle": "Fuente: {{source}}",
"sourceHostCount_one": "{{count}} host de origen",
"sourceHostCount_other": "{{count}} hosts de origen",
"noHost": "Sin host",
"projectCount_one": "{{count}} proyecto",
"projectCount_other": "{{count}} proyectos",
"selectedProject": "Proyecto seleccionado",
"selectedProjectCount_one": "{{count}} proyecto seleccionado",
"selectedProjectCount_other": "{{count}} proyectos seleccionados",
"currentAccount": "Cuenta actual",
"statusCheckingCapabilities": "comprobando capacidades del servidor",
"statusServerUpdateForTaskSources": "requiere actualizar el servidor para las fuentes de tareas",
"statusProviderAuthNeeded": "requiere autenticación del proveedor",
"statusSourceToolUnavailable": "herramienta de origen no disponible",
"statusProviderUnsupported": "proveedor no compatible con este host",
"statusServerUpdateNeeded": "requiere actualizar el servidor",
"unavailableCount_one": "{{count}} no disponible",
"unavailableCount_other": "{{count}} no disponibles",
"statusConnected": "conectado",
"statusAuthNeeded": "requiere autenticación",
"statusConnecting": "conectando",
"statusConnectionIssue": "problema de conexión",
"statusDisconnected": "desconectado",
"hostStatus": "{{host}} {{status}}",
"availabilityTitle": "Disponibilidad: {{hosts}}"
},
"ShortcutKeyCombo": {
"07eb4985a1": "Doble toque en {{value0}}"
@@ -17032,20 +17195,12 @@
"noMatches": "No hay coincidencias."
},
"NativeChatResumeOnRestartModal": {
"notContinuedOne": "1 chat no pudo reanudarse",
"notContinuedMany": "{{value0}} chats no pudieron reanudarse",
"notConfirmedOne": "No se pudo confirmar que 1 chat se reanudó",
"notConfirmedMany": "No se pudo confirmar que {{value0}} chats se reanudaron",
"notConfirmedOtherOne": "No se pudo confirmar que 1 otro chat se reanudó",
"notConfirmedOtherMany": "No se pudo confirmar que {{value0}} otros chats se reanudaron",
"viewChats": "Ver chats",
"review": "Revisar",
"activityApproval": "Esperando tu aprobación: {{value0}}",
"activityMidReply": "Estaba respondiendo",
"activityMonitorMany": "Supervisando {{value0}} tareas en segundo plano",
"activityMonitorOne": "Supervisando: {{value0}}",
"activityQuestion": "Esperando tu respuesta: {{value0}}",
"activitySubagentMany": "{{value0}} subagentes en ejecución",
"activitySubagentOne": "Subagente en ejecución: {{value0}}",
"activityUnnamed": "sin nombre",
"updateBody": "Estos chats estaban trabajando cuando Orca instaló una actualización. Al reanudarlos, cada uno se restaura donde se detuvo, con su contexto completo, y se pide al agente que revise lo que estaba haciendo antes de continuar. Tu propio prompt no se vuelve a enviar.",
@@ -17056,8 +17211,6 @@
"listLabel": "Chats que se reanudarían",
"dontAskAgain": "No volver a preguntar (reanudar automáticamente)",
"dontAskAgainHint": "Puedes desactivarlo en Ajustes → Chat → Comportamiento.",
"continuedOne": "Se reanudó 1 chat",
"continuedMany": "Se reanudaron {{value0}} chats",
"selectAgent": "Reanudar {{value0}} chat \"{{value1}}\" en {{value2}}",
"dismissAll": "Descartar todo",
"selectWorkspace": "Seleccionar todos los chats en {{value0}}",
@@ -17076,10 +17229,22 @@
"serverBody": "Estos chats estaban trabajando cuando Orca se reinició en {{machine}}. Al reanudarlos, cada uno se restaura donde se detuvo y se le pide al agente que continúe. Tu propio prompt no se vuelve a enviar.",
"serverDismiss": "Descartar",
"serverResumeAll": "Reanudar los {{count}} en {{machine}}",
"serverResumeHereOne": "Reanudar 1 chat iniciado aquí",
"serverResumeHere": "Reanudar {{count}} chats iniciados aquí",
"resumeChats_one": "Reanudar {{count}} chat",
"resumeChats_other": "Reanudar {{count}} chats"
"resumeChats_other": "Reanudar {{count}} chats",
"serverResumeHereCount_one": "Reanudar {{count}} chat iniciado aquí",
"serverResumeHereCount_other": "Reanudar {{count}} chats iniciados aquí",
"continuedCount_one": "{{count}} chat reanudado",
"continuedCount_other": "{{count}} chats reanudados",
"notContinuedCount_one": "No se pudo reanudar {{count}} chat",
"notContinuedCount_other": "No se pudieron reanudar {{count}} chats",
"notConfirmedCount_one": "No se pudo confirmar la reanudación de {{count}} chat",
"notConfirmedCount_other": "No se pudo confirmar la reanudación de {{count}} chats",
"notConfirmedOtherCount_one": "No se pudo confirmar la reanudación de {{count}} chat más",
"notConfirmedOtherCount_other": "No se pudo confirmar la reanudación de {{count}} chats más",
"activitySubagentCount_one": "{{count}} subagente en ejecución",
"activitySubagentCount_other": "{{count}} subagentes en ejecución",
"activityMonitorCount_one": "Supervisando {{count}} tarea en segundo plano",
"activityMonitorCount_other": "Supervisando {{count}} tareas en segundo plano"
},
"NativeChatResumeOutcomeRow": {
"openChat": "Abrir chat",
@@ -17235,15 +17400,15 @@
"description": "Orca ocultará los detalles de {{value0}} {{value1}} en este espacio de trabajo. El {{value0}} y la rama en {{value2}} no se modificarán."
},
"NativeChatResumeRunPanel": {
"resumedTitle": "Se reanudaron {{value0}} de {{value1}} chats",
"resumedTitleOne": "{{value0}} de 1 chat reanudado",
"resumingTitleOne": "Reanudando 1 chat",
"resumingTitle": "Reanudando {{value0}} chats",
"description": "Cada chat se restaura con todo su contexto y se le pide que revise dónde se detuvo. Puedes cerrar esto; la barra de estado sigue el progreso.",
"finished": "Estos chats estaban trabajando cuando Orca se cerró. Orca restauró cada uno donde se detuvo, con todo su contexto, y pidió al agente que revisara lo que estaba haciendo antes de continuar. Tus propios mensajes no se reenviaron.",
"finishedUpdate": "Estos chats estaban trabajando cuando Orca instaló una actualización. Orca restauró cada uno donde se detuvo, con todo su contexto, y pidió al agente que revisara lo que estaba haciendo antes de continuar. Tus propios mensajes no se reenviaron.",
"finishedPartial": "Estos chats estaban trabajando cuando Orca se cerró. Los que Orca reanudó se restauraron donde se detuvieron, con todo su contexto, y se les pidió revisar lo que estaban haciendo antes de continuar. Tus propios mensajes no se reenviaron. Consulta la lista para ver los chats que aún necesitan atención o que se pueden reanudar.",
"finishedPartialUpdate": "Estos chats estaban trabajando cuando Orca instaló una actualización. Los que Orca reanudó se restauraron donde se detuvieron, con todo su contexto, y se les pidió revisar lo que estaban haciendo antes de continuar. Tus propios mensajes no se reenviaron. Consulta la lista para ver los chats que aún necesitan atención o que se pueden reanudar."
"finishedPartialUpdate": "Estos chats estaban trabajando cuando Orca instaló una actualización. Los que Orca reanudó se restauraron donde se detuvieron, con todo su contexto, y se les pidió revisar lo que estaban haciendo antes de continuar. Tus propios mensajes no se reenviaron. Consulta la lista para ver los chats que aún necesitan atención o que se pueden reanudar.",
"resumedOfTotal_one": "Chats reanudados: {{resumed}} de {{count}}",
"resumedOfTotal_other": "Chats reanudados: {{resumed}} de {{count}}",
"resumingCount_one": "Reanudando {{count}} chat",
"resumingCount_other": "Reanudando {{count}} chats"
},
"NativeChatResumeRunStatusIcon": {
"waitingForReply": "Esperando respuesta",
@@ -17293,6 +17458,72 @@
"copyFailed": "No se pudo copiar el enlace.",
"signingIn": "Iniciando sesión…",
"cancel": "Cancelar"
},
"AgentStateDot": {
"working": "Trabajando",
"monitoring": "Supervisando tareas en segundo plano",
"blocked": "Bloqueado",
"waiting": "Esperando entrada",
"interrupted": "Interrumpido",
"failed": "Fallido",
"done": "Completado",
"idle": "Inactivo",
"unverifiable": "Sin actualización reciente",
"unconfirmed": "No se pudo confirmar",
"permission": "Requiere atención"
},
"issueComments": {
"you": "Tú"
},
"ZoomOverlay": {
"uiZoom": "Zoom de la interfaz",
"editorZoom": "Zoom del editor",
"terminalZoom": "Zoom del terminal"
},
"issueCopy": {
"urlCopied": "URL copiada",
"keyCopied": "Clave copiada",
"identifierCopied": "Identificador copiado",
"branchNameCopied": "Nombre de rama copiado",
"promptCopied": "Prompt copiado",
"urlCopyFailed": "No se pudo copiar la URL",
"keyCopyFailed": "No se pudo copiar la clave",
"identifierCopyFailed": "No se pudo copiar el identificador",
"branchNameCopyFailed": "No se pudo copiar el nombre de rama",
"promptCopyFailed": "No se pudo copiar el prompt"
},
"prCheckCounts": {
"noChecksFound": "No se encontraron verificaciones",
"checksFailing_one": "{{count}} verificación fallida",
"checksFailing_other": "{{count}} verificaciones fallidas",
"checksNeedAction_one": "{{count}} verificación requiere acción",
"checksNeedAction_other": "{{count}} verificaciones requieren acción",
"checksPending_one": "{{count}} verificación pendiente",
"checksPending_other": "{{count}} verificaciones pendientes",
"allChecksPassing": "Todas las verificaciones superadas",
"checksPassingOfTotal_one": "Verificaciones superadas: {{passing}} de {{count}}",
"checksPassingOfTotal_other": "Verificaciones superadas: {{passing}} de {{count}}"
},
"taskPageJiraBoard": {
"changeStatusFailed": "No se pudo cambiar el estado."
},
"jiraIssue": {
"loadStatusChangesFailed": "No se pudieron cargar los cambios de estado.",
"loadCommentsFailed": "No se pudieron cargar los comentarios."
},
"taskPageJiraLinkedIssues": {
"someIssuesFailed": "No se pudieron cargar algunas incidencias de Jira vinculadas a espacios de trabajo. Actualiza para volver a intentarlo."
},
"taskPageJiraLoadState": {
"failedToLoadIssues": "No se pudieron cargar las incidencias de Jira.",
"authFailed": "Falló la autenticación de Jira. Reconecta Jira en Ajustes y vuelve a intentarlo.",
"accessDenied": "Jira denegó el acceso a esta búsqueda de incidencias. Comprueba los permisos del proyecto o prueba otra consulta JQL.",
"rateLimited": "Jira limitó esta búsqueda de incidencias por exceso de solicitudes. Vuelve a intentarlo en un momento.",
"serverError": "Jira tuvo un error de servidor al cargar las incidencias. Vuelve a intentarlo en un momento.",
"jqlFailed": "Jira no pudo ejecutar esta consulta JQL. Comprueba la sintaxis y vuelve a intentarlo.",
"unreachable": "No se pudo contactar con Jira. Comprueba tu conexión y vuelve a intentarlo.",
"loadFailed": "No se pudieron cargar las incidencias de Jira. Vuelve a intentarlo en un momento.",
"errorWithCode": "Error {{code}}: {{summary}}"
}
},
"i18n": {
@@ -19273,9 +19504,9 @@
"pathAdded": "Added",
"openFolder": "Open {{name}}",
"findOrTypePath": "Busque una carpeta o escriba cualquier ruta...",
"addTypedPath": "Add",
"noDirectories": "Aún no se han agregado carpetas.",
"removePath": "Remove {{name}}"
"removePath": "Remove {{name}}",
"addTypedPathCode": "Agregar <path/>"
},
"editor": {
"markdownPreview": {
@@ -19393,13 +19624,10 @@
"running": "en ejecución"
},
"settingAsk": "Preguntar",
"bodyOther": "{{count}} sesiones de Claude siguen en ejecución con {{previous}}. Al reiniciarlas, cada conversación continúa con {{next}}. Las sesiones ocupadas esperan a estar inactivas antes de reiniciarse.",
"bodyOne": "1 sesión de Claude sigue en ejecución con {{previous}}. Al reiniciarla, la conversación continúa con {{next}}. Las sesiones ocupadas esperan a estar inactivas antes de reiniciarse.",
"dontAskAgain": "No volver a preguntar (se reinicia automáticamente)",
"restartOne": "Reiniciar sesión",
"title": "Cambiado a {{account}}",
"keep": "Mantener como está",
"restartOther": "Reiniciar {{count}} sesiones",
"listLabel": "Sesiones de Claude que se reiniciarán",
"dontAskAgainHint": "Puede desactivar esto en Configuración → Cuentas de proveedores de IA.",
"session": "Sesión de Claude",
@@ -19417,13 +19645,17 @@
"reasonOwnFolder": "Usa tu propia carpeta de Claude",
"reasonUnknownAccount": "Cuenta desconocida",
"reasonNoSession": "No se puede reanudar",
"reviewBodyOne": "Otra sesión de Claude no se movió a {{next}}.",
"reviewBodyOther": "Otras {{count}} sesiones de Claude no se movieron a {{next}}.",
"notMovedOne": "Otra sesión no se movió.",
"notMovedOther": "Otras {{count}} sesiones no se movieron.",
"review": "Revisar",
"uncheckedOne": "No se pudo comprobar si Claude se ejecuta en 1 terminal. Si Claude se está ejecutando allí, seguirá usando {{previous}} hasta que se reinicie.",
"uncheckedOther": "No se pudo comprobar si Claude se ejecuta en {{count}} terminales. Cualquier Claude que se esté ejecutando allí seguirá usando {{previous}} hasta que se reinicie."
"uncheckedOther": "No se pudo comprobar si Claude se ejecuta en {{count}} terminales. Cualquier Claude que se esté ejecutando allí seguirá usando {{previous}} hasta que se reinicie.",
"restartCount_one": "Reiniciar {{count}} sesión",
"restartCount_other": "Reiniciar {{count}} sesiones",
"reviewBody_one": "No se trasladó {{count}} sesión más de Claude a {{next}}.",
"reviewBody_other": "No se trasladaron {{count}} sesiones más de Claude a {{next}}.",
"body_one": "{{count}} sesión de Claude sigue ejecutándose en {{previous}}. Al reiniciarla, la conversación continúa en {{next}}. Las sesiones ocupadas esperan a estar inactivas antes de reiniciarse.",
"body_other": "{{count}} sesiones de Claude siguen ejecutándose en {{previous}}. Al reiniciarlas, cada conversación continúa en {{next}}. Las sesiones ocupadas esperan a estar inactivas antes de reiniciarse."
}
},
"hostSignIn": {
@@ -20189,13 +20421,13 @@
"optionalEmail": "Email de Atlassian (opcional para tokens con alcance)"
},
"workspace": {
"count": "{{count}} espacios de trabajo vinculados a {{key}}",
"startAnother": "Iniciar un espacio de trabajo nuevo",
"empty": "Vincula una incidencia de Jira a un espacio de trabajo o elige otra vista.",
"openFailed": "No se pudo abrir el espacio de trabajo vinculado a esta incidencia de Jira.",
"mode": "Con espacio de trabajo",
"search": "Buscar incidencias vinculadas",
"single": "1 espacio de trabajo vinculado a {{key}}"
"linkedCount_one": "{{count}} espacio de trabajo vinculado a {{key}}",
"linkedCount_other": "{{count}} espacios de trabajo vinculados a {{key}}"
},
"prompt": {
"dialogTitle": "Copiar prompt desde plantilla",
@@ -20580,7 +20812,8 @@
"email": "Conocer tu dirección de correo electrónico",
"allSites": "Leer y cambiar todos tus datos en todos los sitios web",
"someSites": "Leer y cambiar tus datos en {{hosts}}",
"manySites": "Leer y cambiar tus datos en {{hosts}} y en otros {{count}} sitios"
"manyOtherSites_one": "Leer y cambiar tus datos en {{hosts}} y {{count}} sitio más",
"manyOtherSites_other": "Leer y cambiar tus datos en {{hosts}} y {{count}} sitios más"
},
"install": {
"title": "¿Agregar {{name}}?",
+321 -88
View File
@@ -1965,14 +1965,11 @@
"69da9a208c": "Ouvrir dans Jira",
"fa132c8aed": "Échec de l'ajout du commentaire.",
"ea21952aa3": "Échec de la mise à jour du ticket Jira.",
"6c41a9bcea": "Échec de la copie : {{value0}}",
"2ff69a3545": "{{value0}} copié",
"666cfdd835": "Inconnu",
"ef21405c6d": "Ticket Jira",
"commentTooLarge": "Le commentaire est trop volumineux pour être envoyé sans risque."
},
"Landing": {
"76a95f7f47": "Créer",
"f9eaa9e12d": "Ajouter un projet",
"6ca6ff404e": "ORCA",
"520304a067": "Logo Orca",
@@ -1988,7 +1985,12 @@
"0d0ace8861": "Mettre une étoile sur GitHub",
"ec43b38ba7": "Étoile ajoutée sur GitHub",
"157bb5ecbb": "Ouvrir GitHub",
"preflightDismiss": "Ignorer"
"preflightDismiss": "Ignorer",
"moveUpWorkspace": "Sélectionner l’espace de travail précédent",
"moveDownWorkspace": "Sélectionner l’espace de travail suivant",
"installGit": "Installer Git",
"installGitHubCli": "Installer GitHub CLI",
"learnMore": "En savoir plus"
},
"LinearIssueMarkdownDescriptionEditor": {
"d9c47069ef": "Markdown",
@@ -2019,7 +2021,6 @@
"ad5dec37b7": "Prévisualisez, modifiez et démarrez le travail depuis le ticket sélectionné.",
"c23e79e5c0": "Actions",
"b0eac92d85": "Réessayer",
"fabbd3f974": "a mis à jour le ticket ·",
"543970c87a": "Activité",
"df4c86ed12": "Fermer",
"7a4997d8bb": "Fermer l'aperçu du ticket Linear",
@@ -2043,11 +2044,8 @@
"b25e453c9d": "Échec de la création du sous-ticket",
"aeed19d003": "{{value0}} créé",
"9a1317cdd3": "Échec du chargement du sous-ticket",
"9bcbaa2737": "Échec de la copie : {{value0}}",
"7835483c43": "{{value0}} copié",
"61f424f8ca": "Ticket Linear",
"ca8778c124": "Inconnu",
"8a33c85e9c": "Quelqu'un",
"65239a714b": "Linear",
"76ffd3c937": "Recherchez un projet à ajouter.",
"c11b4e3cc2": "Aucun projet trouvé.",
@@ -2058,7 +2056,10 @@
"moreWorkspaceActions": "Plus d'actions d'espace de travail pour l'issue",
"startNewWorkspace": "Démarrer un nouvel espace de travail",
"workspaceSection": "Espace de travail",
"noWorkspaceYet": "Aucun pour l'instant"
"noWorkspaceYet": "Aucun pour l'instant",
"issueDescriptionLabel": "Description de l’issue",
"namedUserUpdatedIssue": "{{name}} a mis à jour l’issue · {{time}}",
"someoneUpdatedIssue": "Quelqu’un a mis à jour l’issue · {{time}}"
},
"LinearItemDrawer": {
"04008e6c46": "Démarrer un espace de travail à partir de l'issue",
@@ -2094,7 +2095,9 @@
"openAttachedWorkspace": "Ouvrir l'espace de travail associé à l'issue",
"openWorkspace": "Ouvrir l'espace de travail",
"moreWorkspaceActions": "Plus d'actions d'espace de travail pour l'issue",
"startNewWorkspace": "Démarrer un nouvel espace de travail"
"startNewWorkspace": "Démarrer un nouvel espace de travail",
"setEstimate": "Définir l’estimation",
"estimateValue": "Estimation {{estimate}}"
},
"NewWorkspaceComposerCard": {
"reuseExistingBranch": "Réutiliser la branche",
@@ -2156,7 +2159,22 @@
"addRemoteOrcaServer": "Ajouter un serveur Orca distant",
"addRemoteOrcaServerHint": "Appairer un autre runtime Orca",
"hostConnectionFailed": "Échec de la connexion",
"defaultBranchUpdateFailed": "Impossible de mettre à jour la branche par défaut du projet. Essayer à nouveau."
"defaultBranchUpdateFailed": "Impossible de mettre à jour la branche par défaut du projet. Essayer à nouveau.",
"connect": "Se connecter",
"reconnect": "Reconnecter",
"setupConfigDefaultTabs": "Commandes des onglets par défaut",
"setupConfigSetupAndDefaultTabs": "Setup et commandes des onglets par défaut",
"setupConfigSetupScript": "Script de setup",
"runDefaultTabCommands": "Exécuter les commandes des onglets par défaut",
"runSetupAndDefaultTabCommands": "Exécuter le setup et les commandes des onglets par défaut",
"runSetupCommand": "Exécuter la commande de setup",
"askRunDefaultTabCommands": "Exécuter les commandes des onglets par défaut maintenant ?",
"askRunSetupAndDefaultTabCommands": "Exécuter le setup et les commandes des onglets par défaut maintenant ?",
"askRunSetup": "Exécuter le setup maintenant ?",
"runSetupNow": "Exécuter le setup maintenant",
"runCommandsNow": "Exécuter les commandes maintenant",
"skipForNow": "Ignorer pour le moment",
"skipCommands": "Ignorer les commandes"
},
"NewWorkspaceComposerModal": {
"createWorktree": "Créer un worktree",
@@ -2335,9 +2353,12 @@
"9e97f08d0f": "Rechercher un fichier à ouvrir",
"ec31e058f7": "Accéder au fichier",
"73b44e7bde": "Copier la commande d'installation",
"b227d88520": "{{value0}} fichiers trouvés",
"995be8ea22": "Copier",
"cf144856dc": "Copied"
"cf144856dc": "Copied",
"filesFound_one": "{{count}} fichier trouvé",
"filesFound_other": "{{count}} fichiers trouvés",
"hostCouldNotOpenPath": "L’hôte n’a pas pu ouvrir ce chemin de fichier.",
"chooseFileNotDirectory": "Choisissez un fichier plutôt qu’un répertoire."
},
"SelectedTextCopyMenu": {
"9b40d7b018": "Copier"
@@ -2355,7 +2376,6 @@
"TaskPage": {
"ff69a30681": "Annuler",
"8ff6fdc368": "Création…",
"fc0d8a1fa4": "pour valider.",
"919a20dd5b": "Saisissez {{value0}}",
"56cdb413a2": "Valeurs séparées par des virgules",
"1f0fce91e3": "Sélectionner {{value0}}",
@@ -2403,11 +2423,9 @@
"bdebffcbfe": "Créez un projet Linear pour l'équipe sélectionnée.",
"1361275ec3": "Nouveau projet Linear",
"7f3f7b4c18": "Description (facultatif, markdown)",
"9f2b4c03a6": "Création dans",
"d3d0998b7d": "Nouveau ticket GitHub",
"6244a02f46": "Ouvrir dans Linear",
"606a85c774": "Ouvert",
"5e8061b088": "Démarrer un espace de travail depuis {{value0}} {{value1}}",
"592a55611b": "Essayez de sélectionner plus d'équipes ou d'actualiser ; les filtres d'équipe s'appliquent aux tickets déjà récupérés.",
"618107fab3": "Aucun ticket récupéré ne correspond aux équipes sélectionnées",
"903c7af49f": "Aucun ticket Linear trouvé",
@@ -2416,7 +2434,6 @@
"f362667d55": "Mis à jour",
"b1eaa18ace": "Issue",
"37e7ee311e": "Clé",
"b7bae28b6a": "affichés",
"a26a48252e": "Propriétés affichées",
"5d2d835467": "Tri",
"5659da12fc": "Regroupement",
@@ -2456,8 +2473,6 @@
"054bf695cc": "Brouillon",
"5b6b2af943": "Nouvelle tentative…",
"0c0de0fc0e": "Impossible de charger les tickets depuis",
"d1766fd62d": "projets n'ont pas pu être chargés",
"7762f4b03a": "sur",
"443f7dd928": "Merge",
"a7396b05c6": "Vérifications",
"f6fa3c97d0": "Reviewers",
@@ -2639,10 +2654,41 @@
"jiraColumnOriginalEstimate": "Estimation",
"jiraColumnRemainingEstimate": "Restant",
"jiraBoardEmptyColumn": "Aucune issue",
"labelCountPlural": "{{count}} labels",
"labelCountSingular": "{{count}} label",
"memberCountPlural": "{{count}} membres",
"memberCountSingular": "{{count}} membre"
"backToPullRequests": "Pull requests",
"backToGitHubList": "Liste GitHub",
"noGitHubRepositoryContext": "Aucun contexte de dépôt GitHub disponible pour cette issue.",
"filingInTarget": "Création dans {{target}}",
"filingInThisRepository": "Création dans ce dépôt",
"shortcutToSubmit": "{{shortcut}} pour envoyer.",
"projectsFailedToLoad_one": "Projets non chargés : {{failed}} sur {{count}}",
"projectsFailedToLoad_other": "Projets non chargés : {{failed}} sur {{count}}",
"draftPullRequestNumber": "Brouillon de pull request #{{number}}",
"pullRequestNumber": "Pull request #{{number}}",
"issueNumber": "Issue #{{number}}",
"loadGitHubWorkFailed": "Impossible de charger le travail GitHub.",
"gitlabViewIssues": "Issues",
"gitlabViewMrs": "MRs",
"gitlabViewTodos": "Mes tâches",
"startWorkspaceFromMr": "Démarrer un espace de travail depuis la MR {{number}}",
"startWorkspaceFromIssue": "Démarrer un espace de travail depuis l’issue {{number}}",
"shownCount_one": "{{count}} affiché",
"shownCount_other": "{{count}} affichés",
"linearProjectPlaceholder": "Projet",
"labelCount_one": "{{count}} label",
"labelCount_other": "{{count}} labels",
"memberCount_one": "{{count}} membre",
"memberCount_other": "{{count}} membres",
"groupUnassigned": "Non assigné",
"linearProjectContext": "Projet : {{name}}",
"linearViewContext": "Vue : {{name}}",
"changedFileCount_one": "{{count}} fichier",
"changedFileCount_other": "{{count}} fichiers",
"resumeRestoration": {
"linearProjectNotFound": "Le projet Linear enregistré est introuvable.",
"linearProjectRestoreFailed": "Impossible de restaurer le projet Linear enregistré.",
"linearViewNotFound": "La vue Linear enregistrée est introuvable.",
"linearViewRestoreFailed": "Impossible de restaurer la vue Linear enregistrée."
}
},
"Terminal": {
"73768427cf": "Fermer",
@@ -2717,7 +2763,8 @@
"b1e390250d": "Impossible de finaliser le basculement vers le build local.",
"d29740d175": "Le build sélectionné n'a pas pu être utilisé.",
"37d45c9ec1": "Choisir un autre build",
"7f1a4c9e02": "Votre gestionnaire de packages système a installé Orca, alors mettez-le à jour à partir de là – Orca ne peut pas installer cette version lui-même."
"7f1a4c9e02": "Votre gestionnaire de packages système a installé Orca, alors mettez-le à jour à partir de là – Orca ne peut pas installer cette version lui-même.",
"compatibilityModeFailed": "Impossible d’activer le mode de compatibilité. {{message}}"
},
"WorktreeJumpPalette": {
"ac037cfac2": "Déplacer",
@@ -2743,8 +2790,6 @@
"d7d496a451": "La page du navigateur n'existe plus",
"50a1d11d5b": "Onglets ouverts",
"088d66d980": "Actions et paramètres",
"20af998bff": "{{value0}} éléments disponibles{{value1}}",
"bb72c08e63": "{{value0}} résultats trouvés{{value1}}",
"34c8fbb46e": "Remote SSH",
"63c2be1914": "SSH déconnecté",
"95be6587d3": "Créer le worktree « {{value0}} »",
@@ -2761,7 +2806,12 @@
"recentChatsTerminalsHeader": "Chats et terminaux récents",
"27f10cca63": "Rechercher chats, terminaux, espaces de travail, tâches, paramètres et actions...",
"2770f02910": "Rechercher chats, terminaux, espaces de travail, tâches, paramètres et actions",
"lastActiveTime": "Dernière activité il y a {{value0}}"
"lastActiveTime": "Dernière activité il y a {{value0}}",
"resultsFound_one": "{{count}} résultat trouvé.",
"resultsFound_other": "{{count}} résultats trouvés.",
"itemsAvailable_one": "{{count}} élément disponible.",
"itemsAvailable_other": "{{count}} éléments disponibles.",
"createActionAvailable": "Action de création de worktree disponible."
},
"github": {
"pr": {
@@ -3063,11 +3113,6 @@
}
}
},
"priority": {
"icon": {
"c43d3e065b": "Priorité :"
}
},
"project": {
"view": {
"surfaces": {
@@ -3086,7 +3131,6 @@
"c8db98b73b": "Ressources",
"bb1405eff8": "Jalons",
"5d99315fb8": "Planification",
"3ad562bdf4": "issues du périmètre",
"563501f191": "Progression",
"bb5664d456": "Aucune description de projet.",
"7b147907dc": "Linear",
@@ -3111,7 +3155,10 @@
"df4bd63c1d": "Non assigné",
"30402d2c6e": "Essayez la recherche ou actualisez.",
"a2f31c4cd6": "Aucun projet Linear trouvé",
"c9b6e9f90d": "Impossible de charger les projets Linear"
"c9b6e9f90d": "Impossible de charger les projets Linear",
"scopedIssueCount_one": "{{count}} issue dans le périmètre",
"scopedIssueCount_other": "{{count}} issues dans le périmètre",
"backlog": "Backlog"
}
}
},
@@ -3124,7 +3171,14 @@
"05baa5ae90": "Espace de travail",
"89f6580dbf": "Rechercher des équipes...",
"b3488fad3c": "Aucune équipe n'a été récupérée. L'accès peut dépendre du périmètre de la clé, de l'appartenance à des équipes privées, d'équipes archivées, des permissions ou d'un échec de récupération.",
"405b33c378": "Aucune équipe récupérée ne correspond à votre recherche."
"405b33c378": "Aucune équipe récupérée ne correspond à votre recherche.",
"teamCount_one": "{{count}} équipe",
"teamCount_other": "{{count}} équipes"
}
},
"priority": {
"icon": {
"priorityValue": "Priorité : {{label}}"
}
}
},
@@ -6508,7 +6562,11 @@
"e8f25bd903": "Impossible de terminer le nettoyage des terminaux.",
"a702d4196e": "Ceci ferme tous les onglets de terminal de tous les espaces de travail et demande l'arrêt des sessions de terminal en cours. Tout travail non enregistré dans un terminal est perdu. Le daemon continue de tourner et de nouveaux terminaux peuvent être ouverts immédiatement. Cette action est irréversible.",
"01d6b7c64e": "Les terminaux ouverts et les agents redémarreront. Les terminaux sur les hôtes distants ne sont pas affectés.",
"922548bc66": "Redémarrer le service du terminal ?"
"922548bc66": "Redémarrer le service du terminal ?",
"confirmRestart": "Redémarrer",
"busyRestarting": "Redémarrage…",
"confirmKillAll": "Terminer toutes les sessions",
"busyKilling": "Arrêt…"
},
"MacFolderAccessFixDialog": {
"stepAllow": "Autoriser Orca sous Fichiers et dossiers",
@@ -14317,11 +14375,11 @@
"a2f68645ac": "Actualiser le quota de l'API GitLab",
"2f9c16d6c3": "Orca utilise REST via le CLI GitLab.",
"14e144f7a7": "Budget API GitLab",
"3e2c982cfa": "restants, réinitialisation dans",
"ea8ad0bae8": "sur",
"0a891e8935": "API REST",
"953f7c6062": "Cet hôte GitLab n'a pas renvoyé d'en-têtes de limite de débit.",
"budget_scope_prefix": "Périmètre du quota"
"budget_scope_prefix": "Périmètre du quota",
"resetUnknown": "inconnu",
"remainingOfLimit": "{{remaining}} sur {{limit}} restants, réinitialisation dans {{reset}}"
}
}
}
@@ -16221,7 +16279,21 @@
"eaa02014f8": "Activé",
"29baf8f4c2": "Source",
"host": "Hôte",
"lastRunFailed": "La dernière exécution a échoué."
"lastRunFailed": "La dernière exécution a échoué.",
"noGrace": "Pas de marge",
"graceMinutes_one": "{{count}} minute",
"graceMinutes_other": "{{count}} minutes",
"graceHours_one": "{{count}} heure",
"graceHours_other": "{{count}} heures",
"usageCoverageRuns_one": "{{known}}/{{count}} exécution",
"usageCoverageRuns_other": "{{known}}/{{count}} exécutions",
"usageUnavailable": "Indisponible",
"noRuns": "Aucune exécution",
"projectDefault": "Valeur par défaut du projet",
"reuseLiveSession": "Réutiliser la session active",
"freshEachRun": "Nouvelle à chaque exécution",
"precheckEnabled": "Activée, {{timeout}}",
"precheckNone": "Aucune"
},
"AutomationEditorDialog": {
"fb1896a5e7": "Annuler",
@@ -16325,11 +16397,8 @@
"2faecab10b": "Exécuter maintenant",
"13118faadf": "Projet inconnu",
"73f630b49d": "Annuler",
"1b586f0e2b": "activé",
"02a33e3204": "de",
"9adfab2596": "Supprimer l'automatisation externe",
"1e2e41392f": "Ne plus demander",
"b264564427": "et son historique d'exécution. Les espaces de travail créés par les exécutions précédentes ne sont pas supprimés.",
"080dcb5fbb": "Supprimer l'automatisation",
"19a6e30eae": "Actualiser les automatisations",
"77c2778945": "Automatisations",
@@ -16361,7 +16430,6 @@
"pendingAutomationRunMissing": "L'historique d'exécution n'est plus disponible.",
"paused": "En pause",
"missingWorkspace": "Espace de travail manquant",
"runUsageSummary": "{{cost}} estimés · {{tokens}} jetons",
"usageUnavailable": "Utilisation indisponible",
"noRunUsageYet": "Aucune utilisation d'exécution pour l'instant",
"noWorkspace": "Aucun espace de travail",
@@ -16379,7 +16447,11 @@
"moveOriginalUnverified": "Créé sur {host}, mais la suppression d'origine n'a pas pu être vérifiée. Vérifiez l'ancien hôte avant de réessayer.",
"tableHost": "Hôte",
"ownerChanged": "Cette automatisation a changé d'hôtes. Actualisez et réessayez.",
"runError": "Erreur :"
"runError": "Erreur :",
"deleteAutomationDescription": "Supprimer <name/> et son historique d’exécution. Les espaces de travail créés par les exécutions précédentes ne seront pas supprimés.",
"deleteExternalAutomationDescription": "Supprimer <name/> de <provider/> sur <host/>.",
"runUsageSummaryTokens_one": "{{cost}} (est.) · {{tokens}} token",
"runUsageSummaryTokens_other": "{{cost}} (est.) · {{tokens}} tokens"
},
"AutomationsPageSkeleton": {
"55527b7bcf": "Chargement des automatisations"
@@ -16409,8 +16481,8 @@
"92405f1431": "Indisponible",
"dbdcec22bd": "Lecture seule",
"0a2d4359a8": "Gérable",
"e2532150ed": "automatisations",
"701515f010": "automatisation"
"automationCount_one": "{{count}} automatisation",
"automationCount_other": "{{count}} automatisations"
},
"WorkspaceCombobox": {
"ee5b280eba": "Aucun espace de travail trouvé.",
@@ -16452,7 +16524,8 @@
"last": {
"run": {
"done": "Terminé",
"failed": "Échec"
"failed": "Échec",
"statusWithRelative": "{{status}} · {{relative}}"
}
}
},
@@ -16597,15 +16670,12 @@
},
"externalScope": {
"uncheckedHost": "Les gestionnaires d'automatisation externes sur {{hostLabel}} n'ont pas pu être vérifiés.",
"uncheckedHosts": "Les gestionnaires d'automatisation externes sur les hôtes {{count}} n'ont pas pu être vérifiés."
"uncheckedHostCount_one": "Impossible de vérifier les gestionnaires d’automatisations externes sur {{count}} hôte.",
"uncheckedHostCount_other": "Impossible de vérifier les gestionnaires d’automatisations externes sur {{count}} hôtes."
},
"enablement": {
"paused": "En pause"
},
"runHistory": {
"occurrencesWithLatest": "{{times}} fois, le plus récemment {{date}}",
"occurrences": "{{times}} fois"
},
"createDestination": {
"label": "Hôte",
"placeholder": "Sélectionnez un hôte",
@@ -16659,6 +16729,71 @@
"useFreshSessions": "Utiliser de nouvelles sessions",
"helper": "Ajoutés aux arguments par défaut de cet hôte à chaque nouvelle session.",
"detailLabel": "Arguments supplémentaires"
},
"runHistory": {
"runCountSummary_one": "{{count}} exécution · terminées : {{completed}}",
"runCountSummary_other": "{{count}} exécutions · terminées : {{completed}}",
"occurrencesWithLatestCount_one": "{{count}} fois, dernièrement le {{date}}",
"occurrencesWithLatestCount_other": "{{count}} fois, dernièrement le {{date}}",
"occurrencesCount_one": "{{count}} fois",
"occurrencesCount_other": "{{count}} fois"
},
"capabilityProbe": {
"createIdempotencyUpdateRequired": "Le déplacement d’automatisations vers cet hôte nécessite un serveur Orca plus récent. Mettez le HUB à jour et réessayez."
},
"editDraft": {
"unsupportedSchedule": "Cette automatisation a une planification enregistrée non prise en charge. Choisissez une planification prise en charge avant d’enregistrer les modifications."
},
"hostCatalog": {
"orphanEntryLabel": "Anciennes automatisations non assignées"
},
"automationPageParts": {
"never": "Jamais",
"now": "à l’instant",
"runStatusPending": "En file d’attente",
"runStatusDispatching": "Démarrage",
"runStatusDispatched": "Lancée",
"runStatusCompleted": "Terminée",
"runStatusSkippedPrecheck": "Ignorée par pré-vérification",
"runStatusSkippedMissed": "Ignorée",
"runStatusSkippedUnavailable": "Indisponible",
"runStatusSkippedNeedsInteractiveAuth": "Identifiants requis",
"runStatusDispatchFailed": "Échec"
},
"runContent": {
"noOutput": "Aucun contenu de sortie disponible."
},
"runViewState": {
"viewRun": "Voir l’exécution",
"runOpen": "L’exécution est ouverte",
"terminalOnPairedServer": "Le terminal de l’exécution est sur le serveur associé.",
"terminalUnavailable": "Le terminal de l’exécution est indisponible.",
"openWorkspace": "Ouvrir l’espace de travail",
"workspaceAvailable": "L’espace de travail est disponible.",
"snapshotSaved": "Instantané enregistré",
"showingSnapshot": "Affichage de l’instantané enregistré de l’exécution.",
"namedWorkspaceGone": "{{name}} n’est plus disponible",
"workspaceGone": "L’espace de travail n’est plus disponible",
"noWorkspaceLaunched": "Aucun espace de travail lancé"
},
"runWorkspaceDisplay": {
"notLaunched": "Non lancé",
"namedWorkspaceGone": "{{name}} (plus disponible)"
},
"usage": {
"tokensAndCost_one": "{{tokens}} token · {{cost}}",
"tokensAndCost_other": "{{tokens}} tokens · {{cost}}"
},
"externalDisplay": {
"sshHost": "Hôte SSH",
"local": "Local"
},
"externalActionDisabled": {
"actionInProgress": "Une autre action d’automatisation est toujours en cours.",
"sshConnecting": "Attendez la fin de la connexion de cet hôte SSH.",
"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."
}
},
"agent": {
@@ -16799,8 +16934,6 @@
"63ce735809": "Se connecter",
"4a2ab52781": "Vérification…",
"79e7aaed39": "Annuler",
"fdd26d81cc": "Paramètres du compte Atlassian",
"8090504a3e": "Créez un token dans",
"7b3967c12f": "Token API Atlassian",
"3d81bf3ab3": "Token API",
"e91b9a4073": "you@example.com",
@@ -16825,7 +16958,8 @@
"be9eba0a1b": "nom d'utilisateur",
"70035652d7": "Mot de passe",
"c50abbf340": "Mot de passe du compte Jira",
"d8737db691": "Utilisez le nom d'utilisateur et le mot de passe de votre compte Jira Server ou Data Center."
"d8737db691": "Utilisez le nom d'utilisateur et le mot de passe de votre compte Jira Server ou Data Center.",
"createTokenInSettings": "Créez un jeton dans les <link>paramètres du compte Atlassian</link>."
}
}
},
@@ -16934,10 +17068,11 @@
"combobox": {
"noProjects": "Aucun projet",
"allProjects": "Tous les projets",
"hostCount": "{{value0}} hôtes",
"searchProjects": "Rechercher des projets...",
"noMatches": "Aucun projet ne correspond à votre recherche.",
"chooseSource": "Choisir la source des tâches"
"chooseSource": "Choisir la source des tâches",
"hostCount_one": "{{count}} hôte",
"hostCount_other": "{{count}} hôtes"
}
}
},
@@ -16974,7 +17109,35 @@
"taskSourceContextSummary": {
"sourceUnavailable": "Source {{value0}} indisponible : {{value1}}",
"someSourceHostsUnavailable": "Certains hôtes de la source {{value0}} sont indisponibles : {{value1}}",
"reconnectOrUpdateTitle": "Reconnectez ou mettez à jour {{value0}} pour charger cette source."
"reconnectOrUpdateTitle": "Reconnectez ou mettez à jour {{value0}} pour charger cette source.",
"providerSourceTitle": "Source {{provider}}",
"hostTitle": "Hôte : {{hosts}}",
"accountTitle": "Compte : {{accounts}}",
"sourceTitle": "Source : {{source}}",
"sourceHostCount_one": "{{count}} hôte source",
"sourceHostCount_other": "{{count}} hôtes sources",
"noHost": "Aucun hôte",
"projectCount_one": "{{count}} projet",
"projectCount_other": "{{count}} projets",
"selectedProject": "Projet sélectionné",
"selectedProjectCount_one": "{{count}} projet sélectionné",
"selectedProjectCount_other": "{{count}} projets sélectionnés",
"currentAccount": "Compte actuel",
"statusCheckingCapabilities": "vérification des capacités du serveur",
"statusServerUpdateForTaskSources": "mise à jour du serveur requise pour les sources de tâches",
"statusProviderAuthNeeded": "authentification du fournisseur requise",
"statusSourceToolUnavailable": "outil source indisponible",
"statusProviderUnsupported": "fournisseur non pris en charge sur cet hôte",
"statusServerUpdateNeeded": "mise à jour du serveur requise",
"unavailableCount_one": "{{count}} indisponible",
"unavailableCount_other": "{{count}} indisponibles",
"statusConnected": "connecté",
"statusAuthNeeded": "authentification requise",
"statusConnecting": "connexion en cours",
"statusConnectionIssue": "problème de connexion",
"statusDisconnected": "déconnecté",
"hostStatus": "{{host}} {{status}}",
"availabilityTitle": "Disponibilité : {{hosts}}"
},
"ShortcutKeyCombo": {
"07eb4985a1": "Appuyez deux fois sur {{value0}}"
@@ -17242,16 +17405,8 @@
"listLabel": "Des discussions qui reprendraient",
"dontAskAgain": "Ne plus demander (reprendre automatiquement)",
"dontAskAgainHint": "Vous pouvez désactiver cette option dans Paramètres → Chat → Comportement.",
"continuedOne": "1 chat a été repris",
"continuedMany": "{{value0}} chats ont été repris",
"selectAgent": "Reprendre le chat {{value0}} \"{{value1}}\" dans {{value2}}",
"dismissAll": "Tout rejeter",
"notContinuedOne": "1 chat n'a pas pu reprendre",
"notContinuedMany": "{{value0}} chats n'ont pas pu reprendre",
"notConfirmedOne": "Impossible de confirmer qu'1 chat a repris",
"notConfirmedMany": "Impossible de confirmer que {{value0}} chats ont repris",
"notConfirmedOtherOne": "Impossible de confirmer qu'1 autre chat a repris",
"notConfirmedOtherMany": "Impossible de confirmer que {{value0}} autres chats ont repris",
"viewChats": "Voir les chats",
"review": "Vérifier",
"activityUnnamed": "sans nom",
@@ -17259,9 +17414,7 @@
"activityQuestion": "En attente de votre réponse : {{value0}}",
"activityMidReply": "Réponse en cours",
"activitySubagentOne": "Sous-agent en cours : {{value0}}",
"activitySubagentMany": "{{value0}} sous-agents en cours",
"activityMonitorOne": "Surveillance : {{value0}}",
"activityMonitorMany": "Surveillance de {{value0}} tâches en arrière-plan",
"selectWorkspace": "Sélectionner toutes les discussions dans {{value0}}",
"workspaceSelectedCount": "{{value0}} sur {{value1}}",
"selectAll": "Sélectionner toutes les discussions",
@@ -17278,10 +17431,22 @@
"serverBody": "Ces chats étaient en cours lorsque Orca a redémarré sur {{machine}}. La reprise restaure chacun là où il s'était arrêté et demande à l'agent de continuer. Votre propre prompt n'est pas renvoyé.",
"serverDismiss": "Ignorer",
"serverResumeAll": "Reprendre les {{count}} sur {{machine}}",
"serverResumeHereOne": "Reprendre 1 chat démarré ici",
"serverResumeHere": "Reprendre {{count}} chats démarrés ici",
"resumeChats_one": "Reprendre {{count}} discussion",
"resumeChats_other": "Reprendre {{count}} discussions"
"resumeChats_other": "Reprendre {{count}} discussions",
"serverResumeHereCount_one": "Reprendre {{count}} discussion démarrée ici",
"serverResumeHereCount_other": "Reprendre {{count}} discussions démarrées ici",
"continuedCount_one": "{{count}} discussion reprise",
"continuedCount_other": "{{count}} discussions reprises",
"notContinuedCount_one": "Impossible de reprendre {{count}} discussion",
"notContinuedCount_other": "Impossible de reprendre {{count}} discussions",
"notConfirmedCount_one": "Impossible de confirmer la reprise de {{count}} discussion",
"notConfirmedCount_other": "Impossible de confirmer la reprise de {{count}} discussions",
"notConfirmedOtherCount_one": "Impossible de confirmer la reprise de {{count}} autre discussion",
"notConfirmedOtherCount_other": "Impossible de confirmer la reprise de {{count}} autres discussions",
"activitySubagentCount_one": "{{count}} sous-agent en cours d’exécution",
"activitySubagentCount_other": "{{count}} sous-agents en cours d’exécution",
"activityMonitorCount_one": "Surveillance de {{count}} tâche en arrière-plan",
"activityMonitorCount_other": "Surveillance de {{count}} tâches en arrière-plan"
},
"linear-issue-attribute-filter-coverage-notice": {
"statusPartialTeamCoverage": "Filtrage des statuts des équipes {{value0}} sur {{value1}} : les problèmes des équipes restantes ne sont pas inclus.",
@@ -17417,15 +17582,15 @@
}
},
"NativeChatResumeRunPanel": {
"resumedTitle": "{{value0}} discussions sur {{value1}} reprises",
"resumedTitleOne": "{{value0}} discussion sur 1 reprise",
"resumingTitleOne": "Reprise d’une discussion",
"resumingTitle": "Reprise de {{value0}} discussions",
"description": "Chaque discussion est restaurée avec tout son contexte, et l’agent vérifie où il s’était arrêté. Vous pouvez fermer cette fenêtre ; la barre d’état suit la progression.",
"finished": "Ces discussions étaient en cours quand Orca s’est fermé. Orca a restauré chacune là où elle s’était arrêtée, avec tout son contexte, et a demandé à l’agent de vérifier ce qu’il faisait avant de continuer. Vos propres messages n’ont pas été renvoyés.",
"finishedUpdate": "Ces discussions étaient en cours quand Orca a installé une mise à jour. Orca a restauré chacune là où elle s’était arrêtée, avec tout son contexte, et a demandé à l’agent de vérifier ce qu’il faisait avant de continuer. Vos propres messages n’ont pas été renvoyés.",
"finishedPartial": "Ces discussions étaient en cours quand Orca s’est fermé. Celles qu’Orca a reprises ont été restaurées là où elles s’étaient arrêtées, avec tout leur contexte, et invitées à vérifier ce qu’elles faisaient avant de continuer. Vos propres messages n’ont pas été renvoyés. Consultez la liste pour voir les discussions qui nécessitent encore votre attention ou qui peuvent être reprises.",
"finishedPartialUpdate": "Ces discussions étaient en cours quand Orca a installé une mise à jour. Celles qu’Orca a reprises ont été restaurées là où elles s’étaient arrêtées, avec tout leur contexte, et invitées à vérifier ce qu’elles faisaient avant de continuer. Vos propres messages n’ont pas été renvoyés. Consultez la liste pour voir les discussions qui nécessitent encore votre attention ou qui peuvent être reprises."
"finishedPartialUpdate": "Ces discussions étaient en cours quand Orca a installé une mise à jour. Celles qu’Orca a reprises ont été restaurées là où elles s’étaient arrêtées, avec tout leur contexte, et invitées à vérifier ce qu’elles faisaient avant de continuer. Vos propres messages n’ont pas été renvoyés. Consultez la liste pour voir les discussions qui nécessitent encore votre attention ou qui peuvent être reprises.",
"resumedOfTotal_one": "Discussions reprises : {{resumed}} sur {{count}}",
"resumedOfTotal_other": "Discussions reprises : {{resumed}} sur {{count}}",
"resumingCount_one": "Reprise de {{count}} discussion",
"resumingCount_other": "Reprise de {{count}} discussions"
},
"NativeChatResumeRunStatusIcon": {
"waitingForReply": "En attente de réponse",
@@ -17475,6 +17640,72 @@
"copyFailed": "Impossible de copier le lien.",
"signingIn": "Connexion…",
"cancel": "Annuler"
},
"AgentStateDot": {
"working": "En cours",
"monitoring": "Surveillance des tâches en arrière-plan",
"blocked": "Bloqué",
"waiting": "En attente de saisie",
"interrupted": "Interrompu",
"failed": "Échec",
"done": "Terminé",
"idle": "Inactif",
"unverifiable": "Aucune mise à jour récente",
"unconfirmed": "Confirmation impossible",
"permission": "Attention requise"
},
"issueComments": {
"you": "Vous"
},
"ZoomOverlay": {
"uiZoom": "Zoom de l’interface",
"editorZoom": "Zoom de l’éditeur",
"terminalZoom": "Zoom du terminal"
},
"issueCopy": {
"urlCopied": "URL copiée",
"keyCopied": "Clé copiée",
"identifierCopied": "Identifiant copié",
"branchNameCopied": "Nom de branche copié",
"promptCopied": "Prompt copié",
"urlCopyFailed": "Impossible de copier l’URL",
"keyCopyFailed": "Impossible de copier la clé",
"identifierCopyFailed": "Impossible de copier l’identifiant",
"branchNameCopyFailed": "Impossible de copier le nom de branche",
"promptCopyFailed": "Impossible de copier le prompt"
},
"prCheckCounts": {
"noChecksFound": "Aucune vérification trouvée",
"checksFailing_one": "{{count}} vérification en échec",
"checksFailing_other": "{{count}} vérifications en échec",
"checksNeedAction_one": "{{count}} vérification nécessite une action",
"checksNeedAction_other": "{{count}} vérifications nécessitent une action",
"checksPending_one": "{{count}} vérification en attente",
"checksPending_other": "{{count}} vérifications en attente",
"allChecksPassing": "Toutes les vérifications réussissent",
"checksPassingOfTotal_one": "Vérifications réussies : {{passing}} sur {{count}}",
"checksPassingOfTotal_other": "Vérifications réussies : {{passing}} sur {{count}}"
},
"taskPageJiraBoard": {
"changeStatusFailed": "Impossible de modifier le statut."
},
"jiraIssue": {
"loadStatusChangesFailed": "Impossible de charger les changements de statut.",
"loadCommentsFailed": "Impossible de charger les commentaires."
},
"taskPageJiraLinkedIssues": {
"someIssuesFailed": "Impossible de charger certaines issues Jira liées à des espaces de travail. Actualisez pour réessayer."
},
"taskPageJiraLoadState": {
"failedToLoadIssues": "Impossible de charger les issues Jira.",
"authFailed": "Échec de l’authentification Jira. Reconnectez Jira dans les paramètres, puis réessayez.",
"accessDenied": "Jira a refusé l’accès à cette recherche d’issues. Vérifiez les permissions du projet ou essayez une autre requête JQL.",
"rateLimited": "Jira a limité cette recherche d’issues en raison du nombre de requêtes. Réessayez dans un instant.",
"serverError": "Une erreur serveur Jira est survenue lors du chargement des issues. Réessayez dans un instant.",
"jqlFailed": "Jira n’a pas pu exécuter cette requête JQL. Vérifiez la syntaxe et réessayez.",
"unreachable": "Impossible de joindre Jira. Vérifiez votre connexion et réessayez.",
"loadFailed": "Impossible de charger les issues Jira. Réessayez dans un instant.",
"errorWithCode": "Erreur {{code}} : {{summary}}"
}
},
"i18n": {
@@ -19542,9 +19773,9 @@
"pathAdded": "Added",
"openFolder": "Open {{name}}",
"findOrTypePath": "Recherchez un dossier ou saisissez n’importe quel chemin…",
"addTypedPath": "Add",
"noDirectories": "Aucun dossier ajouté pour l'instant.",
"removePath": "Remove {{name}}"
"removePath": "Remove {{name}}",
"addTypedPathCode": "Ajouter <path/>"
},
"accounts": {
"wslAccountNotApplied": {
@@ -19645,10 +19876,7 @@
"title": "Passé à {{account}}",
"dontAskAgainHint": "Vous pouvez désactiver cette option dans Paramètres → Comptes de fournisseurs d’IA.",
"dontAskAgain": "Ne plus demander (redémarrer automatiquement)",
"bodyOne": "1 session Claude est toujours en cours d'exécution sur {{previous}}. Le redémarrage continue la conversation sur {{next}}. Les sessions occupées attendent d'être inactives avant de redémarrer.",
"bodyOther": "{{count}} sessions Claude sont toujours en cours d’exécution sur {{previous}}. Le redémarrage poursuit chaque conversation sur {{next}}. Les sessions occupées attendent d’être inactives avant de redémarrer.",
"restartOne": "Redémarrer la session",
"restartOther": "Redémarrer {{count}} sessions",
"session": "Session Claude",
"settingTitle": "Lorsque vous changez de compte alors que Claude est en cours d'exécution",
"listLabel": "Sessions Claude à redémarrer",
@@ -19665,13 +19893,17 @@
"reasonOwnFolder": "Utilise votre propre dossier Claude",
"reasonUnknownAccount": "Compte inconnu",
"reasonNoSession": "Reprise impossible",
"reviewBodyOne": "1 autre session Claude n'a pas été déplacée vers {{next}}.",
"reviewBodyOther": "{{count}} autres sessions Claude n'ont pas été déplacées vers {{next}}.",
"notMovedOne": "1 autre session n'a pas été déplacée.",
"notMovedOther": "{{count}} autres sessions n'ont pas été déplacées.",
"review": "Vérifier",
"uncheckedOne": "Impossible de vérifier la présence de Claude dans 1 terminal. Si Claude y est en cours d’exécution, il reste sur {{previous}} jusqu’à son redémarrage.",
"uncheckedOther": "Impossible de vérifier la présence de Claude dans {{count}} terminaux. Toute instance de Claude qui y tourne reste sur {{previous}} jusqu’à son redémarrage."
"uncheckedOther": "Impossible de vérifier la présence de Claude dans {{count}} terminaux. Toute instance de Claude qui y tourne reste sur {{previous}} jusqu’à son redémarrage.",
"restartCount_one": "Redémarrer {{count}} session",
"restartCount_other": "Redémarrer {{count}} sessions",
"reviewBody_one": "{{count}} autre session Claude n’a pas été déplacée vers {{next}}.",
"reviewBody_other": "{{count}} autres sessions Claude n’ont pas été déplacées vers {{next}}.",
"body_one": "{{count}} session Claude est toujours active sur {{previous}}. Le redémarrage poursuit la conversation sur {{next}}. Les sessions occupées attendent d’être inactives avant de redémarrer.",
"body_other": "{{count}} sessions Claude sont toujours actives sur {{previous}}. Le redémarrage poursuit chaque conversation sur {{next}}. Les sessions occupées attendent d’être inactives avant de redémarrer."
}
},
"hostSignIn": {
@@ -20154,13 +20386,13 @@
"optionalEmail": "E-mail Atlassian (facultatif pour les jetons à portée limitée)"
},
"workspace": {
"count": "{{count}} espaces de travail liés à {{key}}",
"startAnother": "Démarrer un nouvel espace de travail",
"empty": "Liez une issue Jira à un espace de travail, ou choisissez une autre vue.",
"openFailed": "Impossible d'ouvrir l'espace de travail lié à cette issue Jira.",
"mode": "Avec espace de travail",
"search": "Rechercher les issues liées",
"single": "1 espace de travail lié à {{key}}"
"linkedCount_one": "{{count}} espace de travail lié à {{key}}",
"linkedCount_other": "{{count}} espaces de travail liés à {{key}}"
},
"prompt": {
"dialogTitle": "Copier le prompt depuis un modèle",
@@ -20580,7 +20812,8 @@
"email": "Connaître votre adresse e-mail",
"allSites": "Lire et modifier toutes vos données sur tous les sites Web",
"someSites": "Lire et modifier vos données sur {{hosts}}",
"manySites": "Lire et modifier vos données sur {{hosts}} et {{count}} autres sites"
"manyOtherSites_one": "Lire et modifier vos données sur {{hosts}} et {{count}} autre site",
"manyOtherSites_other": "Lire et modifier vos données sur {{hosts}} et {{count}} autres sites"
},
"install": {
"title": "Ajouter {{name}} ?",
+278 -88
View File
@@ -1764,14 +1764,11 @@
"69da9a208c": "Jira で開く",
"fa132c8aed": "コメントの追加に失敗しました。",
"ea21952aa3": "Jira Issue を更新できませんでした。",
"6c41a9bcea": "{{value0}} のコピーに失敗しました",
"2ff69a3545": "{{value0}} をコピーしました",
"666cfdd835": "不明",
"ef21405c6d": "Jira Issue",
"commentTooLarge": "コメントが大きすぎるため安全に送信できません。"
},
"Landing": {
"76a95f7f47": "作成",
"f9eaa9e12d": "プロジェクトを追加",
"6ca6ff404e": "ORCA",
"520304a067": "Orca のロゴ",
@@ -1787,7 +1784,12 @@
"0d0ace8861": "GitHub でスターを付ける",
"ec43b38ba7": "GitHub でスター済み",
"157bb5ecbb": "GitHub を開く",
"preflightDismiss": "閉じる"
"preflightDismiss": "閉じる",
"moveUpWorkspace": "前のワークスペースを選択",
"moveDownWorkspace": "次のワークスペースを選択",
"installGit": "Git をインストール",
"installGitHubCli": "GitHub CLI をインストール",
"learnMore": "詳しく見る"
},
"LinearIssueMarkdownDescriptionEditor": {
"d9c47069ef": "Markdown",
@@ -1818,7 +1820,6 @@
"ad5dec37b7": "選択した Issue をプレビュー・編集し、そこから作業を開始します。",
"c23e79e5c0": "操作",
"b0eac92d85": "再試行",
"fabbd3f974": "Issue を更新しました ·",
"543970c87a": "アクティビティ",
"df4c86ed12": "閉じる",
"7a4997d8bb": "Linear Issue のプレビューを閉じる",
@@ -1842,11 +1843,8 @@
"b25e453c9d": "サブ Issue の作成に失敗しました",
"aeed19d003": "{{value0}} を作成しました",
"9a1317cdd3": "サブ Issue のロードに失敗しました",
"9bcbaa2737": "{{value0}} のコピーに失敗しました",
"7835483c43": "{{value0}} をコピーしました",
"61f424f8ca": "Linear Issue",
"ca8778c124": "不明",
"8a33c85e9c": "誰か",
"65239a714b": "Linear",
"76ffd3c937": "追加するプロジェクトを検索します。",
"c11b4e3cc2": "プロジェクトが見つかりませんでした。",
@@ -1857,7 +1855,10 @@
"moreWorkspaceActions": "Issue ワークスペースのその他の操作",
"startNewWorkspace": "新規ワークスペースを開始",
"workspaceSection": "ワークスペース",
"noWorkspaceYet": "まだありません"
"noWorkspaceYet": "まだありません",
"issueDescriptionLabel": "Issue の説明",
"namedUserUpdatedIssue": "{{name}} が Issue を更新 · {{time}}",
"someoneUpdatedIssue": "誰かが Issue を更新 · {{time}}"
},
"LinearItemDrawer": {
"04008e6c46": "Issue からワークスペースを開始",
@@ -1893,7 +1894,9 @@
"openAttachedWorkspace": "Issue にリンクされたワークスペースを開く",
"openWorkspace": "ワークスペースを開く",
"moreWorkspaceActions": "Issue ワークスペースのその他の操作",
"startNewWorkspace": "新規ワークスペースを開始"
"startNewWorkspace": "新規ワークスペースを開始",
"setEstimate": "見積もりを設定",
"estimateValue": "見積もり {{estimate}}"
},
"NewWorkspaceComposerCard": {
"cbb47ee0dc": "ローカル Git プロジェクトでのみ使用できます。",
@@ -1955,7 +1958,22 @@
"defaultBranchUpdateFailed": "プロジェクトのデフォルトブランチを更新できませんでした。再試行。",
"setLocation": "プロジェクトの場所を設定する",
"setLocationOnHost": "プロジェクトの場所を {{host}} に設定します",
"setLocationTooltip": "フォルダーを選択するか、このプロジェクトを {{host}} に複製します。"
"setLocationTooltip": "フォルダーを選択するか、このプロジェクトを {{host}} に複製します。",
"connect": "接続",
"reconnect": "再接続",
"setupConfigDefaultTabs": "デフォルトタブのコマンド",
"setupConfigSetupAndDefaultTabs": "セットアップとデフォルトタブのコマンド",
"setupConfigSetupScript": "セットアップスクリプト",
"runDefaultTabCommands": "デフォルトタブのコマンドを実行",
"runSetupAndDefaultTabCommands": "セットアップとデフォルトタブのコマンドを実行",
"runSetupCommand": "セットアップコマンドを実行",
"askRunDefaultTabCommands": "デフォルトタブのコマンドを今すぐ実行しますか?",
"askRunSetupAndDefaultTabCommands": "セットアップとデフォルトタブのコマンドを今すぐ実行しますか?",
"askRunSetup": "今すぐセットアップを実行しますか?",
"runSetupNow": "今すぐセットアップを実行",
"runCommandsNow": "今すぐコマンドを実行",
"skipForNow": "今はスキップ",
"skipCommands": "コマンドをスキップ"
},
"NewWorkspaceComposerModal": {
"createWorktree": "ワークツリーを作成する",
@@ -2134,9 +2152,11 @@
"9e97f08d0f": "開くファイルを検索する",
"ec31e058f7": "ファイルに移動",
"73b44e7bde": "インストールコマンドのコピー",
"b227d88520": "{{value0}} ファイルが見つかりました",
"995be8ea22": "コピー",
"cf144856dc": "コピーしました"
"cf144856dc": "コピーしました",
"filesFound_other": "{{count}} 件のファイルが見つかりました",
"hostCouldNotOpenPath": "ホストがこのファイルパスを開けませんでした。",
"chooseFileNotDirectory": "ディレクトリではなくファイルを選択してください。"
},
"SelectedTextCopyMenu": {
"9b40d7b018": "コピー"
@@ -2154,7 +2174,6 @@
"TaskPage": {
"ff69a30681": "キャンセル",
"8ff6fdc368": "作成中…",
"fc0d8a1fa4": "提出する。",
"919a20dd5b": "{{value0}}と入力",
"56cdb413a2": "カンマ区切りの値",
"1f0fce91e3": "{{value0}} を選択",
@@ -2202,11 +2221,9 @@
"bdebffcbfe": "選択したチームの Linear プロジェクトを作成します。",
"1361275ec3": "新規 Linear プロジェクト",
"7f3f7b4c18": "説明 (オプション、markdown)",
"9f2b4c03a6": "提出する",
"d3d0998b7d": "GitHub の新規 Issue",
"6244a02f46": "Linear で開く",
"606a85c774": "オープン",
"5e8061b088": "{{value0}} {{value1}} からワークスペースを開始します",
"592a55611b": "さらにチームを選択するか更新してみてください。チームフィルターは、現在取得されている Issue セットに適用されます。",
"618107fab3": "選択したチームと一致する取得済み Issue はありません",
"903c7af49f": "Linear Issue が見つかりません",
@@ -2215,7 +2232,6 @@
"f362667d55": "更新済み",
"b1eaa18ace": "Issue",
"37e7ee311e": "キー",
"b7bae28b6a": "示されている",
"a26a48252e": "表示プロパティ",
"5d2d835467": "並べ替え",
"5659da12fc": "グループ化",
@@ -2255,8 +2271,6 @@
"054bf695cc": "下書き",
"5b6b2af943": "再試行中…",
"0c0de0fc0e": "からの Issue を読み込めませんでした",
"d1766fd62d": "プロジェクトのロードに失敗しました",
"7762f4b03a": "の",
"443f7dd928": "マージ",
"a7396b05c6": "チェック",
"f6fa3c97d0": "レビュアー",
@@ -2438,10 +2452,36 @@
"jiraColumnOriginalEstimate": "見積もり",
"jiraColumnRemainingEstimate": "残り",
"jiraBoardEmptyColumn": "Issue はありません",
"labelCountPlural": "{{count}} 個のラベル",
"labelCountSingular": "{{count}} 個のラベル",
"memberCountPlural": "{{count}} 人のメンバー",
"memberCountSingular": "{{count}} 人のメンバー"
"backToPullRequests": "PR",
"backToGitHubList": "GitHub の一覧",
"noGitHubRepositoryContext": "この Issue の GitHub リポジトリのコンテキストはありません。",
"filingInTarget": "{{target}} に作成",
"filingInThisRepository": "このリポジトリに作成",
"shortcutToSubmit": "{{shortcut}} で送信。",
"projectsFailedToLoad_other": "{{count}} 件中 {{failed}} 件のプロジェクトを読み込めませんでした",
"draftPullRequestNumber": "ドラフトの PR #{{number}}",
"pullRequestNumber": "PR #{{number}}",
"issueNumber": "Issue #{{number}}",
"loadGitHubWorkFailed": "GitHub の作業項目を読み込めませんでした。",
"gitlabViewIssues": "Issue",
"gitlabViewMrs": "MR",
"gitlabViewTodos": "自分の ToDo",
"startWorkspaceFromMr": "MR {{number}} からワークスペースを開始",
"startWorkspaceFromIssue": "Issue {{number}} からワークスペースを開始",
"shownCount_other": "{{count}} 件表示",
"linearProjectPlaceholder": "プロジェクト",
"labelCount_other": "{{count}} 個のラベル",
"memberCount_other": "{{count}} 人のメンバー",
"groupUnassigned": "未割り当て",
"linearProjectContext": "プロジェクト: {{name}}",
"linearViewContext": "ビュー: {{name}}",
"changedFileCount_other": "{{count}} ファイル",
"resumeRestoration": {
"linearProjectNotFound": "保存された Linear プロジェクトが見つかりませんでした。",
"linearProjectRestoreFailed": "保存された Linear プロジェクトを復元できませんでした。",
"linearViewNotFound": "保存された Linear ビューが見つかりませんでした。",
"linearViewRestoreFailed": "保存された Linear ビューを復元できませんでした。"
}
},
"Terminal": {
"73768427cf": "閉じる",
@@ -2516,7 +2556,8 @@
"b1e390250d": "ローカルビルドの切り替えを完了できませんでした。",
"d29740d175": "選択したビルドを使用できませんでした。",
"37d45c9ec1": "別のビルドを選択",
"7f1a4c9e02": "システムパッケージマネージャーによって Orca がインストールされているため、そこから更新してください。Orca はこのリリース自体をインストールできません。"
"7f1a4c9e02": "システムパッケージマネージャーによって Orca がインストールされているため、そこから更新してください。Orca はこのリリース自体をインストールできません。",
"compatibilityModeFailed": "互換モードを有効にできませんでした。{{message}}"
},
"WorktreeJumpPalette": {
"ac037cfac2": "移動",
@@ -2542,8 +2583,6 @@
"d7d496a451": "ブラウザページはもう存在しません",
"50a1d11d5b": "開いているタブ",
"088d66d980": "操作と設定",
"20af998bff": "{{value0}}アイテムが利用可能{{value1}}",
"bb72c08e63": "{{value0}} の結果が見つかりました{{value1}}",
"34c8fbb46e": "SSH リモート",
"63c2be1914": "SSH が切断されました",
"95be6587d3": "ワークツリー「{{value0}}」を作成する",
@@ -2560,7 +2599,10 @@
"27f10cca63": "チャット、ターミナル、ワークスペース、タスク、設定、操作を検索します…",
"2770f02910": "チャット、ターミナル、ワークスペース、タスク、設定、操作を検索します",
"recentChatsTerminalsHeader": "最近のチャットとターミナル",
"lastActiveTime": "最後にアクティブになったのは{{value0}}前です"
"lastActiveTime": "最後にアクティブになったのは{{value0}}前です",
"resultsFound_other": "{{count}} 件の結果が見つかりました。",
"itemsAvailable_other": "{{count}} 件の項目が利用可能です。",
"createActionAvailable": "ワークツリーの作成操作が利用可能です。"
},
"github": {
"pr": {
@@ -2862,11 +2904,6 @@
}
}
},
"priority": {
"icon": {
"c43d3e065b": "優先度:"
}
},
"project": {
"view": {
"surfaces": {
@@ -2885,7 +2922,6 @@
"c8db98b73b": "リソース",
"bb1405eff8": "マイルストーン",
"5d99315fb8": "企画",
"3ad562bdf4": "スコープされた Issue",
"563501f191": "進捗",
"bb5664d456": "プロジェクトの説明はありません。",
"7b147907dc": "Linear",
@@ -2910,7 +2946,9 @@
"df4bd63c1d": "未割り当て",
"30402d2c6e": "検索または更新してみてください。",
"a2f31c4cd6": "Linear プロジェクトが見つかりません",
"c9b6e9f90d": "Linear プロジェクトをロードできません"
"c9b6e9f90d": "Linear プロジェクトをロードできません",
"scopedIssueCount_other": "対象範囲内の Issue {{count}} 件",
"backlog": "バックログ"
}
}
},
@@ -2923,7 +2961,13 @@
"05baa5ae90": "ワークスペース",
"89f6580dbf": "チームを検索…",
"b3488fad3c": "チームはフェッチされませんでした。アクセスは、キーのスコープ、プライベートチームのメンバーシップ、アーカイブされたチーム、権限、またはフェッチの失敗によって異なります。",
"405b33c378": "検索に一致する取得チームはありません。"
"405b33c378": "検索に一致する取得チームはありません。",
"teamCount_other": "{{count}} チーム"
}
},
"priority": {
"icon": {
"priorityValue": "優先度: {{label}}"
}
}
},
@@ -6305,7 +6349,11 @@
"e8f25bd903": "ターミナルクリーンアップを完了できませんでした。",
"a702d4196e": "これにより、すべてのワークスペースのターミナルタブが閉じられ、現在のターミナルセッションのシャットダウンがリクエストされます。保存されていないターミナル作業は失われます。デーモン自体は実行を続け、新規ターミナルはすぐに開けます。この操作は取り消せません。",
"01d6b7c64e": "ターミナルを開くと Agent が再起動します。リモートホスト上のターミナルは影響を受けません。",
"922548bc66": "ターミナルサービスを再起動しますか?"
"922548bc66": "ターミナルサービスを再起動しますか?",
"confirmRestart": "再起動",
"busyRestarting": "再起動中…",
"confirmKillAll": "すべてのセッションを終了",
"busyKilling": "終了中…"
},
"MacFolderAccessFixDialog": {
"stepAllow": "ファイルとフォルダーで Orca を許可する",
@@ -14112,11 +14160,11 @@
"a2f68645ac": "GitLab API 予算を更新する",
"2f9c16d6c3": "Orca は GitLab CLI を通じて REST を使用します。",
"14e144f7a7": "GitLab API の予算",
"3e2c982cfa": "左、リセット",
"ea8ad0bae8": "の",
"0a891e8935": "REST API",
"953f7c6062": "この GitLab ホストはレート制限ヘッダーを返しませんでした。",
"budget_scope_prefix": "予算スコープ"
"budget_scope_prefix": "予算スコープ",
"resetUnknown": "不明",
"remainingOfLimit": "{{limit}} 中 {{remaining}} 残り、{{reset}} 後にリセット"
}
}
}
@@ -16045,7 +16093,18 @@
"b09b2384fd": "一時停止中",
"eaa02014f8": "有効",
"29baf8f4c2": "ソース",
"lastRunFailed": "前回の実行は失敗しました。"
"lastRunFailed": "前回の実行は失敗しました。",
"noGrace": "猶予なし",
"graceMinutes_other": "{{count}} 分",
"graceHours_other": "{{count}} 時間",
"usageCoverageRuns_other": "{{known}}/{{count}} 回の実行",
"usageUnavailable": "利用不可",
"noRuns": "実行なし",
"projectDefault": "プロジェクトのデフォルト",
"reuseLiveSession": "実行中のセッションを再利用",
"freshEachRun": "実行ごとに新規作成",
"precheckEnabled": "有効、{{timeout}}",
"precheckNone": "なし"
},
"AutomationEditorDialog": {
"fb1896a5e7": "キャンセル",
@@ -16146,11 +16205,8 @@
"2faecab10b": "今すぐ実行",
"13118faadf": "不明なプロジェクト",
"73f630b49d": "キャンセル",
"1b586f0e2b": "の",
"02a33e3204": "から",
"9adfab2596": "外部オートメーションの削除",
"1e2e41392f": "今後表示しない",
"b264564427": "そしてその実行履歴。以前の実行で作成されたワークスペースは削除されません。",
"080dcb5fbb": "オートメーションの削除",
"19a6e30eae": "自動更新",
"77c2778945": "自動化",
@@ -16185,7 +16241,6 @@
"pendingAutomationRunMissing": "実行履歴は利用できなくなりました。",
"paused": "一時停止中",
"missingWorkspace": "ワークスペースがありません",
"runUsageSummary": "約 {{cost}} · {{tokens}} tokens",
"usageUnavailable": "使用量を利用できません",
"noRunUsageYet": "まだ実行の使用量がありません",
"noWorkspace": "ワークスペースなし",
@@ -16200,7 +16255,10 @@
"rowActions": "自動化の操作",
"tableLastRun": "最後の実行",
"ownerChanged": "この自動化によりホストが変更されました。更新して再試行してください。",
"runError": "エラー:"
"runError": "エラー:",
"deleteAutomationDescription": "<name/> とその実行履歴を削除します。過去の実行で作成されたワークスペースは削除されません。",
"deleteExternalAutomationDescription": "<host/> 上の <provider/> から <name/> を削除します。",
"runUsageSummaryTokens_other": "推定 {{cost}} · {{tokens}} トークン"
},
"CreateFromPicker": {
"f061f49e3f": "リポジトリブランチを検索…",
@@ -16227,8 +16285,7 @@
"92405f1431": "利用不可",
"dbdcec22bd": "読み取り専用",
"0a2d4359a8": "管理可能",
"e2532150ed": "自動化",
"701515f010": "オートメーション"
"automationCount_other": "{{count}} 件のオートメーション"
},
"WorkspaceCombobox": {
"ee5b280eba": "ワークスペースが見つかりません。",
@@ -16280,7 +16337,8 @@
"last": {
"run": {
"done": "完了",
"failed": "失敗"
"failed": "失敗",
"statusWithRelative": "{{status}} · {{relative}}"
}
}
}
@@ -16436,15 +16494,11 @@
},
"externalScope": {
"uncheckedHost": "{{hostLabel}} の外部自動化マネージャーをチェックできませんでした。",
"uncheckedHosts": "{{count}} ホスト上の外部自動化マネージャーをチェックできませんでした。"
"uncheckedHostCount_other": "{{count}} 台のホスト上の外部オートメーションマネージャーを確認できませんでした。"
},
"enablement": {
"paused": "一時停止中"
},
"runHistory": {
"occurrencesWithLatest": "{{times}} 回、最近では {{date}}",
"occurrences": "{{times}}回"
},
"extraAgentArgs": {
"advanced": "詳細設定",
"clear": "引数をクリア",
@@ -16454,6 +16508,67 @@
"useFreshSessions": "新しいセッションを使用",
"helper": "新しいセッションごとに、このホストのデフォルト引数に追加されます。",
"detailLabel": "追加の引数"
},
"runHistory": {
"runCountSummary_other": "{{count}} 回実行 · {{completed}} 回完了",
"occurrencesWithLatestCount_other": "{{count}} 回、直近は {{date}}",
"occurrencesCount_other": "{{count}} 回"
},
"capabilityProbe": {
"createIdempotencyUpdateRequired": "このホストにオートメーションを移動するには、最新の Orca サーバーが必要です。HUB を更新して再試行してください。"
},
"editDraft": {
"unsupportedSchedule": "このオートメーションには未対応のスケジュールが保存されています。変更を保存する前に、対応するスケジュールを選択してください。"
},
"hostCatalog": {
"orphanEntryLabel": "未割り当ての旧オートメーション"
},
"automationPageParts": {
"never": "なし",
"now": "たった今",
"runStatusPending": "キュー待ち",
"runStatusDispatching": "起動中",
"runStatusDispatched": "起動済み",
"runStatusCompleted": "完了",
"runStatusSkippedPrecheck": "事前チェックによりスキップ",
"runStatusSkippedMissed": "スキップ済み",
"runStatusSkippedUnavailable": "利用不可",
"runStatusSkippedNeedsInteractiveAuth": "認証情報が必要",
"runStatusDispatchFailed": "失敗"
},
"runContent": {
"noOutput": "出力内容はありません。"
},
"runViewState": {
"viewRun": "実行を表示",
"runOpen": "実行は開いています",
"terminalOnPairedServer": "実行ターミナルはペアリング済みサーバーにあります。",
"terminalUnavailable": "実行ターミナルは利用できません。",
"openWorkspace": "ワークスペースを開く",
"workspaceAvailable": "ワークスペースは利用可能です。",
"snapshotSaved": "スナップショット保存済み",
"showingSnapshot": "保存された実行スナップショットを表示しています。",
"namedWorkspaceGone": "{{name}} は利用できなくなりました",
"workspaceGone": "ワークスペースは利用できなくなりました",
"noWorkspaceLaunched": "ワークスペースは起動されていません"
},
"runWorkspaceDisplay": {
"notLaunched": "未起動",
"namedWorkspaceGone": "{{name}}(利用できなくなりました)"
},
"usage": {
"tokensAndCost_other": "{{tokens}} トークン · {{cost}}"
},
"externalDisplay": {
"sshHost": "SSH ホスト",
"local": "ローカル"
},
"externalActionDisabled": {
"actionInProgress": "別のオートメーション操作が実行中です。",
"sshConnecting": "この SSH ホストの接続が完了するまでお待ちください。",
"connectSshHost": "{{provider}} のオートメーションを管理する前に、この SSH ホストに接続してください。",
"cannotManageOnSshHost": "{{provider}} はこの SSH ホストでオートメーションを管理できません。",
"cannotManageLocally": "{{provider}} はこのマシンでオートメーションを管理できません。"
}
},
"agent": {
@@ -16594,8 +16709,6 @@
"63ce735809": "接続",
"4a2ab52781": "確認中…",
"79e7aaed39": "キャンセル",
"fdd26d81cc": "Atlassian のアカウント設定",
"8090504a3e": "でトークンを作成します",
"7b3967c12f": "Atlassian API トークン",
"3d81bf3ab3": "APIトークン",
"e91b9a4073": "you@example.com",
@@ -16620,7 +16733,8 @@
"be9eba0a1b": "username",
"70035652d7": "パスワード",
"c50abbf340": "Jira アカウントのパスワード",
"d8737db691": "Jira Server または Data Center のアカウントのユーザー名とパスワードを使用します。"
"d8737db691": "Jira Server または Data Center のアカウントのユーザー名とパスワードを使用します。",
"createTokenInSettings": "<link>Atlassian アカウント設定</link>でトークンを作成してください。"
}
}
},
@@ -16729,10 +16843,10 @@
"combobox": {
"noProjects": "プロジェクトがありません",
"allProjects": "すべてのプロジェクト",
"hostCount": "{{value0}} 台のホスト",
"searchProjects": "プロジェクトを検索…",
"noMatches": "検索条件に一致するプロジェクトはありません。",
"chooseSource": "タスクソースを選択"
"chooseSource": "タスクソースを選択",
"hostCount_other": "{{count}} 台のホスト"
}
}
},
@@ -16769,7 +16883,31 @@
"taskSourceContextSummary": {
"sourceUnavailable": "{{value0}} のソースを利用できません: {{value1}}",
"someSourceHostsUnavailable": "一部の {{value0}} ソースホストを利用できません: {{value1}}",
"reconnectOrUpdateTitle": "このソースを読み込むには、{{value0}} を再接続するか更新してください。"
"reconnectOrUpdateTitle": "このソースを読み込むには、{{value0}} を再接続するか更新してください。",
"providerSourceTitle": "{{provider}} ソース",
"hostTitle": "ホスト: {{hosts}}",
"accountTitle": "アカウント: {{accounts}}",
"sourceTitle": "ソース: {{source}}",
"sourceHostCount_other": "{{count}} 台のソースホスト",
"noHost": "ホストなし",
"projectCount_other": "{{count}} 件のプロジェクト",
"selectedProject": "選択したプロジェクト",
"selectedProjectCount_other": "選択したプロジェクト {{count}} 件",
"currentAccount": "現在のアカウント",
"statusCheckingCapabilities": "サーバーの機能を確認中",
"statusServerUpdateForTaskSources": "タスクソースの利用にはサーバーの更新が必要",
"statusProviderAuthNeeded": "プロバイダー認証が必要",
"statusSourceToolUnavailable": "ソースツールが利用不可",
"statusProviderUnsupported": "このホストではプロバイダー未対応",
"statusServerUpdateNeeded": "サーバーの更新が必要",
"unavailableCount_other": "{{count}} 件が利用不可",
"statusConnected": "接続済み",
"statusAuthNeeded": "認証が必要",
"statusConnecting": "接続中",
"statusConnectionIssue": "接続に問題あり",
"statusDisconnected": "未接続",
"hostStatus": "{{host}} {{status}}",
"availabilityTitle": "利用可否: {{hosts}}"
},
"ShortcutKeyCombo": {
"07eb4985a1": "{{value0}} を 2 回押す"
@@ -17025,16 +17163,8 @@
"listLabel": "再開されるチャット",
"dontAskAgain": "二度と質問しないでください (自動的に再開します)",
"dontAskAgainHint": "設定 → チャット → 動作でオフにできます。",
"continuedOne": "1 件のチャットを再開しました",
"continuedMany": "{{value0}} 件のチャットを再開しました",
"selectAgent": "{{value0}} チャット「{{value1}}」を {{value2}} で再開します",
"dismissAll": "すべて閉じる",
"notContinuedOne": "1 件のチャットを再開できませんでした",
"notContinuedMany": "{{value0}} 件のチャットを再開できませんでした",
"notConfirmedOne": "1 件のチャットが再開されたことを確認できませんでした",
"notConfirmedMany": "{{value0}} 件のチャットが再開されたことを確認できませんでした",
"notConfirmedOtherOne": "他のチャット 1 件が再開されたことを確認できませんでした",
"notConfirmedOtherMany": "他のチャット {{value0}} 件が再開されたことを確認できませんでした",
"viewChats": "チャットを表示",
"review": "確認",
"activityUnnamed": "名前なし",
@@ -17042,9 +17172,7 @@
"activityQuestion": "回答待ち: {{value0}}",
"activityMidReply": "返信の途中でした",
"activitySubagentOne": "サブ Agent 実行中: {{value0}}",
"activitySubagentMany": "{{value0}} 個のサブ Agent が実行中",
"activityMonitorOne": "監視中: {{value0}}",
"activityMonitorMany": "{{value0}} 個のバックグラウンドタスクを監視中",
"selectWorkspace": "{{value0}} のチャットをすべて選択",
"workspaceSelectedCount": "{{value0}}/{{value1}}",
"selectAll": "すべてのチャットを選択",
@@ -17061,10 +17189,15 @@
"serverBody": "{{machine}} の Orca が再起動したとき、これらのチャットは作業中でした。再開すると、各チャットを停止した位置から復元し、Agent に作業の続行を依頼します。あなたのプロンプトは再送信されません。",
"serverDismiss": "閉じる",
"serverResumeAll": "{{machine}} の {{count}} 件をすべて再開",
"serverResumeHereOne": "ここで開始したチャット 1 件を再開",
"serverResumeHere": "ここで開始したチャット {{count}} 件を再開",
"resumeChats_one": "{{count}} 件のチャットを再開",
"resumeChats_other": "{{count}} 件のチャットを再開"
"resumeChats_other": "{{count}} 件のチャットを再開",
"serverResumeHereCount_other": "ここで開始した {{count}} 件のチャットを再開",
"continuedCount_other": "{{count}} 件のチャットを再開しました",
"notContinuedCount_other": "{{count}} 件のチャットを再開できませんでした",
"notConfirmedCount_other": "{{count}} 件のチャットの再開を確認できませんでした",
"notConfirmedOtherCount_other": "ほかの {{count}} 件のチャットの再開を確認できませんでした",
"activitySubagentCount_other": "{{count}} 個のサブ Agent が実行中",
"activityMonitorCount_other": "{{count}} 件のバックグラウンドタスクを監視中"
},
"linear-issue-attribute-filter-coverage-notice": {
"statusPartialTeamCoverage": "{{value0}}/{{value1}} チームステータスをフィルタリングしています。残りのチームからの問題は含まれません。",
@@ -17216,15 +17349,13 @@
}
},
"NativeChatResumeRunPanel": {
"resumedTitle": "{{value1}} 件中 {{value0}} 件のチャットを再開しました",
"resumedTitleOne": "1 件中 {{value0}} 件のチャットを再開しました",
"resumingTitleOne": "1 件のチャットを再開中",
"resumingTitle": "{{value0}} 件のチャットを再開中",
"description": "各チャットは全コンテキストとともに復元され、中断した箇所を確認するよう依頼されます。このダイアログは閉じても構いません。進行状況はステータスバーで確認できます。",
"finished": "これらのチャットは Orca が終了したときに作業中でした。Orca は各チャットを停止した時点から、すべてのコンテキストとともに復元し、続行する前に何をしていたかを確認するよう Agent に依頼しました。あなた自身のプロンプトは再送信されていません。",
"finishedUpdate": "これらのチャットは Orca がアップデートをインストールしたときに作業中でした。Orca は各チャットを停止した時点から、すべてのコンテキストとともに復元し、続行する前に何をしていたかを確認するよう Agent に依頼しました。あなた自身のプロンプトは再送信されていません。",
"finishedPartial": "これらのチャットは Orca が終了したときに作業中でした。Orca が再開したチャットは停止した時点から、すべてのコンテキストとともに復元され、続行する前に何をしていたかを確認するよう依頼されました。あなた自身のプロンプトは再送信されていません。対応が必要なチャットや再開できるチャットは、この一覧で確認してください。",
"finishedPartialUpdate": "これらのチャットは Orca がアップデートをインストールしたときに作業中でした。Orca が再開したチャットは停止した時点から、すべてのコンテキストとともに復元され、続行する前に何をしていたかを確認するよう依頼されました。あなた自身のプロンプトは再送信されていません。対応が必要なチャットや再開できるチャットは、この一覧で確認してください。"
"finishedPartialUpdate": "これらのチャットは Orca がアップデートをインストールしたときに作業中でした。Orca が再開したチャットは停止した時点から、すべてのコンテキストとともに復元され、続行する前に何をしていたかを確認するよう依頼されました。あなた自身のプロンプトは再送信されていません。対応が必要なチャットや再開できるチャットは、この一覧で確認してください。",
"resumedOfTotal_other": "{{count}} 件中 {{resumed}} 件のチャットを再開しました",
"resumingCount_other": "{{count}} 件のチャットを再開中"
},
"NativeChatResumeRunStatusIcon": {
"waitingForReply": "返信を待っています",
@@ -17289,6 +17420,68 @@
"cancelled": "この通常の SSH ターミナルは開始前に閉じられました。",
"terminalUnavailable": "Orca はここでターミナルを開けませんでした。",
"openHint": "Orca がホスト上でセットアップできない間も、ホストで作業を続けられます。"
},
"AgentStateDot": {
"working": "作業中",
"monitoring": "バックグラウンドタスクを監視中",
"blocked": "ブロック中",
"waiting": "入力待ち",
"interrupted": "中断",
"failed": "失敗",
"done": "完了",
"idle": "待機中",
"unverifiable": "最近の更新なし",
"unconfirmed": "確認できませんでした",
"permission": "対応が必要"
},
"issueComments": {
"you": "あなた"
},
"ZoomOverlay": {
"uiZoom": "UI ズーム",
"editorZoom": "エディターのズーム",
"terminalZoom": "ターミナルのズーム"
},
"issueCopy": {
"urlCopied": "URL をコピーしました",
"keyCopied": "キーをコピーしました",
"identifierCopied": "識別子をコピーしました",
"branchNameCopied": "ブランチ名をコピーしました",
"promptCopied": "プロンプトをコピーしました",
"urlCopyFailed": "URL をコピーできませんでした",
"keyCopyFailed": "キーをコピーできませんでした",
"identifierCopyFailed": "識別子をコピーできませんでした",
"branchNameCopyFailed": "ブランチ名をコピーできませんでした",
"promptCopyFailed": "プロンプトをコピーできませんでした"
},
"prCheckCounts": {
"noChecksFound": "チェックが見つかりません",
"checksFailing_other": "{{count}} 件のチェックが失敗",
"checksNeedAction_other": "{{count}} 件のチェックに対応が必要",
"checksPending_other": "{{count}} 件のチェックが保留中",
"allChecksPassing": "すべてのチェックに成功",
"checksPassingOfTotal_other": "{{count}} 件中 {{passing}} 件のチェックに成功"
},
"taskPageJiraBoard": {
"changeStatusFailed": "ステータスを変更できませんでした。"
},
"jiraIssue": {
"loadStatusChangesFailed": "ステータスの変更を読み込めませんでした。",
"loadCommentsFailed": "コメントを読み込めませんでした。"
},
"taskPageJiraLinkedIssues": {
"someIssuesFailed": "ワークスペースにリンクされた一部の Jira Issue を読み込めませんでした。更新して再試行してください。"
},
"taskPageJiraLoadState": {
"failedToLoadIssues": "Jira Issue を読み込めませんでした。",
"authFailed": "Jira の認証に失敗しました。設定で Jira に再接続してから再試行してください。",
"accessDenied": "Jira がこの Issue 検索へのアクセスを拒否しました。プロジェクトの権限を確認するか、別の JQL クエリをお試しください。",
"rateLimited": "この Issue 検索は Jira のレート制限に達しました。しばらくしてから再試行してください。",
"serverError": "Issue の読み込み中に Jira のサーバーエラーが発生しました。しばらくしてから再試行してください。",
"jqlFailed": "Jira がこの JQL クエリを実行できませんでした。構文を確認して再試行してください。",
"unreachable": "Jira に接続できませんでした。接続を確認して再試行してください。",
"loadFailed": "Jira Issue を読み込めませんでした。しばらくしてから再試行してください。",
"errorWithCode": "エラー {{code}}: {{summary}}"
}
},
"i18n": {
@@ -19536,9 +19729,9 @@
"pathAdded": "Added",
"openFolder": "Open {{name}}",
"findOrTypePath": "フォルダーを検索するか、パスを直接入力…",
"addTypedPath": "Add",
"noDirectories": "まだフォルダーは追加されていません。",
"removePath": "Remove {{name}}"
"removePath": "Remove {{name}}",
"addTypedPathCode": "<path/> を追加"
},
"accounts": {
"wslAccountNotApplied": {
@@ -19637,14 +19830,11 @@
"settingAsk": "確認する",
"title": "{{account}} に切り替えました",
"dontAskAgainHint": "これは、「設定」→「AI プロバイダーアカウント」でオフにできます。",
"bodyOther": "{{previous}} で Claude セッションが {{count}} 件まだ実行中です。再起動すると、{{next}} で各会話が続きます。作業中のセッションは、アイドル状態になってから再起動します。",
"bodyOne": "{{previous}} で Claude セッションが 1 件まだ実行中です。再起動すると、{{next}} で会話が続きます。作業中のセッションは、アイドル状態になってから再起動します。",
"dontAskAgain": "今後は確認しない(自動で再起動する)",
"listLabel": "再起動する Claude セッション",
"restartOne": "セッションを再起動",
"keep": "そのままにする",
"session": "Claude セッション",
"restartOther": "{{count}} 件のセッションを再起動",
"settingDescription": "再起動すると、新規アカウントで実行中の各会話が継続されます。",
"settingTitle": "Claude の実行中にアカウントを切り替える場合",
"restartingOne": "{{account}} で Claude セッションを 1 件再起動中",
@@ -19659,13 +19849,14 @@
"reasonOwnFolder": "独自の Claude フォルダーを使用",
"reasonUnknownAccount": "アカウント不明",
"reasonNoSession": "再開できません",
"reviewBodyOne": "他の Claude セッション 1 件は {{next}} に移動されませんでした。",
"reviewBodyOther": "他の Claude セッション {{count}} 件は {{next}} に移動されませんでした。",
"notMovedOne": "他の 1 件のセッションは移動されませんでした。",
"notMovedOther": "他の {{count}} 件のセッションは移動されませんでした。",
"review": "確認",
"uncheckedOne": "1 つのターミナルで Claude を確認できませんでした。そこで Claude が実行中の場合、再起動するまで {{previous}} のままになります。",
"uncheckedOther": "{{count}} 個のターミナルで Claude を確認できませんでした。そこで実行中の Claude は、再起動するまで {{previous}} のままになります。"
"uncheckedOther": "{{count}} 個のターミナルで Claude を確認できませんでした。そこで実行中の Claude は、再起動するまで {{previous}} のままになります。",
"restartCount_other": "{{count}} 件のセッションを再起動",
"reviewBody_other": "ほかの {{count}} 件の Claude セッションは {{next}} に移動されませんでした。",
"body_other": "{{count}} 件の Claude セッションがまだ {{previous}} で実行中です。再起動すると、各会話が {{next}} で続行されます。処理中のセッションは待機状態になってから再起動します。"
}
},
"hostSignIn": {
@@ -20090,13 +20281,12 @@
"optionalEmail": "Atlassian のメールアドレス (スコープ付きトークンではオプション)"
},
"workspace": {
"count": "{{key}} にリンクされたワークスペース {{count}} 件",
"startAnother": "新規ワークスペースを開始",
"empty": "Jira Issue をワークスペースにリンクするか、別のビューを選択してください。",
"openFailed": "この Jira Issue にリンクされたワークスペースを開けませんでした。",
"mode": "ワークスペースあり",
"search": "リンクされた Issue を検索",
"single": "{{key}} にリンクされたワークスペース 1 件"
"linkedCount_other": "{{count}} 件のワークスペースが {{key}} にリンク済み"
},
"prompt": {
"dialogTitle": "テンプレートからプロンプトをコピー",
@@ -20574,7 +20764,7 @@
"email": "メールアドレスの取得",
"allSites": "すべてのウェブサイト上にある自分のすべてのデータの読み取りと変更",
"someSites": "{{hosts}} 上にある自分のデータの読み取りと変更",
"manySites": "{{hosts}} とほか {{count}} 件のサイト上にある自分のデータの読み取りと変更"
"manyOtherSites_other": "{{hosts}} とほかの {{count}} 個のサイト上にある自分のデータの読み取りと変更"
},
"install": {
"title": "{{name}} を追加しますか?",

Some files were not shown because too many files have changed in this diff Show More