From fb139ef64c1def86e5298d4d35c270c2d030b025 Mon Sep 17 00:00:00 2001
From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Date: Sat, 1 Aug 2026 06:46:51 -0700
Subject: [PATCH] fix(mobile): harden localization catalog audit
---
.github/CODEOWNERS | 2 +-
.../scripts/audit-localization-coverage.mjs | 78 +-
.../mobile-embedded-document-candidates.mjs | 143 +-
...bile-localization-candidate-rules.test.mjs | 37 +
...bile-localization-translation-bindings.mjs | 201 +
.../verify-mobile-localization-catalog.mjs | 166 +-
...erify-mobile-localization-catalog.test.mjs | 102 +-
mobile/app/about.tsx | 12 +-
mobile/app/browser-settings.tsx | 18 +-
mobile/app/connection-log.tsx | 16 +-
mobile/app/h/[hostId]/accounts.tsx | 30 +-
mobile/app/h/[hostId]/edit.tsx | 36 +-
mobile/app/h/[hostId]/index.tsx | 135 +-
.../session/QuickCommandsTabButton.tsx | 2 +-
.../app/h/[hostId]/session/[worktreeId].tsx | 366 +-
.../session/mobile-session-route-types.ts | 34 +
mobile/app/h/[hostId]/tasks.tsx | 1861 ++++---
mobile/app/h/_layout.tsx | 21 +-
mobile/app/index.tsx | 89 +-
mobile/app/mobile-onboarding.tsx | 8 +-
mobile/app/native-chat-settings.tsx | 14 +-
mobile/app/notifications.tsx | 10 +-
mobile/app/pair-confirm.tsx | 24 +-
mobile/app/pair-scan.tsx | 54 +-
mobile/app/pair.tsx | 4 +-
mobile/app/settings.tsx | 41 +-
mobile/app/terminal-settings.tsx | 62 +-
mobile/app/troubleshoot.tsx | 58 +-
mobile/app/voice-settings.tsx | 44 +-
.../MobileAgentSessionHistoryList.tsx | 11 +-
.../MobileAgentSessionHistoryPanel.tsx | 66 +-
.../agent-history-resume-target.ts | 6 +-
.../agent-history-session-card.ts | 2 +-
.../use-mobile-agent-history-state.ts | 16 +-
.../worktree-navigation-actions.ts | 4 +-
mobile/src/browser/MobileBrowserKeyRow.tsx | 2 +-
mobile/src/browser/MobileBrowserPane.tsx | 49 +-
.../browser/MobileBrowserPointerModifiers.tsx | 12 +-
.../browser/MobileBrowserViewModeSwitch.tsx | 8 +-
mobile/src/components/AuthFailedBanner.tsx | 10 +-
.../src/components/CodexResetCreditAction.tsx | 19 +-
mobile/src/components/ConfirmModal.tsx | 4 +-
mobile/src/components/CustomKeyModal.tsx | 48 +-
mobile/src/components/DragReorderList.tsx | 8 +-
mobile/src/components/HostProtocolGate.tsx | 7 +-
.../components/MobileDictationSetupSheet.tsx | 40 +-
.../src/components/MobileDiffReviewBody.tsx | 38 +-
.../components/MobileDiffReviewDrawers.tsx | 88 +-
.../MobileDiffReviewFileSummary.tsx | 32 +-
.../src/components/MobileDiffReviewFooter.tsx | 26 +-
.../src/components/MobileDiffReviewHeader.tsx | 17 +-
.../src/components/MobileDiffReviewLine.tsx | 21 +-
mobile/src/components/MobileHostCard.tsx | 17 +-
mobile/src/components/MobileHtmlPreview.tsx | 8 +-
mobile/src/components/MobileMarkdown.tsx | 18 +-
mobile/src/components/MobilePRSidebar.tsx | 11 +-
mobile/src/components/MobilePrBasePicker.tsx | 2 +-
.../components/MobileRichMarkdownEditor.tsx | 78 +-
mobile/src/components/MobileSearchField.tsx | 2 +-
.../components/MobileWorkspaceNameInput.tsx | 2 +-
mobile/src/components/NewWorkspaceFab.tsx | 2 +-
mobile/src/components/NewWorktreeModal.tsx | 74 +-
mobile/src/components/ProtocolBlockScreen.tsx | 12 +-
.../src/components/SetupHookTrustDrawer.tsx | 20 +-
.../SmartWorkspaceAdvancedFields.tsx | 12 +-
.../components/SmartWorkspaceSourceDrawer.tsx | 28 +-
.../components/SmartWorkspaceSourceField.tsx | 4 +-
.../components/SmartWorkspaceSourceRow.tsx | 16 +-
.../components/TerminalShortcutSettings.tsx | 20 +-
mobile/src/components/TextInputModal.tsx | 4 +-
mobile/src/components/VoiceModelList.tsx | 12 +-
.../components/WorkspaceDetailPlaceholder.tsx | 4 +-
mobile/src/components/WorktreeListRow.tsx | 4 +-
mobile/src/components/accounts-snapshot.ts | 18 +-
mobile/src/components/codex-reset-credit.ts | 40 +-
.../src/components/mounted-bottom-drawer.tsx | 2 +-
.../new-worktree-agent-selection.ts | 2 +-
.../components/pr-sidebar/MermaidDiagram.tsx | 4 +-
.../pr-sidebar/MobileLinkPrForm.tsx | 16 +-
.../pr-sidebar/MobilePrComposeForm.tsx | 56 +-
.../pr-sidebar/MobilePrViewPanel.tsx | 4 +-
.../pr-sidebar/PRActionsSection.tsx | 46 +-
.../components/pr-sidebar/PRCheckDetail.tsx | 10 +-
.../components/pr-sidebar/PRChecksSection.tsx | 31 +-
.../components/pr-sidebar/PRCommentCard.tsx | 42 +-
.../pr-sidebar/PRCommentComposer.tsx | 4 +-
.../pr-sidebar/PRCommentsSection.tsx | 50 +-
.../pr-sidebar/PRConflictingFilesSection.tsx | 31 +-
.../pr-sidebar/PRReviewersSection.tsx | 12 +-
.../components/pr-sidebar/PRSidebarHeader.tsx | 22 +-
.../pr-sidebar/PrSidebarCreateEmptyState.tsx | 28 +-
.../pr-sidebar/ReviewerPickerDrawer.tsx | 15 +-
.../components/pr-sidebar/markdown-blocks.ts | 8 +-
.../pr-sidebar/pr-check-detail-content.ts | 3 +-
.../pr-sidebar/pr-checks-presentation.ts | 72 +-
.../pr-sidebar/pr-comment-audience.ts | 12 +-
.../components/pr-sidebar/pr-comment-time.ts | 14 +-
.../use-codex-reset-credit-action.ts | 44 +-
.../troubleshoot-common-issues.tsx | 46 +-
.../src/dictation/mobile-dictation-setup.ts | 10 +-
mobile/src/files/MobileFileExplorerPanel.tsx | 27 +-
.../src/files/MobileFileMarkdownPreview.tsx | 4 +-
mobile/src/files/MobileFilePreviewBody.tsx | 8 +-
.../files/MobileFilePreviewEditableSource.tsx | 4 +-
mobile/src/files/MobileFilePreviewScreen.tsx | 51 +-
.../src/files/MobileFilePreviewSourceText.tsx | 10 +-
mobile/src/files/mobile-file-explorer-row.tsx | 22 +-
.../files/mobile-file-mutation-ownership.ts | 2 +-
.../src/files/mobile-file-preview-request.ts | 2 +-
.../src/files/mobile-file-preview-response.ts | 40 +-
mobile/src/files/mobile-file-preview-route.ts | 6 +-
.../hooks/mobile-dictation-desktop-start.ts | 2 +-
.../src/hooks/mobile-dictation-keep-awake.ts | 2 +-
.../mobile-dictation-pending-audio-budget.ts | 4 +-
mobile/src/hooks/use-mobile-dictation.ts | 6 +-
mobile/src/i18n/locales/en.json | 4783 +++++++++--------
mobile/src/i18n/locales/es.json | 4593 ++++++++--------
mobile/src/i18n/locales/ja.json | 4632 ++++++++--------
mobile/src/i18n/locales/ko.json | 4631 ++++++++--------
mobile/src/i18n/locales/zh.json | 4640 ++++++++--------
mobile/src/i18n/mobile-i18n.test.ts | 75 +-
mobile/src/i18n/mobile-i18n.ts | 4 +
.../src/i18n/use-mobile-locale-reload.test.ts | 59 +
mobile/src/i18n/use-mobile-locale-reload.ts | 22 +-
.../src/onboarding/MobileOnboardingPage.tsx | 24 +-
.../session/MobileAgentWorkingIndicator.tsx | 2 +-
.../session/MobileBrowserTabActionSheet.tsx | 10 +-
mobile/src/session/MobileNativeChatAsk.tsx | 10 +-
.../src/session/MobileNativeChatComposer.tsx | 12 +-
.../src/session/MobileNativeChatMessage.tsx | 28 +-
.../src/session/MobileNativeChatQuestion.tsx | 14 +-
mobile/src/session/MobileNativeChatView.tsx | 16 +-
.../MobileSessionHeaderMoreActionsSheet.tsx | 8 +-
.../session/MobileTerminalInputActions.tsx | 16 +-
.../session/MobileTerminalLiveInputStatus.tsx | 18 +-
mobile/src/session/QuickCommandEditorForm.tsx | 38 +-
mobile/src/session/QuickCommandsList.tsx | 28 +-
mobile/src/session/QuickCommandsSheet.tsx | 36 +-
mobile/src/session/ai-vault-resume-launch.ts | 8 +-
.../session/ai-vault-resume-preparation.ts | 2 +-
mobile/src/session/floating-workspace.ts | 2 +-
mobile/src/session/github-pr-mutations.ts | 32 +-
mobile/src/session/github-pr-rpc.ts | 8 +-
.../mobile-bulk-close-sheet-actions.ts | 2 +-
mobile/src/session/mobile-clipboard-image.ts | 2 +-
.../src/session/mobile-diff-comments.test.ts | 6 +-
.../mobile-diff-review-controller-input.ts | 16 +
.../src/session/mobile-diff-review-loaders.ts | 37 +-
.../src/session/mobile-diff-review-queue.ts | 5 +-
mobile/src/session/mobile-diff-review-rpc.ts | 2 +-
.../mobile-diff-review-screen-model.ts | 28 +-
.../mobile-native-chat-permission-send.ts | 6 +-
.../session/mobile-native-chat-permission.ts | 25 +-
.../session/mobile-native-chat-question.ts | 3 +-
.../session/mobile-native-chat-render-data.ts | 2 +-
.../mobile-native-chat-stream-frame.ts | 5 +-
.../mobile-native-chat-toggle-action.ts | 4 +-
mobile/src/session/mobile-pr-sidebar-state.ts | 2 +-
.../session/mobile-session-route-helpers.ts | 12 +-
.../mobile-session-startup-source.test.ts | 14 +-
.../src/session/mobile-tab-close-selection.ts | 6 +-
.../mobile-terminal-action-sheet-actions.ts | 10 +-
mobile/src/session/mobile-terminal-records.ts | 2 +-
.../src/session/mobile-terminal-tab-agent.ts | 14 +-
mobile/src/session/pr-actions-engine.ts | 4 +-
mobile/src/session/pr-ai-triage-launch.ts | 8 +-
...uick-commands-tab-stability-source.test.ts | 6 +-
.../use-mobile-attachment-input-lease-gate.ts | 2 +-
.../use-mobile-diff-review-comment-actions.ts | 12 +-
.../use-mobile-diff-review-controller.ts | 44 +-
.../use-mobile-diff-review-git-actions.ts | 22 +-
.../use-mobile-diff-review-interactions.ts | 2 +-
.../use-mobile-diff-review-send-actions.ts | 24 +-
.../session/use-mobile-image-attachment.ts | 8 +-
.../use-mobile-native-chat-answer-send.ts | 10 +-
.../use-mobile-native-chat-cancel-ask.ts | 6 +-
...se-mobile-native-chat-image-attachments.ts | 22 +-
.../use-mobile-native-chat-message-send.ts | 12 +-
.../session/use-mobile-native-chat-stop.ts | 8 +-
mobile/src/session/use-mobile-pr-actions.ts | 5 +-
mobile/src/session/use-mobile-pr-ai-triage.ts | 4 +-
.../session/use-mobile-pr-comment-actions.ts | 2 +-
.../src/session/use-mobile-pr-title-action.ts | 4 +-
.../src/session/use-mobile-terminal-paste.ts | 10 +-
mobile/src/session/use-quick-commands.ts | 14 +-
mobile/src/session/worktree-label.ts | 2 +-
.../MobileBranchDiffPreviewDrawer.tsx | 12 +-
.../MobileCommitFailurePanel.tsx | 20 +-
.../source-control/MobileGitHistoryList.tsx | 16 +-
.../MobileSourceControlBranchCard.tsx | 18 +-
.../MobileSourceControlContent.tsx | 28 +-
.../MobileSourceControlFileRows.tsx | 33 +-
.../MobileSourceControlHeader.tsx | 14 +-
.../MobileSourceControlModals.tsx | 31 +-
.../MobileSourceControlPanel.tsx | 6 +-
.../MobileSourceControlPrChip.tsx | 22 +-
.../src/source-control/hosted-review-copy.ts | 12 +-
.../source-control/mobile-branch-base-ref.ts | 2 +-
.../source-control/mobile-branch-compare.ts | 26 +-
.../mobile-commit-message-ai.ts | 12 +-
.../source-control/mobile-create-pr-action.ts | 11 +-
.../src/source-control/mobile-git-history.ts | 6 +-
.../src/source-control/mobile-git-status.ts | 6 +-
.../mobile-hosted-review-create-intent.ts | 30 +-
.../mobile-hosted-review-git-preparation.ts | 20 +-
...obile-hosted-review-remote-prerequisite.ts | 6 +-
.../mobile-hosted-review-service.ts | 24 +-
.../source-control/mobile-pr-chip-summary.ts | 12 +-
mobile/src/source-control/mobile-pr-create.ts | 63 +-
mobile/src/source-control/mobile-pr-link.ts | 14 +-
.../mobile-source-control-actions.ts | 96 +-
.../mobile-source-control-conflict-abort.ts | 6 +-
.../mobile-source-control-hub-tab.ts | 6 +-
.../mobile-source-control-primary-action.ts | 68 +-
.../mobile-source-control-screen-state.ts | 9 +-
.../source-control/pr-compose-validation.ts | 10 +-
.../use-mobile-commit-failure-recovery.ts | 6 +-
.../use-mobile-commit-message-generation.ts | 4 +-
.../use-mobile-create-pr-runner.ts | 2 +-
.../source-control/use-mobile-git-requests.ts | 10 +-
...ile-source-control-action-sheet-runners.ts | 4 +-
...se-mobile-source-control-commit-runners.ts | 6 +-
.../use-mobile-source-control-loaders.ts | 25 +-
.../use-mobile-source-control-openers.ts | 17 +-
.../use-mobile-source-control-runners.ts | 4 +-
.../storage/codex-reset-attempt-journal.ts | 4 +-
mobile/src/tasks/github-review-metadata.ts | 12 +-
mobile/src/tasks/linear-mobile-issue-read.ts | 2 +-
.../tasks/mobile-github-project-group-sort.ts | 4 +-
.../src/tasks/mobile-hosted-check-status.ts | 42 +-
mobile/src/tasks/mobile-smart-source-modes.ts | 44 +-
mobile/src/tasks/mobile-tasks-screen-types.ts | 256 +
mobile/src/tasks/mobile-tui-agents.ts | 70 +-
mobile/src/tasks/sparse-preset-draft.ts | 6 +-
.../src/tasks/use-mobile-composer-source.ts | 2 +-
mobile/src/tasks/workspace-agent-selection.ts | 2 +-
mobile/src/tasks/workspace-ssh-gate.ts | 16 +-
mobile/src/tasks/worktree-create-retry.ts | 2 +-
mobile/src/terminal/TerminalWebView.tsx | 12 +-
.../terminal-accessory-key-catalog.ts | 112 +-
.../src/terminal/terminal-accessory-keys.ts | 104 +-
.../terminal-live-input-affordance.test.ts | 6 +-
.../terminal-webview-engine-error-state.tsx | 4 +-
.../terminal-webview-notification-dispatch.ts | 5 +-
.../terminal-webview-ready-watchdog.ts | 2 +-
.../src/transport/connection-health.test.ts | 15 +-
mobile/src/transport/connection-health.ts | 26 +-
mobile/src/transport/host-endpoint.ts | 46 +-
.../transport/mobile-connection-path-label.ts | 6 +-
.../transport/mobile-relay-host-overlay.ts | 9 +-
.../src/transport/mobile-relay-rpc-streams.ts | 5 +-
mobile/src/transport/pair-confirm-state.ts | 12 +-
mobile/src/worktree/agent-row-display.ts | 14 +-
.../src/worktree/mobile-host-screen-props.ts | 6 +
.../src/worktree/mobile-workspace-statuses.ts | 23 +-
.../worktree/workspace-list-picker-options.ts | 36 +-
.../src/worktree/workspace-list-sections.ts | 12 +-
.../worktree/workspace-pr-status-groups.ts | 8 +-
258 files changed, 17361 insertions(+), 13850 deletions(-)
create mode 100644 config/scripts/mobile-localization-translation-bindings.mjs
create mode 100644 mobile/src/i18n/use-mobile-locale-reload.test.ts
create mode 100644 mobile/src/session/mobile-diff-review-controller-input.ts
create mode 100644 mobile/src/tasks/mobile-tasks-screen-types.ts
create mode 100644 mobile/src/worktree/mobile-host-screen-props.ts
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 711793ac102..b82ec1b453b 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -4,6 +4,6 @@
/mobile/locales/ @brennanb2025
/config/scripts/*localization*.mjs @brennanb2025
/config/scripts/*locale*.mjs @brennanb2025
-/config/scripts/localize-mobile-strings.mjs @brennanb2025
/config/scripts/mobile-embedded-document-candidates.mjs @brennanb2025
+/config/mobile-localization-coverage-allowlist.json @brennanb2025
/config/i18next.config.ts @brennanb2025
diff --git a/config/scripts/audit-localization-coverage.mjs b/config/scripts/audit-localization-coverage.mjs
index 0b5fdae58a6..5169c481f33 100644
--- a/config/scripts/audit-localization-coverage.mjs
+++ b/config/scripts/audit-localization-coverage.mjs
@@ -8,6 +8,14 @@ import ts from 'typescript-api'
import { collectMobileEmbeddedDocumentCandidates } from './mobile-embedded-document-candidates.mjs'
import { classifyMobileStringNode } from './mobile-localization-candidate-rules.mjs'
+import {
+ isAssignedToRenderedVariable,
+ isRenderedJsxExpression
+} from './mobile-localization-rendered-variable.mjs'
+import {
+ collectMobileTranslationBindings,
+ isMobileTranslationCall
+} from './mobile-localization-translation-bindings.mjs'
const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts'])
const SKIP_PATH_PARTS = new Set(['.git', 'dist', 'node_modules', 'out', '__snapshots__', 'assets'])
@@ -161,12 +169,15 @@ function stringParts(node) {
]
}
-function isInsideLocalizationCall(node) {
+function isInsideLocalizationCall(node, sourceFile, mobileBindings) {
let current = node.parent
while (current) {
if (ts.isCallExpression(current)) {
+ if (mobileBindings && isMobileTranslationCall(current, sourceFile, mobileBindings)) {
+ return true
+ }
const name = expressionNameText(current.expression)
- if (name && LOCALIZATION_CALL_NAMES.has(name.split('.').at(-1) ?? name)) {
+ if (!mobileBindings && name && LOCALIZATION_CALL_NAMES.has(name.split('.').at(-1) ?? name)) {
return true
}
}
@@ -175,6 +186,24 @@ function isInsideLocalizationCall(node) {
return false
}
+function isUnboundRenderedTranslationArgument(node, sourceFile, mobileBindings) {
+ const call = findAncestor(node, ts.isCallExpression)
+ if (!call || !ts.isIdentifier(call.expression)) {
+ return false
+ }
+ const name = call.expression.text
+ const resemblesTranslator =
+ LOCALIZATION_CALL_NAMES.has(name) ||
+ mobileBindings.translatorNames.has(name) ||
+ mobileBindings.fixedTranslatorNames.has(name) ||
+ mobileBindings.prefixedTranslatorNames.has(name)
+ return (
+ resemblesTranslator &&
+ !isMobileTranslationCall(call, sourceFile, mobileBindings) &&
+ (isRenderedJsxExpression(call) || isAssignedToRenderedVariable(call))
+ )
+}
+
function isJsxAttributeValue(node) {
const parent = node.parent
if (!parent) {
@@ -209,40 +238,6 @@ function ancestorJsxAttributeName(node) {
return undefined
}
-function isRenderedJsxExpression(node) {
- let current = node.parent
- while (current) {
- if (ts.isJsxExpression(current)) {
- return (
- ts.isJsxElement(current.parent) ||
- ts.isJsxFragment(current.parent) ||
- ts.isJsxSelfClosingElement(current.parent)
- )
- }
- if (
- ts.isConditionalExpression(current) ||
- ts.isParenthesizedExpression(current) ||
- ts.isTemplateExpression(current) ||
- ts.isNoSubstitutionTemplateLiteral(current)
- ) {
- if (ts.isConditionalExpression(current) && current.condition === node) {
- return false
- }
- current = current.parent
- continue
- }
- if (ts.isBinaryExpression(current)) {
- if (current.operatorToken.kind !== ts.SyntaxKind.PlusToken) {
- return false
- }
- current = current.parent
- continue
- }
- return false
- }
- return false
-}
-
function nearestObjectPropertyName(node) {
let current = node.parent
while (current) {
@@ -406,10 +401,14 @@ export function collectLocalizationCandidates(filePath, sourceText, root = proce
/^mobile\/src\/(?:agent-history|browser|components|dictation|files|hooks|session|source-control|tasks)\//.test(
relativePath
)
+ const mobileBindings = mobileSource ? collectMobileTranslationBindings(sourceFile) : undefined
function pushReport(node, kind, text, dynamic = false) {
const value = compactText(text)
- if (!hasHumanLanguageText(value) || isInsideLocalizationCall(node)) {
+ if (
+ !hasHumanLanguageText(value) ||
+ isInsideLocalizationCall(node, sourceFile, mobileBindings)
+ ) {
return
}
const position = lineAndColumn(sourceFile, node)
@@ -433,7 +432,10 @@ export function collectLocalizationCandidates(filePath, sourceText, root = proce
}
const kind = mobileSource
- ? classifyMobileStringNode(node, userVisibleErrorSource)
+ ? (classifyMobileStringNode(node, userVisibleErrorSource) ??
+ (isUnboundRenderedTranslationArgument(node, sourceFile, mobileBindings)
+ ? 'unbound-localization-call'
+ : undefined))
: classifyStringNode(node)
if (kind) {
for (const part of stringParts(node)) {
diff --git a/config/scripts/mobile-embedded-document-candidates.mjs b/config/scripts/mobile-embedded-document-candidates.mjs
index d992fb54a83..b8a30318454 100644
--- a/config/scripts/mobile-embedded-document-candidates.mjs
+++ b/config/scripts/mobile-embedded-document-candidates.mjs
@@ -4,7 +4,7 @@ import ts from 'typescript-api'
const EMBEDDED_DOCUMENT_FILE_RE = /(?:-html|webview-html)\.[cm]?[jt]sx?$/
const USER_VISIBLE_ATTRIBUTE_RE =
/\b(aria-description|aria-label|alt|data-placeholder|placeholder|title)\s*=\s*(["'])(.*?)\2/gi
-const USER_VISIBLE_PROMPT_RE = /\b(?:window\.)?(alert|confirm|prompt)\(\s*(["'])(.*?)\2/g
+const USER_VISIBLE_PROMPT_START_RE = /\b(?:window\.)?(alert|confirm|prompt)\(\s*/g
const INSERTED_HTML_CALL_RE = /\bexecCommand\(\s*(["'])insertHTML\1\s*,\s*false\s*,/g
function maskNonMarkupContent(documentText) {
@@ -17,33 +17,57 @@ function capturedOffset(match, capturedValue) {
return (match.index ?? 0) + match[0].indexOf(capturedValue)
}
+function collectTextCandidates(value, baseOffset, kind, candidates) {
+ if (!value.includes('${')) {
+ candidates.push({
+ start: baseOffset,
+ end: baseOffset + value.length,
+ kind,
+ text: value,
+ dynamic: false
+ })
+ return
+ }
+
+ let cursor = 0
+ while (cursor < value.length) {
+ const interpolationStart = value.indexOf('${', cursor)
+ const segmentEnd = interpolationStart === -1 ? value.length : interpolationStart
+ if (segmentEnd > cursor) {
+ candidates.push({
+ start: baseOffset + cursor,
+ end: baseOffset + segmentEnd,
+ kind,
+ text: value.slice(cursor, segmentEnd),
+ dynamic: true
+ })
+ }
+ if (interpolationStart === -1) {
+ break
+ }
+ cursor = skipTemplateInterpolation(value, interpolationStart)
+ }
+}
+
function collectMarkupCandidates(markup, baseOffset, candidates) {
for (const match of markup.matchAll(USER_VISIBLE_ATTRIBUTE_RE)) {
const value = match[3]
- if (!value.includes('${')) {
- const start = baseOffset + capturedOffset(match, value)
- candidates.push({
- start,
- end: start + value.length,
- kind: `embedded-html-attribute:${match[1].toLowerCase()}`,
- text: value,
- dynamic: false
- })
- }
+ collectTextCandidates(
+ value,
+ baseOffset + capturedOffset(match, value),
+ `embedded-html-attribute:${match[1].toLowerCase()}`,
+ candidates
+ )
}
for (const match of markup.matchAll(/>([^<]+)
])
})
+ it('finds static copy around dynamic WebView values and prompts', () => {
+ const source = [
+ 'export const HTML = `',
+ '',
+ '',
+ '`'
+ ].join('\n')
+ const candidates = collectLocalizationCandidates(
+ '/repo/mobile/src/components/example-webview-html.ts',
+ source,
+ '/repo'
+ )
+
+ expect(candidates.map(({ dynamic, text }) => ({ dynamic, text }))).toEqual([
+ { dynamic: true, text: 'Copy' },
+ { dynamic: true, text: 'Retry' },
+ { dynamic: true, text: 'Could not load' }
+ ])
+ })
+
it('finds literals assigned to variables that later render in JSX', () => {
const source = `
export function Example({ alternate }) {
@@ -81,4 +101,21 @@ export function toRow(item) {
expect(candidates.map((candidate) => candidate.text)).toEqual(['(no commit message)'])
})
+
+ it('recognizes aliased translators and reports calls shadowed by parameters', () => {
+ const source = `
+import { t as translateMobile } from '@/i18n/mobile-i18n'
+const localized = translateMobile('example.localized')
+export function Example(translateMobile) {
+ return {translateMobile('Unlocalized shadowed copy')}
+}
+`
+ const candidates = collectLocalizationCandidates(
+ '/repo/mobile/src/components/Example.tsx',
+ source,
+ '/repo'
+ )
+
+ expect(candidates.map((candidate) => candidate.text)).toEqual(['Unlocalized shadowed copy'])
+ })
})
diff --git a/config/scripts/mobile-localization-translation-bindings.mjs b/config/scripts/mobile-localization-translation-bindings.mjs
new file mode 100644
index 00000000000..b71f7970bb9
--- /dev/null
+++ b/config/scripts/mobile-localization-translation-bindings.mjs
@@ -0,0 +1,201 @@
+// TypeScript 7 is a native CLI; AST consumers still need the legacy JavaScript API.
+import ts from 'typescript-api'
+
+const MOBILE_I18N_MODULE_RE = /(?:^|\/)mobile-i18n$/
+
+function bindingNames(name, names = []) {
+ if (!name) {
+ return names
+ }
+ if (ts.isIdentifier(name)) {
+ names.push(name.text)
+ } else {
+ for (const element of name.elements) {
+ bindingNames(element.name, names)
+ }
+ }
+ return names
+}
+
+function lexicalScope(node, sourceFile) {
+ let current = node.parent
+ while (current && current !== sourceFile) {
+ if (ts.isBlock(current) || ts.isSourceFile(current) || ts.isFunctionLike(current)) {
+ return current
+ }
+ current = current.parent
+ }
+ return sourceFile
+}
+
+function functionScope(node, sourceFile) {
+ let current = node.parent
+ while (current && current !== sourceFile) {
+ if (ts.isFunctionLike(current)) {
+ return current
+ }
+ current = current.parent
+ }
+ return sourceFile
+}
+
+function addDeclarations(sourceFile) {
+ const declarations = new Map()
+
+ function add(scope, name) {
+ const names = declarations.get(scope) ?? new Set()
+ names.add(name)
+ declarations.set(scope, names)
+ }
+
+ function visit(node) {
+ if (ts.isParameter(node)) {
+ for (const name of bindingNames(node.name)) {
+ add(node.parent, name)
+ }
+ } else if (ts.isVariableDeclaration(node)) {
+ const declarationList = node.parent
+ const scope =
+ ts.isVariableDeclarationList(declarationList) &&
+ (declarationList.flags & ts.NodeFlags.BlockScoped) === 0
+ ? functionScope(node, sourceFile)
+ : lexicalScope(node, sourceFile)
+ for (const name of bindingNames(node.name)) {
+ add(scope, name)
+ }
+ } else if ((ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node)) && node.name) {
+ add(lexicalScope(node, sourceFile), node.name.text)
+ } else if (ts.isCatchClause(node) && node.variableDeclaration) {
+ for (const name of bindingNames(node.variableDeclaration.name)) {
+ add(node, name)
+ }
+ }
+ ts.forEachChild(node, visit)
+ }
+
+ visit(sourceFile)
+ return declarations
+}
+
+function isShadowed(identifier, sourceFile, declarations) {
+ let current = identifier.parent
+ while (current && current !== sourceFile) {
+ if (declarations.get(current)?.has(identifier.text)) {
+ return true
+ }
+ current = current.parent
+ }
+ return false
+}
+
+function isEnglishFixedTranslator(node, instanceNames, sourceFile, declarations) {
+ return (
+ ts.isCallExpression(node) &&
+ ts.isPropertyAccessExpression(node.expression) &&
+ ts.isIdentifier(node.expression.expression) &&
+ instanceNames.has(node.expression.expression.text) &&
+ !isShadowed(node.expression.expression, sourceFile, declarations) &&
+ node.expression.name.text === 'getFixedT' &&
+ node.arguments.length === 1 &&
+ ts.isStringLiteralLike(node.arguments[0]) &&
+ node.arguments[0].text === 'en'
+ )
+}
+
+function mobileTranslatorPrefix(node, factoryNames, sourceFile, declarations) {
+ if (
+ !ts.isCallExpression(node) ||
+ !ts.isIdentifier(node.expression) ||
+ !factoryNames.has(node.expression.text) ||
+ isShadowed(node.expression, sourceFile, declarations) ||
+ node.arguments.length !== 1 ||
+ !ts.isStringLiteralLike(node.arguments[0])
+ ) {
+ return undefined
+ }
+ return node.arguments[0].text
+}
+
+export function collectMobileTranslationBindings(sourceFile) {
+ const translatorNames = new Set()
+ const translatorFactoryNames = new Set()
+ const instanceNames = new Set()
+ const fixedTranslatorNames = new Set()
+ const prefixedTranslatorNames = new Map()
+ const declarations = addDeclarations(sourceFile)
+
+ for (const statement of sourceFile.statements) {
+ if (
+ !ts.isImportDeclaration(statement) ||
+ !ts.isStringLiteralLike(statement.moduleSpecifier) ||
+ !MOBILE_I18N_MODULE_RE.test(statement.moduleSpecifier.text)
+ ) {
+ continue
+ }
+ for (const element of statement.importClause?.namedBindings?.elements ?? []) {
+ const importedName = element.propertyName?.text ?? element.name.text
+ if (importedName === 't') {
+ translatorNames.add(element.name.text)
+ } else if (importedName === 'createMobileTranslator') {
+ translatorFactoryNames.add(element.name.text)
+ } else if (importedName === 'mobileI18n') {
+ instanceNames.add(element.name.text)
+ }
+ }
+ }
+
+ function collectFixed(node) {
+ if (
+ ts.isVariableDeclaration(node) &&
+ ts.isIdentifier(node.name) &&
+ node.initializer &&
+ isEnglishFixedTranslator(node.initializer, instanceNames, sourceFile, declarations)
+ ) {
+ fixedTranslatorNames.add(node.name.text)
+ }
+ if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {
+ const prefix = mobileTranslatorPrefix(
+ node.initializer,
+ translatorFactoryNames,
+ sourceFile,
+ declarations
+ )
+ if (prefix !== undefined) {
+ prefixedTranslatorNames.set(node.name.text, prefix)
+ }
+ }
+ ts.forEachChild(node, collectFixed)
+ }
+ collectFixed(sourceFile)
+
+ return {
+ declarations,
+ fixedTranslatorNames,
+ instanceNames,
+ prefixedTranslatorNames,
+ translatorNames
+ }
+}
+
+export function mobileTranslationCallPrefix(call, sourceFile, bindings) {
+ const callee = call.expression
+ if (ts.isIdentifier(callee)) {
+ if (isShadowed(callee, sourceFile, bindings.declarations)) {
+ return undefined
+ }
+ if (
+ bindings.translatorNames.has(callee.text) ||
+ bindings.fixedTranslatorNames.has(callee.text)
+ ) {
+ return ''
+ }
+ return bindings.prefixedTranslatorNames.get(callee.text)
+ }
+ return isEnglishFixedTranslator(callee, bindings.instanceNames, sourceFile, bindings.declarations)
+ ? ''
+ : undefined
+}
+
+export function isMobileTranslationCall(call, sourceFile, bindings) {
+ return mobileTranslationCallPrefix(call, sourceFile, bindings) !== undefined
+}
diff --git a/config/scripts/verify-mobile-localization-catalog.mjs b/config/scripts/verify-mobile-localization-catalog.mjs
index c7bc03fff88..3787b4f7d23 100644
--- a/config/scripts/verify-mobile-localization-catalog.mjs
+++ b/config/scripts/verify-mobile-localization-catalog.mjs
@@ -6,6 +6,12 @@ import process from 'node:process'
// TypeScript 7 is a native CLI; AST consumers still need the legacy JavaScript API.
import ts from 'typescript-api'
+import {
+ collectMobileTranslationBindings,
+ isMobileTranslationCall,
+ mobileTranslationCallPrefix
+} from './mobile-localization-translation-bindings.mjs'
+
const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx'])
const SOURCE_RELATIVE_ROOTS = [path.join('mobile', 'app'), path.join('mobile', 'src')]
const LOCALES_RELATIVE_DIR = path.join('mobile', 'src', 'i18n', 'locales')
@@ -46,10 +52,69 @@ const PROTECTED_LITERALS = [
'WSL',
'SSH',
'HEAD',
- 'MR !'
+ 'MR !',
+ 'HOOKS'
]
const PLACEHOLDER_RE = /\{\{\s*([^,}\s]+)(?:,[^}]*)?\}\}/g
const ENCODED_HTML_ENTITY_RE = /&(?:amp|apos|gt|lt|quot);/i
+const INTENT_MESSAGE_ID_RE = /^[a-z][A-Za-z0-9]*(?:\.[a-z][A-Za-z0-9]*)+$/
+const POSITIONAL_PLACEHOLDER_RE = /^value\d+$/
+const LANGUAGE_NEUTRAL_VALUES = new Set([
+ '@orca_build',
+ '[x]',
+ 'Aider',
+ 'Amp',
+ 'Ante',
+ 'Antigravity',
+ 'Auggie',
+ 'Autohand Code',
+ 'Charm',
+ 'Claude',
+ 'Claude Agent Teams',
+ 'Cline',
+ 'Codebuff',
+ 'Codex',
+ 'Command Code',
+ 'Continue',
+ 'Cursor',
+ 'Devin',
+ 'Droid',
+ 'Gemini',
+ 'GitHub',
+ 'GitHub Copilot',
+ 'GitHub Releases',
+ 'GitLab',
+ 'Goose',
+ 'Grok',
+ 'HEAD',
+ 'Hermes',
+ 'Kilocode',
+ 'Kimi',
+ 'Kiro',
+ 'Linear',
+ 'Markdown',
+ 'MiMo Code',
+ 'Mistral Vibe',
+ 'MR',
+ 'MR !',
+ 'OMP',
+ 'onOrca.dev',
+ 'OpenAI API',
+ 'OpenClaude',
+ 'OpenClaw',
+ 'OpenCode',
+ 'Orca',
+ 'Orca Relay',
+ 'orca.yaml',
+ 'ORCA.YAML',
+ 'Pi',
+ 'PR',
+ 'Qwen Code',
+ 'Rovo Dev',
+ 'stablyai/orca',
+ 'Trae',
+ 'YYYY-MM-DD'
+])
function normalizePath(root, filePath) {
return path.relative(root, filePath).split(path.sep).join('/')
@@ -193,6 +258,39 @@ function verifyProtectedLiterals(englishValue, localeValue, locale, key) {
return issues
}
+function isLanguageNeutralValue(value) {
+ const withoutPlaceholders = value.replace(PLACEHOLDER_RE, '').trim()
+ return (
+ LANGUAGE_NEUTRAL_VALUES.has(value) ||
+ /^(?:Alt|Ctrl|Shift)(?:\+(?:[A-Z]|Tab))?$/.test(value) ||
+ /^(?:Del|Enter|Esc|Ins|PgDn|PgUp|Tab)$/.test(value) ||
+ /^(?:F|H)\d{1,2}$/.test(value) ||
+ /^(?:https?:\/\/|orca:\/\/|lin_api_)/.test(value) ||
+ /^(?:npm run dev|Linux: sudo ufw allow 6768|src\/renderer packages\/ui)$/.test(value) ||
+ withoutPlaceholders === '' ||
+ withoutPlaceholders === '..HEAD' ||
+ withoutPlaceholders === '×'
+ )
+}
+
+function verifyTerminology(englishValue, localeValue, locale, key) {
+ const issues = []
+ if (
+ locale === 'es' &&
+ /\bbranch(?:es)?\b/i.test(englishValue) &&
+ /\bsucursal(?:es)?\b/i.test(localeValue)
+ ) {
+ issues.push(`${locale}.json Git terminology mismatch: ${key} translates branch as sucursal`)
+ }
+ if (locale === 'zh' && /\bhost\b/i.test(englishValue) && localeValue.includes('主人')) {
+ issues.push(`${locale}.json host terminology mismatch: ${key} uses 主人`)
+ }
+ if (locale === 'zh' && /\bagent/i.test(englishValue) && localeValue.includes('检测剂')) {
+ issues.push(`${locale}.json agent terminology mismatch: ${key} uses 检测剂`)
+ }
+ return issues
+}
+
export function collectMobileTranslationCalls(filePath, sourceText, root = process.cwd()) {
const sourceKind =
filePath.endsWith('.tsx') || filePath.endsWith('.jsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS
@@ -204,47 +302,17 @@ export function collectMobileTranslationCalls(filePath, sourceText, root = proce
sourceKind
)
const calls = []
- const fixedTranslatorNames = new Set()
-
- function isEnglishFixedTranslator(node) {
- const expression = unwrapExpression(node)
- return (
- ts.isCallExpression(expression) &&
- ts.isPropertyAccessExpression(expression.expression) &&
- ts.isIdentifier(expression.expression.expression) &&
- expression.expression.expression.text === 'mobileI18n' &&
- expression.expression.name.text === 'getFixedT' &&
- expression.arguments.length === 1 &&
- ts.isStringLiteralLike(expression.arguments[0]) &&
- expression.arguments[0].text === 'en'
- )
- }
-
- function collectFixedTranslators(node) {
- if (
- ts.isVariableDeclaration(node) &&
- ts.isIdentifier(node.name) &&
- node.initializer &&
- isEnglishFixedTranslator(node.initializer)
- ) {
- fixedTranslatorNames.add(node.name.text)
- }
- ts.forEachChild(node, collectFixedTranslators)
- }
-
- collectFixedTranslators(sourceFile)
+ const bindings = collectMobileTranslationBindings(sourceFile)
function visit(node) {
- if (
- ts.isCallExpression(node) &&
- ((ts.isIdentifier(node.expression) &&
- (node.expression.text === 't' || fixedTranslatorNames.has(node.expression.text))) ||
- isEnglishFixedTranslator(node.expression))
- ) {
+ if (ts.isCallExpression(node) && isMobileTranslationCall(node, sourceFile, bindings)) {
const keyExpression = node.arguments[0]
if (keyExpression) {
+ const prefix = mobileTranslationCallPrefix(node, sourceFile, bindings)
+ const branches = collectKeyBranches(keyExpression)
calls.push({
- ...collectKeyBranches(keyExpression),
+ ...branches,
+ keys: branches.keys.map((key) => (prefix ? `${prefix}.${key}` : key)),
location: locationFor(root, filePath, sourceFile, keyExpression),
options: collectOptionNames(node.arguments[1]),
source: keyExpression.getText(sourceFile)
@@ -290,6 +358,25 @@ function verifyCalls(calls, englishEntries) {
return issues
}
+function verifyEnglishEntries(calls, englishEntries) {
+ const issues = []
+ const referencedKeys = new Set(calls.flatMap((call) => (call.inspected ? call.keys : [])))
+ for (const [key, value] of englishEntries) {
+ if (!INTENT_MESSAGE_ID_RE.test(key) || key.startsWith('m.')) {
+ issues.push(`en.json message ID must be intent-named: ${key}`)
+ }
+ for (const placeholder of collectPlaceholderNames(value)) {
+ if (POSITIONAL_PLACEHOLDER_RE.test(placeholder)) {
+ issues.push(`en.json placeholder must be intent-named: ${key} uses ${placeholder}`)
+ }
+ }
+ if (!referencedKeys.has(key)) {
+ issues.push(`en.json has orphaned key: ${key}`)
+ }
+ }
+ return issues
+}
+
function verifyLocaleEntries(englishEntries, locale, localeEntries) {
const issues = []
const localeKeys = [...localeEntries.keys()].sort()
@@ -307,6 +394,10 @@ function verifyLocaleEntries(englishEntries, locale, localeEntries) {
issues.push(`${locale}.json placeholder mismatch: ${key}`)
}
issues.push(...verifyProtectedLiterals(englishValue, localeValue, locale, key))
+ issues.push(...verifyTerminology(englishValue, localeValue, locale, key))
+ if (localeValue === englishValue && !isLanguageNeutralValue(englishValue)) {
+ issues.push(`${locale}.json copies English instead of using fallback: ${key}`)
+ }
}
return issues
@@ -476,6 +567,7 @@ export async function main(root = process.cwd()) {
}
issues.push(...verifyCalls(calls, englishEntries))
+ issues.push(...verifyEnglishEntries(calls, englishEntries))
for (const locale of MOBILE_LOCALES.slice(1)) {
const localeEntries = catalogs.get(locale)
if (localeEntries) {
diff --git a/config/scripts/verify-mobile-localization-catalog.test.mjs b/config/scripts/verify-mobile-localization-catalog.test.mjs
index eba1f717015..30d62fb2ac9 100644
--- a/config/scripts/verify-mobile-localization-catalog.test.mjs
+++ b/config/scripts/verify-mobile-localization-catalog.test.mjs
@@ -4,7 +4,10 @@ import path from 'node:path'
import { describe, expect, it, vi } from 'vitest'
-import { main as verifyMobileCatalog } from './verify-mobile-localization-catalog.mjs'
+import {
+ collectMobileTranslationCalls,
+ main as verifyMobileCatalog
+} from './verify-mobile-localization-catalog.mjs'
const LOCALES = ['en', 'es', 'ja', 'ko', 'zh']
const NATIVE_LOCALES = ['en', 'es', 'ja', 'ko', 'zh-Hans']
@@ -62,7 +65,10 @@ function makeProject({ sourceText, catalogs, nativeCatalogs, appConfig }) {
writeJson(path.join(root, 'mobile', 'app.json'), appConfig ?? defaultAppConfig())
for (const locale of LOCALES) {
- writeJson(path.join(localeDirectory, `${locale}.json`), catalogs?.[locale] ?? catalogs.en)
+ writeJson(
+ path.join(localeDirectory, `${locale}.json`),
+ catalogs?.[locale] ?? (locale === 'en' ? catalogs.en : {})
+ )
}
for (const locale of NATIVE_LOCALES) {
writeJson(
@@ -85,10 +91,10 @@ async function runFailedVerification(root) {
describe('verify-mobile-localization-catalog', () => {
it('verifies literal and conditional keys with matching options', async () => {
- const catalog = { m: { greeting: 'Hello {{name}}', farewell: 'Bye {{name}}' } }
+ const catalog = { example: { greeting: 'Hello {{name}}', farewell: 'Bye {{name}}' } }
const root = makeProject({
sourceText:
- "import { t } from '@/i18n/mobile-i18n'\nconst name = 'Orca'\nexport const label = t(name ? 'm.greeting' : 'm.farewell', { name })\n",
+ "import { t } from '@/i18n/mobile-i18n'\nconst name = 'Orca'\nexport const label = t(name ? 'example.greeting' : 'example.farewell', { name })\n",
catalogs: { en: catalog }
})
@@ -115,6 +121,43 @@ describe('verify-mobile-localization-catalog', () => {
expect(await runFailedVerification(root)).toContain('missing English key: m.missing')
})
+ it('tracks aliased imports without treating shadowed names as translators', async () => {
+ const sourceText = `
+import { t as translateMobile } from '@/i18n/mobile-i18n'
+export const label = translateMobile('example.known')
+export function local(translateMobile) {
+ return translateMobile('not-a-translation-key')
+}
+`
+ const calls = collectMobileTranslationCalls('/repo/mobile/app/Example.tsx', sourceText, '/repo')
+
+ expect(calls.map((call) => call.keys)).toEqual([['example.known']])
+ })
+
+ it('expands statically prefixed translators without accepting shadowed calls', () => {
+ const sourceText = `
+import { createMobileTranslator as makeTranslator } from '@/i18n/mobile-i18n'
+const translate = makeTranslator('example')
+export const label = translate('known')
+export function local(translate) {
+ return translate('not-a-translation-key')
+}
+`
+ const calls = collectMobileTranslationCalls('/repo/mobile/app/Example.tsx', sourceText, '/repo')
+
+ expect(calls.map((call) => call.keys)).toEqual([['example.known']])
+ })
+
+ it('ignores unrelated local t functions', () => {
+ const calls = collectMobileTranslationCalls(
+ '/repo/mobile/app/Example.tsx',
+ "function t(value) { return value }\nexport const label = t('not-a-translation-key')\n",
+ '/repo'
+ )
+
+ expect(calls).toEqual([])
+ })
+
it('rejects translation keys that cannot be statically inspected', async () => {
const root = makeProject({
sourceText: "import { t } from '@/i18n/mobile-i18n'\nexport const label = t(runtimeKey)\n",
@@ -137,19 +180,64 @@ describe('verify-mobile-localization-catalog', () => {
})
it('allows missing translations in sparse locale catalogs', async () => {
- const en = { m: { greeting: 'Hello {{name}}', farewell: 'Bye' } }
+ const en = { example: { greeting: 'Hello {{name}}' } }
const root = makeProject({
sourceText:
- "import { t } from '@/i18n/mobile-i18n'\nexport const label = t('m.greeting', { name: 'Orca' })\n",
+ "import { t } from '@/i18n/mobile-i18n'\nexport const label = t('example.greeting', { name: 'Orca' })\n",
catalogs: {
en,
- es: { m: { greeting: 'Hola {{name}}' } }
+ es: { example: { greeting: 'Hola {{name}}' } }
}
})
await expect(verifyMobileCatalog(root)).resolves.toBe(0)
})
+ it('rejects opaque IDs, positional placeholders, and orphaned English keys', async () => {
+ const root = makeProject({
+ sourceText:
+ "import { t } from '@/i18n/mobile-i18n'\nexport const label = t('m.opaque', { value0: 'Orca' })\n",
+ catalogs: { en: { m: { opaque: 'Hello {{value0}}', orphan: 'Unused' } } }
+ })
+
+ const report = await runFailedVerification(root)
+ expect(report).toContain('message ID must be intent-named: m.opaque')
+ expect(report).toContain('placeholder must be intent-named: m.opaque uses value0')
+ expect(report).toContain('en.json has orphaned key: m.orphan')
+ })
+
+ it('rejects copied English target entries unless they are language-neutral', async () => {
+ const root = makeProject({
+ sourceText:
+ "import { t } from '@/i18n/mobile-i18n'\nexport const label = t('example.downloadFailed')\n",
+ catalogs: {
+ en: { example: { downloadFailed: 'Download failed' } },
+ ja: { example: { downloadFailed: 'Download failed' } }
+ }
+ })
+
+ expect(await runFailedVerification(root)).toContain(
+ 'ja.json copies English instead of using fallback: example.downloadFailed'
+ )
+ })
+
+ it('enforces Git and agent terminology', async () => {
+ const root = makeProject({
+ sourceText:
+ "import { t } from '@/i18n/mobile-i18n'\nexport const branch = t('example.branch')\nexport const host = t('example.host')\n",
+ catalogs: {
+ en: { example: { branch: 'Switch branch', host: 'Detecting agents on host' } },
+ es: { example: { branch: 'Cambiar sucursal' } },
+ zh: { example: { host: '主人正在检测剂' } }
+ }
+ })
+
+ const report = await runFailedVerification(root)
+ expect(report).toContain('translates branch as sucursal')
+ expect(report).toContain('uses 主人')
+ expect(report).toContain('uses 检测剂')
+ })
+
it('validates placeholders and extra keys in present translations', async () => {
const en = { m: { greeting: 'Hello {{name}}' } }
const root = makeProject({
diff --git a/mobile/app/about.tsx b/mobile/app/about.tsx
index e7e07da45a9..5ec617d129a 100644
--- a/mobile/app/about.tsx
+++ b/mobile/app/about.tsx
@@ -47,13 +47,13 @@ export default function AboutScreen() {
router.back()}>
- {t('m.qBqOdtg')}
+ {t('about.about')}
- {t('m.o1zkACA')}
- {t('m.wRf8z4A')}
+ {t('about.orca')}
+ {t('about.open')}
@@ -62,7 +62,7 @@ export default function AboutScreen() {
onPress={() => void Linking.openURL('https://onOrca.dev')}
>
- {t('m.1sjQKuE')}
+ {t('about.orcaDev')}
void Linking.openURL('https://github.com/stablyai/orca')}
>
- {t('m.qfIlnqY')}
+ {t('about.stablyai')}
void Linking.openURL('https://x.com/orca_build')}
>
- {t('m.pBOdX2k')}
+ {t('about.orcaBuild')}
diff --git a/mobile/app/browser-settings.tsx b/mobile/app/browser-settings.tsx
index 93ec07d455f..0b21c9dc342 100644
--- a/mobile/app/browser-settings.tsx
+++ b/mobile/app/browser-settings.tsx
@@ -20,13 +20,13 @@ export default function BrowserSettingsScreen(): React.JSX.Element {
const linkModeOptions: PickerOption[] = [
{
value: 'orca-browser',
- label: t('m.OcnHGtE'),
- subtitle: t('m.Z49nZqQ')
+ label: t('browserSettings.orca'),
+ subtitle: t('browserSettings.openStreamed')
},
{
value: 'phone-browser',
- label: t('m.hIo6XgE'),
- subtitle: t('m.Wj6QRnE')
+ label: t('browserSettings.phone'),
+ subtitle: t('browserSettings.openSafari')
}
]
const linkModeLabel =
@@ -47,12 +47,12 @@ export default function BrowserSettingsScreen(): React.JSX.Element {
router.back()}>
- {t('m.GJwMNak')}
+ {t('browserSettings.browser')}
- {t('m.gh7VaTc')}
- {t('m.K6VU-6c')}
+ {t('browserSettings.links')}
+ {t('browserSettings.choose')}
[styles.row, pressed && styles.rowPressed]}
@@ -60,7 +60,7 @@ export default function BrowserSettingsScreen(): React.JSX.Element {
>
- {t('m.wdyLCXU')}
+ {t('browserSettings.openTerminal')}
{linkModeLabel}
@@ -70,7 +70,7 @@ export default function BrowserSettingsScreen(): React.JSX.Element {
visible={pickerOpen}
- title={t('m.wdyLCXU')}
+ title={t('browserSettings.openTerminal')}
options={linkModeOptions}
selected={linkMode}
onSelect={selectLinkMode}
diff --git a/mobile/app/connection-log.tsx b/mobile/app/connection-log.tsx
index ac995eaeca1..12105d368a4 100644
--- a/mobile/app/connection-log.tsx
+++ b/mobile/app/connection-log.tsx
@@ -87,7 +87,7 @@ export default function ConnectionLogScreen() {
router.back()}>
- {t('m.x43FzPs')}
+ {t('connectionLog.connection')}
{hosts.length > 1 && (
@@ -114,7 +114,11 @@ export default function ConnectionLogScreen() {
{state}
- {reconnectAttempts > 0 ? t('m.mu5iayg', { value0: reconnectAttempts }) : ''}
+ {reconnectAttempts > 0
+ ? t('connectionLog.attempt', {
+ reconnectAttempts: reconnectAttempts
+ })
+ : ''}
void copyDiagnostics()}>
{copied ? (
@@ -122,17 +126,19 @@ export default function ConnectionLogScreen() {
) : (
)}
- {copied ? t('m.DYy9eRs') : t('m.GiZXYb8')}
+
+ {copied ? t('connectionLog.copied') : t('connectionLog.copy')}
+
{entries.length > 0 ? (
) : (
- {t('m.FX9lUwo')}
+ {t('connectionLog.noConnection')}
)}
>
) : (
- {t('m.POUjxlM')}
+ {t('connectionLog.noPaired')}
)}
)
diff --git a/mobile/app/h/[hostId]/accounts.tsx b/mobile/app/h/[hostId]/accounts.tsx
index 1cbdaa5d69e..1054d7eb5e6 100644
--- a/mobile/app/h/[hostId]/accounts.tsx
+++ b/mobile/app/h/[hostId]/accounts.tsx
@@ -59,7 +59,7 @@ export default function AccountsScreen() {
// Why: a stale snapshot can expose a finite reset action for the wrong
// account; fail closed if a host sends a shape this mobile cannot prove.
setSnapshot(null)
- setError(t('m.Cop_m2o'))
+ setError(t('accounts.invalid'))
}, [])
const {
supported: codexResetSupported,
@@ -96,7 +96,7 @@ export default function AccountsScreen() {
}
const host = hosts.find((h) => h.id === hostId)
if (!host) {
- setError(t('m.nnr0WpI'))
+ setError(t('accounts.hostNot'))
return
}
setHostName(host.name)
@@ -176,7 +176,7 @@ export default function AccountsScreen() {
codexTarget?.runtime === 'wsl' ? { accountId, target: codexTarget } : { accountId }
const res = await client.sendRequest(method, params)
if (!res.ok) {
- Alert.alert(t('m.5TVCgEg'), res.error.message)
+ Alert.alert(t('accounts.could'), res.error.message)
} else {
// Why: optimistic refresh — the streaming subscription will also
// emit, but a one-shot keeps the UI responsive even if the stream
@@ -184,7 +184,7 @@ export default function AccountsScreen() {
await refresh()
}
} catch (e) {
- Alert.alert(t('m.5TVCgEg'), e instanceof Error ? e.message : String(e))
+ Alert.alert(t('accounts.could'), e instanceof Error ? e.message : String(e))
} finally {
setBusyAccountId(null)
}
@@ -220,22 +220,22 @@ export default function AccountsScreen() {
disabled={busyAccountId !== null || resettingCodex || connState !== 'connected'}
>
- {t('m.uuo9M60')}
- {t('m.rjJXJpg')}
+ {t('accounts.system')}
+ {t('accounts.use')}
{/* Why: when system default is the active selection, activeUsage
holds the system-default login's rate limits — surface them
here so non-managed users still see their usage. */}
{activeAccountId === null && hasActiveProviderUsage(activeUsage) ? (
- {t('m.XheJ_p8')}
+ {t('accounts.accounts')}
{hostName ? (
{hostName}
@@ -369,7 +369,9 @@ export default function AccountsScreen() {
- {t('m.sqHaM-Q', { value0: hostName || t('m.esqB5TM') })}
+ {t('accounts.connecting', {
+ hostName: hostName || t('accounts.host')
+ })}
) : error && !snapshot ? (
@@ -379,7 +381,7 @@ export default function AccountsScreen() {
) : !snapshot ? (
- {t('m.z0N4v1Y')}
+ {t('accounts.loading')}
) : (
<>
@@ -387,7 +389,7 @@ export default function AccountsScreen() {
{renderProviderSection('codex', 'Codex')}
- {t('m.lXRU_hQ')}
+ {t('accounts.add')}
>
)}
diff --git a/mobile/app/h/[hostId]/edit.tsx b/mobile/app/h/[hostId]/edit.tsx
index 6008af8daaa..49619b24437 100644
--- a/mobile/app/h/[hostId]/edit.tsx
+++ b/mobile/app/h/[hostId]/edit.tsx
@@ -40,14 +40,14 @@ export default function EditHostScreen() {
const load = useCallback(async () => {
if (!hostId) {
- setLoadError(t('m.yLNjPPk'))
+ setLoadError(t('edit.missing'))
return
}
try {
const hosts = await loadHosts()
const found = hosts.find((h) => h.id === hostId) ?? null
if (!found) {
- setLoadError(t('m.T_ULLfI'))
+ setLoadError(t('edit.hostRemoved'))
setHost(null)
return
}
@@ -56,7 +56,7 @@ export default function EditHostScreen() {
setAddress(displayHostEndpoint(found.endpoint))
setLoadError(null)
} catch (err) {
- setLoadError(err instanceof Error ? err.message : t('m.koyS6Oc'))
+ setLoadError(err instanceof Error ? err.message : t('edit.failedLoad'))
setHost(null)
}
}, [hostId])
@@ -87,7 +87,7 @@ export default function EditHostScreen() {
}
const nextName = name.trim()
if (!nextName) {
- setSaveError(t('m.7UECNUc'))
+ setSaveError(t('edit.enter'))
return
}
if (endpointEdit.kind === 'invalid') {
@@ -114,7 +114,7 @@ export default function EditHostScreen() {
...(nextEndpoint !== undefined ? { endpoint: nextEndpoint } : {})
})
} catch (err) {
- setSaveError(err instanceof Error ? err.message : t('m.sI26LXo'))
+ setSaveError(err instanceof Error ? err.message : t('edit.failedSave'))
savingRef.current = false
setSaving(false)
return
@@ -149,11 +149,11 @@ export default function EditHostScreen() {
style={styles.backButton}
onPress={() => router.back()}
accessibilityRole="button"
- accessibilityLabel={t('m.K8w9o8U')}
+ accessibilityLabel={t('edit.back')}
>
- {t('m.NKISHlY')}
+ {t('edit.edit')}
[
styles.saveButton,
@@ -162,12 +162,12 @@ export default function EditHostScreen() {
onPress={() => void handleSave()}
disabled={!canSave}
accessibilityRole="button"
- accessibilityLabel={t('m.ugYhCr4')}
+ accessibilityLabel={t('edit.saveHost')}
>
{saving ? (
) : (
- {t('m.OOhGw28')}
+ {t('edit.save')}
)}
@@ -176,7 +176,7 @@ export default function EditHostScreen() {
{loadError}
router.back()}>
- {t('m.LS3NecQ')}
+ {t('edit.go')}
) : !host ? (
@@ -192,28 +192,28 @@ export default function EditHostScreen() {
contentContainerStyle={[styles.form, { paddingBottom: insets.bottom + spacing.xl }]}
keyboardShouldPersistTaps="handled"
>
- {t('m.KytWtss')}
+ {t('edit.connectionAddressDescription')}
- {t('m.wLjwLQg')}
+ {t('edit.name')}
{
setName(value)
setSaveError(null)
}}
- placeholder={t('m.jHccG1s')}
+ placeholder={t('edit.hostName')}
placeholderTextColor={colors.textMuted}
autoCapitalize="words"
autoCorrect={false}
returnKeyType="next"
/>
- {t('m.kMmtf5E')}
+ {t('edit.address')}
{
setAddress(value)
@@ -232,11 +232,11 @@ export default function EditHostScreen() {
}
}}
/>
- {t('m.dYplni8')}
+ {t('edit.accepts')}
{endpointEdit == null ? null : endpointEdit.kind !== 'invalid' ? (
- {t('m.eB5hKE4', { value0: endpointEdit.endpoint })}
+ {t('edit.connects', { endpoint: endpointEdit.endpoint })}
) : address.trim().length > 0 ? (
{endpointEdit.error}
diff --git a/mobile/app/h/[hostId]/index.tsx b/mobile/app/h/[hostId]/index.tsx
index 12ce19eb640..3229e07eca0 100644
--- a/mobile/app/h/[hostId]/index.tsx
+++ b/mobile/app/h/[hostId]/index.tsx
@@ -45,7 +45,7 @@ import {
} from '../../../src/transport/client-context-connection-metrics'
import {
classifyConnection,
- type ConnectionVerdict
+ isConnectionErrorVerdict
} from '../../../src/transport/connection-health'
import type { RpcSuccess } from '../../../src/transport/types'
import { StatusDot } from '../../../src/components/StatusDot'
@@ -101,31 +101,22 @@ import {
getWorkspaceSortOptions
} from '../../../src/worktree/workspace-list-picker-options'
import type { RepoSummary } from '../../../src/worktree/host-worktree-rpc-types'
+import type { MobileHostScreenProps } from '../../../src/worktree/mobile-host-screen-props'
import type { WorkspaceStatusDefinition } from '../../../../src/shared/types'
import { getDefaultMobileWorkspaceStatuses } from '../../../src/worktree/mobile-workspace-statuses'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator } from '@/i18n/mobile-i18n'
-function isErrorVerdict(v: ConnectionVerdict): boolean {
- return v.kind === 'warning' || v.kind === 'unreachable' || v.kind === 'auth-failed'
-}
+const tr = createMobileTranslator('host')
+const filterLabel = (activeFilterCount: string) => tr('filterActive', { activeFilterCount })
const REPO_METADATA_REFRESH_MS = 60_000
-type HostScreenProps = {
- // When true, rendered as the persistent tablet sidebar by the host layout, not as its own routed screen.
- embedded?: boolean
- // Route params aren't in scope when rendered from the layout, so the caller passes these explicitly.
- hostId?: string
- action?: string
- onHideSidebar?: () => void
-}
-
export function HostScreen({
embedded = false,
hostId: hostIdProp,
action: actionProp,
onHideSidebar
-}: HostScreenProps = {}) {
+}: MobileHostScreenProps = {}) {
const params = useLocalSearchParams<{ hostId: string; action?: string }>()
const hostId = hostIdProp ?? params.hostId
const action = actionProp ?? params.action
@@ -346,7 +337,7 @@ export function HostScreen({
}
const host = hosts.find((h) => h.id === hostId)
if (!host) {
- setError(t('m.2FRJWFs'))
+ setError(tr('hostNot'))
return
}
setHostName(host.name)
@@ -619,7 +610,7 @@ export function HostScreen({
} catch {
// Why: removal can fail while still paired; re-open confirm (ConfirmModal closes on confirm).
setConfirmRemoveHost(true)
- Alert.alert(t('m.P_OTj14'), t('m.QHBQ8yI'))
+ Alert.alert(tr('could'), tr('please'))
}
}, [hostId, leaveHost, closeHostClient])
@@ -709,7 +700,7 @@ export function HostScreen({
return count
}, [filters])
const selectedSortLabel =
- getWorkspaceSortOptions().find((option) => option.value === sortMode)?.label ?? t('m.qVCBvFg')
+ getWorkspaceSortOptions().find((option) => option.value === sortMode)?.label ?? tr('recent')
const handleGroupChange = useCallback(
(value: MobileGroupMode) => {
@@ -787,7 +778,7 @@ export function HostScreen({
style={styles.backButton}
onPress={leaveHost}
accessibilityRole="button"
- accessibilityLabel={t('m.IDkp2AI')}
+ accessibilityLabel={tr('back')}
hitSlop={8}
>
@@ -803,14 +794,14 @@ export function HostScreen({
- {hostName || t('m.3GdsXVQ')}
+ {hostName || tr('host')}
{connState !== 'connected' &&
(() => {
// Why: auth-failed has its own banner, so suppress the Reconnect button for that verdict.
const verdict = headerVerdict
- const isError = isErrorVerdict(verdict)
+ const isError = isConnectionErrorVerdict(verdict)
const showReconnectButton = isError && hostId && verdict.kind !== 'auth-failed'
if (!showReconnectButton) {
return null
@@ -821,7 +812,7 @@ export function HostScreen({
onPress={() => void forceReconnectHost(hostId!)}
hitSlop={8}
>
- {t('m.2FFC6Og')}
+ {tr('reconnect')}
)
})()}
@@ -837,7 +828,7 @@ export function HostScreen({
onPress={openFloatingWorkspace}
disabled={connState !== 'connected'}
accessibilityRole="button"
- accessibilityLabel={t('m.qs3IfgE')}
+ accessibilityLabel={tr('floating')}
hitSlop={8}
>
@@ -873,10 +864,12 @@ export function HostScreen({
accessibilityRole="button"
accessibilityLabel={
activeFilterCount === 0
- ? t('m.kz_Kdkw')
+ ? tr('filterWorkspaces')
: activeFilterCount === 1
- ? t('m.6oNXq-k')
- : t('m.DxBfvEc', { value0: activeFilterCount })
+ ? tr('filterWorkspaces1')
+ : tr('filterWorkspacesActive', {
+ activeFilterCount: activeFilterCount
+ })
}
>
- {t('m.2hirWvg', { value0: activeFilterCount ? ` (${activeFilterCount})` : '' })}
+ {filterLabel(activeFilterCount ? ` (${activeFilterCount})` : '')}
@@ -898,7 +891,9 @@ export function HostScreen({
style={[styles.modeButton, styles.embeddedModeButton]}
onPress={() => setShowSortPicker(true)}
accessibilityRole="button"
- accessibilityLabel={t('m.jZR1hFw', { value0: selectedSortLabel })}
+ accessibilityLabel={tr('sortSelected', {
+ selectedSortLabel: selectedSortLabel
+ })}
>
@@ -910,17 +905,17 @@ export function HostScreen({
style={[styles.modeButton, styles.embeddedModeButton]}
onPress={() => setShowGroupPicker(true)}
accessibilityRole="button"
- accessibilityLabel={t('m.KYYIQO4')}
+ accessibilityLabel={tr('groupWorkspaces')}
>
{groupMode === 'none'
- ? t('m.mZ5NlSU')
+ ? tr('group')
: groupMode === 'workspaceStatus'
- ? t('m.GAUYfWk')
+ ? tr('status')
: groupMode === 'repo'
- ? t('m.CzGUIP8')
- : t('m.sUx-id0')}
+ ? tr('repo')
+ : tr('pr')}
@@ -934,7 +929,7 @@ export function HostScreen({
onPress={() => navigateFromHostList(`/h/${hostId}/accounts`)}
disabled={connState !== 'connected'}
accessibilityRole="button"
- accessibilityLabel={t('m.CVlu0tE')}
+ accessibilityLabel={tr('accounts')}
>
navigateFromHostList(`/h/${hostId}/tasks`)}
disabled={connState !== 'connected'}
accessibilityRole="button"
- accessibilityLabel={t('m.V5DOCOQ')}
+ accessibilityLabel={tr('tasks')}
>
setShowSearch((s) => !s)}
accessibilityRole="button"
- accessibilityLabel={showSearch ? t('m.AYkrJs8') : t('m.LgVSSVY')}
+ accessibilityLabel={showSearch ? tr('close') : tr('searchWorkspaces')}
>
{showSearch ? (
@@ -1022,7 +1017,7 @@ export function HostScreen({
activeFilterCount > 0 && styles.filterChipTextActive
]}
>
- {t('m.2hirWvg', { value0: activeFilterCount > 0 ? ` (${activeFilterCount})` : '' })}
+ {filterLabel(activeFilterCount > 0 ? ` (${activeFilterCount})` : '')}
@@ -1037,12 +1032,12 @@ export function HostScreen({
{groupMode === 'none'
- ? t('m.mZ5NlSU')
+ ? tr('group')
: groupMode === 'workspaceStatus'
- ? t('m.GAUYfWk')
+ ? tr('status')
: groupMode === 'repo'
- ? t('m.CzGUIP8')
- : t('m.sUx-id0')}
+ ? tr('repo')
+ : tr('pr')}
@@ -1097,11 +1092,11 @@ export function HostScreen({
)}
@@ -1119,7 +1114,11 @@ export function HostScreen({
{connState === 'connected' && worktreesLoaded && sections.length === 0 && (
- {search ? t('m.d-FojRM') : activeFilterCount > 0 ? t('m.oRXGJpo') : t('m.4HGax2g')}
+ {search
+ ? tr('noMatching')
+ : activeFilterCount > 0
+ ? tr('noWorktreesMatch')
+ : tr('noWorktrees')}
)}
@@ -1210,7 +1209,7 @@ export function HostScreen({
setShowFilterModal(false)}>
- {t('m.S8jJ9v4')}
+ {tr('filter')}
{activeFilterCount > 0 && (
- {t('m.5IYckMg')}
+ {tr('clear')}
)}
- {t('m.bd8B2ME')}
+ {tr('workspaces')}
- {t('m.1w-t3vQ')}
+ {tr('hideSleeping')}
{filters.hideSleeping && }
- {t('m.MFWDh4g')}
+ {tr('hideDefault')}
{filters.hideDefaultBranch && }
{uniqueRepos.length > 1 && (
<>
- {t('m.aCNuYPE')}
+ {tr('repositories')}
{uniqueRepos.map((repo, i) => (
@@ -1283,11 +1282,11 @@ export function HostScreen({
{confirmDelete ? (
- {t('m.sCHpXNI')}
+ {tr('deleteWorktree')}
- {t('m.asTmnrM', {
- value0: confirmDelete.displayName || confirmDelete.repo,
- value1: confirmDelete.branch
+ {tr('deleteDisplay', {
+ displayName: confirmDelete.displayName || confirmDelete.repo,
+ branch: confirmDelete.branch
})}
@@ -1300,7 +1299,7 @@ export function HostScreen({
]}
onPress={() => setConfirmDelete(null)}
>
- {t('m.jQgIadE')}
+ {tr('cancel')}
[
@@ -1316,7 +1315,7 @@ export function HostScreen({
setActionTarget(null)
}}
>
- {t('m.PCaw7X8')}
+ {tr('delete')}
@@ -1336,7 +1335,7 @@ export function HostScreen({
onDone: () => setActionTarget(null)
}),
{
- label: t('m.7b05QJE'),
+ label: tr('sleep'),
icon: Moon,
onPress: () => {
if (client) {
@@ -1351,16 +1350,14 @@ export function HostScreen({
}
},
{
- label: isWorktreePinned(actionTarget, pinnedIds)
- ? t('m.dgZsiv8')
- : t('m.JwcgRbU'),
+ label: isWorktreePinned(actionTarget, pinnedIds) ? tr('unpin') : tr('pin'),
onPress: () => {
togglePin(actionTarget.worktreeId)
setActionTarget(null)
}
},
{
- label: t('m.PCaw7X8'),
+ label: tr('delete'),
destructive: true,
onPress: () => setConfirmDelete(actionTarget)
}
@@ -1374,9 +1371,9 @@ export function HostScreen({
{/* Host remove confirmation */}
void handleRemoveHost()}
onCancel={() => setConfirmRemoveHost(false)}
diff --git a/mobile/app/h/[hostId]/session/QuickCommandsTabButton.tsx b/mobile/app/h/[hostId]/session/QuickCommandsTabButton.tsx
index 6269abadc26..64fd42cf29c 100644
--- a/mobile/app/h/[hostId]/session/QuickCommandsTabButton.tsx
+++ b/mobile/app/h/[hostId]/session/QuickCommandsTabButton.tsx
@@ -22,7 +22,7 @@ export function QuickCommandsTabButton({ disabled, onPress }: Props) {
]}
disabled={disabled}
onPress={onPress}
- accessibilityLabel={t('m.Y1upIE8')}
+ accessibilityLabel={t('quickCommandsTabButton.quick')}
>
diff --git a/mobile/app/h/[hostId]/session/[worktreeId].tsx b/mobile/app/h/[hostId]/session/[worktreeId].tsx
index 8fa84a97c5c..431cd8d2150 100644
--- a/mobile/app/h/[hostId]/session/[worktreeId].tsx
+++ b/mobile/app/h/[hostId]/session/[worktreeId].tsx
@@ -272,13 +272,15 @@ import { styles } from './mobile-session-styles'
import { QuickCommandsTabButton } from './QuickCommandsTabButton'
import type { DiffComment, TerminalQuickCommand } from '../../../../../src/shared/types'
import type {
- DiffCommentActions,
+ DiffLineRowProps,
DiffNotesDelivery,
DiffSyntaxState,
DirtyMarkdownDraft,
FileDocState,
+ FileReaderProps,
FileSyntaxState,
MarkdownDocState,
+ MarkdownReaderProps,
MobileDisplayMode,
MobileNewTabAgentLoadState,
MobileSessionTab,
@@ -291,7 +293,9 @@ import type {
TerminalGestureInputBucket,
TerminalGestureInputQueue
} from './mobile-session-route-types'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator, t } from '@/i18n/mobile-i18n'
+
+const tr = createMobileTranslator('worktreeId')
import { addRefreshTimer, type RefreshTimerLifecycle } from '@/session/session-refresh-timer'
const TERMINAL_KEYBOARD_DISMISS_ACTION_SHEET_FALLBACK_MS = 450
@@ -305,16 +309,7 @@ function MarkdownReader({
onCopy,
onDiscard,
keyboardLift
-}: {
- documentId: string
- doc: MarkdownDocState | undefined
- onRefresh: () => void
- onChange: (content: string) => void
- onSave: () => void
- onCopy: () => void
- onDiscard: () => void
- keyboardLift: number
-}) {
+}: MarkdownReaderProps) {
// Native Keyboard events under-report the WebView editor's covered area, so prefer the larger WebView-measured inset.
const [webviewKeyboardInset, setWebviewKeyboardInset] = useState(0)
const effectiveKeyboardLift = Math.max(keyboardLift, webviewKeyboardInset)
@@ -331,7 +326,7 @@ function MarkdownReader({
{doc.message}
- {t('m.8Uro2f0')}
+ {tr('retry')}
)
@@ -340,9 +335,9 @@ function MarkdownReader({
const statusText = doc.saveError
? doc.saveError
: doc.readOnlyReason
- ? t('m.RwIU_9I')
+ ? tr('read')
: doc.stale
- ? t('m.V4EVATY')
+ ? tr('changed')
: null
const showRefresh = (doc.stale && !doc.isDirty) || !doc.editable
const showCopy = doc.saveError || !doc.editable
@@ -384,18 +379,18 @@ function MarkdownReader({
{showCopy ? (
- {t('m.i7mE8Wc')}
+ {tr('copy')}
) : null}
{showRefresh ? (
- {t('m.a6FBCvM')}
+ {tr('refresh')}
) : null}
{doc.isDirty ? (
- {t('m.Hy2xmeg')}
+ {tr('discard')}
) : null}
{showSave ? (
@@ -411,7 +406,7 @@ function MarkdownReader({
{doc.saving ? (
) : (
- {t('m.fAJsFIg')}
+ {tr('save')}
)}
) : null}
@@ -435,20 +430,7 @@ function DiffLineRow({
onDraftChange,
onSubmitComment,
onDeleteComment
-}: {
- line: RenderableDiffLine
- title: string
- index: number
- comments: DiffComment[]
- activeCommentLine: number | null
- commentDraft: string
- commentsBusy: boolean
- onStartComment: (lineNumber: number) => void
- onCancelComment: () => void
- onDraftChange: (value: string) => void
- onSubmitComment: (lineNumber: number) => void
- onDeleteComment: (commentId: string) => void
-}) {
+}: DiffLineRowProps) {
const commentLine = line.newLineNumber
const isCommenting = commentLine !== undefined && activeCommentLine === commentLine
const canComment = commentLine !== undefined
@@ -467,7 +449,10 @@ function DiffLineRow({
@@ -506,13 +493,17 @@ function DiffLineRow({
- {t('m.HtCuTmQ', { value0: comment.lineNumber })}
+ {tr('line', {
+ lineNumber: comment.lineNumber
+ })}
onDeleteComment(comment.id)}
- accessibilityLabel={t('m.AMX0qpI', { value0: comment.lineNumber })}
+ accessibilityLabel={tr('delete', {
+ lineNumber: comment.lineNumber
+ })}
>
@@ -528,7 +519,7 @@ function DiffLineRow({
style={[styles.textInput, styles.diffCommentInput]}
value={commentDraft}
onChangeText={onDraftChange}
- placeholder={t('m.vCc2hyw')}
+ placeholder={tr('addReview')}
placeholderTextColor={colors.textMuted}
editable={!commentsBusy}
multiline
@@ -541,7 +532,7 @@ function DiffLineRow({
disabled={commentsBusy}
onPress={onCancelComment}
>
- {t('m.AJOY4oY')}
+ {tr('cancel')}
- {t('m.bNrgw7Q')}
+ {tr('saveNote')}
@@ -564,19 +555,7 @@ function DiffLineRow({
)
}
-function FileReader({
- doc,
- title,
- relativePath,
- language,
- diffCommentActions
-}: {
- doc: FileDocState | undefined
- title: string
- relativePath: string
- language?: string
- diffCommentActions?: DiffCommentActions
-}) {
+function FileReader({ doc, title, relativePath, language, diffCommentActions }: FileReaderProps) {
const syntaxLanguage = useMemo(
() => resolveMobileSyntaxLanguage(relativePath || title, language),
[language, relativePath, title]
@@ -733,9 +712,9 @@ function FileReader({
{commentCount === 0
- ? t('m.bjh73HM')
- : t(commentCount === 1 ? 'm.qJU9f5Q' : 'm.QGcvPOc', {
- value0: commentCount
+ ? tr('noReview')
+ : tr(commentCount === 1 ? 'commentCountReviewNote' : 'commentCountReviewNotes', {
+ commentCount: commentCount
})}
@@ -747,10 +726,10 @@ function FileReader({
]}
disabled={!canCopyNotes}
onPress={() => void diffCommentActions.onCopyAll()}
- accessibilityLabel={t('m.G46090U')}
+ accessibilityLabel={tr('copyReview')}
>
- {t('m.i7mE8Wc')}
+ {tr('copy')}
- {t('m.yHsoXLM')}
+ {tr('send')}
@@ -799,7 +778,9 @@ function FileReader({
source={{ uri: doc.dataUri }}
style={styles.imagePreview}
resizeMode="contain"
- accessibilityLabel={t('m.GF9YPY8', { value0: title })}
+ accessibilityLabel={tr('titleImage', {
+ title: title
+ })}
/>
@@ -815,7 +796,9 @@ function FileReader({
appendBufferedDictation(current, text)
)
- showToast(t('m.X1e46P4'))
+ showToast(tr('dictation'))
return
}
// Live mode inserts the transcript into its PTY as text (no Return); buffered mode appends to the command field.
@@ -1253,13 +1236,13 @@ export default function SessionScreen() {
}
const sent = await sendLiveTerminalInput(insertHandle, route.text)
if (sent) {
- showToast(t('m.X1e46P4'))
+ showToast(tr('dictation'))
}
})()
return
}
setInput((current) => appendBufferedDictation(current, route.text))
- showToast(t('m.X1e46P4'))
+ showToast(tr('dictation'))
},
onError: (err) => {
dictationRouteContextRef.current = null
@@ -1977,7 +1960,7 @@ export default function SessionScreen() {
relativePath: tab.relativePath
})
if (!fallback.ok) {
- throw new Error(t('m.I4VlaAs'))
+ throw new Error(tr('unableRead'))
}
const fileResult = (fallback as RpcSuccess).result as {
content: string
@@ -1998,7 +1981,7 @@ export default function SessionScreen() {
setMarkdownDocs((prev) =>
new Map(prev).set(tab.id, {
status: 'error',
- message: t('m.ElSO0Bs')
+ message: tr('couldNotLoadMarkdown')
})
)
}
@@ -2023,12 +2006,12 @@ export default function SessionScreen() {
const message = err instanceof Error ? err.message : ''
const previewMessage =
message === 'binary_file'
- ? t('m.8Ho6nkA')
+ ? tr('binary')
: message === 'file_too_large'
- ? t('m.sJ7CwDw')
+ ? tr('fileToo')
: tab.diffSource === 'staged' || tab.diffSource === 'unstaged'
- ? t('m.XD1EPRc')
- : t('m.qIT8ceU')
+ ? tr('couldNotLoadDiff')
+ : tr('couldNotLoadFile')
setFileDocs((prev) =>
new Map(prev).set(tab.id, {
status: 'error',
@@ -2060,14 +2043,14 @@ export default function SessionScreen() {
const persistDiffComments = useCallback(
async (comments: readonly DiffComment[]): Promise => {
if (!client || connState !== 'connected') {
- throw new Error(t('m.-0DsFBU'))
+ throw new Error(tr('waiting'))
}
const response = await client.sendRequest('worktree.set', {
worktree: `id:${worktreeId}`,
diffComments: comments
})
if (!response.ok) {
- throw new Error((response as RpcFailure).error.message || t('m.5GHrSsw'))
+ throw new Error((response as RpcFailure).error.message || tr('failedSaveReview'))
}
},
[client, connState, worktreeId]
@@ -2100,12 +2083,12 @@ export default function SessionScreen() {
try {
await persistDiffComments(result.comments)
triggerSuccess()
- showToast(t('m.TX0YgPk'))
+ showToast(tr('note'))
return true
} catch (err) {
setDiffComments(previous)
triggerError()
- showToast(err instanceof Error ? err.message : t('m.ya3rgTk'), 1600)
+ showToast(err instanceof Error ? err.message : tr('failedSaveNote'), 1600)
return false
} finally {
setDiffCommentBusy(false)
@@ -2132,7 +2115,7 @@ export default function SessionScreen() {
} catch (err) {
setDiffComments(previous)
triggerError()
- showToast(err instanceof Error ? err.message : t('m.TDYOpzk'), 1600)
+ showToast(err instanceof Error ? err.message : tr('failedDelete'), 1600)
} finally {
setDiffCommentBusy(false)
}
@@ -2148,10 +2131,10 @@ export default function SessionScreen() {
try {
await Clipboard.setStringAsync(formatDiffComments(comments))
triggerSuccess()
- showToast(t('m.dl26MWM'))
+ showToast(tr('notesCopied'))
} catch {
triggerError()
- showToast(t('m.XIoxeds'), 1600)
+ showToast(tr('couldNotCopyNotes'), 1600)
}
}, [showToast])
@@ -2211,7 +2194,7 @@ export default function SessionScreen() {
}
await Clipboard.setStringAsync(current.localContent)
triggerSuccess()
- showToast(t('m.A6mZ2G0'))
+ showToast(tr('copied'))
},
[markdownDocs, showToast]
)
@@ -2221,7 +2204,11 @@ export default function SessionScreen() {
for (const [tabId, doc] of markdownDocs) {
if (doc.status === 'ready' && doc.isDirty) {
const tab = sessionTabs.find((candidate) => candidate.id === tabId)
- drafts.push({ tabId, title: tab?.title || t('m.Dy-chOU'), content: doc.localContent })
+ drafts.push({
+ tabId,
+ title: tab?.title || tr('markdown'),
+ content: doc.localContent
+ })
}
}
return drafts
@@ -2330,10 +2317,10 @@ export default function SessionScreen() {
)
markdownSaveSeqRef.current.delete(tab.id)
triggerSuccess()
- showToast(t('m.JnDupXg'))
+ showToast(tr('saved'))
} catch (error) {
triggerError()
- const message = error instanceof Error ? error.message : t('m.DKTAFXw')
+ const message = error instanceof Error ? error.message : tr('saveFailed')
if (markdownSaveSeqRef.current.get(tab.id) !== saveSeq) {
return
}
@@ -2345,7 +2332,7 @@ export default function SessionScreen() {
return new Map(prev).set(tab.id, {
...existing,
saving: false,
- saveError: message || t('m.DKTAFXw')
+ saveError: message || tr('saveFailed')
})
})
} finally {
@@ -2724,7 +2711,7 @@ export default function SessionScreen() {
response &&
headlessActivationNeedsHostRenderer(response.result)
) {
- showToast(t('m.RJlcmtM'), 3000)
+ showToast(tr('openOrca'), 3000)
}
}
if (client && created !== '1' && !isFloatingWorkspaceRoute) {
@@ -3084,7 +3071,7 @@ export default function SessionScreen() {
}
if (!isTerminalLiveInputWithinByteLimit(text)) {
triggerError()
- showToast(t('m.528pc28'), 1500)
+ showToast(tr('input'), 1500)
return false
}
const rpc = clientRef.current
@@ -3473,9 +3460,9 @@ export default function SessionScreen() {
await client.sendRequest('terminal.clearBuffer', {
terminal: target.handle
})
- showToast(t('m.8hc6lac'))
+ showToast(tr('terminalCleared'))
} catch {
- showToast(t('m.m332RRE'), 1500)
+ showToast(tr('couldNotClear'), 1500)
}
}
@@ -3556,7 +3543,7 @@ export default function SessionScreen() {
triggerSuccess()
// Why: Android 13+ shows its own system copy toast; iOS shows none, so only iOS needs our in-app toast.
if (Platform.OS === 'ios') {
- showToast(t('m.A6mZ2G0'))
+ showToast(tr('copied'))
}
terminalRefs.current.get(handle)?.cancelSelect()
} catch (e) {
@@ -3567,7 +3554,7 @@ export default function SessionScreen() {
name: err.name,
message: err.message
})
- showToast(t('m._0rBKLA'), 1500)
+ showToast(tr('couldNotCopy'), 1500)
}
},
[showToast]
@@ -3580,7 +3567,7 @@ export default function SessionScreen() {
}
// eslint-disable-next-line no-console
console.warn('[mobile-clip] selection evicted')
- showToast(t('m.BYmvBAo'), 1500)
+ showToast(tr('selection'), 1500)
setSelectModeActive(false)
},
[showToast]
@@ -3824,7 +3811,7 @@ export default function SessionScreen() {
const existing = previousTerminals.find((terminal) => terminal.handle === createdHandle)
const createdTerminal: Terminal = {
handle: createdHandle,
- title: created.title || existing?.title || t('m.1ELofI0'),
+ title: created.title || existing?.title || tr('terminal'),
terminalTheme: created.terminalTheme ?? existing?.terminalTheme,
isActive: true
}
@@ -3851,22 +3838,22 @@ export default function SessionScreen() {
)
.then((sendResponse) => {
if (!sendResponse.ok) {
- throw new Error((sendResponse as RpcFailure).error.message || t('m.v-nMJVc'))
+ throw new Error((sendResponse as RpcFailure).error.message || tr('failedSend'))
}
const result = (sendResponse as RpcSuccess).result as {
send?: { accepted?: boolean }
}
if (result.send?.accepted === false) {
- throw new Error(t('m.1s8dFXg'))
+ throw new Error(tr('terminalInput'))
}
triggerSuccess()
- showToast(options.successToast ?? t('m.4BJ8B0k'))
+ showToast(options.successToast ?? tr('notesSent'))
options.onPromptSent?.()
})
.catch((err) => {
triggerError()
showToast(
- options.errorToast ?? (err instanceof Error ? err.message : t('m.OcU2d6s')),
+ options.errorToast ?? (err instanceof Error ? err.message : tr('couldNotSend')),
1800
)
})
@@ -3882,7 +3869,7 @@ export default function SessionScreen() {
}
scheduleDelayedAction(() => void fetchSessionTabs(), 500)
} else {
- const message = options?.errorToast ?? t('m.BphZ5Gw')
+ const message = options?.errorToast ?? tr('failedCreateTerminal')
setCreateError(message)
if (options?.errorToast) {
triggerError()
@@ -3890,7 +3877,7 @@ export default function SessionScreen() {
}
}
} catch {
- const message = options?.errorToast ?? t('m.BphZ5Gw')
+ const message = options?.errorToast ?? tr('failedCreateTerminal')
setCreateError(message)
if (options?.errorToast) {
triggerError()
@@ -3918,10 +3905,10 @@ export default function SessionScreen() {
const launch = buildMobileQuickCommandLaunch(command)
if (!launch) {
triggerError()
- showToast(t('m.6kcq1T8'), 1800)
+ showToast(tr('edit'), 1800)
return false
}
- const label = command.label.trim() || t('m.sgQvHe0')
+ const label = command.label.trim() || tr('quick')
void handleCreateTerminal(launch.agent, {
...launch.options,
errorToast: t('session.quickCommand.runFailed', { commandLabel: label })
@@ -3952,7 +3939,7 @@ export default function SessionScreen() {
if (isFileExistsErrorMessage(message) && attempt < 100) {
continue
}
- throw new Error(message || t('m.6oL3kaQ'))
+ throw new Error(message || tr('failedCreateMarkdown'))
}
const openResponse = await client.sendRequest(
@@ -3966,9 +3953,9 @@ export default function SessionScreen() {
scheduleDelayedAction(() => void fetchSessionTabs(), 300)
return
}
- throw new Error(t('m.14_Cpwk'))
+ throw new Error(tr('unableCreate'))
} catch (err) {
- const message = err instanceof Error ? err.message : t('m.6oL3kaQ')
+ const message = err instanceof Error ? err.message : tr('failedCreateMarkdown')
setCreateError(message)
showToast(message, 1800)
} finally {
@@ -3982,12 +3969,12 @@ export default function SessionScreen() {
}
// Why: read via ref so a tap before the capability probe resolves (or a stale callback) still sees the live value.
if (browserScreencastSupportedRef.current !== true) {
- showToast(t('m.xdJzAj8'), 1600)
+ showToast(tr('desktopUpdateRequiredMobile'), 1600)
return false
}
const url = normalizeBrowserUrl(rawUrl)
if (!url) {
- const message = t('m.HyIWUac')
+ const message = tr('enterValid')
setCreateError(message)
showToast(message, 1400)
return false
@@ -4019,7 +4006,7 @@ export default function SessionScreen() {
scheduleDelayedAction(() => void fetchPendingBrowserSessionTabs(), 1200)
return true
} catch (err) {
- const message = err instanceof Error ? err.message : t('m.sYGlLWQ')
+ const message = err instanceof Error ? err.message : tr('failedCreateBrowser')
setCreateError(message)
showToast(message, 1800)
return false
@@ -4035,7 +4022,7 @@ export default function SessionScreen() {
method: 'browser.back' | 'browser.forward' | 'browser.reload'
) {
if (!client || !tab.browserPageId) {
- showToast(t('m.Ggr0PGg'), 1500)
+ showToast(tr('browserPage'), 1500)
return
}
try {
@@ -4052,7 +4039,7 @@ export default function SessionScreen() {
}
scheduleDelayedAction(() => void fetchSessionTabs(), 250)
} catch (err) {
- const message = err instanceof Error ? err.message : t('m.6P8BtkA')
+ const message = err instanceof Error ? err.message : tr('browserCommand')
showToast(message, 1600)
}
}
@@ -4073,7 +4060,7 @@ export default function SessionScreen() {
if (response.ok) {
const nextTerminals = terminalsRef.current.map((terminal) =>
terminal.handle === target.handle
- ? { ...terminal, title: title || t('m.1ELofI0') }
+ ? { ...terminal, title: title || tr('terminal') }
: terminal
)
terminalsRef.current = nextTerminals
@@ -4260,12 +4247,16 @@ export default function SessionScreen() {
const terminalSummary =
connState === 'connected'
? showLoadingState
- ? t('m.vFcOLlo')
+ ? tr('loadingTabs')
: visibleTabs.length === 1
- ? t('m.KRxO3Ug')
- : t('m.-4K4pmw', { value0: visibleTabs.length })
+ ? tr('one')
+ : tr('visible', {
+ visibleTabCount: visibleTabs.length
+ })
: showConnectionRetry
- ? t('m.S6RbGW8', { value0: verdictDisplayLabel(connectionVerdict) })
+ ? tr('verdict', {
+ verdictDisplayLabel: verdictDisplayLabel(connectionVerdict)
+ })
: MOBILE_SESSION_STATUS_LABELS[connState]
// Why: iOS keyboard height includes the home-indicator inset; Android IME height does not.
@@ -4301,7 +4292,7 @@ export default function SessionScreen() {
createTabAgentLoadState === 'loading'
? [
{
- label: t('m.pUeIX0M'),
+ label: tr('detecting'),
icon: Bot,
disabled: true,
loading: true,
@@ -4320,7 +4311,7 @@ export default function SessionScreen() {
: createTabAgentLoadState === 'loaded'
? [
{
- label: t('m.yBLhh9Y'),
+ label: tr('noEnabled'),
icon: Bot,
disabled: true,
onPress: () => {}
@@ -4329,8 +4320,8 @@ export default function SessionScreen() {
: createTabAgentLoadState === 'error'
? [
{
- label: t('m.m6V9ozk'),
- hint: t('m.k5E-6Qo'),
+ label: tr('agent'),
+ hint: tr('check'),
icon: Bot,
disabled: true,
onPress: () => {}
@@ -4343,7 +4334,7 @@ export default function SessionScreen() {
: createTabAgentLoadState === 'loading'
? [
{
- label: t('m.pUeIX0M'),
+ label: tr('detecting'),
icon: Bot,
disabled: true,
loading: true,
@@ -4353,7 +4344,7 @@ export default function SessionScreen() {
: createTabAgentOptions.length > 0
? createTabAgentOptions.map((option) => ({
label: option.label,
- hint: t('m.0IFqHX0'),
+ hint: tr('newAgent'),
icon: Bot,
onPress: () => {
const delivery = pendingDiffNotesDelivery
@@ -4370,7 +4361,7 @@ export default function SessionScreen() {
: createTabAgentLoadState === 'loaded'
? [
{
- label: t('m.yBLhh9Y'),
+ label: tr('noEnabled'),
icon: Bot,
disabled: true,
onPress: () => {}
@@ -4379,8 +4370,8 @@ export default function SessionScreen() {
: createTabAgentLoadState === 'error'
? [
{
- label: t('m.m6V9ozk'),
- hint: t('m.AnvMzjI'),
+ label: tr('agent'),
+ hint: tr('copyNotesInstead'),
icon: Bot,
disabled: true,
onPress: () => {}
@@ -4438,14 +4429,14 @@ export default function SessionScreen() {
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={requestLeaveSession}
hitSlop={8}
- accessibilityLabel={t('m.z6d7HxM')}
+ accessibilityLabel={tr('back')}
>
- {worktreeName || t('m.1ELofI0')}
+ {worktreeName || tr('terminal')}
@@ -4467,7 +4458,7 @@ export default function SessionScreen() {
{!isFloatingWorkspaceRoute && (
handlePanelTap('files')}
/>
@@ -4475,7 +4466,7 @@ export default function SessionScreen() {
{!isFolderWorkspaceRoute && !isFloatingWorkspaceRoute && (
handlePanelTap('sourceControl')}
/>
@@ -4483,7 +4474,7 @@ export default function SessionScreen() {
{showHeaderMoreButton ? (
setShowHeaderMoreActions(true)}
/>
@@ -4574,7 +4565,7 @@ export default function SessionScreen() {
setCreateError('')
setShowCreateTabDrawer(true)
}}
- accessibilityLabel={t('m.7IGdkR0')}
+ accessibilityLabel={tr('newTab')}
>
@@ -4589,7 +4580,9 @@ export default function SessionScreen() {
return
}
showToast(
- quickCommandsSupported === false ? t('m.UoNS0D4') : t('m.5g1_I7Y'),
+ quickCommandsSupported === false
+ ? tr('desktopUpdateRequiredQuick')
+ : tr('checking'),
1600
)
}}
@@ -4608,7 +4601,7 @@ export default function SessionScreen() {
setCreateWarningState(dismissMobileSessionCreateWarningState)}
- accessibilityLabel={t('m.jBv9pDk')}
+ accessibilityLabel={tr('dismissWorkspace')}
hitSlop={8}
>
@@ -4622,7 +4615,7 @@ export default function SessionScreen() {
) : showEmptyState ? (
- {t('m.Xb4fMs0')}
+ {tr('noTabs')}
{createError ? {createError} : null}
- {createTabBusy ? t('m.S2Yv1rU') : t('m.IdjCS0U')}
+ {createTabBusy ? tr('creating') : tr('create')}
@@ -4664,7 +4657,7 @@ export default function SessionScreen() {
- {activePendingTerminalTab.title || t('m.1Ef6jA8')}
+ {activePendingTerminalTab.title || tr('loadingTerminal')}
) : (
@@ -4793,8 +4786,8 @@ export default function SessionScreen() {
onPress={dismissSoftwareKeyboard}
hitSlop={8}
accessibilityRole="button"
- accessibilityLabel={t('m.O4uFjyM')}
- accessibilityHint={t('m.jbJql9k')}
+ accessibilityLabel={tr('dismissKeyboard')}
+ accessibilityHint={tr('hides')}
>
@@ -4829,8 +4822,8 @@ export default function SessionScreen() {
}}
accessibilityLabel={
isTerminalPhoneDisplayMode(activeHandle, terminalModes)
- ? t('m.QB6eVqs')
- : t('m.CAFCbk0')
+ ? tr('switchDesktop')
+ : tr('switchPhone')
}
>
{isTerminalPhoneDisplayMode(activeHandle, terminalModes) ? (
@@ -4855,7 +4848,9 @@ export default function SessionScreen() {
// Why: offline, live mode is dead but the buffered box still composes — keep the escape hatch tappable (#6713).
disabled={!canCompose}
onPress={toggleLiveInput}
- accessibilityLabel={liveInputEnabled ? t('m.LNjU0eA') : t('m.g0S-mpY')}
+ accessibilityLabel={
+ liveInputEnabled ? tr('switchBuffered') : tr('switchLive')
+ }
>
void handlePaste()}
- accessibilityLabel={t('m.UjbgRFg')}
+ accessibilityLabel={tr('pasteClipboard')}
>
- {t('m.UDf4wts')}
+ {tr('paste')}
)}
@@ -4918,7 +4913,10 @@ export default function SessionScreen() {
void handleAccessoryKey(createTerminalLiveAccessoryInput(key))
}}
accessibilityLabel={
- key.accessibilityLabel ?? t('m.65j23gQ', { value0: key.label })
+ key.accessibilityLabel ??
+ tr('sendKey', {
+ keyLabel: key.label
+ })
}
>
setShowCustomKeyModal(true)}
- accessibilityLabel={t('m.WbNNU2M')}
+ accessibilityLabel={tr('addCustom')}
>
@@ -4984,8 +4984,8 @@ export default function SessionScreen() {
disabled={!canSend}
onPress={focusLiveInput}
accessibilityRole="button"
- accessibilityLabel={t('m.JQAVlGc')}
- accessibilityHint={t('m.Rddk0Io')}
+ accessibilityLabel={tr('show')}
+ accessibilityHint={tr('typed')}
>
void handleSend()}
- accessibilityLabel={t('m.ps5grWg')}
+ accessibilityLabel={tr('sendCommand')}
>
@@ -5130,11 +5130,11 @@ export default function SessionScreen() {
{
setShowCreateTabDrawer(false)
@@ -5148,19 +5148,19 @@ export default function SessionScreen() {
? []
: [
{
- label: t('m.vL8HgZo'),
+ label: tr('browser'),
icon: Globe,
closeBeforePress: true,
onPress: () => {
if (browserScreencastSupported !== true) {
- showToast(t('m.xdJzAj8'), 1600)
+ showToast(tr('desktopUpdateRequiredMobile'), 1600)
return
}
setShowCreateBrowserModal(true)
}
},
{
- label: t('m.c_XP7YM'),
+ label: tr('markdownNote'),
icon: FileText,
onPress: () => {
setShowCreateTabDrawer(false)
@@ -5174,12 +5174,12 @@ export default function SessionScreen() {
{
const delivery = pendingDiffNotesDelivery
@@ -5190,11 +5190,11 @@ export default function SessionScreen() {
void Clipboard.setStringAsync(delivery.prompt)
.then(() => {
triggerSuccess()
- showToast(t('m.dl26MWM'))
+ showToast(tr('notesCopied'))
})
.catch(() => {
triggerError()
- showToast(t('m.XIoxeds'), 1500)
+ showToast(tr('couldNotCopyNotes'), 1500)
})
}
}
@@ -5204,7 +5204,7 @@ export default function SessionScreen() {
tab.type === 'terminal'),
@@ -5224,10 +5224,10 @@ export default function SessionScreen() {
/>
{
const target = markdownActionTarget
setMarkdownActionTarget(null)
if (target) {
void Clipboard.setStringAsync(target.relativePath || target.filePath)
- showToast(t('m.HimYt6k'))
+ showToast(tr('path'))
}
}
},
@@ -5257,10 +5257,10 @@ export default function SessionScreen() {
/>
{
const target = fileActionTarget
@@ -5283,11 +5283,11 @@ export default function SessionScreen() {
/>
{
const drafts = leaveDrafts ?? []
@@ -5301,12 +5301,12 @@ export default function SessionScreen() {
})
.catch(() => {
triggerError()
- showToast(t('m.TxiIlg0'), 1500)
+ showToast(tr('couldNotCopyDrafts'), 1500)
})
}
},
{
- label: t('m.psn3klQ'),
+ label: tr('discardLeave'),
destructive: true,
onPress: () => {
setLeaveDrafts(null)
@@ -5318,28 +5318,28 @@ export default function SessionScreen() {
/>
setDiscardMarkdownTarget(null)}
/>
void handleRenameTerminal(value)}
onCancel={() => setRenameTarget(null)}
/>
{
if (deleteKeyTarget) {
diff --git a/mobile/app/h/[hostId]/session/mobile-session-route-types.ts b/mobile/app/h/[hostId]/session/mobile-session-route-types.ts
index c5a94e9d38f..57f4365e80c 100644
--- a/mobile/app/h/[hostId]/session/mobile-session-route-types.ts
+++ b/mobile/app/h/[hostId]/session/mobile-session-route-types.ts
@@ -153,3 +153,37 @@ export type TerminalGestureInputQueue = {
timer: ReturnType | null
lastUpdatedMs: number
}
+
+export type MarkdownReaderProps = {
+ documentId: string
+ doc: MarkdownDocState | undefined
+ onRefresh: () => void
+ onChange: (content: string) => void
+ onSave: () => void
+ onCopy: () => void
+ onDiscard: () => void
+ keyboardLift: number
+}
+
+export type DiffLineRowProps = {
+ line: RenderableDiffLine
+ title: string
+ index: number
+ comments: DiffComment[]
+ activeCommentLine: number | null
+ commentDraft: string
+ commentsBusy: boolean
+ onStartComment: (lineNumber: number) => void
+ onCancelComment: () => void
+ onDraftChange: (value: string) => void
+ onSubmitComment: (lineNumber: number) => void
+ onDeleteComment: (commentId: string) => void
+}
+
+export type FileReaderProps = {
+ doc: FileDocState | undefined
+ title: string
+ relativePath: string
+ language?: string
+ diffCommentActions?: DiffCommentActions
+}
diff --git a/mobile/app/h/[hostId]/tasks.tsx b/mobile/app/h/[hostId]/tasks.tsx
index 830e6276b53..a9b8bc49224 100644
--- a/mobile/app/h/[hostId]/tasks.tsx
+++ b/mobile/app/h/[hostId]/tasks.tsx
@@ -137,10 +137,31 @@ import {
resolveVisibleTaskProvider,
type TaskProvider
} from '../../../src/tasks/mobile-task-providers'
-import {
- extractLinearIssueReadItems,
- type LinearMobileIssue
-} from '../../../src/tasks/linear-mobile-issue-read'
+import { extractLinearIssueReadItems } from '../../../src/tasks/linear-mobile-issue-read'
+import type {
+ DetailComment,
+ DetailPayload,
+ GitHubAssignableUser,
+ GitHubDetailCheck,
+ GitHubDetailFile,
+ GitHubPRFileContents,
+ GitHubPRReviewerRow,
+ GitHubPRReviewSummary,
+ GitHubRepoSources,
+ GitHubWorkItem,
+ GitLabTodo,
+ GitLabWorkItem,
+ GitPushTarget,
+ LinearIssue,
+ LinearIssueChild,
+ LinearState,
+ LinearTeam,
+ RepoHooksResponse,
+ RepoSummary,
+ SetupDecision,
+ TaskRuntimeStatus,
+ TasksSupportState
+} from '../../../src/tasks/mobile-tasks-screen-types'
import { MOBILE_TUI_AGENT_AUTO_PICK_ORDER } from '../../../src/tasks/mobile-tui-agents'
import { resolveComposerBranchSelection } from '../../../src/tasks/mobile-composer-branch-selection'
import {
@@ -150,7 +171,6 @@ import {
import type {
BaseRefSearchResult,
GitHubOwnerRepo,
- ProviderCheckSummary,
PersistedTrustedOrcaHooks,
SparsePreset,
TuiAgent
@@ -161,253 +181,9 @@ import {
githubProjectHost,
githubProjectIdentityKey as githubProjectKey
} from '../../../../src/shared/github-project-identity'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator, t } from '@/i18n/mobile-i18n'
-type RepoSummary = {
- id: string
- displayName: string
- path: string
- badgeColor?: string
- kind?: 'git' | 'folder'
- connectionId?: string | null
- issueSourcePreference?: IssueSourcePreference
-}
-
-type IssueSourcePreference = 'upstream' | 'origin' | 'auto'
-
-type GitHubWorkItem = {
- id: string
- type: 'issue' | 'pr'
- number: number
- title: string
- state: 'open' | 'closed' | 'merged' | 'draft'
- url: string
- labels: string[]
- updatedAt: string
- author: string | null
- branchName?: string
- baseRefName?: string
- isCrossRepository?: boolean
- additions?: number
- deletions?: number
- changedFiles?: number
- repoId: string
- repoName: string
- reviewDecision?: string | null
- reviewRequests?: GitHubAssignableUser[]
- latestReviews?: GitHubPRReviewSummary[]
- checksSummary?: ProviderCheckSummary
- mergeable?: GitHubPRMergeableState
- mergeStateStatus?: string | null
-}
-type GitHubAssignableUser = {
- login: string
- name?: string | null
- avatarUrl?: string | null
-}
-type GitHubPRReviewSummary = {
- login: string
- state?: string | null
- avatarUrl?: string | null
-}
-type GitHubPRMergeableState = 'MERGEABLE' | 'CONFLICTING' | 'UNKNOWN'
-
-type GitHubPRReviewerRow = {
- login: string
- name?: string | null
- avatarUrl?: string | null
- stateLabel: string
-}
-type GitHubRepoSources = {
- issues: GitHubOwnerRepo | null
- prs: GitHubOwnerRepo | null
- upstreamCandidate: GitHubOwnerRepo | null
-}
-type TaskRuntimeStatus = {
- capabilities?: string[]
-}
-
-type TasksSupportState =
- | { kind: 'unknown'; client: RpcClient | null }
- | { kind: 'supported'; client: RpcClient }
- | { kind: 'unsupported'; client: RpcClient }
-type GitLabWorkItem = {
- id: string
- type: 'issue' | 'mr'
- number: number
- title: string
- state: 'opened' | 'closed' | 'merged' | 'locked' | 'draft'
- url: string
- labels: string[]
- updatedAt: string
- author: string | null
- branchName?: string
- baseRefName?: string
- isCrossRepository?: boolean
- projectRef?: { host: string; path: string }
- checksSummary?: ProviderCheckSummary
- mergeable?: 'MERGEABLE' | 'CONFLICTING' | 'UNKNOWN'
- reviewDecision?: HostedReviewDecision
- reviewerCount?: number
- repoId: string
- repoName: string
-}
-
-type GitLabTodo = {
- id: number
- actionName: string
- targetType: string
- targetIid: number | null
- targetTitle: string
- targetUrl: string
- projectPath: string
- authorUsername: string
- updatedAt: string
- state: 'pending' | 'done'
-}
-
-type GitPushTarget = {
- remoteName: string
- branchName: string
- remoteUrl?: string
-}
-
-type SetupDecision = 'inherit' | 'run' | 'skip'
-type SetupRunPolicy = 'ask' | 'run-by-default' | 'skip-by-default'
-
-type RepoHooksResponse = {
- hooks: { scripts?: { setup?: string } } | null
- source: string | null
- setupRunPolicy?: SetupRunPolicy
- setupTrust?: {
- contentHash: string
- scriptContent: string
- }
-}
-
-type LinearProject = {
- id: string
- name: string
- url?: string
- color?: string
-}
-
-type LinearIssueChild = {
- id: string
- identifier: string
- title: string
- url: string
-}
-
-type LinearIssue = LinearMobileIssue
-
-type LinearState = {
- id: string
- name: string
- type: string
- color?: string
-}
-
-type LinearTeam = {
- id: string
- workspaceId?: string
- workspaceName?: string
- name: string
- key: string
-}
-
-type DetailComment = {
- id: string | number
- author?: string
- authorAvatarUrl?: string
- user?: { displayName?: string }
- isBot?: boolean
- body: string
- createdAt?: string
- url?: string
- reactions?: Array<{
- content:
- | 'thumbs_up'
- | 'thumbs_down'
- | 'laugh'
- | 'confused'
- | 'heart'
- | 'hooray'
- | 'rocket'
- | 'eyes'
- count: number
- }>
- path?: string
- line?: number
- startLine?: number
- threadId?: string
- isResolved?: boolean
-}
-
-type GitHubDetailFile = {
- path: string
- oldPath?: string
- status?: 'added' | 'modified' | 'removed' | 'renamed' | 'copied' | 'changed' | 'unchanged'
- additions?: number
- deletions?: number
- isBinary?: boolean
- viewerViewedState?: 'DISMISSED' | 'VIEWED' | 'UNVIEWED'
-}
-
-type GitHubDetailCheck = {
- name: string
- status: string
- conclusion?: string | null
- url?: string | null
-}
-
-type GitHubPRFileContents = {
- original: string
- modified: string
- originalIsBinary: boolean
- modifiedIsBinary: boolean
-}
-
-type DetailPayload =
- | {
- provider: 'github'
- body: string
- comments: DetailComment[]
- labels: string[]
- assignees: string[]
- reviewDecision?: string | null
- reviewRequests: GitHubAssignableUser[]
- latestReviews: GitHubPRReviewSummary[]
- headSha?: string
- baseSha?: string
- pullRequestId?: string
- checks: GitHubDetailCheck[]
- files: GitHubDetailFile[]
- }
- | {
- provider: 'gitlab'
- body: string
- comments: DetailComment[]
- labels: string[]
- assignees: string[]
- pipelineJobs: Array<{
- id?: number
- name: string
- stage: string
- status: string
- webUrl?: string | null
- duration?: number | null
- }>
- }
- | {
- provider: 'linear'
- description: string
- comments: DetailComment[]
- labels: string[]
- assignee?: string
- project?: LinearProject
- children: LinearIssueChild[]
- }
+const tr = createMobileTranslator('task')
type GitHubTaskKind = 'issues' | 'prs'
type GitHubMode = GitHubTaskKind | 'project'
@@ -686,8 +462,8 @@ type TaskListEntry =
const getProviderOptions = (): PickerOption[] => [
{
value: 'github',
- label: t('m.gcczsRA'),
- subtitle: t('m.monYp5Q'),
+ label: tr('gitHub'),
+ subtitle: tr('issuesPull'),
renderIcon: (selected) => (
[] => [
},
{
value: 'gitlab',
- label: t('m.BaXOO9M'),
- subtitle: t('m.cBPoyj8'),
+ label: tr('gitLab'),
+ subtitle: tr('issuesMerge'),
renderIcon: (selected) => (
[] => [
},
{
value: 'linear',
- label: t('m.R_7ye6M'),
- subtitle: t('m.L9I1oLA'),
+ label: tr('linear'),
+ subtitle: tr('assignedTeam'),
renderIcon: (selected) => (
[] => [
]
const getGitLabFilterOptions = (): PickerOption[] => [
- { value: 'opened', label: t('m.czxJ7iQ'), subtitle: t('m.Dm3BEDs') },
- { value: 'merged', label: t('m.GtruncU'), subtitle: t('m.fM4vagY') },
- { value: 'closed', label: t('m.BpviSSw'), subtitle: t('m.m5Y69Pc') },
- { value: 'all', label: t('m.gIF8518'), subtitle: t('m.Svu67QM') }
+ {
+ value: 'opened',
+ label: tr('open'),
+ subtitle: tr('openIssuesMerge')
+ },
+ {
+ value: 'merged',
+ label: tr('merged'),
+ subtitle: tr('mergedMerge')
+ },
+ {
+ value: 'closed',
+ label: tr('closed'),
+ subtitle: tr('closedIssues')
+ },
+ {
+ value: 'all',
+ label: tr('all'),
+ subtitle: tr('any')
+ }
]
const getLinearFilterOptions = (): PickerOption[] => [
- { value: 'all', label: t('m.gIF8518'), subtitle: t('m._kT7uQE') },
- { value: 'assigned', label: t('m.pP-07nE'), subtitle: t('m.eNsBySI') },
- { value: 'created', label: t('m.o_j-FoE'), subtitle: t('m.kRDldqg') },
- { value: 'completed', label: t('m.HauqL5Y'), subtitle: t('m.CW8el5g') }
+ {
+ value: 'all',
+ label: tr('all'),
+ subtitle: tr('openIssuesAcross')
+ },
+ {
+ value: 'assigned',
+ label: tr('myIssues'),
+ subtitle: tr('issuesAssigned')
+ },
+ {
+ value: 'created',
+ label: tr('created'),
+ subtitle: tr('issuesCreated')
+ },
+ {
+ value: 'completed',
+ label: tr('completed'),
+ subtitle: tr('recently')
+ }
]
const getLinearViewOptions = (): PickerOption[] => [
- { value: 'list', label: t('m.tIgX1ak'), subtitle: t('m.6GAUUa8') },
- { value: 'board', label: t('m.uoATjeA'), subtitle: t('m.JKx6Gd0') }
+ {
+ value: 'list',
+ label: tr('list'),
+ subtitle: tr('compact')
+ },
+ {
+ value: 'board',
+ label: tr('board'),
+ subtitle: tr('grouped')
+ }
]
function taskWorkspaceFallback(item: ActionableTaskItem): string {
@@ -767,26 +583,26 @@ const COMMENT_REACTION_EMOJI: Record<
}
const getLinearGroupOptions = (): PickerOption[] => [
- { value: 'none', label: t('m.Dd-TzXA') },
- { value: 'status', label: t('m.Fa6K7yI') },
- { value: 'assignee', label: t('m.b3RSkG0') },
- { value: 'priority', label: t('m.ISISlFo') },
- { value: 'team', label: t('m.czBdX7w') }
+ { value: 'none', label: tr('noGrouping') },
+ { value: 'status', label: tr('status') },
+ { value: 'assignee', label: tr('assignee') },
+ { value: 'priority', label: tr('priority') },
+ { value: 'team', label: tr('team') }
]
const getLinearOrderOptions = (): PickerOption[] => [
- { value: 'priority', label: t('m.ISISlFo') },
- { value: 'updated', label: t('m.43utnp4') },
- { value: 'identifier', label: t('m.kpxCp5s') }
+ { value: 'priority', label: tr('priority') },
+ { value: 'updated', label: tr('updated') },
+ { value: 'identifier', label: tr('identifier') }
]
const getLinearDisplayOptions = (): PickerOption[] => [
- { value: 'state', label: t('m.Fa6K7yI') },
- { value: 'priority', label: t('m.ISISlFo') },
- { value: 'assignee', label: t('m.b3RSkG0') },
- { value: 'team', label: t('m.czBdX7w') },
- { value: 'labels', label: t('m.GhHLbBA') },
- { value: 'updated', label: t('m.43utnp4') }
+ { value: 'state', label: tr('status') },
+ { value: 'priority', label: tr('priority') },
+ { value: 'assignee', label: tr('assignee') },
+ { value: 'team', label: tr('team') },
+ { value: 'labels', label: tr('labels') },
+ { value: 'updated', label: tr('updated') }
]
const DEFAULT_LINEAR_DISPLAY_PROPERTIES: LinearDisplayProperty[] = [
@@ -799,33 +615,77 @@ const DEFAULT_LINEAR_DISPLAY_PROPERTIES: LinearDisplayProperty[] = [
]
const getGitHubKindOptions = (): PickerOption[] => [
- { value: 'issues', label: t('m.41d4YcM'), subtitle: t('m.PAK8mwc') },
- { value: 'prs', label: t('m.Xj-3fdg'), subtitle: t('m.RU009FY') },
- { value: 'project', label: t('m.LB-QyhM'), subtitle: t('m.QNj7rUo') }
+ {
+ value: 'issues',
+ label: tr('issues'),
+ subtitle: tr('gitHubIssues')
+ },
+ {
+ value: 'prs',
+ label: tr('prs'),
+ subtitle: tr('gitHubPull')
+ },
+ {
+ value: 'project',
+ label: tr('projects'),
+ subtitle: tr('gitHubProjectsViews')
+ }
]
const getIssuePresets = (): PickerOption[] => [
- { value: 'issues', label: t('m.czxJ7iQ'), subtitle: t('m.4HZ7SXw') },
- { value: 'my-issues', label: t('m.NeeUliY'), subtitle: t('m.90lx_rw') }
+ {
+ value: 'issues',
+ label: tr('open'),
+ subtitle: tr('openGitHubIssues')
+ },
+ {
+ value: 'my-issues',
+ label: tr('assignedMe'),
+ subtitle: tr('openIssuesAssigned')
+ }
]
const getPRPresets = (): PickerOption[] => [
- { value: 'prs', label: t('m.czxJ7iQ'), subtitle: t('m.4q-Iqts') },
- { value: 'my-prs', label: t('m.DitaVA4'), subtitle: t('m.Qcb2h_k') },
- { value: 'review', label: t('m.ox2Q3X4'), subtitle: t('m.Vejw8iE') }
+ {
+ value: 'prs',
+ label: tr('open'),
+ subtitle: tr('openPull')
+ },
+ {
+ value: 'my-prs',
+ label: tr('mine'),
+ subtitle: tr('pullRequestsAuthored')
+ },
+ {
+ value: 'review',
+ label: tr('needs'),
+ subtitle: tr('reviewRequests')
+ }
]
const getGitLabViewOptions = (): PickerOption[] => [
- { value: 'project', label: t('m.fxhXe98'), subtitle: t('m.CNrYYPU') },
- { value: 'todos', label: t('m.uLI9QAU'), subtitle: t('m.ncl7fEY') }
+ {
+ value: 'project',
+ label: tr('projectMrs'),
+ subtitle: tr('mergeRequests')
+ },
+ {
+ value: 'todos',
+ label: tr('myTodos'),
+ subtitle: tr('pending')
+ }
]
const getSortOptions = (): PickerOption[] => [
- { value: 'updated', label: t('m.43utnp4'), subtitle: t('m.45bce5E') },
+ {
+ value: 'updated',
+ label: tr('updated'),
+ subtitle: tr('newest')
+ },
{
value: 'repository',
- label: t('m.RBS8OI4'),
- subtitle: t('m._96Solc')
+ label: tr('repository'),
+ subtitle: tr('groupRepository')
}
]
@@ -987,21 +847,21 @@ function githubProjectOptionColor(color: string | null | undefined): string {
function projectRowStatusLabel(row: GitHubProjectRow): string {
if (row.itemType === 'DRAFT_ISSUE') {
- return t('m.1WEmdBA')
+ return tr('draft')
}
if (row.itemType === 'REDACTED') {
- return t('m.BbDPGbM')
+ return tr('redacted')
}
if (row.content.isDraft) {
- return t('m.1WEmdBA')
+ return tr('draft')
}
if (row.content.state === 'MERGED') {
- return t('m.GtruncU')
+ return tr('merged')
}
if (row.content.state === 'CLOSED') {
- return t('m.BpviSSw')
+ return tr('closed')
}
- return t('m.czxJ7iQ')
+ return tr('open')
}
function scopeGitHubTaskSearch(query: string, kind: GitHubTaskKind): string {
@@ -1017,12 +877,12 @@ function scopeGitHubTaskSearch(query: string, kind: GitHubTaskKind): string {
function gitHubStatusLabel(item: GitHubWorkItem): string {
if (item.state === 'merged') {
- return t('m.GtruncU')
+ return tr('merged')
}
if (item.state === 'draft') {
- return t('m.1WEmdBA')
+ return tr('draft')
}
- return item.state === 'closed' ? t('m.BpviSSw') : t('m.czxJ7iQ')
+ return item.state === 'closed' ? tr('closed') : tr('open')
}
function gitHubTaskSubtitle(item: GitHubWorkItem): string {
@@ -1044,15 +904,15 @@ function createGitHubTask(repo: RepoSummary, item: Omit) {
@@ -1070,12 +930,12 @@ function createGitLabTask(repo: RepoSummary, item: Omit): string {
if (todo.targetType === 'MergeRequest') {
- return t('m.mYLUh0s')
+ return tr('mergeRequest')
}
if (todo.targetType === 'Issue') {
- return t('m.xcg6mvE')
+ return tr('issue')
}
- return t('m.pmjWIDk')
+ return tr('gitLabTodo')
}
function gitLabTodoTargetRef(todo: Pick): string {
@@ -1152,11 +1012,11 @@ function createLinearTask(issue: LinearIssue): TaskItem {
function getLinearPriorityLabel(priority: number): string {
const labels: Record = {
- 0: t('m.pzBhZI4'),
- 1: t('m.e3kayEE'),
- 2: t('m._pcc0Zw'),
- 3: t('m.7LgwgJM'),
- 4: t('m.xPjEgDM')
+ 0: tr('none'),
+ 1: tr('urgent'),
+ 2: tr('high'),
+ 3: tr('medium'),
+ 4: tr('low')
}
return labels[priority] ?? `P${priority}`
}
@@ -1179,7 +1039,7 @@ function getGitHubReviewerRows(item: {
login,
name: user.name,
avatarUrl: user.avatarUrl,
- stateLabel: t('m.7RncVJk')
+ stateLabel: tr('requested')
})
}
for (const review of item.latestReviews ?? []) {
@@ -1204,14 +1064,14 @@ function getGitHubReviewSummary(item: {
latestReviews?: GitHubPRReviewSummary[]
}): string {
if (item.reviewDecision === 'APPROVED') {
- return t('m.O3Knlx4')
+ return tr('approved')
}
if (item.reviewDecision === 'CHANGES_REQUESTED') {
- return t('m.yMw_C-k')
+ return tr('changes')
}
const rows = getGitHubReviewerRows(item)
if (rows.length === 0) {
- return t('m.zrt1n24')
+ return tr('noReviewers')
}
if (rows.length === 1) {
return `${rows[0]!.login} - ${rows[0]!.stateLabel}`
@@ -1223,13 +1083,13 @@ function hostedBranchSummary(item: TaskItem): { head: string; base: string } | n
if (item.provider === 'github' && item.source.type === 'pr') {
return {
head: item.source.branchName?.trim() || t('review.branch.unknownHead'),
- base: item.source.baseRefName?.trim() || t('m.RIaVSo8')
+ base: item.source.baseRefName?.trim() || tr('base')
}
}
if (item.provider === 'gitlab' && item.source.type === 'mr') {
return {
head: item.source.branchName?.trim() || t('review.branch.unknownHead'),
- base: item.source.baseRefName?.trim() || t('m.RIaVSo8')
+ base: item.source.baseRefName?.trim() || tr('base')
}
}
return null
@@ -1237,49 +1097,52 @@ function hostedBranchSummary(item: TaskItem): { head: string; base: string } | n
function getGitHubMergeLabel(item: GitHubWorkItem): string {
if (item.mergeable === undefined && item.mergeStateStatus === undefined) {
- return t('m.AXgAxVM')
+ return tr('merge')
}
if (item.state === 'merged') {
- return t('m.GtruncU')
+ return tr('merged')
}
if (item.state === 'closed') {
- return t('m.BpviSSw')
+ return tr('closed')
}
if (item.mergeable === 'CONFLICTING') {
- return t('m.hIW5XEU')
+ return tr('conflicts')
}
if (item.mergeStateStatus === 'BEHIND') {
- return t('m.OXTehpM')
+ return tr('behind')
}
if (item.mergeStateStatus === 'BLOCKED') {
- return t('m.YEiNYxU')
+ return tr('blocked')
}
if (item.mergeable === 'MERGEABLE' || item.mergeStateStatus === 'CLEAN') {
- return t('m.cbIMuqY')
+ return tr('able')
}
- return t('m.6MEByr4')
+ return tr('unknown')
}
function getHostedReviewMergeMethodLabel(method: HostedReviewMergeMethod): string {
if (method === 'squash') {
- return t('m.1Shau08')
+ return tr('squashMerge')
}
if (method === 'rebase') {
- return t('m.b9yLdBs')
+ return tr('rebaseMerge')
}
- return t('m.PAnLDcM')
+ return tr('createMerge')
}
function hostedReviewMergeTargetLabel(item: HostedReviewItem): string {
- return item.provider === 'gitlab' ? t('m.xLFr_Co') : t('m.psZ6Lys')
+ return item.provider === 'gitlab' ? tr('mergeRequestMessage') : tr('pr')
}
function getHostedMergeConfirmMessage(pending: PendingHostedMerge): string {
const target = hostedReviewMergeTargetLabel(pending.item)
if (pending.method === 'squash') {
- return t('m.dTuoCp0', { value0: target, value1: pending.item.source.number })
+ return tr('squashMergeConfirmation', {
+ reviewType: target,
+ pullRequestNumber: pending.item.source.number
+ })
}
- const action = pending.method === 'rebase' ? t('m.b9yLdBs') : t('m.AXgAxVM')
+ const action = pending.method === 'rebase' ? tr('rebaseMerge') : tr('merge')
return t('hostedReview.mergeConfirm', {
action,
target,
@@ -1290,15 +1153,15 @@ function getHostedMergeConfirmMessage(pending: PendingHostedMerge): string {
function getProjectGitHubMergeConfirmMessage(pending: PendingProjectGitHubMerge): string {
const number = pending.row.content.number
if (pending.method === 'squash') {
- return t('m.LCOEY5w', { value0: number })
+ return tr('squashMergePr', { pullRequestNumber: number })
}
return pending.method === 'rebase'
- ? t('m.X5VvyPQ', { value0: number })
- : t('m.cAXZUp4', { value0: number })
+ ? tr('rebaseMergePr', { pullRequestNumber: number })
+ : tr('mergePr', { pullRequestNumber: number })
}
function hostedStateChangeAction(nextState: PendingHostedStateChange['nextState']): string {
- return nextState === 'closed' ? t('m.gL1buuY') : t('m.zRLzboM')
+ return nextState === 'closed' ? tr('close') : tr('reopen')
}
function hostedStateChangeTarget(pending: PendingHostedStateChange): {
@@ -1309,21 +1172,21 @@ function hostedStateChangeTarget(pending: PendingHostedStateChange): {
if (pending.source === 'project') {
const type = projectRowType(pending.row)
return {
- titleTarget: type === 'pr' ? t('m.fO2nz88') : t('m.xcg6mvE'),
- labelTarget: type === 'pr' ? t('m.psZ6Lys') : t('m.xcg6mvE'),
+ titleTarget: type === 'pr' ? tr('pullRequest') : tr('issue'),
+ labelTarget: type === 'pr' ? tr('pr') : tr('issue'),
number: pending.row.content.number
}
}
if (pending.item.provider === 'gitlab') {
return {
- titleTarget: pending.item.source.type === 'mr' ? t('m.cR4zEEM') : t('m.xcg6mvE'),
- labelTarget: pending.item.source.type === 'mr' ? t('m.mYLUh0s') : t('m.xcg6mvE'),
+ titleTarget: pending.item.source.type === 'mr' ? tr('mergeRequestTitle') : tr('issue'),
+ labelTarget: pending.item.source.type === 'mr' ? tr('mergeRequest') : tr('issue'),
number: pending.item.source.number
}
}
return {
- titleTarget: pending.item.source.type === 'pr' ? t('m.fO2nz88') : t('m.xcg6mvE'),
- labelTarget: pending.item.source.type === 'pr' ? t('m.psZ6Lys') : t('m.xcg6mvE'),
+ titleTarget: pending.item.source.type === 'pr' ? tr('pullRequest') : tr('issue'),
+ labelTarget: pending.item.source.type === 'pr' ? tr('pr') : tr('issue'),
number: pending.item.source.number
}
}
@@ -1418,7 +1281,7 @@ function hasGitHubIssueSourceChoice(sources: GitHubRepoSources | undefined): boo
}
function issueSourceSlug(source: GitHubOwnerRepo | null | undefined): string {
- return source ? `${source.owner}/${source.repo}` : t('m.6MEByr4')
+ return source ? `${source.owner}/${source.repo}` : tr('unknown')
}
function compareLinearIssues(a: LinearIssue, b: LinearIssue, orderBy: LinearOrderBy): number {
@@ -1446,7 +1309,7 @@ function getLinearIssueGroup(
if (groupBy === 'assignee') {
return {
key: `assignee:${issue.assignee?.id ?? issue.assignee?.displayName ?? 'unassigned'}`,
- label: issue.assignee?.displayName ?? t('m.7wx0uDo'),
+ label: issue.assignee?.displayName ?? tr('unassigned'),
color: colors.accentBlue
}
}
@@ -1460,7 +1323,7 @@ function getLinearIssueGroup(
if (groupBy === 'team') {
return { key: `team:${issue.team.id}`, label: issue.team.name, color: issue.state.color }
}
- return { key: 'all', label: t('m.41d4YcM'), color: colors.accentBlue }
+ return { key: 'all', label: tr('issues'), color: colors.accentBlue }
}
function groupLinearIssues(
@@ -1470,7 +1333,14 @@ function groupLinearIssues(
): LinearIssueSection[] {
const sorted = [...issues].sort((a, b) => compareLinearIssues(a, b, orderBy))
if (groupBy === 'none') {
- return [{ key: 'all', label: t('m.41d4YcM'), color: colors.accentBlue, issues: sorted }]
+ return [
+ {
+ key: 'all',
+ label: tr('issues'),
+ color: colors.accentBlue,
+ issues: sorted
+ }
+ ]
}
const sections = new Map<
string,
@@ -1548,7 +1418,7 @@ function editableProjectFields(table: GitHubProjectTable | null): GitHubProjectF
function projectFieldValueLabel(row: GitHubProjectRow, field: GitHubProjectField): string {
const value = row.fieldValuesByFieldId?.[field.id]
if (!value) {
- return t('m.PoPA1vA')
+ return tr('empty')
}
if (value.kind === 'single-select') {
return value.name
@@ -1557,7 +1427,7 @@ function projectFieldValueLabel(row: GitHubProjectRow, field: GitHubProjectField
return value.title
}
if (value.kind === 'text') {
- return value.text || t('m.PoPA1vA')
+ return value.text || tr('empty')
}
if (value.kind === 'number') {
return String(value.number)
@@ -1566,29 +1436,29 @@ function projectFieldValueLabel(row: GitHubProjectRow, field: GitHubProjectField
return value.date
}
if (value.kind === 'labels') {
- return value.labels.map((label) => label.name).join(', ') || t('m.PoPA1vA')
+ return value.labels.map((label) => label.name).join(', ') || tr('empty')
}
if (value.kind === 'users') {
- return value.users.map((user) => user.login).join(', ') || t('m.PoPA1vA')
+ return value.users.map((user) => user.login).join(', ') || tr('empty')
}
- return t('m.PoPA1vA')
+ return tr('empty')
}
function projectFieldDisplayLabel(row: GitHubProjectRow, field: GitHubProjectField): string {
if (field.dataType === 'ASSIGNEES') {
- return row.content.assignees.map((user) => user.login).join(', ') || t('m.PoPA1vA')
+ return row.content.assignees.map((user) => user.login).join(', ') || tr('empty')
}
if (field.dataType === 'LABELS') {
- return row.content.labels.map((label) => label.name).join(', ') || t('m.PoPA1vA')
+ return row.content.labels.map((label) => label.name).join(', ') || tr('empty')
}
if (field.dataType === 'REPOSITORY') {
- return row.content.repository ?? t('m.PoPA1vA')
+ return row.content.repository ?? tr('empty')
}
if (field.dataType === 'PARENT_ISSUE') {
- return row.content.parentIssue ? `#${row.content.parentIssue.number}` : t('m.PoPA1vA')
+ return row.content.parentIssue ? `#${row.content.parentIssue.number}` : tr('empty')
}
if (field.dataType === 'ISSUE_TYPE') {
- return row.content.issueType?.name ?? t('m.PoPA1vA')
+ return row.content.issueType?.name ?? tr('empty')
}
if (field.dataType === 'TITLE') {
return row.content.title
@@ -1692,7 +1562,7 @@ function optimisticProjectFieldValue(
kind: 'single-select',
fieldId: field.id,
optionId: value.optionId,
- name: option?.name ?? t('m.q1Pbqtk'),
+ name: option?.name ?? tr('selected'),
color: option?.color ?? 'GRAY'
}
}
@@ -1702,7 +1572,7 @@ function optimisticProjectFieldValue(
kind: 'iteration',
fieldId: field.id,
iterationId: value.iterationId,
- title: iteration?.title ?? t('m.ObzOf3Y'),
+ title: iteration?.title ?? tr('iteration'),
startDate: iteration?.startDate ?? '',
duration: iteration?.duration ?? 0
}
@@ -1718,35 +1588,42 @@ function optimisticProjectFieldValue(
function taskKindLabel(item: TaskItem): string {
if (item.provider === 'github') {
- return item.source.type === 'pr' ? t('m.Bawm-QY') : t('m.xcg6mvE')
+ return item.source.type === 'pr' ? tr('pullRequestMessage') : tr('issue')
}
if (item.provider === 'gitlab') {
- return item.source.type === 'mr' ? t('m.mYLUh0s') : t('m.xcg6mvE')
+ return item.source.type === 'mr' ? tr('mergeRequest') : tr('issue')
}
if (item.provider === 'gitlabTodo') {
- return t('m.MKTNAHg', { value0: gitLabTodoTargetLabel(item.source) })
+ return tr('todo', {
+ todoTarget: gitLabTodoTargetLabel(item.source)
+ })
}
- return t('m.SpAtwKU')
+ return tr('linearTicket')
}
function taskExternalOpenLabel(item: TaskItem): string {
if (item.provider === 'github') {
- return t('m.jKf3DPI')
+ return tr('openGitHub')
}
if (item.provider === 'gitlab' || item.provider === 'gitlabTodo') {
- return t('m.N_IsXzY')
+ return tr('openGitLab')
}
- return t('m.6rtcg5s')
+ return tr('openLinear')
}
function taskStatusActionLabel(item: TaskItem): string {
const verb =
item.provider === 'github' || item.provider === 'gitlab'
? item.source.state === 'closed'
- ? t('m.zRLzboM')
- : t('m.vCnFzKQ')
+ ? tr('reopen')
+ : tr('close')
: ''
- return verb ? t('m.p2fnv7c', { value0: verb, value1: taskKindLabel(item) }) : ''
+ return verb
+ ? tr('action', {
+ actionVerb: verb,
+ taskKindLabel: taskKindLabel(item)
+ })
+ : ''
}
function isGitHubPrMergeBlocked(item: Extract): boolean {
@@ -1785,12 +1662,12 @@ function commentSourceLabel(comment: DetailComment): string {
: String(comment.line)
: ''
const location = line ? `${comment.path}:${line}` : comment.path
- return `${comment.isResolved ? t('m.BWgU598') : t('m.oj0ltFk')} · ${location}`
+ return `${comment.isResolved ? tr('resolvedReview') : tr('review')} · ${location}`
}
if (comment.threadId) {
- return comment.isResolved ? t('m.Ak34AMw') : t('m.br73014')
+ return comment.isResolved ? tr('resolvedReviewThread') : tr('reviewThread')
}
- return t('m.PAtCwbU')
+ return tr('top')
}
function groupDetailComments(comments: DetailComment[]): DetailCommentGroup[] {
@@ -1846,9 +1723,11 @@ function isResolvedDetailCommentGroup(group: DetailCommentGroup): boolean {
function discussionSummary(count: number): string {
if (count === 0) {
- return t('m.24Kgyy4')
+ return tr('noCommentsYet')
}
- return t(count === 1 ? 'm.px-yCeQ' : 'm.Uv1hPbA', { value0: count })
+ return tr(count === 1 ? 'commentCountComment' : 'commentCountComments', {
+ commentCount: count
+ })
}
function renderCommentReactions(comment: DetailComment): ReactNode {
@@ -1915,16 +1794,16 @@ function GitHubPrFileDiff({
const hiddenDiffLineCount = Math.max(0, diffPreview.totalLineCount - visibleDiffLines.length)
if (diffPreview.totalLineCount === 0) {
- return {t('m.T2C3fss')}
+ return {tr('noText')}
}
return (
{hiddenDiffLineCount > 0 ? (
- {t('m.fCKRINY', {
- value0: MAX_RENDERED_PR_DIFF_LINES,
- value1: diffPreview.totalLineCount
+ {tr('diffPreviewTruncated', {
+ maxRenderedPrDiffLines: MAX_RENDERED_PR_DIFF_LINES,
+ totalLineCount: diffPreview.totalLineCount
})}
) : null}
@@ -1969,7 +1848,7 @@ function GitHubPrFileDiff({
style={[styles.input, styles.replyInput]}
value={commentDrafts[draftKey] ?? ''}
onChangeText={(next) => onCommentDraftChange(draftKey, next)}
- placeholder={t('m._SIoB4k')}
+ placeholder={tr('addReview')}
placeholderTextColor={colors.textMuted}
multiline
textAlignVertical="top"
@@ -1980,7 +1859,9 @@ function GitHubPrFileDiff({
onPress={() => onSubmitComment(commentLine)}
>
- {t('m.0WWDhS8', { value0: commentLine })}
+ {tr('commentLine', {
+ commentLine: commentLine
+ })}
>
@@ -1997,11 +1878,16 @@ function isFailedGitHubCheck(check: { conclusion?: string | null }): boolean {
}
function repositoryCount(count: number): string {
- return count === 1 ? t('m.nt1k3hc', { value0: count }) : t('m.qzhASv0', { value0: count })
+ return count === 1
+ ? tr('repositoryCountRepository', { repositoryCount: count })
+ : tr('repositoryCountRepositories', { repositoryCount: count })
}
function buildPartialRepositoryNotice(failedCount: number, totalCount: number): string {
- return t('m.jG05lVM', { value0: failedCount, value1: repositoryCount(totalCount) })
+ return tr('failedCount', {
+ failedCount: failedCount,
+ repositoryCount: repositoryCount(totalCount)
+ })
}
function repoColor(name: string): string {
@@ -2019,12 +1905,12 @@ function getRepoBadgeColor(repo: RepoSummary | undefined, fallbackName: string):
function setupSourceLabel(source: string | null): string {
if (source === 'orca.yaml') {
- return t('m.BeBymFk')
+ return tr('orcaYaml')
}
if (source === 'legacy') {
- return t('m.EJg7NQU')
+ return tr('local')
}
- return t('m.xYaQ41Y')
+ return tr('repositoryHooks')
}
function taskRepositoryMeta(
@@ -2907,7 +2793,7 @@ export default function MobileTasksScreen() {
setMergeMethodTaskItem(null)
setMergeMethodProjectRow(null)
resetWorkspaceCreateState()
- setError(t('m.AmP4Z_A'))
+ setError(tr('updateOrcaDesktopUse'))
setTaskStateHydrated(false)
return
}
@@ -3011,7 +2897,7 @@ export default function MobileTasksScreen() {
if (stale) {
return
}
- setError(err instanceof Error ? err.message : t('m.jxeDUBI'))
+ setError(err instanceof Error ? err.message : tr('failedLoadTasksSettings'))
setTaskStateHydrated(false)
})
@@ -3154,7 +3040,7 @@ export default function MobileTasksScreen() {
return {
items: [] as Array>,
repoId: repo.id,
- error: err instanceof Error ? err.message : t('m.Bt_rGOI')
+ error: err instanceof Error ? err.message : tr('failedLoadGitHub')
}
}
}
@@ -3288,7 +3174,7 @@ export default function MobileTasksScreen() {
setGithubSourceErrors(page.sourceErrors)
setGithubSourceFallbacks(page.sourceFallbacks)
if (page.failedCount === queriedRepos.length) {
- throw new Error(t('m.Bt_rGOI'))
+ throw new Error(tr('failedLoadGitHub'))
}
setGithubPages([page.items])
setGithubCurrentPage(0)
@@ -3365,7 +3251,7 @@ export default function MobileTasksScreen() {
console.warn(`[mobile tasks] failed to fetch ${provider} work items`, repo.id, err)
return {
items: [] as TaskItem[],
- error: err instanceof Error ? err.message : t('m.bNtRw1Q')
+ error: err instanceof Error ? err.message : tr('failedLoadGitLab')
}
}
}
@@ -3375,7 +3261,7 @@ export default function MobileTasksScreen() {
}
const failedCount = results.filter((result) => result.error).length
if (failedCount === queriedRepos.length) {
- throw new Error(results.find((result) => result.error)?.error ?? t('m.bNtRw1Q'))
+ throw new Error(results.find((result) => result.error)?.error ?? tr('failedLoadGitLab'))
}
setItems(
results
@@ -3421,7 +3307,7 @@ export default function MobileTasksScreen() {
setItems([])
setGithubSourceErrors([])
setGithubSourceFallbacks([])
- setError(err instanceof Error ? err.message : t('m.eVVS8u4'))
+ setError(err instanceof Error ? err.message : tr('failedLoadTasks'))
} finally {
if (isCurrent()) {
setLoading(false)
@@ -3468,7 +3354,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.caw13Gk'))
+ throw new Error(result.error ?? tr('failedConnectLinear'))
}
setLinearApiKeyDraft('')
setLinearConnectState('idle')
@@ -3481,7 +3367,7 @@ export default function MobileTasksScreen() {
await loadLinearContext()
} catch (err) {
setLinearConnectState('error')
- setLinearConnectError(err instanceof Error ? err.message : t('m.bMml9Hw'))
+ setLinearConnectError(err instanceof Error ? err.message : tr('connection'))
}
}, [client, connState, linearApiKeyDraft, linearConnectState, loadLinearContext, taskUiReady])
@@ -3597,7 +3483,7 @@ export default function MobileTasksScreen() {
setGithubCurrentPage(nextPage)
setItems(allPages[nextPage] ?? [])
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.y6brnh8'))
+ setError(err instanceof Error ? err.message : tr('failedLoadMore'))
} finally {
setGithubPaginationLoading(false)
setGithubLoadingTargetPage(null)
@@ -3718,7 +3604,7 @@ export default function MobileTasksScreen() {
)
} catch (err) {
setGithubProjectTable(null)
- setGithubProjectError(err instanceof Error ? err.message : t('m.XhuO-88'))
+ setGithubProjectError(err instanceof Error ? err.message : tr('failedLoadProject'))
} finally {
setGithubProjectLoading(false)
}
@@ -3776,21 +3662,21 @@ export default function MobileTasksScreen() {
// replacement view, not as a failed project selection.
const supportedViews = views.filter((view) => view.layout === 'TABLE_LAYOUT')
if (supportedViews.length === 0) {
- throw new Error(t('m.s_tAbdk'))
+ throw new Error(tr('projectHas'))
}
setPendingGitHubProjectViewSelection(project)
setShowGitHubProjectViewPicker(true)
return
}
if (explicitView && explicitView.layout !== 'TABLE_LAYOUT') {
- throw new Error(t('m.pTwUfTs'))
+ throw new Error(tr('orcaDoes'))
}
if (!explicitView && !rememberedView) {
// Why: desktop asks which Project view to open the first time a project
// is selected. Mobile should not silently choose the first table view.
const supportedViews = views.filter((view) => view.layout === 'TABLE_LAYOUT')
if (supportedViews.length === 0) {
- throw new Error(t('m.s_tAbdk'))
+ throw new Error(tr('projectHas'))
}
setPendingGitHubProjectViewSelection(project)
setShowGitHubProjectViewPicker(true)
@@ -3801,11 +3687,11 @@ export default function MobileTasksScreen() {
views.find((view) => view.id === rememberedView && view.layout === 'TABLE_LAYOUT') ??
undefined
if (!selectedView) {
- throw new Error(t('m.s_tAbdk'))
+ throw new Error(tr('projectHas'))
}
commitGitHubProjectView(project, selectedView.id)
} catch (err) {
- setGithubProjectError(err instanceof Error ? err.message : t('m.6aqSQa0'))
+ setGithubProjectError(err instanceof Error ? err.message : tr('failedSelect'))
} finally {
setGithubProjectLoading(false)
}
@@ -3826,7 +3712,7 @@ export default function MobileTasksScreen() {
const input = githubProjectPasteInput.trim()
const parsed = parseProjectInput(input)
if (!parsed) {
- setGithubProjectPasteError(t('m.W2b7E0I'))
+ setGithubProjectPasteError(tr('expected'))
return
}
setGithubProjectPasteBusy(true)
@@ -3867,7 +3753,7 @@ export default function MobileTasksScreen() {
{ viewNumber: result.viewNumber }
)
} catch (err) {
- setGithubProjectPasteError(err instanceof Error ? err.message : t('m.-QPTwEw'))
+ setGithubProjectPasteError(err instanceof Error ? err.message : tr('failedAddProject'))
} finally {
setGithubProjectPasteBusy(false)
}
@@ -3935,7 +3821,7 @@ export default function MobileTasksScreen() {
return
}
void loadLinearContext().catch((err) => {
- setError(err instanceof Error ? err.message : t('m.us3-SEs'))
+ setError(err instanceof Error ? err.message : tr('failedLoadLinearContext'))
})
}, [linearConnected, loadLinearContext, provider, taskStateHydrated])
@@ -3950,7 +3836,7 @@ export default function MobileTasksScreen() {
void selectGitHubProject(activeGitHubProject)
} else {
void loadGitHubProjects().catch((err) => {
- setGithubProjectError(err instanceof Error ? err.message : t('m.wpUutIo'))
+ setGithubProjectError(err instanceof Error ? err.message : tr('failedLoadProjects'))
})
}
}, [
@@ -3971,7 +3857,7 @@ export default function MobileTasksScreen() {
return
}
void loadGitHubProjects().catch((err) => {
- setGithubProjectError(err instanceof Error ? err.message : t('m.wpUutIo'))
+ setGithubProjectError(err instanceof Error ? err.message : tr('failedLoadProjects'))
})
}, [loadGitHubProjects, showGitHubProjectPicker, taskUiReady])
@@ -4138,7 +4024,7 @@ export default function MobileTasksScreen() {
})
.catch((err) => {
if (!stale) {
- setItemLabelsError(err instanceof Error ? err.message : t('m.661kq0E'))
+ setItemLabelsError(err instanceof Error ? err.message : tr('failedLoadLabels'))
}
})
.finally(() => {
@@ -4172,7 +4058,9 @@ export default function MobileTasksScreen() {
})
.catch((err) => {
if (!stale) {
- setItemAssignableUsersError(err instanceof Error ? err.message : t('m.quO-aRc'))
+ setItemAssignableUsersError(
+ err instanceof Error ? err.message : tr('failedLoadAssignees')
+ )
}
})
.finally(() => {
@@ -4238,7 +4126,7 @@ export default function MobileTasksScreen() {
}>
} | null
if (!details) {
- throw new Error(t('m.-JNPw2M'))
+ throw new Error(tr('details'))
}
if (!stale) {
setDetailPayload({
@@ -4291,7 +4179,7 @@ export default function MobileTasksScreen() {
approvalState?: { approvalsRequired: number | null; approvalsLeft: number | null }
} | null
if (!details) {
- throw new Error(t('m.-JNPw2M'))
+ throw new Error(tr('details'))
}
if (!stale) {
setDetailPayload({
@@ -4370,7 +4258,7 @@ export default function MobileTasksScreen() {
? ((commentsResponse.result as DetailComment[]) ?? [])
: []
if (!issue) {
- throw new Error(t('m.-JNPw2M'))
+ throw new Error(tr('details'))
}
if (!stale) {
setDetailPayload({
@@ -4402,7 +4290,7 @@ export default function MobileTasksScreen() {
void loadDetails()
.catch((err) => {
if (!stale) {
- setDetailError(err instanceof Error ? err.message : t('m.BRtGSdQ'))
+ setDetailError(err instanceof Error ? err.message : tr('failedLoadDetails'))
}
})
.finally(() => {
@@ -4535,7 +4423,7 @@ export default function MobileTasksScreen() {
})
.catch((err) => {
if (!stale) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.BRtGSdQ'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedLoadDetails'))
}
})
.finally(() => {
@@ -4586,13 +4474,13 @@ export default function MobileTasksScreen() {
| { ok: true; labels?: string[] }
| { ok: false; error?: { message?: string } }
if (!result.ok) {
- throw new Error(result.error?.message ?? t('m.661kq0E'))
+ throw new Error(result.error?.message ?? tr('failedLoadLabels'))
}
setProjectAvailableLabels(result.labels ?? [])
})
.catch((err) => {
if (!stale) {
- setProjectLabelsError(err instanceof Error ? err.message : t('m.661kq0E'))
+ setProjectLabelsError(err instanceof Error ? err.message : tr('failedLoadLabels'))
}
})
.finally(() => {
@@ -4641,13 +4529,15 @@ export default function MobileTasksScreen() {
| { ok: true; users?: GitHubAssignableUser[] }
| { ok: false; error?: { message?: string } }
if (!result.ok) {
- throw new Error(result.error?.message ?? t('m.quO-aRc'))
+ throw new Error(result.error?.message ?? tr('failedLoadAssignees'))
}
setProjectAssignableUsers(result.users ?? [])
})
.catch((err) => {
if (!stale) {
- setProjectAssignableUsersError(err instanceof Error ? err.message : t('m.quO-aRc'))
+ setProjectAssignableUsersError(
+ err instanceof Error ? err.message : tr('failedLoadAssignees')
+ )
}
})
.finally(() => {
@@ -4697,13 +4587,13 @@ export default function MobileTasksScreen() {
| { ok: true; types?: GitHubIssueType[] }
| { ok: false; error?: { message?: string } }
if (!result.ok) {
- throw new Error(result.error?.message ?? t('m.0uj422Y'))
+ throw new Error(result.error?.message ?? tr('failedLoadIssue'))
}
setProjectIssueTypes(result.types ?? [])
})
.catch((err) => {
if (!stale) {
- setProjectIssueTypesError(err instanceof Error ? err.message : t('m.0uj422Y'))
+ setProjectIssueTypesError(err instanceof Error ? err.message : tr('failedLoadIssue'))
}
})
.finally(() => {
@@ -4769,11 +4659,13 @@ export default function MobileTasksScreen() {
: null
const workspaceSparseDraftError =
workspaceSparseDraft && workspaceSparseDraftName.length === 0
- ? t('m.RT1HPds')
+ ? tr('nameRequired')
: workspaceSparseDraftName.length > 80
- ? t('m.jBhX2v4')
+ ? tr('nameMust')
: workspaceSparseDraftNameCollision
- ? t('m.OR0Rh2U', { value0: workspaceSparseDraftNameCollision.name })
+ ? tr('workspaceSparse', {
+ workspaceSparseDraftNameCollisionName: workspaceSparseDraftNameCollision.name
+ })
: (workspaceSparseDraftParsed?.error ?? null)
const canSaveWorkspaceSparseDraft =
workspaceSparseDraft !== null &&
@@ -4813,7 +4705,7 @@ export default function MobileTasksScreen() {
{
value: 'blank' as const,
label: workspaceAgentLabel('blank'),
- subtitle: t('m.WG-yXgM'),
+ subtitle: tr('openShell'),
renderIcon: () =>
}
]
@@ -4941,7 +4833,9 @@ export default function MobileTasksScreen() {
setWorkspaceSparsePresets([])
setWorkspaceSparsePresetsLoaded(false)
setWorkspaceSparsePresetId(null)
- setWorkspaceSparsePresetsError(err instanceof Error ? err.message : t('m.f8dRWFk'))
+ setWorkspaceSparsePresetsError(
+ err instanceof Error ? err.message : tr('failedLoadSparse')
+ )
}
})
.finally(() => {
@@ -5010,7 +4904,7 @@ export default function MobileTasksScreen() {
.catch((err) => {
if (!stale) {
setWorkspaceBaseBranchResults([])
- setWorkspaceBaseBranchError(err instanceof Error ? err.message : t('m.MNvx1_M'))
+ setWorkspaceBaseBranchError(err instanceof Error ? err.message : tr('failedSearch'))
}
})
.finally(() => {
@@ -5092,7 +4986,7 @@ export default function MobileTasksScreen() {
}
const saved = (response.result as { preset?: SparsePreset }).preset
if (!saved) {
- throw new Error(t('m.xWmoUM8'))
+ throw new Error(tr('failedSave'))
}
setWorkspaceSparsePresets((current) => {
const withoutSaved = current.filter((preset) => preset.id !== saved.id)
@@ -5104,7 +4998,7 @@ export default function MobileTasksScreen() {
}
setWorkspaceSparseDraft(null)
} catch (err) {
- setWorkspaceSparsePresetsError(err instanceof Error ? err.message : t('m.xWmoUM8'))
+ setWorkspaceSparsePresetsError(err instanceof Error ? err.message : tr('failedSave'))
} finally {
setWorkspaceSparseSaving(false)
}
@@ -5151,7 +5045,7 @@ export default function MobileTasksScreen() {
setWorkspaceSshState({
targetId: workspaceCreateTargetConnectionId,
status: 'error',
- error: err instanceof Error ? err.message : t('m.CyTKwng'),
+ error: err instanceof Error ? err.message : tr('failedRead'),
reconnectAttempt: 0
})
}
@@ -5195,7 +5089,7 @@ export default function MobileTasksScreen() {
setWorkspaceSshState({
targetId: workspaceCreateTargetConnectionId,
status: 'error',
- error: err instanceof Error ? err.message : t('m.eCcpIL4'),
+ error: err instanceof Error ? err.message : tr('failedConnectSsh'),
reconnectAttempt: 0
})
} finally {
@@ -5223,7 +5117,11 @@ export default function MobileTasksScreen() {
setWorkspaceSshState(state)
}
if (state?.status !== 'connected') {
- throw new Error(t('m.AGIjbJU', { value0: repo.displayName }))
+ throw new Error(
+ tr('connectDisplay', {
+ displayName: repo.displayName
+ })
+ )
}
},
[client, tasksSupported, workspaceSshState]
@@ -5362,7 +5260,11 @@ export default function MobileTasksScreen() {
try {
const targetRepo = getWorkspaceTargetRepo(item, repoIdOverride)
if (!targetRepo) {
- throw new Error(item.provider === 'linear' ? t('m.6kKiG2U') : t('m.4F__ZBY'))
+ throw new Error(
+ item.provider === 'linear'
+ ? tr('addGitRepositoryBeforeCreatingLinear')
+ : tr('repositoryNotFound')
+ )
}
await ensureWorkspaceSshReady(targetRepo)
let latestRuntimeTaskSettings = runtimeTaskSettings
@@ -5390,7 +5292,7 @@ export default function MobileTasksScreen() {
) {
setWorkspaceAgent(selectedAgent)
setWorkspaceAgentOverridden(false)
- throw new Error(t('m.QI7iJCw'))
+ throw new Error(tr('selectedAgent'))
}
const setupResolution = await resolveCreateSetupDecision(targetRepo, setupOverride)
const comment = noteOverride?.trim()
@@ -5569,7 +5471,7 @@ export default function MobileTasksScreen() {
`/h/${hostId}/session/${encodeURIComponent(result.worktree.id)}?${queryParams.toString()}`
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.8r702TY'))
+ setError(err instanceof Error ? err.message : tr('failedCreateWorkspace'))
} finally {
setCreatingKey(null)
}
@@ -5597,14 +5499,14 @@ export default function MobileTasksScreen() {
const kind = projectRowType(row)
const repo = findProjectRowRepo(row)
if (!kind || !row.content.number || !row.content.url) {
- setError(t('m.aCTe1aA'))
+ setError(tr('addProject'))
return
}
if (!repo) {
const slug = splitRepositorySlug(row.content.repository)
setProjectRepoNotInOrca({
- owner: slug?.owner ?? t('m.6MEByr4'),
- repo: slug?.repo ?? row.content.repository ?? t('m.BX2Np3Y'),
+ owner: slug?.owner ?? tr('unknown'),
+ repo: slug?.repo ?? row.content.repository ?? tr('repository'),
url: row.content.url ?? null
})
return
@@ -5654,7 +5556,7 @@ export default function MobileTasksScreen() {
const type = projectRowType(row)
const slug = splitRepositorySlug(row.content.repository)
if (!type || !slug || !row.content.number) {
- setProjectRowDetailError(t('m.2lpu738'))
+ setProjectRowDetailError(tr('projectItemCannot'))
return
}
setProjectMutating(true)
@@ -5677,7 +5579,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: { message?: string } }
if (result.ok === false) {
- throw new Error(result.error?.message ?? t('m.8U28lt8'))
+ throw new Error(result.error?.message ?? tr('failedUpdateGitHubItem'))
}
setProjectRowItem((current) => {
if (!current || current.id !== row.id) {
@@ -5723,7 +5625,7 @@ export default function MobileTasksScreen() {
)
}
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.TE3rsP8'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateItem'))
} finally {
setProjectMutating(false)
}
@@ -5761,7 +5663,7 @@ export default function MobileTasksScreen() {
| { ok: true; comment?: DetailComment }
| { ok: false; error?: { message?: string } }
if (!result.ok) {
- throw new Error(result.error?.message ?? t('m.-bXRzXk'))
+ throw new Error(result.error?.message ?? tr('failedAddComment'))
}
setProjectCommentDraft('')
if (result.comment) {
@@ -5772,7 +5674,7 @@ export default function MobileTasksScreen() {
)
}
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.-bXRzXk'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedAddComment'))
} finally {
setProjectMutating(false)
}
@@ -5789,7 +5691,7 @@ export default function MobileTasksScreen() {
const commentId = Number(comment.id)
const body = projectEditingCommentDraft.trim()
if (!slug || !Number.isInteger(commentId) || commentId <= 0 || !body) {
- setProjectRowDetailError(t('m.fToZEE4'))
+ setProjectRowDetailError(tr('projectCommentCannotEdited'))
return
}
setProjectMutating(true)
@@ -5817,7 +5719,7 @@ export default function MobileTasksScreen() {
throw new Error(
typeof result.error === 'string'
? result.error
- : (result.error?.message ?? t('m.Lw1c31w'))
+ : (result.error?.message ?? tr('failedEdit'))
)
}
setProjectRowDetail((current) =>
@@ -5833,7 +5735,7 @@ export default function MobileTasksScreen() {
setProjectEditingCommentId(null)
setProjectEditingCommentDraft('')
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.Lw1c31w'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedEdit'))
} finally {
setProjectMutating(false)
}
@@ -5849,7 +5751,7 @@ export default function MobileTasksScreen() {
const slug = splitRepositorySlug(row.content.repository)
const commentId = Number(comment.id)
if (!slug || !Number.isInteger(commentId) || commentId <= 0) {
- setProjectRowDetailError(t('m.22DpbZo'))
+ setProjectRowDetailError(tr('projectCommentCannotDeleted'))
return
}
setProjectMutating(true)
@@ -5876,7 +5778,7 @@ export default function MobileTasksScreen() {
throw new Error(
typeof result.error === 'string'
? result.error
- : (result.error?.message ?? t('m.UbvF6N4'))
+ : (result.error?.message ?? tr('failedDelete'))
)
}
setProjectRowDetail((current) =>
@@ -5892,7 +5794,7 @@ export default function MobileTasksScreen() {
setProjectEditingCommentDraft('')
}
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.UbvF6N4'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedDelete'))
} finally {
setProjectMutating(false)
}
@@ -5930,7 +5832,7 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (response.result !== true) {
- throw new Error(resolve ? t('m.LVc8Fk0') : t('m.ct__F0Q'))
+ throw new Error(resolve ? tr('failedResolve') : tr('failedReopen'))
}
setProjectRowDetail((current) =>
current?.provider === 'github'
@@ -5945,7 +5847,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.Akq8bGo'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateReview'))
} finally {
setProjectMutating(false)
}
@@ -6007,7 +5909,7 @@ export default function MobileTasksScreen() {
comment?: DetailComment
}
if (result.ok === false) {
- throw new Error(result.error ?? t('m.k4ojp0Y'))
+ throw new Error(result.error ?? tr('failedReply'))
}
const reply: DetailComment = result.comment ?? {
id: `local-${Date.now()}`,
@@ -6029,7 +5931,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.k4ojp0Y'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedReply'))
} finally {
setProjectMutating(false)
}
@@ -6052,7 +5954,7 @@ export default function MobileTasksScreen() {
}
const slug = splitRepositorySlug(row.content.repository)
if (!slug || !row.content.number) {
- setProjectRowDetailError(t('m.2lpu738'))
+ setProjectRowDetailError(tr('projectItemCannot'))
return
}
setProjectMutating(true)
@@ -6073,7 +5975,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: { message?: string } }
if (result.ok === false) {
- throw new Error(result.error?.message ?? t('m.8U28lt8'))
+ throw new Error(result.error?.message ?? tr('failedUpdateGitHubItem'))
}
const applyContentUpdate = (candidate: GitHubProjectRow): GitHubProjectRow => {
const labels = new Map(candidate.content.labels.map((label) => [label.name, label]))
@@ -6142,7 +6044,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.TE3rsP8'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateItem'))
} finally {
setProjectMutating(false)
}
@@ -6184,7 +6086,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: { message?: string } }
if (result.ok === false) {
- throw new Error(result.error?.message ?? t('m.QbIagpk'))
+ throw new Error(result.error?.message ?? tr('failedUpdateProject'))
}
const patchRow = (candidate: GitHubProjectRow): GitHubProjectRow => {
const fieldValuesByFieldId = { ...candidate.fieldValuesByFieldId }
@@ -6212,7 +6114,7 @@ export default function MobileTasksScreen() {
setProjectFieldDrafts((current) => ({ ...current, [field.id]: '' }))
}
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.QbIagpk'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateProject'))
} finally {
setProjectMutating(false)
}
@@ -6227,7 +6129,7 @@ export default function MobileTasksScreen() {
}
const slug = splitRepositorySlug(row.content.repository)
if (row.itemType !== 'ISSUE' || !slug || !row.content.number) {
- setProjectRowDetailError(t('m.Z7UA1fA'))
+ setProjectRowDetailError(tr('projectIssue'))
return
}
setProjectMutating(true)
@@ -6248,7 +6150,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: { message?: string } }
if (result.ok === false) {
- throw new Error(result.error?.message ?? t('m.QKHONdI'))
+ throw new Error(result.error?.message ?? tr('failedUpdateIssueType'))
}
const patchRow = (candidate: GitHubProjectRow): GitHubProjectRow => ({
...candidate,
@@ -6268,7 +6170,7 @@ export default function MobileTasksScreen() {
: table
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.QKHONdI'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateIssueType'))
} finally {
setProjectMutating(false)
}
@@ -6304,7 +6206,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.eYVZBag'))
+ throw new Error(result.error ?? tr('failedRequest'))
}
const nextReviewRequests = (() => {
const byLogin = new Map()
@@ -6337,7 +6239,7 @@ export default function MobileTasksScreen() {
setProjectReviewersDraft('')
}
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.eYVZBag'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedRequest'))
} finally {
setProjectMutating(false)
}
@@ -6382,14 +6284,14 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (!Array.isArray(response.result)) {
- throw new Error(t('m.lanbga8'))
+ throw new Error(tr('invalid'))
}
const checks = response.result as GitHubDetailCheck[]
setProjectRowDetail((current) =>
current?.provider === 'github' ? { ...current, checks } : current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m._sMIbrI'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedRefresh'))
} finally {
setProjectMutating(false)
}
@@ -6428,11 +6330,11 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.ppWaFdk'))
+ throw new Error(result.error ?? tr('failedRerun'))
}
setProjectRowDetailRefreshSeq((current) => current + 1)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.ppWaFdk'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedRerun'))
} finally {
setProjectMutating(false)
}
@@ -6447,7 +6349,7 @@ export default function MobileTasksScreen() {
return
}
if (projectRowDetail?.provider !== 'github' || !projectRowDetail.pullRequestId) {
- setProjectRowDetailError(t('m.HCcPUIo'))
+ setProjectRowDetailError(tr('unableSync'))
return
}
const viewed = file.viewerViewedState !== 'VIEWED'
@@ -6469,7 +6371,7 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (response.result !== true) {
- throw new Error(t('m.fpX38uo'))
+ throw new Error(tr('failedSync'))
}
setProjectRowDetail((current) =>
current?.provider === 'github'
@@ -6484,7 +6386,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.3JBRDbM'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedUpdateViewed'))
} finally {
setProjectMutating(false)
}
@@ -6512,7 +6414,7 @@ export default function MobileTasksScreen() {
!projectRowDetail.headSha ||
!projectRowDetail.baseSha
) {
- setProjectRowDetailError(t('m.7sESNDQ'))
+ setProjectRowDetailError(tr('unableLoad'))
return
}
setPrFileLoadingPath(file.path)
@@ -6540,7 +6442,7 @@ export default function MobileTasksScreen() {
[file.path]: response.result as GitHubPRFileContents
}))
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.b6obzk0'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedLoadFile'))
} finally {
setPrFileLoadingPath(null)
}
@@ -6568,7 +6470,7 @@ export default function MobileTasksScreen() {
return
}
if (projectRowDetail?.provider !== 'github' || !projectRowDetail.headSha) {
- setProjectRowDetailError(t('m.4Si7jXY'))
+ setProjectRowDetailError(tr('unableComment'))
return
}
const draftKey = `${file.path}:${line}`
@@ -6601,7 +6503,7 @@ export default function MobileTasksScreen() {
comment?: DetailComment
}
if (result.ok === false) {
- throw new Error(result.error ?? t('m.jRm4RmA'))
+ throw new Error(result.error ?? tr('failedAddReview'))
}
const comment: DetailComment = result.comment ?? {
id: `local-${Date.now()}`,
@@ -6622,7 +6524,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.jRm4RmA'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedAddReview'))
} finally {
setProjectMutating(false)
}
@@ -6670,7 +6572,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.qVRnj6M'))
+ throw new Error(result.error ?? tr('failedMergePull'))
}
setProjectRowItem((current) =>
current?.id === row.id
@@ -6690,7 +6592,7 @@ export default function MobileTasksScreen() {
: table
)
} catch (err) {
- setProjectRowDetailError(err instanceof Error ? err.message : t('m.qVRnj6M'))
+ setProjectRowDetailError(err instanceof Error ? err.message : tr('failedMergePull'))
} finally {
setProjectMutating(false)
}
@@ -6726,12 +6628,12 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.lSNLJ4s'))
+ throw new Error(result.error ?? tr('failedUpdateGitHubStatus'))
}
setActionItem(null)
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.BvA66yA'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateStatus'))
} finally {
setMutatingStatus(false)
}
@@ -6767,12 +6669,12 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.nOlVFQ0'))
+ throw new Error(result.error ?? tr('failedUpdateGitLab'))
}
setActionItem(null)
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.nOlVFQ0'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateGitLab'))
} finally {
setMutatingStatus(false)
}
@@ -6812,7 +6714,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.aulxiV4'))
+ throw new Error(result.error ?? tr('failedUpdateGitHubIssue'))
}
const nextLabels = [
@@ -6883,7 +6785,7 @@ export default function MobileTasksScreen() {
setItemRemoveAssigneesDraft('')
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.aulxiV4'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateGitHubIssue'))
} finally {
setMutatingStatus(false)
}
@@ -6923,7 +6825,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.PA_I94w'))
+ throw new Error(result.error ?? tr('failedUpdateGitHubPull'))
}
if (nextTitle !== undefined) {
setActionItem((current) =>
@@ -6954,7 +6856,7 @@ export default function MobileTasksScreen() {
}
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.PA_I94w'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateGitHubPull'))
} finally {
setMutatingStatus(false)
}
@@ -7006,7 +6908,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.nOlVFQ0'))
+ throw new Error(result.error ?? tr('failedUpdateGitLab'))
}
const nextLabels = [
...new Set([
@@ -7078,7 +6980,7 @@ export default function MobileTasksScreen() {
}
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.nOlVFQ0'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateGitLab'))
} finally {
setMutatingStatus(false)
}
@@ -7138,7 +7040,7 @@ export default function MobileTasksScreen() {
comment?: DetailComment
}
if (result.ok === false) {
- throw new Error(result.error ?? t('m.-bXRzXk'))
+ throw new Error(result.error ?? tr('failedAddComment'))
}
const comment: DetailComment = result.comment ?? {
id: `local-${Date.now()}`,
@@ -7155,7 +7057,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.-bXRzXk'))
+ setError(err instanceof Error ? err.message : tr('failedAddComment'))
} finally {
setMutatingStatus(false)
}
@@ -7169,7 +7071,7 @@ export default function MobileTasksScreen() {
setCopiedLinkKey(key)
scheduleMobileTaskCopyFeedbackReset(copiedLinkResetTimerRef, key, setCopiedLinkKey)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.Y45YlXw'))
+ setError(err instanceof Error ? err.message : tr('failedCopyLink'))
}
}, [])
@@ -7179,7 +7081,7 @@ export default function MobileTasksScreen() {
setCopiedLinkKey(key)
scheduleMobileTaskCopyFeedbackReset(copiedLinkResetTimerRef, key, setCopiedLinkKey)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.4-krOeE'))
+ setError(err instanceof Error ? err.message : tr('failedCopyText'))
}
}, [])
@@ -7209,7 +7111,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.eYVZBag'))
+ throw new Error(result.error ?? tr('failedRequest'))
}
const nextReviewRequests = (() => {
const byLogin = new Map()
@@ -7260,7 +7162,7 @@ export default function MobileTasksScreen() {
setItemReviewersDraft('')
}
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.eYVZBag'))
+ setError(err instanceof Error ? err.message : tr('failedRequest'))
} finally {
setMutatingStatus(false)
}
@@ -7290,7 +7192,7 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (!Array.isArray(response.result)) {
- throw new Error(t('m.lanbga8'))
+ throw new Error(tr('invalid'))
}
const checks = response.result as GitHubDetailCheck[]
const checksSummary = buildGitHubCheckSummary(checks)
@@ -7316,7 +7218,7 @@ export default function MobileTasksScreen() {
)
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m._sMIbrI'))
+ setError(err instanceof Error ? err.message : tr('failedRefresh'))
} finally {
setMutatingStatus(false)
}
@@ -7347,11 +7249,11 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.ppWaFdk'))
+ throw new Error(result.error ?? tr('failedRerun'))
}
setDetailRefreshSeq((current) => current + 1)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.ppWaFdk'))
+ setError(err instanceof Error ? err.message : tr('failedRerun'))
} finally {
setMutatingStatus(false)
}
@@ -7368,7 +7270,7 @@ export default function MobileTasksScreen() {
return
}
if (detailPayload?.provider !== 'github' || !detailPayload.pullRequestId) {
- setError(t('m.HCcPUIo'))
+ setError(tr('unableSync'))
return
}
const viewed = file.viewerViewedState !== 'VIEWED'
@@ -7389,7 +7291,7 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (response.result !== true) {
- throw new Error(t('m.fpX38uo'))
+ throw new Error(tr('failedSync'))
}
setDetailPayload((current) =>
current?.provider === 'github'
@@ -7404,7 +7306,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.3JBRDbM'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateViewed'))
} finally {
setMutatingStatus(false)
}
@@ -7437,7 +7339,7 @@ export default function MobileTasksScreen() {
throw new Error(response.error.message)
}
if (response.result !== true) {
- throw new Error(resolve ? t('m.LVc8Fk0') : t('m.ct__F0Q'))
+ throw new Error(resolve ? tr('failedResolve') : tr('failedReopen'))
}
setDetailPayload((current) =>
current?.provider === 'github'
@@ -7452,7 +7354,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.Akq8bGo'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateReview'))
} finally {
setMutatingStatus(false)
}
@@ -7480,7 +7382,7 @@ export default function MobileTasksScreen() {
!detailPayload.headSha ||
!detailPayload.baseSha
) {
- setError(t('m.7sESNDQ'))
+ setError(tr('unableLoad'))
return
}
setPrFileLoadingPath(file.path)
@@ -7507,7 +7409,7 @@ export default function MobileTasksScreen() {
[file.path]: response.result as GitHubPRFileContents
}))
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.b6obzk0'))
+ setError(err instanceof Error ? err.message : tr('failedLoadFile'))
} finally {
setPrFileLoadingPath(null)
}
@@ -7525,7 +7427,7 @@ export default function MobileTasksScreen() {
return
}
if (detailPayload?.provider !== 'github' || !detailPayload.headSha) {
- setError(t('m.4Si7jXY'))
+ setError(tr('unableComment'))
return
}
const draftKey = `${file.path}:${line}`
@@ -7557,7 +7459,7 @@ export default function MobileTasksScreen() {
comment?: DetailComment
}
if (result.ok === false) {
- throw new Error(result.error ?? t('m.jRm4RmA'))
+ throw new Error(result.error ?? tr('failedAddReview'))
}
const comment: DetailComment = result.comment ?? {
id: `local-${Date.now()}`,
@@ -7578,7 +7480,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.jRm4RmA'))
+ setError(err instanceof Error ? err.message : tr('failedAddReview'))
} finally {
setMutatingStatus(false)
}
@@ -7640,7 +7542,7 @@ export default function MobileTasksScreen() {
comment?: DetailComment
}
if (result.ok === false) {
- throw new Error(result.error ?? t('m.k4ojp0Y'))
+ throw new Error(result.error ?? tr('failedReply'))
}
const reply: DetailComment = result.comment ?? {
id: `local-${Date.now()}`,
@@ -7662,7 +7564,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.k4ojp0Y'))
+ setError(err instanceof Error ? err.message : tr('failedReply'))
} finally {
setMutatingStatus(false)
}
@@ -7685,7 +7587,7 @@ export default function MobileTasksScreen() {
return
}
if (item.provider === 'github' && isGitHubPrMergeBlocked(item)) {
- setError(t('m.wPJymlU'))
+ setError(tr('gitHubReportsMergeConflictsOpen'))
return
}
setMutatingStatus(true)
@@ -7717,12 +7619,12 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m._t92UNY'))
+ throw new Error(result.error ?? tr('failedMerge'))
}
setActionItem(null)
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m._t92UNY'))
+ setError(err instanceof Error ? err.message : tr('failedMerge'))
} finally {
setMutatingStatus(false)
}
@@ -7776,7 +7678,7 @@ export default function MobileTasksScreen() {
})
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.gNpYapQ'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateLinear'))
} finally {
setMutatingStatus(false)
}
@@ -7810,7 +7712,7 @@ export default function MobileTasksScreen() {
}
const result = response.result as { ok?: boolean; id?: string; error?: string }
if (result.ok === false) {
- throw new Error(result.error ?? t('m.-bXRzXk'))
+ throw new Error(result.error ?? tr('failedAddComment'))
}
const comment: DetailComment = {
id: result.id ?? `local-${Date.now()}`,
@@ -7825,7 +7727,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.YpcHVvo'))
+ setError(err instanceof Error ? err.message : tr('failedAddLinear'))
} finally {
setMutatingStatus(false)
}
@@ -7851,11 +7753,11 @@ export default function MobileTasksScreen() {
}
const issue = response.result as LinearIssue | null
if (!issue) {
- throw new Error(t('m.KcjImC4'))
+ throw new Error(tr('subIssueNot'))
}
setActionItem(createLinearTask(issue) as Extract)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.GdZdv18'))
+ setError(err instanceof Error ? err.message : tr('failedLoadLinearSub'))
} finally {
setMutatingStatus(false)
}
@@ -7898,7 +7800,7 @@ export default function MobileTasksScreen() {
error?: string
}
if (result.ok === false || !result.id || !result.identifier) {
- throw new Error(result.error ?? t('m.2cHUFuY'))
+ throw new Error(result.error ?? tr('failedCreateSub'))
}
const child: LinearIssueChild = {
id: result.id,
@@ -7918,7 +7820,7 @@ export default function MobileTasksScreen() {
: current
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.Sni1IDk'))
+ setError(err instanceof Error ? err.message : tr('failedCreateLinearSub'))
} finally {
setMutatingStatus(false)
}
@@ -7940,7 +7842,11 @@ export default function MobileTasksScreen() {
if (provider === 'github' || provider === 'gitlab') {
const repo = hostedRepos.find((entry) => entry.id === createRepoId) ?? hostedRepos[0]
if (!repo) {
- throw new Error(t('m.C3TiEsc', { value0: provider === 'github' ? 'GitHub' : 'GitLab' }))
+ throw new Error(
+ tr('addGitRepositoryBeforeCreatingProvider', {
+ provider: provider === 'github' ? 'GitHub' : 'GitLab'
+ })
+ )
}
const response = await client.sendRequest(
provider === 'github' ? 'github.createIssue' : 'gitlab.createIssue',
@@ -7961,7 +7867,10 @@ export default function MobileTasksScreen() {
}
if (result.ok === false) {
throw new Error(
- result.error ?? t('m.ffJZE1A', { value0: provider === 'github' ? 'GitHub' : 'GitLab' })
+ result.error ??
+ tr('failedCreateProvider', {
+ provider: provider === 'github' ? 'GitHub' : 'GitLab'
+ })
)
}
if (typeof result.number === 'number') {
@@ -7999,7 +7908,7 @@ export default function MobileTasksScreen() {
} else {
const team = linearTeams.find((entry) => entry.id === createTeamId) ?? linearTeams[0]
if (!team) {
- throw new Error(t('m.T_YfEh0'))
+ throw new Error(tr('selectLinear'))
}
const response = await client.sendRequest('linear.createIssue', {
teamId: team.id,
@@ -8019,7 +7928,7 @@ export default function MobileTasksScreen() {
error?: string
}
if (result.ok === false || !result.id || !result.identifier) {
- throw new Error(result.error ?? t('m.iD-UhpY'))
+ throw new Error(result.error ?? tr('failedCreateLinearIssue'))
}
setActionItem(
createLinearTask({
@@ -8043,7 +7952,7 @@ export default function MobileTasksScreen() {
setCreateBody('')
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.XuKemqY'))
+ setError(err instanceof Error ? err.message : tr('failedCreateTask'))
} finally {
setCreatingTask(false)
}
@@ -8092,7 +8001,7 @@ export default function MobileTasksScreen() {
)
await loadTasks({ silent: true })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.piHodso'))
+ setError(err instanceof Error ? err.message : tr('failedUpdateIssueSource'))
}
},
[client, loadTasks, taskUiReady]
@@ -8111,7 +8020,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.commentInput, styles.commentComposerInput]}
value={args.value}
onChangeText={args.onChangeText}
- placeholder={t('m._I4A15k')}
+ placeholder={tr('addComment')}
placeholderTextColor={colors.textMuted}
editable={!args.disabled}
multiline
@@ -8121,7 +8030,7 @@ export default function MobileTasksScreen() {
{hasText ? (
[
styles.commentComposerSend,
pressed && !args.disabled && styles.commentComposerSendPressed,
@@ -8173,7 +8082,7 @@ export default function MobileTasksScreen() {
onPress={() => void toggleGitHubReviewThread(actionItem, comment)}
>
- {comment.isResolved ? t('m.qEc1OYo') : t('m.Rjjl1iA')}
+ {comment.isResolved ? tr('reopenThread') : tr('resolve')}
) : null}
@@ -8186,7 +8095,7 @@ export default function MobileTasksScreen() {
[String(comment.id)]: next
}))
}
- placeholder={t('m.2MyR_iQ')}
+ placeholder={tr('reply')}
placeholderTextColor={colors.textMuted}
multiline
textAlignVertical="top"
@@ -8196,7 +8105,7 @@ export default function MobileTasksScreen() {
disabled={mutatingStatus || !(itemReplyDrafts[String(comment.id)] ?? '').trim()}
onPress={() => void replyToGitHubComment(actionItem, comment)}
>
- {t('m.2MyR_iQ')}
+ {tr('reply')}
>
) : null}
@@ -8226,12 +8135,12 @@ export default function MobileTasksScreen() {
}
>
- {t(group.kind === 'thread' ? 'm.kYCT6qM' : 'm.ahIRbHk', {
- value0: commentAuthor(root)
+ {tr(group.kind === 'thread' ? 'resolvedThread' : 'resolvedComment', {
+ commentAuthor: commentAuthor(root)
})}
- {count > 1 ? t('m.M2j9mpc', { value0: count }) : t('m.z1fMPAI')}
+ {count > 1 ? tr('discussionComment', { commentCount: count }) : tr('show')}
)
@@ -8278,10 +8187,10 @@ export default function MobileTasksScreen() {
: (linearTeams.find((team) => team.id === createTeamId) ?? linearTeams[0] ?? null)
const selectedCreateTargetLabel =
provider === 'github' || provider === 'gitlab'
- ? ((selectedCreateTarget as RepoSummary | null)?.displayName ?? t('m.x8ioLCA'))
- : ((selectedCreateTarget as LinearTeam | null)?.name ?? t('m.x8ioLCA'))
+ ? ((selectedCreateTarget as RepoSummary | null)?.displayName ?? tr('selectTarget'))
+ : ((selectedCreateTarget as LinearTeam | null)?.name ?? tr('selectTarget'))
const providerLabel =
- provider === 'github' ? t('m.gcczsRA') : provider === 'gitlab' ? t('m.BaXOO9M') : t('m.R_7ye6M')
+ provider === 'github' ? tr('gitHub') : provider === 'gitlab' ? tr('gitLab') : tr('linear')
const showHeaderCreateTask =
provider === 'linear' || (provider === 'github' && githubMode === 'items')
const providerOptions = useMemo(
@@ -8317,13 +8226,17 @@ export default function MobileTasksScreen() {
? githubIssueSourceRows[0]!.sources.prs
: githubIssueSourceRows[0]!.sources.upstreamCandidate
)
- : t('m.yX2I5Qc', { value0: githubIssueSourceRows.length })
+ : tr('githubIssue', {
+ githubIssueSourceRowCount: githubIssueSourceRows.length
+ })
const repoPickerLabel =
selectedRepoIds.size === 0 || selectedHostedRepos.length === hostedRepos.length
- ? t('m.dBmZ43Q')
+ ? tr('allRepos')
: selectedHostedRepos.length === 1
? selectedHostedRepos[0]!.displayName
- : t('m.zrhQGaA', { value0: selectedHostedRepos.length })
+ : tr('selectedHosted', {
+ selectedHostedRepoCount: selectedHostedRepos.length
+ })
const repoPickerSelectedRepo =
selectedRepoIds.size > 0 && selectedHostedRepos.length === 1 ? selectedHostedRepos[0]! : null
const workspaceRepoOptions = useMemo[]>(
@@ -8374,7 +8287,7 @@ export default function MobileTasksScreen() {
return entries
}, [reposById, sortedItems, taskSort])
const sortLabel =
- getSortOptions().find((option) => option.value === taskSort)?.label ?? t('m.43utnp4')
+ getSortOptions().find((option) => option.value === taskSort)?.label ?? tr('updated')
const githubProjectFields = githubProjectTable?.selectedView.fields ?? []
const githubProjectViewSort = githubProjectTable?.selectedView.sortByFields?.[0] ?? null
const githubProjectSortField = githubProjectSortOverride
@@ -8383,43 +8296,46 @@ export default function MobileTasksScreen() {
const githubProjectSortDirection =
githubProjectSortOverride?.direction ?? githubProjectViewSort?.direction ?? null
const githubProjectSortLabel = githubProjectSortField
- ? `${githubProjectSortField.name} ${githubProjectSortDirection === 'DESC' ? t('m.2IFEfeA') : t('m.qzEC9yM')}`
- : t('m.Hs-i62I')
+ ? `${githubProjectSortField.name} ${githubProjectSortDirection === 'DESC' ? tr('descending') : tr('ascending')}`
+ : tr('viewOrder')
const githubProjectFieldsLabel =
githubProjectAvailableSummaryFields.length > 0
- ? t('m.BJUllKs', {
- value0: githubProjectSummaryFields.length,
- value1: githubProjectAvailableSummaryFields.length
+ ? tr('githubProject', {
+ githubProjectSummaryFieldCount: githubProjectSummaryFields.length,
+ githubProjectAvailableSummaryFieldCount: githubProjectAvailableSummaryFields.length
})
- : t('m.DiuXQZo')
+ : tr('fields')
const githubProjectSortOptions = useMemo[]>(
() => [
{
value: PROJECT_VIEW_DEFAULT_SORT,
- label: t('m.Hs-i62I'),
+ label: tr('viewOrder'),
subtitle: githubProjectViewSort
- ? t('m.fERYVNg', {
- value0: githubProjectViewSort.field.name,
- value1: githubProjectViewSort.direction === 'DESC' ? t('m.2IFEfeA') : t('m.qzEC9yM')
+ ? tr('usesSort', {
+ sortFieldName: githubProjectViewSort.field.name,
+ sortDirection:
+ githubProjectViewSort.direction === 'DESC' ? tr('descending') : tr('ascending')
})
- : t('m.P-ZWamw')
+ : tr('usesGit')
},
...githubProjectFields.map((field) => {
const active = githubProjectSortOverride?.fieldId === field.id
const nextDirection =
!active || githubProjectSortOverride.direction === 'DESC'
- ? t('m.qzEC9yM')
- : t('m.2IFEfeA')
+ ? tr('ascending')
+ : tr('descending')
return {
value: field.id,
label: field.name,
subtitle: active
- ? t('m.YKWIedk', {
- value0:
- githubProjectSortOverride.direction === 'DESC' ? t('m.2IFEfeA') : t('m.qzEC9yM'),
- value1: nextDirection
+ ? tr('currently', {
+ currentSortDirection:
+ githubProjectSortOverride.direction === 'DESC'
+ ? tr('descending')
+ : tr('ascending'),
+ nextSortDirection: nextDirection
})
- : t('m.yvbNVZo')
+ : tr('sortAscending')
}
})
],
@@ -8431,7 +8347,9 @@ export default function MobileTasksScreen() {
value: view.id,
label: view.name,
subtitle:
- view.layout === 'TABLE_LAYOUT' ? t('m.hy_B4J8', { value0: view.number }) : t('m.dMUK4L8'),
+ view.layout === 'TABLE_LAYOUT'
+ ? tr('viewProject', { projectViewNumber: view.number })
+ : tr('unsupported'),
disabled: view.layout !== 'TABLE_LAYOUT'
})),
[githubProjectViews]
@@ -8441,38 +8359,35 @@ export default function MobileTasksScreen() {
option.value === defaultGitHubPreset
? {
...option,
- subtitle: option.subtitle ? t('m.dXnxHU4', { value0: option.subtitle }) : t('m.TNd6PjA')
+ subtitle: option.subtitle ? tr('subtitle', { subtitle: option.subtitle }) : tr('default')
}
: option
)
const githubPresetLabel =
- githubPresetOptions.find((preset) => preset.value === githubPreset)?.label ?? t('m.czxJ7iQ')
+ githubPresetOptions.find((preset) => preset.value === githubPreset)?.label ?? tr('open')
const gitlabFilterLabel =
- getGitLabFilterOptions().find((filter) => filter.value === gitlabFilter)?.label ??
- t('m.czxJ7iQ')
+ getGitLabFilterOptions().find((filter) => filter.value === gitlabFilter)?.label ?? tr('open')
const linearFilterLabel =
- getLinearFilterOptions().find((filter) => filter.value === linearFilter)?.label ??
- t('m.gIF8518')
+ getLinearFilterOptions().find((filter) => filter.value === linearFilter)?.label ?? tr('all')
const linearViewLabel =
- getLinearViewOptions().find((option) => option.value === linearViewMode)?.label ??
- t('m.tIgX1ak')
+ getLinearViewOptions().find((option) => option.value === linearViewMode)?.label ?? tr('list')
const linearGroupLabel =
getLinearGroupOptions().find((option) => option.value === linearGroupBy)?.label ??
- t('m.Dd-TzXA')
+ tr('noGrouping')
const linearOrderLabel =
getLinearOrderOptions().find((option) => option.value === linearOrderBy)?.label ??
- t('m.ISISlFo')
+ tr('priority')
const linearWorkspaceLabel =
selectedLinearWorkspaceId === 'all'
- ? t('m.-Qqso-0')
+ ? tr('allWorkspaces')
: (linearWorkspaces.find((workspace) => workspace.id === selectedLinearWorkspaceId)
?.organizationName ??
linearWorkspaces.find((workspace) => workspace.id === selectedLinearWorkspaceId)
?.displayName ??
- t('m.5U1KC3A'))
+ tr('workspace'))
const linearWorkspaceOptions = useMemo[]>(
() => [
- { value: 'all', label: t('m.-Qqso-0') },
+ { value: 'all', label: tr('allWorkspaces') },
...linearWorkspaces.map((workspace) => ({
value: workspace.id,
label: workspace.organizationName ?? workspace.displayName ?? workspace.id
@@ -8482,10 +8397,10 @@ export default function MobileTasksScreen() {
)
const linearTeamLabel =
selectedLinearTeamIds.size === 0 || selectedLinearTeamIds.size === linearTeams.length
- ? t('m.dEIGNBo')
+ ? tr('allTeams')
: selectedLinearTeamIds.size === 1
- ? (linearTeams.find((team) => selectedLinearTeamIds.has(team.id))?.name ?? t('m.rqyU6Yo'))
- : t('m.73-jDqg', { value0: selectedLinearTeamIds.size })
+ ? (linearTeams.find((team) => selectedLinearTeamIds.has(team.id))?.name ?? tr('oneTeam'))
+ : tr('teamCount', { teamCount: selectedLinearTeamIds.size })
const effectiveLinearDisplayProperties = useMemo(() => {
const next = new Set(linearDisplayProperties)
if (linearGroupBy === 'status') {
@@ -8550,16 +8465,12 @@ export default function MobileTasksScreen() {
[linearGroupBy, linearIssuesForView, linearOrderBy]
)
const githubModeLabel =
- githubMode === 'project'
- ? t('m.LB-QyhM')
- : githubKind === 'prs'
- ? t('m.Xj-3fdg')
- : t('m.41d4YcM')
+ githubMode === 'project' ? tr('projects') : githubKind === 'prs' ? tr('prs') : tr('issues')
const activeProjectLabel = githubProjectTable
? githubProjectTable.project.title
: activeGitHubProject
? `${activeGitHubProject.owner} #${activeGitHubProject.number}`
- : t('m.inyDHB0')
+ : tr('chooseProject')
const selectedGitHubProjectViewUrl = githubProjectTable
? `${githubProjectTable.project.url}/views/${githubProjectTable.selectedView.number}`
: null
@@ -8647,14 +8558,14 @@ export default function MobileTasksScreen() {
})
const emptyLabel =
connState !== 'connected'
- ? t('m.Q9YN3Hk')
+ ? tr('connectHost')
: query
- ? t('m.OCkeuqU')
+ ? tr('noMatchingTasks')
: provider === 'github'
- ? t('m.haGU2eY')
+ ? tr('noGitHub')
: provider === 'gitlab'
- ? t('m.ifuEhog')
- : t('m.uGLg5VY')
+ ? tr('noGitLab')
+ : tr('noLinear')
const isGithubProjectSearch = provider === 'github' && githubMode === 'project'
return (
@@ -8666,7 +8577,7 @@ export default function MobileTasksScreen() {
- {t('m._TeSdI8')}
+ {tr('tasks')}
- {t('m.3fJQdKo', { value0: githubIssueSourceLabel })}
+ {tr('source', {
+ githubIssueSourceLabel: githubIssueSourceLabel
+ })}
) : null}
@@ -8844,7 +8757,9 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.F0yrwZ0', { value0: githubProjectSortLabel })}
+ {tr('sortGithub', {
+ githubProjectSortLabel: githubProjectSortLabel
+ })}
) : null}
@@ -8860,7 +8775,9 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.ntCXZ5E', { value0: githubProjectFieldsLabel })}
+ {tr('fieldsGithub', {
+ githubProjectFieldsLabel: githubProjectFieldsLabel
+ })}
) : null}
@@ -8874,7 +8791,7 @@ export default function MobileTasksScreen() {
{selectedGitHubProjectViewUrl ? (
{
@@ -8905,7 +8822,7 @@ export default function MobileTasksScreen() {
}}
>
- {gitlabView === 'project' ? t('m.fxhXe98') : t('m.uLI9QAU')}
+ {gitlabView === 'project' ? tr('projectMrs') : tr('myTodos')}
{gitlabView === 'project' && (
@@ -8988,7 +8905,9 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.rkPw0BI', { value0: linearGroupLabel })}
+ {tr('groupLinearGroup', {
+ linearGroupLabel: linearGroupLabel
+ })}
- {t('m.KPrnw08', { value0: linearOrderLabel })}
+ {tr('orderLinearOrder', {
+ linearOrderLabel: linearOrderLabel
+ })}
- {t('m.niMSGwc')}
+ {tr('display')}
>
)}
@@ -9033,7 +8954,9 @@ export default function MobileTasksScreen() {
>
- {t('m.F0yrwZ0', { value0: sortLabel })}
+ {tr('sortGithub', {
+ githubProjectSortLabel: sortLabel
+ })}
) : null}
@@ -9046,7 +8969,11 @@ export default function MobileTasksScreen() {
value={isGithubProjectSearch ? githubProjectSearch : query}
onChangeText={isGithubProjectSearch ? setGithubProjectSearch : setQuery}
placeholder={
- isGithubProjectSearch ? t('m.RzsrKAc') : t('m.7WH7i2M', { value0: providerLabel })
+ isGithubProjectSearch
+ ? tr('searchProject')
+ : tr('searchProvider', {
+ providerLabel: providerLabel
+ })
}
// Why: GitHub items seed the field with a preset query, so a bare
// value.length check would always show clear. Project mode shows clear
@@ -9134,7 +9061,9 @@ export default function MobileTasksScreen() {
style={styles.sourceNoticeBanner}
>
- {t('m.p08Gdhs', { value0: fallback.repoLabel })}
+ {tr('preferred', {
+ repoName: fallback.repoLabel
+ })}
))
@@ -9150,7 +9079,7 @@ export default function MobileTasksScreen() {
>
- {t('m.91ACsJY')}{' '}
+ {tr('couldNotLoadIssues')}{' '}
{sourceError.source.owner}/{sourceError.source.repo}
@@ -9162,16 +9091,16 @@ export default function MobileTasksScreen() {
void retryGitHubIssueSourceFetch(sourceError.repoPath)}
>
- {isRetrying ? t('m.aCzhUtY') : t('m.yF0bGcQ')}
+ {isRetrying ? tr('retrying') : tr('retry')}
@@ -9185,15 +9114,15 @@ export default function MobileTasksScreen() {
githubProjectTable?.parentFieldDropped === true ? (
- {t('m.KQkXL08')}
+ {tr('subIssueData')}
) : null}
{!tasksSupported ? (
tasksUnsupported ? (
- {t('m.iUDJtXI')}
- {t('m.J73iv2w')}
+ {tr('updateOrcaDesktop')}
+ {tr('mobile')}
) : (
@@ -9203,8 +9132,8 @@ export default function MobileTasksScreen() {
) : provider === 'linear' && !linearConnected ? (
- {t('m.L9oPTag')}
- {t('m.42DYBxM')}
+ {tr('connectYour')}
+ {tr('browseStart')}
- {t('m.IQp4SP8')}
+ {tr('connectLinear')}
) : provider === 'github' && githubMode === 'project' ? (
@@ -9228,7 +9157,7 @@ export default function MobileTasksScreen() {
) : !activeGitHubProject ? (
- {t('m.UqRLwDk')}
+ {tr('chooseGit')}
- {t('m.F7DoZNU')}
+ {tr('browseProjects')}
) : githubProjectError ? (
@@ -9252,7 +9181,7 @@ export default function MobileTasksScreen() {
) : !githubProjectTable || visibleGitHubProjectRows.length === 0 ? (
- {t('m.XHZQUAc')}
+ {tr('noProject')}
) : (
- {entry.group.label || t('m.Wg2C-lo')}
+ {entry.group.label || tr('items')}
{projectGroupMeta(entry.group)}
@@ -9329,10 +9258,10 @@ export default function MobileTasksScreen() {
/>
{row.itemType === 'PULL_REQUEST'
- ? t('m.Bawm-QY')
+ ? tr('pullRequestMessage')
: row.itemType === 'ISSUE'
- ? t('m.xcg6mvE')
- : t('m.NnYhRJs')}{' '}
+ ? tr('issue')
+ : tr('projectItem')}{' '}
· {row.content.repository ?? githubProjectTable.project.title}
{row.content.number ? ` #${row.content.number}` : ''}
@@ -9358,7 +9287,10 @@ export default function MobileTasksScreen() {
{githubProjectSummaryFields.length > 4 ? (
- {t('m.3-41cjc', { value0: githubProjectSummaryFields.length - 4 })}
+ {tr('plus', {
+ githubProjectSummaryFieldCount:
+ githubProjectSummaryFields.length - 4
+ })}
) : null}
@@ -9427,7 +9359,9 @@ export default function MobileTasksScreen() {
style={[styles.statusPillSelf, styles.linearStatePill]}
disabled={mutatingStatus}
accessibilityRole="button"
- accessibilityLabel={t('m.SlWRC8A', { value0: issue.state.name })}
+ accessibilityLabel={tr('changeStatusName', {
+ fromName: issue.state.name
+ })}
onPress={(event) => {
event.stopPropagation()
triggerMediumImpact()
@@ -9525,7 +9459,9 @@ export default function MobileTasksScreen() {
style={[styles.statusPill, styles.linearStatePill]}
disabled={mutatingStatus}
accessibilityRole="button"
- accessibilityLabel={t('m.SlWRC8A', { value0: issue.state.name })}
+ accessibilityLabel={tr('changeStatusName', {
+ fromName: issue.state.name
+ })}
onPress={(event) => {
event.stopPropagation()
triggerMediumImpact()
@@ -9575,7 +9511,7 @@ export default function MobileTasksScreen() {
{githubTotalCount === null
- ? t('m.7aV6RlU', { value0: githubCurrentPage + 1 })
- : t('m.7LorW8k', {
- value0: githubCurrentPage + 1,
- value1: githubTotalPages
+ ? tr('pagePage', {
+ pageNumber: githubCurrentPage + 1
+ })
+ : tr('pageGithub', {
+ githubCurrentPage: githubCurrentPage + 1,
+ githubTotalPages: githubTotalPages
})}
- {t('m.g8lrpKM', { value0: branchSummary.base })}
+ {tr('baseBranch', { baseBranch: branchSummary.base })}
) : null}
@@ -9775,7 +9715,7 @@ export default function MobileTasksScreen() {
{
@@ -9822,8 +9762,8 @@ export default function MobileTasksScreen() {
onClose={() => setShowRepoPicker(false)}
>
- {t('m.pMWEK5w')}
- {t('m.ec9l6fo')}
+ {tr('repositories')}
+ {tr('chooseWhichRepositories')}
@@ -9836,7 +9776,7 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.FohFTKc')}
+ {tr('allRepositories')}
{repositoryCount(hostedRepos.length)}
{selectedRepoIds.size === 0 ? : null}
@@ -9878,14 +9818,14 @@ export default function MobileTasksScreen() {
onClose={() => setShowGitHubIssueSourcePicker(false)}
>
- {t('m.aqrdcoU')}
- {t('m.LGWybvE')}
+ {tr('gitHubIssue')}
+ {tr('chooseWhether')}
{githubIssueSourceRows.length === 0 ? (
- {t('m.a5ldOMU')}
+ {tr('noAlternate')}
) : (
githubIssueSourceRows.map(({ repo, sources }, index) => {
@@ -9902,8 +9842,8 @@ export default function MobileTasksScreen() {
{repo.displayName}
- {t('m.2x3FfB8', {
- value0: issueSourceSlug(
+ {tr('querying', {
+ prs: issueSourceSlug(
selectedPreference === 'origin'
? sources.prs
: sources.upstreamCandidate
@@ -9934,7 +9874,7 @@ export default function MobileTasksScreen() {
selected && styles.issueSourceSegmentTextActive
]}
>
- {preference === 'upstream' ? t('m.CF9OlC4') : t('m.GbFyuJM')}
+ {preference === 'upstream' ? tr('upstream') : tr('origin')}
{slug}
@@ -9953,7 +9893,7 @@ export default function MobileTasksScreen() {
{
@@ -9981,7 +9921,7 @@ export default function MobileTasksScreen() {
{
@@ -10005,8 +9945,8 @@ export default function MobileTasksScreen() {
onClose={() => setShowGitHubPagePicker(false)}
>
- {t('m.Zpsg1Hk')}
- {t('m.K80V7xk')}
+ {tr('gitHubPages')}
+ {tr('jump')}
{githubPagePickerPages.map((index) => {
@@ -10023,9 +9963,11 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.T-_RK2o', { value0: index + 1 })}
+
+ {tr('pagePage', { pageNumber: index + 1 })}
+
- {loaded ? t('m.cR6luW0') : t('m.5kq0ekc')}
+ {loaded ? tr('loaded') : tr('loads')}
{selected ? : null}
@@ -10040,8 +9982,8 @@ export default function MobileTasksScreen() {
onClose={() => setShowGitHubProjectPicker(false)}
>
- {t('m.4pG_Id0')}
- {t('m.6e87BT8')}
+ {tr('gitHubProjects')}
+ {tr('chooseProjectViewTasks')}
@@ -10049,7 +9991,7 @@ export default function MobileTasksScreen() {
style={styles.input}
value={githubProjectPickerSearch}
onChangeText={setGithubProjectPickerSearch}
- placeholder={t('m.gBglOLc')}
+ placeholder={tr('searchProjects')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -10063,7 +10005,7 @@ export default function MobileTasksScreen() {
setGithubProjectPasteError('')
}}
onSubmitEditing={() => void resolveGitHubProjectFromInput()}
- placeholder={t('m.Qyb0AbI')}
+ placeholder={tr('addUrl')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -10074,7 +10016,7 @@ export default function MobileTasksScreen() {
onPress={() => void resolveGitHubProjectFromInput()}
>
- {githubProjectPasteBusy ? t('m.i7LVjnE') : t('m.25-g19E')}
+ {githubProjectPasteBusy ? tr('adding') : tr('add')}
@@ -10092,10 +10034,14 @@ export default function MobileTasksScreen() {
{githubProjectPartialFailures.length === 1 &&
githubProjectPartialFailures[0]!.owner !== '*'
- ? t('m.rTimB6Y', { value0: githubProjectPartialFailures[0]!.owner })
- : t('m.x8yvGR0', { value0: githubProjectPartialFailures.length })}
+ ? tr('couldNotLoadProjects', {
+ owner: githubProjectPartialFailures[0]!.owner
+ })
+ : tr('some', {
+ githubProjectPartialFailureCount: githubProjectPartialFailures.length
+ })}
- {t('m.9srv5vA')}
+ {tr('useAdd')}
{githubProjectPartialFailures
.map(
@@ -10120,20 +10066,22 @@ export default function MobileTasksScreen() {
style={styles.repoPickerRow}
onPress={() =>
void loadGitHubProjects().catch((err) => {
- setGithubProjectError(err instanceof Error ? err.message : t('m.wpUutIo'))
+ setGithubProjectError(
+ err instanceof Error ? err.message : tr('failedLoadProjects')
+ )
})
}
>
- {t('m.dbO6elU')}
- {t('m.0Dc-Ym0')}
+ {tr('noProjects')}
+ {tr('tap')}
) : (
<>
{pinnedGitHubProjects.length > 0 ? (
<>
- {t('m.Rn74bFA')}
+ {tr('pinned')}
{pinnedGitHubProjects.map((project, index) => {
const key = githubProjectKey(project)
const selected =
@@ -10168,7 +10116,7 @@ export default function MobileTasksScreen() {
})
}}
>
- {t('m.6WVhiZM')}
+ {tr('remove')}
{selected ? : null}
@@ -10180,7 +10128,7 @@ export default function MobileTasksScreen() {
{recentGitHubProjects.length > 0 ? (
<>
- {t('m.d2YMdrw')}
+ {tr('recent')}
{recentGitHubProjects.map((project, index) => {
const key = githubProjectKey(project)
const selected =
@@ -10221,7 +10169,7 @@ export default function MobileTasksScreen() {
})
}}
>
- {t('m.70mLMDk')}
+ {tr('pin')}
) : null}
{selected ? : null}
@@ -10233,11 +10181,11 @@ export default function MobileTasksScreen() {
) : null}
- {githubProjectLoading ? t('m.2BAkBs4') : t('m.yJYA52k')}
+ {githubProjectLoading ? tr('browseAllLoading') : tr('browseAll')}
{browseGitHubProjects.length === 0 ? (
- {githubProjectPickerSearch.trim() ? t('m.HH8i3aE') : t('m.RzP96Tg')}
+ {githubProjectPickerSearch.trim() ? tr('noMatchingProjects') : tr('noMore')}
) : (
browseGitHubProjects.map((project, index) => {
@@ -10275,13 +10223,13 @@ export default function MobileTasksScreen() {
{
const view = githubProjectViews.find((candidate) => candidate.id === viewId)
if (view && view.layout !== 'TABLE_LAYOUT') {
- setGithubProjectError(t('m.pTwUfTs'))
+ setGithubProjectError(tr('orcaDoes'))
return
}
if (pendingGitHubProjectViewSelection) {
@@ -10304,7 +10252,7 @@ export default function MobileTasksScreen() {
{
@@ -10330,12 +10278,12 @@ export default function MobileTasksScreen() {
onClose={() => setShowGitHubProjectFieldsPicker(false)}
>
- {t('m.kqKUAww')}
- {t('m.3YhoII8')}
+ {tr('projectFields')}
+ {tr('chooseWhichProject')}
{githubProjectAvailableSummaryFields.length === 0 ? (
- {t('m.nOtNSyE')}
+ {tr('viewHas')}
) : (
githubProjectAvailableSummaryFields.map((field, index) => {
const visible = !githubProjectHiddenFieldIds.has(field.id)
@@ -10351,7 +10299,7 @@ export default function MobileTasksScreen() {
{field.name}
- {visible ? t('m.p0Rtsu4') : t('m.EQxa0Qk')}
+ {visible ? tr('shown') : tr('hidden')}
{visible ? : null}
@@ -10365,7 +10313,7 @@ export default function MobileTasksScreen() {
{
@@ -10383,7 +10331,7 @@ export default function MobileTasksScreen() {
{
@@ -10406,7 +10354,7 @@ export default function MobileTasksScreen() {
{
@@ -10417,7 +10365,7 @@ export default function MobileTasksScreen() {
.sendRequest('linear.selectWorkspace', { workspaceId })
.then(() => loadLinearContext())
.catch((err) => {
- setError(err instanceof Error ? err.message : t('m.nLSftbc'))
+ setError(err instanceof Error ? err.message : tr('failedSwitch'))
})
}
}}
@@ -10429,8 +10377,8 @@ export default function MobileTasksScreen() {
onClose={() => setShowLinearTeamPicker(false)}
>
- {t('m.ZnNVwOs')}
- {t('m.UL55j-A')}
+ {tr('linearTeams')}
+ {tr('chooseWhichTeams')}
- {t('m.dEIGNBo')}
+ {tr('allTeams')}
- {t('m.AHMKHtc', { value0: linearTeams.length })}
+ {tr('teamCount', { teamCount: linearTeams.length })}
{selectedLinearTeamIds.size === linearTeams.length ? (
@@ -10495,19 +10443,19 @@ export default function MobileTasksScreen() {
zIndex={TASK_SECONDARY_DRAWER_Z_INDEX}
>
- {t('m.xw1L5lQ')}
+ {tr('changeStatus')}
- {linearStatusPickerItem?.source.identifier ?? t('m.kbZvL2g')}
+ {linearStatusPickerItem?.source.identifier ?? tr('linearIssue')}
{linearStatesLoading ? (
- {t('m._mQhK7g')}
+ {tr('loadingStates')}
) : linearStates.length === 0 ? (
- {t('m.GpSeJMA')}
+ {tr('noStates')}
) : (
linearStates.map((state, index) => {
const selected =
@@ -10553,7 +10501,7 @@ export default function MobileTasksScreen() {
setShowLinearDisplayPicker(false)}
>
- {t('m.Jhimi1k')}
+ {tr('displayProperties')}
{getLinearDisplayOptions().map((property, index) => {
@@ -10621,7 +10569,7 @@ export default function MobileTasksScreen() {
- {t('m.GRCIny0', { value0: providerLabel })}
+
+ {tr('newProvider', { providerLabel: providerLabel })}
+
- {provider === 'github' || provider === 'gitlab' ? t('m.V9yDSos') : t('m.ZXVz3A4')}
+ {provider === 'github' || provider === 'gitlab'
+ ? tr('createIssueSelectedRepository')
+ : tr('createIssueSelectedLinear')}
- {provider === 'github' || provider === 'gitlab' ? t('m.RBS8OI4') : t('m.czBdX7w')}
+ {provider === 'github' || provider === 'gitlab' ? tr('repository') : tr('team')}
- {t('m.3U3WMlI')}
+ {tr('issueSource')}
- {t('m.z7RLmIM', {
- value0:
+ {tr('fileIssue', {
+ issueSource:
selectedCreateIssuePreference === 'origin'
? issueSourceSlug(selectedCreateGitHubSources?.prs)
: issueSourceSlug(selectedCreateGitHubSources?.upstreamCandidate)
@@ -10718,7 +10670,7 @@ export default function MobileTasksScreen() {
selected && styles.issueSourceSegmentTextActive
]}
>
- {preference === 'upstream' ? t('m.CF9OlC4') : t('m.GbFyuJM')}
+ {preference === 'upstream' ? tr('upstream') : tr('origin')}
{slug}
@@ -10730,23 +10682,23 @@ export default function MobileTasksScreen() {
) : null}
- {t('m.6b2exyc')}
+ {tr('title')}
- {t('m.xX2Cp7c')}
+ {tr('description')}
) : (
- {t('m.wSJtlQc')}
+ {tr('createIssue')}
)}
@@ -10771,7 +10723,7 @@ export default function MobileTasksScreen() {
- {t('m.jbMHil8')}
+ {tr('connectLinearWorkspace')}
- {t('m.6EAEvD4')}
+ {tr('paste')}
- {t('m.a4vIye8')}
+ {tr('personal')}
void Linking.openURL('https://linear.app/settings/account/security')}
>
- {t('m.KV_5X9g')}
+ {tr('linearSettings')}
- {t('m.8aaa0oM')}
+ {tr('your')}
) : (
- {t('m.eDrVQno')}
+ {tr('connect')}
)}
@@ -10857,7 +10809,7 @@ export default function MobileTasksScreen() {
{
@@ -10878,7 +10830,7 @@ export default function MobileTasksScreen() {
{workspaceCreateDraft ? (
- {t('m.14O3-ys')}
+ {tr('createWorkspaceMessage')}
{workspaceCreateDraft.item.title}
@@ -10886,7 +10838,7 @@ export default function MobileTasksScreen() {
- {t('m.RBS8OI4')}
+ {tr('repository')}
- {workspaceCreateTargetRepo?.displayName ?? t('m.mDtuNkA')}
+ {workspaceCreateTargetRepo?.displayName ?? tr('selectRepository')}
{workspaceCreateCanPickRepo ? (
@@ -10922,7 +10874,7 @@ export default function MobileTasksScreen() {
{workspaceCreateTargetConnectionId ? (
- {t('m.hcl0Sms')}
+ {tr('ssh')}
- {workspaceCreateTargetRepo?.displayName ?? t('m.EmJ0ZpA')}
+ {workspaceCreateTargetRepo?.displayName ?? tr('remote')}
{workspaceSshStatusLabel(workspaceCreateSshStatus)}
@@ -10955,7 +10907,7 @@ export default function MobileTasksScreen() {
onPress={() => void connectWorkspaceSshRepo()}
>
- {workspaceCreateSshConnectInProgress ? t('m.HIci8AI') : t('m.eDrVQno')}
+ {workspaceCreateSshConnectInProgress ? tr('connecting') : tr('connect')}
)}
@@ -10969,8 +10921,8 @@ export default function MobileTasksScreen() {
- {t('m.nr-rmnA')}
- {t('m.5URSVzY')}
+ {tr('workspaceName')}
+ {tr('optional')}
- {t('m.wD7tyKU')}
+ {tr('agent')}
{workspaceCreateRequiresSshConnection
- ? t('m.SRP0mzk')
+ ? tr('connectRepositoryFirst')
: workspaceAgentDetectionPending
- ? t('m.phVPn2Q')
+ ? tr('detecting')
: workspaceAgentLabel(resolvedWorkspaceAgent)}
@@ -11010,7 +10962,7 @@ export default function MobileTasksScreen() {
style={styles.workspaceAdvancedToggle}
onPress={() => setShowWorkspaceAdvanced((current) => !current)}
>
- {t('m.8PDq1d4')}
+ {tr('advanced')}
{showWorkspaceAdvanced ? (
) : (
@@ -11020,7 +10972,7 @@ export default function MobileTasksScreen() {
{showWorkspaceAdvanced ? (
- {t('m.naggWL4')}
+ {tr('start')}
{
@@ -11030,13 +10982,15 @@ export default function MobileTasksScreen() {
>
- {workspaceBaseBranch?.refName ?? t('m.tJhJMIQ')}
+ {workspaceBaseBranch?.refName ?? tr('defaultBranch')}
{workspaceBaseBranch ? (
- {t('m.Cb83OoQ', { value0: workspaceBaseBranch.refName })}
+ {tr('createRef', {
+ refName: workspaceBaseBranch.refName
+ })}
) : null}
@@ -11045,7 +10999,9 @@ export default function MobileTasksScreen() {
{workspaceCreateTargetRepo ? null : (
- {workspaceCreateDraft.item.provider === 'linear' ? t('m.6kKiG2U') : t('m.4F__ZBY')}
+ {workspaceCreateDraft.item.provider === 'linear'
+ ? tr('addGitRepositoryBeforeCreatingLinear')
+ : tr('repositoryNotFound')}
)}
@@ -11090,10 +11046,10 @@ export default function MobileTasksScreen() {
) : (
{workspaceAgentDetectionPending
- ? t('m.phVPn2Q')
+ ? tr('detecting')
: workspaceCreateRequiresSshConnection
- ? t('m.SWOSFtY')
- : t('m.14O3-ys')}
+ ? tr('connectRepository')
+ : tr('createWorkspaceMessage')}
)}
@@ -11104,7 +11060,7 @@ export default function MobileTasksScreen() {
{
@@ -11119,7 +11075,7 @@ export default function MobileTasksScreen() {
{
@@ -11138,15 +11094,15 @@ export default function MobileTasksScreen() {
>
- {t('m.vqofDcI')}
- {t('m.O0AHKnE')}
+ {tr('startMessage')}
+ {tr('pick')}
- {t('m.tJhJMIQ')}
- {t('m.ajFYYlY')}
+ {tr('defaultBranch')}
+ {tr('useRepositorys')}
{workspaceBaseBranchLoading ? (
@@ -11174,7 +11130,7 @@ export default function MobileTasksScreen() {
) : workspaceBaseBranchError ? (
{workspaceBaseBranchError}
) : workspaceBaseBranchQuery.trim() && workspaceBaseBranchResults.length === 0 ? (
- {t('m.uwfc5JU')}
+ {tr('noBranches')}
) : null}
{workspaceBaseBranchResults.map((branch) => (
@@ -11196,7 +11152,9 @@ export default function MobileTasksScreen() {
{branch.localBranchName !== branch.refName ? (
- {t('m.Fg7BUfE', { value0: branch.localBranchName })}
+ {tr('branch', {
+ localBranchName: branch.localBranchName
+ })}
) : null}
@@ -11214,7 +11172,7 @@ export default function MobileTasksScreen() {
>
- {t('m.6xj6dHo')}
+ {tr('sparse')}
- {t('m.0fqNjoo')}
- {t('m.m38OFiM')}
+ {tr('full')}
+ {tr('useWhole')}
{workspaceSparsePresets.map((preset) => (
@@ -11262,7 +11220,9 @@ export default function MobileTasksScreen() {
startEditWorkspaceSparsePreset(preset)}
>
@@ -11281,7 +11241,7 @@ export default function MobileTasksScreen() {
disabled={!workspaceSparsePresetsLoaded || workspaceSparsePresetsLoading}
onPress={startNewWorkspaceSparsePreset}
>
- {t('m.6-gKCU8')}
+ {tr('newPreset')}
@@ -11299,19 +11259,19 @@ export default function MobileTasksScreen() {
- {workspaceSparseDraft.mode === 'new' ? t('m.m6fKanI') : t('m.al2hOTo')}
+ {workspaceSparseDraft.mode === 'new' ? tr('newSparse') : tr('editSparse')}
- {t('m.7dCN6Lk')}
+ {tr('name')}
setWorkspaceSparseDraft({ ...workspaceSparseDraft, name })
}
- placeholder={t('m.oh8k9MM')}
+ placeholder={tr('renderer')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -11319,14 +11279,14 @@ export default function MobileTasksScreen() {
/>
- {t('m.chkWwSI')}
+ {tr('directories')}
setWorkspaceSparseDraft({ ...workspaceSparseDraft, directoriesText })
}
- placeholder={t('m.g2mP3mE')}
+ placeholder={tr('src')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -11337,9 +11297,9 @@ export default function MobileTasksScreen() {
{workspaceSparseDraftError ??
(workspaceSparseDraftParsed?.directories.length === 1
- ? t('m.DvuAE90')
- : t('m.pjrxOkU', {
- value0: workspaceSparseDraftParsed?.directories.length ?? 0
+ ? tr('oneDirectory')
+ : tr('directory', {
+ directoryCount: workspaceSparseDraftParsed?.directories.length ?? 0
}))}
@@ -11349,7 +11309,7 @@ export default function MobileTasksScreen() {
disabled={workspaceSparseSaving}
onPress={() => setWorkspaceSparseDraft(null)}
>
- {t('m.Fv7ly30')}
+ {tr('cancel')}
) : null}
- {t('m.xxWLKS8')}
+ {tr('save')}
@@ -11377,9 +11337,11 @@ export default function MobileTasksScreen() {
{setupPrompt ? (
- {t('m.N0pQdfg')}
+ {tr('runSetupScript')}
- {t('m.Cx8BTNg', { value0: setupPrompt.repoName })}
+ {tr('repoNameRequires', {
+ repoName: setupPrompt.repoName
+ })}
@@ -11412,7 +11374,7 @@ export default function MobileTasksScreen() {
>
- {creatingKey === setupPrompt.item.key ? t('m.ftImAuc') : t('m.b0Ah5tg')}
+ {creatingKey === setupPrompt.item.key ? tr('creating') : tr('runSetupCreate')}
@@ -11434,7 +11396,7 @@ export default function MobileTasksScreen() {
}
>
- {t('m.xd1VuYs')}
+ {tr('skip')}
@@ -11451,16 +11413,20 @@ export default function MobileTasksScreen() {
{orcaYamlTrustPrompt.previouslyApproved
- ? t('m.QetdCKc', { value0: orcaYamlTrustPrompt.repoName })
- : t('m.M_Pqsow', { value0: orcaYamlTrustPrompt.repoName })}
+ ? tr('repoNameS', {
+ repoName: orcaYamlTrustPrompt.repoName
+ })
+ : tr('runSetupRepo', {
+ repoName: orcaYamlTrustPrompt.repoName
+ })}
- {t('m.Q3oUbk4')}
+ {tr('orcaYamlTrustWarning')}
- {orcaYamlTrustPrompt.previouslyApproved ? t('m.vtdIQWU') : t('m.XPutx64')}
+ {orcaYamlTrustPrompt.previouslyApproved ? tr('newSetup') : tr('setup')}
{orcaYamlTrustPrompt.scriptContent}
@@ -11492,13 +11458,13 @@ export default function MobileTasksScreen() {
orcaYamlTrustPrompt.contentHash
)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.520CKU4'))
+ setError(err instanceof Error ? err.message : tr('failedTrust'))
}
})()
}
>
- {t('m.m-fVevQ')}
+ {tr('runHooks')}
- {t('m.llz-FzM')}
+ {tr('always')}
- {t('m.eNyNmbU')}
+ {tr('do')}
@@ -11571,11 +11537,11 @@ export default function MobileTasksScreen() {
{projectRepoNotInOrca ? (
- {t('m.p3aCd2Y')}
+ {tr('repositoryNotOrca')}
- {t('m.-1cVb10', {
- value0: projectRepoNotInOrca.owner,
- value1: projectRepoNotInOrca.repo
+ {tr('owner', {
+ owner: projectRepoNotInOrca.owner,
+ repo: projectRepoNotInOrca.repo
})}
@@ -11591,7 +11557,7 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.jKf3DPI')}
+ {tr('openGitHub')}
) : null}
{projectRepoNotInOrca.url ? : null}
@@ -11608,8 +11574,8 @@ export default function MobileTasksScreen() {
{copiedLinkKey ===
`project-repo:${projectRepoNotInOrca.owner}/${projectRepoNotInOrca.repo}`
- ? t('m.xD9cVOU')
- : t('m.eGT8LNM')}
+ ? tr('copied')
+ : tr('copyRepository')}
@@ -11631,9 +11597,11 @@ export default function MobileTasksScreen() {
- {t('m.TLa90Qg', {
- value0: projectRowItem.content.repository ?? activeProjectLabel,
- value1: projectRowItem.content.number ? ` #${projectRowItem.content.number}` : ''
+ {tr('gitHubProject', {
+ repository: projectRowItem.content.repository ?? activeProjectLabel,
+ projectNumber: projectRowItem.content.number
+ ? ` #${projectRowItem.content.number}`
+ : ''
})}
@@ -11641,19 +11609,19 @@ export default function MobileTasksScreen() {
- {t('m.o2-QUvU')}
+ {tr('type')}
{projectRowItem.itemType === 'PULL_REQUEST'
- ? t('m.Bawm-QY')
+ ? tr('pullRequestMessage')
: projectRowItem.itemType === 'ISSUE'
- ? t('m.xcg6mvE')
+ ? tr('issue')
: projectRowItem.itemType === 'DRAFT_ISSUE'
- ? t('m.jGZods8')
- : t('m.NnYhRJs')}
+ ? tr('draftIssue')
+ : tr('projectItem')}
- {t('m.Fa6K7yI')}
+ {tr('status')}
{projectRowStatusLabel(projectRowItem)}
@@ -11680,20 +11648,20 @@ export default function MobileTasksScreen() {
{SHOW_MOBILE_PROJECT_METADATA_EDITORS && projectRowItem.itemType === 'ISSUE' ? (
- {t('m.1YuDgI8')}
+ {tr('issueType')}
- {projectRowItem.content.issueType?.name ?? t('m.I0vv7aw')}
+ {projectRowItem.content.issueType?.name ?? tr('noType')}
{projectIssueTypesLoading ? (
- {t('m.w23rmTc')}
+ {tr('loadingIssue')}
) : projectIssueTypesError ? (
{projectIssueTypesError}
) : projectIssueTypes.length === 0 ? (
- {t('m.5DEGuK4')}
+ {tr('noIssue')}
) : (
{projectIssueTypes.map((issueType) => {
@@ -11728,7 +11696,7 @@ export default function MobileTasksScreen() {
disabled={projectMutating}
onPress={() => void mutateProjectRowIssueType(projectRowItem, null)}
>
- {t('m.3p4QMPc')}
+ {tr('clearType')}
) : null}
@@ -11738,7 +11706,7 @@ export default function MobileTasksScreen() {
{SHOW_MOBILE_PROJECT_METADATA_EDITORS &&
editableProjectFields(githubProjectTable).length > 0 ? (
- {t('m.JV1Xsds')}
+ {tr('projectFieldsMessage')}
{editableProjectFields(githubProjectTable).map((field) => {
const currentLabel = projectFieldValueLabel(projectRowItem, field)
const draftValue = projectFieldDrafts[field.id] ?? ''
@@ -11746,7 +11714,7 @@ export default function MobileTasksScreen() {
if (field.dataType === 'NUMBER') {
const number = Number(draftValue)
if (!Number.isFinite(number)) {
- setProjectRowDetailError(t('m.DqtxPEI'))
+ setProjectRowDetailError(tr('enterValid'))
return
}
void mutateProjectRowField(projectRowItem, field, {
@@ -11758,7 +11726,7 @@ export default function MobileTasksScreen() {
if (field.dataType === 'DATE') {
const date = draftValue.trim()
if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) {
- setProjectRowDetailError(t('m.6tQv41I'))
+ setProjectRowDetailError(tr('enterDate'))
return
}
void mutateProjectRowField(projectRowItem, field, { kind: 'date', date })
@@ -11813,7 +11781,7 @@ export default function MobileTasksScreen() {
) : field.dataType === 'ITERATION' && field.kind === 'iteration' ? (
{field.iterations.length === 0 ? (
- {t('m.CXQp8Pw')}
+ {tr('noIterations')}
) : (
field.iterations.map((iteration) => {
const fieldValue = projectRowItem.fieldValuesByFieldId?.[field.id]
@@ -11836,12 +11804,12 @@ export default function MobileTasksScreen() {
{iteration.title}
- {t('m.sNIGIT0', {
- value0: iteration.completed
- ? t('m.HauqL5Y')
- : t('m.qcFeMQM'),
- value1: iteration.startDate,
- value2: iteration.duration
+ {tr('iterationStatus', {
+ iterationStatus: iteration.completed
+ ? tr('completed')
+ : tr('current'),
+ startDate: iteration.startDate,
+ durationDays: iteration.duration
})}
@@ -11866,10 +11834,10 @@ export default function MobileTasksScreen() {
}
placeholder={
field.dataType === 'DATE'
- ? t('m.KulyzJY')
+ ? tr('yyyy')
: field.dataType === 'NUMBER'
- ? t('m.1jNZjFQ')
- : t('m.5gzka0E')
+ ? tr('number')
+ : tr('text')
}
placeholderTextColor={colors.textMuted}
keyboardType={field.dataType === 'NUMBER' ? 'numeric' : 'default'}
@@ -11880,7 +11848,7 @@ export default function MobileTasksScreen() {
disabled={projectMutating}
onPress={saveTextField}
>
- {t('m.akD0kZQ')}
+ {tr('saveField')}
>
)}
@@ -11891,7 +11859,7 @@ export default function MobileTasksScreen() {
}
onPress={() => void mutateProjectRowField(projectRowItem, field, null)}
>
- {t('m.GKSPk20')}
+ {tr('clearField')}
)
@@ -11901,23 +11869,23 @@ export default function MobileTasksScreen() {
{SHOW_MOBILE_PROJECT_METADATA_EDITORS && projectRowType(projectRowItem) ? (
- {t('m.GhHLbBA')}
+ {tr('labels')}
{(projectRowDetail?.provider === 'github'
? projectRowDetail.labels
: projectRowItem.content.labels.map((label) => label.name)
- ).length || t('m.pzBhZI4')}
+ ).length || tr('none')}
{projectLabelsLoading ? (
- {t('m.vYfgNJ8')}
+ {tr('loadingLabels')}
) : projectLabelsError ? (
{projectLabelsError}
) : projectAvailableLabels.length === 0 ? (
- {t('m.ySDu5JQ')}
+ {tr('noLabels')}
) : (
{[
@@ -11962,23 +11930,23 @@ export default function MobileTasksScreen() {
{SHOW_MOBILE_PROJECT_METADATA_EDITORS && projectRowType(projectRowItem) ? (
- {t('m.oL0nsd4')}
+ {tr('assignees')}
{(projectRowDetail?.provider === 'github'
? projectRowDetail.assignees
: projectRowItem.content.assignees.map((assignee) => assignee.login)
- ).length || t('m.pzBhZI4')}
+ ).length || tr('none')}
{projectAssignableUsersLoading ? (
- {t('m.gX4WIW4')}
+ {tr('loadingAssignees')}
) : projectAssignableUsersError ? (
{projectAssignableUsersError}
) : projectAssignableUsers.length === 0 ? (
- {t('m.--H0boQ')}
+ {tr('noAssignable')}
) : (
{[
@@ -12040,12 +12008,12 @@ export default function MobileTasksScreen() {
{SHOW_MOBILE_PROJECT_METADATA_EDITORS && projectRowType(projectRowItem) ? (
<>
- {t('m.6b2exyc')}
+ {tr('title')}
- {t('m.OOzqk6Q')}
+ {tr('saveTitle')}
- {t('m.xX2Cp7c')}
+ {tr('description')}
- {t('m.bmXEQhk')}
+ {tr('saveDescription')}
-
+
>
) : (
<>
- {t('m.6b2exyc')}
+ {tr('title')}
{projectRowItem.content.title}
- {t('m.xX2Cp7c')}
-
+ {tr('description')}
+
>
)}
@@ -12113,13 +12081,13 @@ export default function MobileTasksScreen() {
<>
- {t('m.hDVISbQ')}
+ {tr('reviewers')}
{getGitHubReviewSummary(projectRowDetail)}
{getGitHubReviewerRows(projectRowDetail).length === 0 ? (
- {t('m.ifA4snA')}
+ {tr('noReviewersRequested')}
) : (
getGitHubReviewerRows(projectRowDetail).map((reviewer) => (
@@ -12145,12 +12113,12 @@ export default function MobileTasksScreen() {
{projectAssignableUsersLoading ? (
- {t('m.Re-pmxo')}
+ {tr('loadingReviewers')}
) : projectAssignableUsersError ? (
{projectAssignableUsersError}
) : projectReviewerCandidates.length === 0 ? (
- {t('m.k2ppyKs')}
+ {tr('noReviewer')}
) : (
{projectReviewerCandidates.map((user) => {
@@ -12184,7 +12152,7 @@ export default function MobileTasksScreen() {
style={styles.input}
value={projectReviewersDraft}
onChangeText={setProjectReviewersDraft}
- placeholder={t('m.WTd49qc')}
+ placeholder={tr('requestReviewers')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -12195,21 +12163,21 @@ export default function MobileTasksScreen() {
}
onPress={() => void requestProjectGitHubReviewers(projectRowItem)}
>
- {t('m.KoPjVCY')}
+ {tr('requestReview')}
{projectRowType(projectRowItem) === 'pr' ? (
- {t('m.XlbT3Zg')}
+ {tr('checks')}
void refreshProjectGitHubChecks(projectRowItem)}
>
- {t('m.ruk6BoQ')}
+ {tr('refresh')}
void rerunProjectGitHubChecks(projectRowItem, true)}
>
- {t('m.jphAkJQ')}
+ {tr('rerunFailed')}
void rerunProjectGitHubChecks(projectRowItem, false)}
>
- {t('m.Hhu9oHM')}
+ {tr('rerunAll')}
{projectRowDetail.checks.length === 0 ? (
- {t('m.Ct4OwyY')}
+ {tr('noChecks')}
) : (
projectRowDetail.checks.map((check) => (
0 ? (
- {t('m.WhM0uCg')}
+ {tr('changed')}
{projectRowDetail.files.map((file) => (
- {expandedPrFilePath === file.path
- ? t('m._Qr_OQY')
- : t('m.PYs8iJY')}
+ {expandedPrFilePath === file.path ? tr('hide') : tr('view')}
{file.viewerViewedState === 'VIEWED'
- ? t('m.11IaYcI')
- : t('m.DtNbEWc')}
+ ? tr('markUnviewed')
+ : tr('markViewed')}
{expandedPrFilePath === file.path ? (
@@ -12300,7 +12266,7 @@ export default function MobileTasksScreen() {
) : prFileContents[file.path]?.originalIsBinary ||
prFileContents[file.path]?.modifiedIsBinary ? (
- {t('m.jh3_4KI')}
+ {tr('binary')}
) : prFileContents[file.path] ? (
) : (
- {t('m.XLoI3kU')}
+ {tr('fileContents')}
)}
) : null}
@@ -12335,13 +12301,13 @@ export default function MobileTasksScreen() {
{projectRowDetail?.provider === 'github' ? (
- {t('m.AXmMT_g')}
+ {tr('discussion')}
{discussionSummary(projectRowDetail.comments.length)}
{projectRowDetail.comments.length === 0 ? (
- {t('m.D7U7kB4')}
+ {tr('noComments')}
) : (
projectDetailCommentGroups.map((group) => {
const groupId = detailCommentGroupId(group)
@@ -12364,12 +12330,19 @@ export default function MobileTasksScreen() {
}
>
- {t(group.kind === 'thread' ? 'm.kYCT6qM' : 'm.ahIRbHk', {
- value0: commentAuthor(root)
- })}
+ {tr(
+ group.kind === 'thread' ? 'resolvedThread' : 'resolvedComment',
+ {
+ commentAuthor: commentAuthor(root)
+ }
+ )}
- {count > 1 ? t('m.M2j9mpc', { value0: count }) : t('m.z1fMPAI')}
+ {count > 1
+ ? tr('discussionComment', {
+ commentCount: count
+ })
+ : tr('show')}
)
@@ -12407,7 +12380,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.commentInput]}
value={projectEditingCommentDraft}
onChangeText={setProjectEditingCommentDraft}
- placeholder={t('m.loMCIgM')}
+ placeholder={tr('editComment')}
placeholderTextColor={colors.textMuted}
multiline
textAlignVertical="top"
@@ -12423,7 +12396,7 @@ export default function MobileTasksScreen() {
void updateProjectRowComment(projectRowItem, comment)
}
>
- {t('m.xxWLKS8')}
+ {tr('save')}
- {t('m.Fv7ly30')}
+ {tr('cancel')}
>
@@ -12456,7 +12429,9 @@ export default function MobileTasksScreen() {
}
>
- {comment.isResolved ? t('m.qEc1OYo') : t('m.Rjjl1iA')}
+ {comment.isResolved
+ ? tr('reopenThread')
+ : tr('resolve')}
) : null}
@@ -12469,7 +12444,7 @@ export default function MobileTasksScreen() {
[commentId]: next
}))
}
- placeholder={t('m.2MyR_iQ')}
+ placeholder={tr('reply')}
placeholderTextColor={colors.textMuted}
multiline
textAlignVertical="top"
@@ -12487,9 +12462,7 @@ export default function MobileTasksScreen() {
)
}
>
-
- {t('m.2MyR_iQ')}
-
+ {tr('reply')}
-
- {t('m.BhSglbo')}
-
+ {tr('edit')}
- {t('m.MVHK0qg')}
+ {tr('delete')}
@@ -12556,10 +12527,10 @@ export default function MobileTasksScreen() {
onPress={() => void createWorkspaceFromProjectRow(projectRowItem)}
>
- {t('m.14O3-ys')}
+ {tr('createWorkspaceMessage')}
) : (
- {t('m.fngWtc4')}
+ {tr('workspaces')}
)}
{projectRowItem.content.url ? (
@@ -12576,7 +12547,7 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.jKf3DPI')}
+ {tr('openGitHub')}
{copiedLinkKey === `github-project:${projectRowItem.id}`
- ? t('m.xD9cVOU')
- : t('m.vW7-nd4')}
+ ? tr('copied')
+ : tr('copyGit')}
>
@@ -12631,7 +12602,9 @@ export default function MobileTasksScreen() {
)}
- {projectRowItem.content.state === 'CLOSED' ? t('m.vegmy2w') : t('m.9bffkjg')}
+ {projectRowItem.content.state === 'CLOSED'
+ ? tr('reopenItem')
+ : tr('closeItem')}
>
@@ -12647,10 +12620,10 @@ export default function MobileTasksScreen() {
onPress={() => setMergeMethodProjectRow(projectRowItem)}
>
- {t('m.MPMGVuk')}
+ {tr('mergePullRequest')}
{!projectRowHostedRepo ? (
- {t('m.bS5_420')}
+ {tr('mergeRequires')}
) : null}
>
) : null}
@@ -12675,7 +12648,7 @@ export default function MobileTasksScreen() {
setDetailRefreshSeq((current) => current + 1)}
>
- {t('m.o2-QUvU')}
+ {tr('type')}
{taskKindLabel(actionItem)}
- {t('m.Fa6K7yI')}
+ {tr('status')}
{actionItem.status}
{detailPayload.provider === 'linear' && detailPayload.assignee ? (
- {t('m.b3RSkG0')}
+ {tr('assignee')}
{detailPayload.assignee}
) : null}
{detailPayload.provider === 'linear' && detailPayload.project ? (
- {t('m.iM5LG78')}
+ {tr('project')}
{detailPayload.project.name}
) : null}
{(detailPayload.provider === 'github' || detailPayload.provider === 'gitlab') &&
detailPayload.assignees.length > 0 ? (
- {t('m.oL0nsd4')}
+ {tr('assignees')}
{detailPayload.assignees.join(', ')}
@@ -12741,7 +12714,7 @@ export default function MobileTasksScreen() {
) : null}
- {t('m.xX2Cp7c')}
+ {tr('description')}
{SHOW_MOBILE_DETAIL_METADATA_EDITORS &&
((actionItem.provider === 'github' &&
detailPayload.provider === 'github' &&
@@ -12755,7 +12728,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.bodyInput]}
value={itemBodyDraft}
onChangeText={setItemBodyDraft}
- placeholder={t('m.xX2Cp7c')}
+ placeholder={tr('description')}
placeholderTextColor={colors.textMuted}
multiline
textAlignVertical="top"
@@ -12793,9 +12766,9 @@ export default function MobileTasksScreen() {
}
}}
>
- {t('m.bmXEQhk')}
+ {tr('saveDescription')}
-
+
>
) : (
)}
@@ -12818,12 +12791,12 @@ export default function MobileTasksScreen() {
detailPayload.provider === 'gitlab')) ? (
<>
- {t('m.6b2exyc')}
+ {tr('title')}
- {t('m.OOzqk6Q')}
+ {tr('saveTitle')}
- {t('m.GhHLbBA')}
+ {tr('labels')}
- {detailPayload.labels.length || t('m.pzBhZI4')}
+ {detailPayload.labels.length || tr('none')}
{actionItem.provider === 'github' ? (
itemLabelsLoading ? (
- {t('m.vYfgNJ8')}
+ {tr('loadingLabels')}
) : itemLabelsError ? (
{itemLabelsError}
) : itemAvailableLabels.length === 0 ? (
- {t('m.ySDu5JQ')}
+ {tr('noLabels')}
) : (
{[...new Set([...itemAvailableLabels, ...detailPayload.labels])].map(
@@ -12917,7 +12890,7 @@ export default function MobileTasksScreen() {
style={styles.input}
value={itemAddLabelsDraft}
onChangeText={setItemAddLabelsDraft}
- placeholder={t('m.ByJ_aqM')}
+ placeholder={tr('addLabels')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -12925,7 +12898,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.stackedInput]}
value={itemRemoveLabelsDraft}
onChangeText={setItemRemoveLabelsDraft}
- placeholder={t('m.gyu0Q6w')}
+ placeholder={tr('removeLabels')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -12943,7 +12916,7 @@ export default function MobileTasksScreen() {
})
}
>
- {t('m.K9OxCfg')}
+ {tr('updateLabels')}
>
)}
@@ -12951,21 +12924,21 @@ export default function MobileTasksScreen() {
- {t('m.oL0nsd4')}
+ {tr('assignees')}
- {detailPayload.assignees.length || t('m.pzBhZI4')}
+ {detailPayload.assignees.length || tr('none')}
{actionItem.provider === 'github' ? (
itemAssignableUsersLoading ? (
- {t('m.gX4WIW4')}
+ {tr('loadingAssignees')}
) : itemAssignableUsersError ? (
{itemAssignableUsersError}
) : itemAssignableUsers.length === 0 ? (
- {t('m.--H0boQ')}
+ {tr('noAssignable')}
) : (
{[
@@ -13015,7 +12988,7 @@ export default function MobileTasksScreen() {
style={styles.input}
value={itemAddAssigneesDraft}
onChangeText={setItemAddAssigneesDraft}
- placeholder={t('m.K9otrEQ')}
+ placeholder={tr('addUsernames')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -13023,7 +12996,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.stackedInput]}
value={itemRemoveAssigneesDraft}
onChangeText={setItemRemoveAssigneesDraft}
- placeholder={t('m.X_A_K1Q')}
+ placeholder={tr('removeUsernames')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -13041,7 +13014,7 @@ export default function MobileTasksScreen() {
})
}
>
- {t('m.FQRH8fY')}
+ {tr('updateAssignees')}
>
) : null}
@@ -13054,7 +13027,7 @@ export default function MobileTasksScreen() {
actionItem.source.type === 'pr' ? (
- {t('m.hDVISbQ')}
+ {tr('reviewers')}
{detailPayload.provider === 'github' ? (
{getGitHubReviewSummary(detailPayload)}
@@ -13063,7 +13036,7 @@ export default function MobileTasksScreen() {
{detailPayload.provider === 'github' ? (
getGitHubReviewerRows(detailPayload).length === 0 ? (
- {t('m.ifA4snA')}
+ {tr('noReviewersRequested')}
) : (
getGitHubReviewerRows(detailPayload).map((reviewer) => (
@@ -13090,12 +13063,12 @@ export default function MobileTasksScreen() {
{itemAssignableUsersLoading ? (
- {t('m.Re-pmxo')}
+ {tr('loadingReviewers')}
) : itemAssignableUsersError ? (
{itemAssignableUsersError}
) : itemReviewerCandidates.length === 0 ? (
- {t('m.k2ppyKs')}
+ {tr('noReviewer')}
) : (
{itemReviewerCandidates.map((user) => {
@@ -13127,7 +13100,7 @@ export default function MobileTasksScreen() {
style={styles.input}
value={itemReviewersDraft}
onChangeText={setItemReviewersDraft}
- placeholder={t('m.WTd49qc')}
+ placeholder={tr('requestReviewers')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
/>
@@ -13138,7 +13111,7 @@ export default function MobileTasksScreen() {
}
onPress={() => void requestGitHubReviewers(actionItem)}
>
- {t('m.KoPjVCY')}
+ {tr('requestReview')}
) : null}
@@ -13149,14 +13122,14 @@ export default function MobileTasksScreen() {
actionItem.source.type === 'pr' ? (
- {t('m.XlbT3Zg')}
+ {tr('checks')}
void refreshGitHubChecks(actionItem)}
>
- {t('m.ruk6BoQ')}
+ {tr('refresh')}
void rerunGitHubChecks(actionItem, true)}
>
- {t('m.jphAkJQ')}
+ {tr('rerunFailed')}
void rerunGitHubChecks(actionItem, false)}
>
- {t('m.Hhu9oHM')}
+ {tr('rerunAll')}
{detailPayload.checks.length === 0 ? (
- {t('m.Ct4OwyY')}
+ {tr('noChecks')}
) : (
detailPayload.checks.map((check) => (
0 ? (
- {t('m.WhM0uCg')}
+ {tr('changed')}
{detailPayload.files.map((file) =>
actionItem.provider === 'github' && actionItem.source.type === 'pr' ? (
@@ -13223,7 +13196,7 @@ export default function MobileTasksScreen() {
: ''}
- {expandedPrFilePath === file.path ? t('m._Qr_OQY') : t('m.PYs8iJY')}
+ {expandedPrFilePath === file.path ? tr('hide') : tr('view')}
{file.viewerViewedState === 'VIEWED'
- ? t('m.11IaYcI')
- : t('m.DtNbEWc')}
+ ? tr('markUnviewed')
+ : tr('markViewed')}
{expandedPrFilePath === file.path ? (
@@ -13243,7 +13216,7 @@ export default function MobileTasksScreen() {
) : prFileContents[file.path]?.originalIsBinary ||
prFileContents[file.path]?.modifiedIsBinary ? (
- {t('m.jh3_4KI')}
+ {tr('binary')}
) : prFileContents[file.path] ? (
) : (
- {t('m.XLoI3kU')}
+ {tr('fileContents')}
)}
) : null}
@@ -13285,15 +13258,17 @@ export default function MobileTasksScreen() {
actionItem.source.type === 'mr' ? (
- {t('m.iaudYyQ')}
+ {tr('pipeline')}
{detailPayload.pipelineJobs.length
- ? t('m.re5Bmac', { value0: detailPayload.pipelineJobs.length })
- : t('m.pzBhZI4')}
+ ? tr('pipelineJob', {
+ pipelineJobCount: detailPayload.pipelineJobs.length
+ })
+ : tr('none')}
{detailPayload.pipelineJobs.length === 0 ? (
- {t('m.-uupizo')}
+ {tr('noPipeline')}
) : (
detailPayload.pipelineJobs.map((job) => {
const duration = formatDurationSeconds(job.duration)
@@ -13336,13 +13311,13 @@ export default function MobileTasksScreen() {
actionItem.provider === 'linear' ? (
- {t('m.yIapPk8')}
+ {tr('subIssues')}
- {detailPayload.children.length || t('m.pzBhZI4')}
+ {detailPayload.children.length || tr('none')}
{detailPayload.children.length === 0 ? (
- {t('m.8MKn4Lk')}
+ {tr('noSub')}
) : (
detailPayload.children.map((child) => (
{child.identifier} · {child.title}
- {t('m.czxJ7iQ')}
+ {tr('open')}
))
)}
@@ -13364,7 +13339,7 @@ export default function MobileTasksScreen() {
style={[styles.input, styles.stackedInput]}
value={linearSubIssueTitle}
onChangeText={setLinearSubIssueTitle}
- placeholder={t('m.G6AAKyI')}
+ placeholder={tr('subIssueTitle')}
placeholderTextColor={colors.textMuted}
/>
void createLinearSubIssue(actionItem)}
>
- {t('m.z1ts1Vw')}
+ {tr('addSub')}
) : null}
- {t('m.AXmMT_g')}
+ {tr('discussion')}
{discussionSummary(detailPayload.comments.length)}
{detailPayload.comments.length === 0 ? (
- {t('m.D7U7kB4')}
+ {tr('noComments')}
) : (
detailCommentGroups.map(renderDetailCommentGroup)
)}
@@ -13425,7 +13400,7 @@ export default function MobileTasksScreen() {
>
- {creatingKey === actionItem.key ? t('m.ftImAuc') : t('m.14O3-ys')}
+ {creatingKey === actionItem.key ? tr('creating') : tr('createWorkspaceMessage')}
@@ -13453,8 +13428,8 @@ export default function MobileTasksScreen() {
{copiedLinkKey === `linear-url:${actionItem.key}`
- ? t('m.xD9cVOU')
- : t('m.tS4SSLM')}
+ ? tr('copied')
+ : tr('copyLinear')}
>
@@ -13471,7 +13446,7 @@ export default function MobileTasksScreen() {
>
- {copiedLinkKey === `task:${actionItem.key}` ? t('m.xD9cVOU') : t('m.vW7-nd4')}
+ {copiedLinkKey === `task:${actionItem.key}` ? tr('copied') : tr('copyGit')}
>
@@ -13517,10 +13492,10 @@ export default function MobileTasksScreen() {
}
>
- {t('m.MPMGVuk')}
+ {tr('mergePullRequest')}
{isGitHubPrMergeBlocked(actionItem) ? (
- {t('m.QnAsBMo')}
+ {tr('gitHubReportsMergeConflicts')}
) : null}
>
) : null}
@@ -13567,7 +13542,7 @@ export default function MobileTasksScreen() {
}
>
- {t('m.Fc7HS-c')}
+ {tr('mergeMerge')}
>
) : null}
@@ -13585,7 +13560,7 @@ export default function MobileTasksScreen() {
}}
>
- {t('m.ZDweAzI')}
+ {tr('changeStatusMessage')}
>
) : null}
@@ -13596,8 +13571,8 @@ export default function MobileTasksScreen() {
({
@@ -13613,8 +13588,10 @@ export default function MobileTasksScreen() {
/>
({
label:
mergeMethodTaskItem.provider === 'gitlab' && method === 'merge'
- ? t('m.AXgAxVM')
+ ? tr('merge')
: getHostedReviewMergeMethodLabel(method),
icon: GitBranch,
onPress: () => {
@@ -13637,12 +13614,16 @@ export default function MobileTasksScreen() {
/>
{
if (!taskUiReady || !pendingHostedMerge) {
@@ -13654,7 +13635,7 @@ export default function MobileTasksScreen() {
/>
{
if (!taskUiReady || !pendingProjectGitHubMerge) {
@@ -13681,7 +13662,7 @@ export default function MobileTasksScreen() {
title={
pendingHostedStateChange
? getHostedStateConfirmTitle(pendingHostedStateChange)
- : t('m.ZhTpuGQ')
+ : tr('updateItem')
}
message={
pendingHostedStateChange
@@ -13691,7 +13672,7 @@ export default function MobileTasksScreen() {
confirmLabel={
pendingHostedStateChange
? getHostedStateConfirmLabel(pendingHostedStateChange)
- : t('m.y2BBXrA')
+ : tr('confirm')
}
destructive={pendingHostedStateChange?.nextState === 'closed'}
onConfirm={() => {
diff --git a/mobile/app/h/_layout.tsx b/mobile/app/h/_layout.tsx
index aa932ea3c09..89a41a535b6 100644
--- a/mobile/app/h/_layout.tsx
+++ b/mobile/app/h/_layout.tsx
@@ -40,21 +40,24 @@ function HostStack({ animation }: { animation: 'none' | 'default' }) {
animation
}}
>
-
-
-
-
-
+
+
+
+
+
-
-
+
+
)
}
diff --git a/mobile/app/index.tsx b/mobile/app/index.tsx
index d148f0875e3..59749a5aeb3 100644
--- a/mobile/app/index.tsx
+++ b/mobile/app/index.tsx
@@ -105,9 +105,9 @@ type HomeLinearStatus = {
function taskProviderLabel(provider: TaskProvider): string {
return {
- github: t('m.TH4OaOM'),
- gitlab: t('m.fvIr9H8'),
- linear: t('m.kZGbeC4')
+ github: t('home.gitHub'),
+ gitlab: t('home.gitLab'),
+ linear: t('home.linear')
}[provider]
}
@@ -626,11 +626,11 @@ export default function HomeScreen() {
- {t('m.y7w0hIs')}
+ {t('home.tasks')}
{primaryTaskProviders.length > 0
? primaryTaskProviders.map(taskProviderLabel).join(' · ')
- : t('m.1_sz9cs')}
+ : t('home.no')}
@@ -642,7 +642,9 @@ export default function HomeScreen() {
[
styles.taskHomeProviderButton,
@@ -674,7 +676,7 @@ export default function HomeScreen() {
} catch {
// Why: ConfirmModal closes on confirm; re-open for retry so the failure isn't silent.
setConfirmRemove(hostToRemove)
- Alert.alert(t('m.U7WlIpo'), t('m.GLgoz1s'))
+ Alert.alert(t('home.could'), t('home.please'))
}
}
@@ -686,7 +688,7 @@ export default function HomeScreen() {
- {t('m.VjaDNq0')}
+ {t('home.orca')}
[styles.iconButton, pressed && styles.iconButtonPressed]}
@@ -706,16 +708,16 @@ export default function HomeScreen() {
]}
>
- {t('m.8vieqXE')}
- {t('m.QT_H7rk')}
+ {t('home.connectYour')}
+ {t('home.pairingDescription')}
router.push('/pair-scan')}>
- {t('m.lWqrsbM')}
+ {t('home.pair')}
- {t('m.9HldFAc')}
+ {t('home.how')}
{getOnboardingSteps().map((step, i) => (
0 && styles.stepRowBorder]}>
@@ -743,7 +745,7 @@ export default function HomeScreen() {
ListHeaderComponent={
- {t('m.9i5ZhFo')}
+ {t('home.welcome')}
{stats && (
@@ -752,20 +754,20 @@ export default function HomeScreen() {
{stats.totalAgentsSpawned.toLocaleString()}
- {t('m.qFFbXcQ')}
+ {t('home.agents')}
{formatDuration(stats.totalAgentTimeMs)}
- {t('m.4uJ9yUY')}
+ {t('home.agent')}
{stats.totalPRsCreated.toLocaleString()}
- {t('m.TPknwrs')}
+ {t('home.prs')}
)}
- {t('m.81Qrbno')}
+ {t('home.desktops')}
}
ItemSeparatorComponent={CardGap}
@@ -803,7 +805,7 @@ export default function HomeScreen() {
{resumeWorktree ? (
<>
- {t('m.ROZQW2U')}
+ {t('home.resume')}
[styles.resumeCard, pressed && styles.hostCardPressed]}
@@ -841,14 +843,14 @@ export default function HomeScreen() {
- {t('m.y7w0hIs')}
+ {t('home.tasks')}
{renderTaskHomeCard()}
>
) : (
<>
- {t('m.y7w0hIs')}
+ {t('home.tasks')}
{renderTaskHomeCard()}
>
@@ -856,7 +858,7 @@ export default function HomeScreen() {
{/* ─── Quick actions ─── */}
- {t('m.1St5QBU')}
+ {t('home.quick')}
- {t('m.lWqrsbM')}
+ {t('home.pair')}
- {t('m.8CNCPA8')}
+ {t('home.new')}
@@ -896,7 +898,7 @@ export default function HomeScreen() {
{accountsHosts.length > 0 ? (
<>
- {t('m.VXpHvL4')}
+ {t('home.account')}
{accountsHosts.map(({ host, snapshot }) => {
const claudeActiveId = snapshot.claude.activeAccountId
@@ -944,17 +946,17 @@ export default function HomeScreen() {
- {active?.email ?? t('m.IOLibYw')}
+ {active?.email ?? t('home.system')}
setActionTarget(null),
onReconnect: (hostId) => void forceReconnectHost(hostId),
@@ -1003,9 +1005,11 @@ export default function HomeScreen() {
void handleRemove()}
onCancel={() => setConfirmRemove(null)}
@@ -1020,9 +1024,18 @@ function CardGap() {
function getOnboardingSteps() {
return [
- { title: t('m.N1Ra8Og'), desc: t('m.aCJTiqw') },
- { title: t('m.bKwbnYs'), desc: t('m.-SigWBo') },
- { title: t('m.rqAbU9s'), desc: t('m.td40qOY') }
+ {
+ title: t('home.openOrca'),
+ desc: t('home.go')
+ },
+ {
+ title: t('home.scan'),
+ desc: t('home.tap')
+ },
+ {
+ title: t('home.youre'),
+ desc: t('home.your')
+ }
]
}
diff --git a/mobile/app/mobile-onboarding.tsx b/mobile/app/mobile-onboarding.tsx
index a4d98660e8d..365ac79b350 100644
--- a/mobile/app/mobile-onboarding.tsx
+++ b/mobile/app/mobile-onboarding.tsx
@@ -110,7 +110,7 @@ function MobileOnboardingFlow({
await saveDefaultSessionView(view)
advanceOrContinue()
} catch {
- setError(t('m.Dl9ttFI'))
+ setError(t('mobileOnboarding.your'))
setBusyChoice(null)
choiceInFlightRef.current = false
}
@@ -131,7 +131,7 @@ function MobileOnboardingFlow({
await savePushNotificationsEnabled(enabled)
advanceOrContinue()
} catch {
- setError(t('m.6vGSxlM'))
+ setError(t('mobileOnboarding.notification'))
setBusyChoice(null)
choiceInFlightRef.current = false
}
@@ -145,12 +145,12 @@ function MobileOnboardingFlow({
- {t('m.mB8kw4M')}
+ {t('mobileOnboarding.orca')}
{steps.length > 1 ? (
router.back()}
>
- {t('m.ao09T48')}
+ {t('nativeChatSettings.chat')}
- {t('m.R7mksio')}
- {t('m.sW_6PG4')}
+ {t('nativeChatSettings.default')}
+ {t('nativeChatSettings.choose')}
- {t('m.LutlQWg')}
+ {t('nativeChatSettings.open')}
- {chatDefault ? t('m.OXcAS68') : t('m.p0ydSMw')}
+ {chatDefault ? t('nativeChatSettings.on') : t('nativeChatSettings.off')}
setDefaultView(next ? 'chat' : 'terminal')}
trackColor={{ false: colors.bgRaised, true: colors.textSecondary }}
diff --git a/mobile/app/notifications.tsx b/mobile/app/notifications.tsx
index 8719f1984f5..750b6143b39 100644
--- a/mobile/app/notifications.tsx
+++ b/mobile/app/notifications.tsx
@@ -69,7 +69,9 @@ export default function NotificationsScreen() {
const switchEnabled = pushEnabled && permissionState.granted
const notificationsBlocked = permissionState.status === 'denied'
- const hint = notificationsBlocked ? t('m.uzWRFSg') : t('m.dVAzjOs')
+ const hint = notificationsBlocked
+ ? t('notifications.notificationsDisabled')
+ : t('notifications.get')
return (
@@ -77,12 +79,12 @@ export default function NotificationsScreen() {
router.back()}>
- {t('m.GIjQvDw')}
+ {t('notifications.notifications')}
- {t('m.aXWuT8I')}
+ {t('notifications.agent')}
void Linking.openSettings()}
>
- {t('m.x7lqDGA')}
+ {t('notifications.open')}
)}
diff --git a/mobile/app/pair-confirm.tsx b/mobile/app/pair-confirm.tsx
index 5936daa7ff0..74144f6aa8d 100644
--- a/mobile/app/pair-confirm.tsx
+++ b/mobile/app/pair-confirm.tsx
@@ -136,8 +136,12 @@ export default function PairConfirmScreen() {
setStatus('error')
setErrorMessage(
timedOut
- ? t('m.uZiEDJ8', { value0: PAIRING_OVERALL_TIMEOUT_MS / 1000 })
- : t('m.AHFOidY', { value0: err instanceof Error ? err.message : String(err) })
+ ? t('pairConfirm.could', {
+ pairingOverallTimeoutSeconds: PAIRING_OVERALL_TIMEOUT_MS / 1000
+ })
+ : t('pairConfirm.pairingFailed', {
+ errorMessage: err instanceof Error ? err.message : String(err)
+ })
)
}
}
@@ -153,14 +157,14 @@ export default function PairConfirmScreen() {
{offer && resolvedStatus === 'awaiting-confirm' && (
<>
- {t('m.ymuJ-Uc')}
- {t('m.3LfZ8xU')}
+ {t('pairConfirm.pairDesktop')}
+ {t('pairConfirm.confirmDesktopPairingLink')}
void confirm()}>
- {t('m.V-NORJA')}
+ {t('pairConfirm.pair')}
- {t('m.gZ1SfD8')}
+ {t('pairConfirm.cancel')}
>
@@ -169,9 +173,9 @@ export default function PairConfirmScreen() {
{resolvedStatus === 'connecting' && (
<>
- {t('m.zDZEMlw')}
+ {t('pairConfirm.connecting')}
-
+
>
)}
@@ -181,12 +185,12 @@ export default function PairConfirmScreen() {
{resolvedErrorMessage}
{logs.length > 0 && (
-
+
)}
- {t('m.sKiKFEI')}
+ {t('pairConfirm.back')}
>
diff --git a/mobile/app/pair-scan.tsx b/mobile/app/pair-scan.tsx
index 435be253d0a..886b760842f 100644
--- a/mobile/app/pair-scan.tsx
+++ b/mobile/app/pair-scan.tsx
@@ -83,7 +83,7 @@ export default function PairScanScreen() {
const offer = decodePairingUrl(data)
if (!offer) {
setStatus('error')
- setErrorMessage(t('m.iHaWj50'))
+ setErrorMessage(t('pairScan.notValidOrca'))
processingRef.current = false
return
}
@@ -103,7 +103,7 @@ export default function PairScanScreen() {
const offer = parsePairingCode(input)
if (!offer) {
setStatus('error')
- setErrorMessage(t('m.feaDGg4'))
+ setErrorMessage(t('pairScan.notValidPairing'))
processingRef.current = false
return
}
@@ -180,8 +180,12 @@ export default function PairScanScreen() {
setStatus('error')
setErrorMessage(
timedOut
- ? t('m.zyTFKp4', { value0: PAIRING_OVERALL_TIMEOUT_MS / 1000 })
- : t('m.HVl7cpc', { value0: err instanceof Error ? err.message : String(err) })
+ ? t('pairScan.could', {
+ pairingOverallTimeoutSeconds: PAIRING_OVERALL_TIMEOUT_MS / 1000
+ })
+ : t('pairScan.pairingFailed', {
+ errorMessage: err instanceof Error ? err.message : String(err)
+ })
)
processingRef.current = false
}
@@ -225,15 +229,19 @@ export default function PairScanScreen() {
- {canAskAgain ? t('m.0VOtRkg') : t('m.sBkGoYA')}
- {canAskAgain ? t('m.InfekMg') : t('m.b6n4c_8')}
+
+ {canAskAgain ? t('pairScan.pair') : t('pairScan.camera')}
+
+
+ {canAskAgain ? t('pairScan.scanOrPastePairingCode') : t('pairScan.enable')}
+
void Linking.openSettings()}
>
{canAskAgain && }
- {canAskAgain ? t('m.Scz67W0') : t('m.wvDgXHk')}
+ {canAskAgain ? t('pairScan.continue') : t('pairScan.openSettings')}
setPasteVisible(true)}
>
- {t('m.Q_qrUNw')}
+ {t('pairScan.pasteCode')}
setPasteVisible(false)}
/>
@@ -263,9 +271,9 @@ export default function PairScanScreen() {
-
-
-
+
+
+
{status === 'scanning' && (
@@ -299,7 +307,7 @@ export default function PairScanScreen() {
onPress={() => setPasteVisible(true)}
>
- {t('m.U_fkYz4')}
+ {t('pairScan.pastePairingCodeMessage')}
>
)}
@@ -307,9 +315,9 @@ export default function PairScanScreen() {
{status === 'connecting' && (
- {t('m.T3HZLEU')}
+ {t('pairScan.connecting')}
-
+
)}
@@ -319,12 +327,12 @@ export default function PairScanScreen() {
{errorMessage}
{logs.length > 0 && (
-
+
)}
- {t('m._C6l3j4')}
+ {t('pairScan.try')}
[
@@ -336,7 +344,7 @@ export default function PairScanScreen() {
setPasteVisible(true)
}}
>
- {t('m.Q_qrUNw')}
+ {t('pairScan.pasteCode')}
@@ -344,9 +352,9 @@ export default function PairScanScreen() {
setPasteVisible(false)}
/>
diff --git a/mobile/app/pair.tsx b/mobile/app/pair.tsx
index 7c2e19d6010..a470f9eaedc 100644
--- a/mobile/app/pair.tsx
+++ b/mobile/app/pair.tsx
@@ -46,9 +46,9 @@ export default function PairRedirectScreen() {
{missingCode ? (
<>
- {t('m.eQE_ziw')}
+ {t('pair.missing')}
- {t('m.AIhB-fM')}
+ {t('pair.back')}
>
) : (
diff --git a/mobile/app/settings.tsx b/mobile/app/settings.tsx
index 09ef0eb5270..b7fafbc3df9 100644
--- a/mobile/app/settings.tsx
+++ b/mobile/app/settings.tsx
@@ -99,7 +99,7 @@ export default function SettingsScreen() {
router.back()}>
- {t('m.0cOgjik')}
+ {t('settings.settings')}
router.push('/terminal-settings')}
>
- {t('m.QlyWJyY')}
+ {t('settings.terminal')}
@@ -121,7 +121,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/native-chat-settings')}
>
- {t('m.-aB74WM')}
+ {t('settings.chat')}
@@ -130,7 +130,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/browser-settings')}
>
- {t('m.ttAM7Ds')}
+ {t('settings.browser')}
@@ -139,7 +139,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/voice-settings')}
>
- {t('m.rm30Zkg')}
+ {t('settings.voice')}
@@ -148,7 +148,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/notifications')}
>
- {t('m.i8QR0SY')}
+ {t('settings.notifications')}
@@ -157,7 +157,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/troubleshoot')}
>
- {t('m.0aipMZQ')}
+ {t('settings.troubleshooting')}
@@ -166,7 +166,7 @@ export default function SettingsScreen() {
onPress={() => router.push('/about')}
>
- {t('m.EELdtVU')}
+ {t('settings.about')}
@@ -176,20 +176,25 @@ export default function SettingsScreen() {
- {t('m.BFrWnfA')}
+ {t('settings.pairing')}
{credentialRetryFailed
- ? t('m.K-uhruk')
+ ? t('settings.cleanup')
: pendingCredentialCount > 0
- ? t(pendingCredentialCount === 1 ? 'm.DCkRqC8' : 'm.XStfhOk', {
- value0: pendingCredentialCount
- })
- : t('m.kiQMppk')}
+ ? t(
+ pendingCredentialCount === 1
+ ? 'settings.couldNotConfirmCleanupPendingCredentialCountCredential'
+ : 'settings.couldNotConfirmCleanupPendingCredentialCountCredentials',
+ {
+ pendingCredentialCount: pendingCredentialCount
+ }
+ )
+ : t('settings.couldNotCheck')}
) : (
- {t('m.EJmGYjM')}
+ {t('settings.retry')}
)}
@@ -218,7 +223,7 @@ export default function SettingsScreen() {
onPress={() => void Linking.openURL('https://www.onorca.dev/privacy')}
>
- {t('m.7jufUfc')}
+ {t('settings.privacy')}
void Linking.openURL('https://github.com/stablyai/orca/issues')}
>
- {t('m.cFPanOU')}
+ {t('settings.support')}
diff --git a/mobile/app/terminal-settings.tsx b/mobile/app/terminal-settings.tsx
index 4592c6a1fa2..f193b55bfe1 100644
--- a/mobile/app/terminal-settings.tsx
+++ b/mobile/app/terminal-settings.tsx
@@ -32,12 +32,12 @@ type TextSizeValue = 'smallest' | 'smaller' | 'default' | 'large' | 'larger' | '
// scale = baseline zoom the terminal WebView applies on top of fit-to-width.
// Keep in sync with TERMINAL_TEXT_SCALES; pinch-to-zoom snaps to these values.
const TEXT_SIZE_OPTIONS: (PickerOption & { scale: number })[] = [
- { value: 'smallest', label: t('m.hiouM1M'), scale: 0.5 },
- { value: 'smaller', label: t('m.CAs8oUM'), scale: 0.75 },
- { value: 'default', label: t('m.0OKOsKY'), scale: 1 },
- { value: 'large', label: t('m.HqP6IBw'), scale: 1.25 },
- { value: 'larger', label: t('m.tAn81tY'), scale: 1.5 },
- { value: 'largest', label: t('m.75Kr_24'), scale: 2 }
+ { value: 'smallest', label: t('terminalSettings.smallest'), scale: 0.5 },
+ { value: 'smaller', label: t('terminalSettings.smaller'), scale: 0.75 },
+ { value: 'default', label: t('terminalSettings.default'), scale: 1 },
+ { value: 'large', label: t('terminalSettings.large'), scale: 1.25 },
+ { value: 'larger', label: t('terminalSettings.larger'), scale: 1.5 },
+ { value: 'largest', label: t('terminalSettings.largest'), scale: 2 }
]
function textSizeValueFromScale(scale: number): TextSizeValue {
@@ -49,10 +49,10 @@ function textSizeSummary(scale: number): string {
}
const AUTO_RESTORE_FIT_OPTIONS: (PickerOption & { ms: number | null })[] = [
- { value: 'indefinite', label: t('m.q6VQcZE'), ms: null },
- { value: '60s', label: t('m.gBGOsCI'), ms: 60_000 },
- { value: '5m', label: t('m.p2EWmRg'), ms: 5 * 60_000 },
- { value: '30m', label: t('m.rU9qdt0'), ms: 30 * 60_000 }
+ { value: 'indefinite', label: t('terminalSettings.keep'), ms: null },
+ { value: '60s', label: t('terminalSettings.after1'), ms: 60_000 },
+ { value: '5m', label: t('terminalSettings.after5'), ms: 5 * 60_000 },
+ { value: '30m', label: t('terminalSettings.after30'), ms: 30 * 60_000 }
]
function valueFromMs(ms: number | null | undefined): RestoreValue {
@@ -90,7 +90,9 @@ function autoRestoreSummary(ms: number | null | undefined): string {
return AUTO_RESTORE_FIT_OPTIONS[0]!.label
}
const exact = AUTO_RESTORE_FIT_OPTIONS.find((o) => o.ms === ms)
- return exact ? exact.label : t('m.WVNYnak', { value0: Math.round(ms / 1000) })
+ return exact
+ ? exact.label
+ : t('terminalSettings.afterDuration', { durationSeconds: Math.round(ms / 1000) })
}
function HostFitRow({
@@ -260,7 +262,7 @@ export default function TerminalSettingsScreen() {
router.back()}>
- {t('m.kJj5Z2g')}
+ {t('terminalSettings.terminal')}
- {t('m.f9vgUHc')}
- {t('m.-fV3Ce8')}
+ {t('terminalSettings.when')}
+
+ {t('terminalSettings.resizeBehaviorDescription')}
+
{hosts.length === 0 ? (
- {t('m.U2mtyZg')}
+ {t('terminalSettings.no')}
) : (
@@ -299,8 +303,10 @@ export default function TerminalSettingsScreen() {
)}
- {t('m.OS-rNTI')}
- {t('m.nzfG92c')}
+
+ {t('terminalSettings.textSize')}
+
+ {t('terminalSettings.textScaleDescription')}
[styles.row, pressed && styles.rowPressed]}
@@ -308,21 +314,23 @@ export default function TerminalSettingsScreen() {
>
- {t('m.QcL6LT4')}
+ {t('terminalSettings.textSizeMessage')}
{textSizeSummary(textScale)}
- {t('m.18J3yr0')}
- {t('m.mK_kCfI')}
+
+ {t('terminalSettings.keyboard')}
+
+ {t('terminalSettings.autocompleteDescription')}
- {t('m.AsTLd6A')}
+ {t('terminalSettings.autocomplete')}
- {autocompleteEnabled ? t('m.qR5mpHo') : t('m.rE4IiF8')}
+ {autocompleteEnabled ? t('terminalSettings.on') : t('terminalSettings.off')}
visible={pickerHost != null}
- title={pickerHost ? t('m.nN25Xmo', { value0: pickerHost.name }) : ''}
+ title={
+ pickerHost
+ ? t('terminalSettings.restore', {
+ pickerHostName: pickerHost.name
+ })
+ : ''
+ }
options={AUTO_RESTORE_FIT_OPTIONS}
selected={valueFromMs(pickerHost ? hostMs[pickerHost.id] : null)}
onSelect={(v) => {
@@ -357,7 +371,7 @@ export default function TerminalSettingsScreen() {
visible={textSizePickerOpen}
- title={t('m.lfAeAOI')}
+ title={t('terminalSettings.terminalText')}
options={TEXT_SIZE_OPTIONS}
selected={textSizeValueFromScale(textScale)}
onSelect={selectTextSize}
diff --git a/mobile/app/troubleshoot.tsx b/mobile/app/troubleshoot.tsx
index 97486cee475..f6fc760cff3 100644
--- a/mobile/app/troubleshoot.tsx
+++ b/mobile/app/troubleshoot.tsx
@@ -96,14 +96,22 @@ export default function TroubleshootScreen() {
results.push(
hosts.length > 0
? {
- label: t('m._IfUZ2s'),
+ label: t('troubleshoot.paired'),
status: 'pass',
- detail: t('m.OCWSDG0', { value0: hosts.length })
+ detail: t('troubleshoot.host', { hostCount: hosts.length })
+ }
+ : {
+ label: t('troubleshoot.paired'),
+ status: 'fail',
+ detail: t('troubleshoot.none')
}
- : { label: t('m._IfUZ2s'), status: 'fail', detail: t('m.AtwKjZ4') }
)
} catch {
- results.push({ label: t('m._IfUZ2s'), status: 'warn', detail: t('m.uJRC49k') })
+ results.push({
+ label: t('troubleshoot.paired'),
+ status: 'warn',
+ detail: t('troubleshoot.couldNotRead')
+ })
}
if (!isCurrentRun()) {
@@ -122,14 +130,26 @@ export default function TroubleshootScreen() {
}
results.push(
resp.ok
- ? { label: t('m.3gA9qeo'), status: 'pass', detail: t('m.O1SHffI') }
- : { label: t('m.3gA9qeo'), status: 'warn', detail: t('m.DxL3QsM') }
+ ? {
+ label: t('troubleshoot.internet'),
+ status: 'pass',
+ detail: t('troubleshoot.connected')
+ }
+ : {
+ label: t('troubleshoot.internet'),
+ status: 'warn',
+ detail: t('troubleshoot.unexpected')
+ }
)
} catch {
if (!isCurrentRun()) {
return
}
- results.push({ label: t('m.3gA9qeo'), status: 'fail', detail: t('m.gdHptko') })
+ results.push({
+ label: t('troubleshoot.internet'),
+ status: 'fail',
+ detail: t('troubleshoot.no')
+ })
} finally {
internetCheck.dispose()
if (activeInternetCheckRef.current === internetCheck) {
@@ -156,13 +176,19 @@ export default function TroubleshootScreen() {
label: host.name,
status: reachable ? 'pass' : 'fail',
detail: reachable
- ? t('m.ImyX3J0', { value0: formatEndpoint(host.endpoint) })
+ ? t('troubleshoot.reachable', {
+ endpoint: formatEndpoint(host.endpoint)
+ })
: unreachableHostDetail(host.endpoint)
})
setChecks([...results])
}
} catch {
- results.push({ label: t('m.Ie918PM'), status: 'warn', detail: t('m._wFCKE8') })
+ results.push({
+ label: t('troubleshoot.hosts'),
+ status: 'warn',
+ detail: t('troubleshoot.couldNotTest')
+ })
}
if (!isCurrentRun()) {
@@ -170,7 +196,7 @@ export default function TroubleshootScreen() {
}
results.push({
- label: t('m.8sOFcoA'),
+ label: t('troubleshoot.platform'),
status: 'pass',
detail: `${Platform.OS} ${Platform.Version ?? ''}`
})
@@ -188,7 +214,7 @@ export default function TroubleshootScreen() {
router.back()}>
- {t('m.DIEmGuM')}
+ {t('troubleshoot.troubleshooting')}
{diagnosticStatus === 'running'
- ? t('m.dQs8-jc')
+ ? t('troubleshoot.running')
: diagnosticStatus === 'done'
- ? t('m.B5C2aso')
- : t('m.5xQU6vw')}
+ ? t('troubleshoot.runAgain')
+ : t('troubleshoot.runDiagnostics')}
@@ -227,7 +253,7 @@ export default function TroubleshootScreen() {
onPress={() => router.push('/connection-log')}
>
- {t('m.bwJLtK4')}
+ {t('troubleshoot.view')}
{checks.length > 0 && (
@@ -249,7 +275,7 @@ export default function TroubleshootScreen() {
)}
- {t('m.2J8vm70')}
+ {t('troubleshoot.common')}
{getTroubleshootCommonIssues().map((section, i) => (
diff --git a/mobile/app/voice-settings.tsx b/mobile/app/voice-settings.tsx
index 2b7602e55f6..174f1159a04 100644
--- a/mobile/app/voice-settings.tsx
+++ b/mobile/app/voice-settings.tsx
@@ -33,8 +33,8 @@ import { t } from '@/i18n/mobile-i18n'
const POLL_INTERVAL_MS = 1500
const DICTATION_MODES = [
- { value: 'toggle', label: t('m.yxHp0Uc') },
- { value: 'hold', label: t('m.hYUl_w0') }
+ { value: 'toggle', label: t('voiceSettings.toggle') },
+ { value: 'hold', label: t('voiceSettings.hold') }
] as const
type ModelBusyAction = { modelId: string; type: 'download' | 'select' | 'delete' }
@@ -79,7 +79,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
setError(null)
return next.models.some(isModelInFlight)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.wFKD2Es'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.failedLoadVoiceSettings'))
return undefined
} finally {
setLoading(false)
@@ -111,7 +111,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
try {
setSetup(await setDictationConfig(client, { enabled }))
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.PiXz3AQ'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.couldNotUpdate'))
void refreshSetup()
}
},
@@ -128,7 +128,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
try {
setSetup(await setDictationConfig(client, { dictationMode }))
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.PiXz3AQ'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.couldNotUpdate'))
void refreshSetup()
}
},
@@ -146,7 +146,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
setSetup(await setDictationConfig(client, { enabled: true, modelId: model.id }))
setModelDrawerOpen(false)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.cpL32fY'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.couldNotSelect'))
} finally {
setBusyAction(null)
}
@@ -165,7 +165,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
await downloadDictationModel(client, model.id)
await refreshSetup()
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.O-GK4L4'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.download'))
} finally {
setBusyAction(null)
}
@@ -187,7 +187,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
setModelDrawerOpen(false)
}
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.Wgx1aTY'))
+ setError(err instanceof Error ? err.message : t('voiceSettings.delete'))
} finally {
setBusyAction(null)
}
@@ -197,7 +197,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
const enabled = setup?.enabled ?? false
const selectedModel = setup?.models.find((m) => m.id === setup.selectedModelId)
- const selectedModelLabel = selectedModel?.label ?? t('m.J055vls')
+ const selectedModelLabel = selectedModel?.label ?? t('voiceSettings.none')
return (
@@ -205,12 +205,12 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
router.back()}>
- {t('m.pSmQbNo')}
+ {t('voiceSettings.voice')}
{!client ? (
- {t('m.pJrwjt0')}
+ {t('voiceSettings.connect')}
) : loading && setup === null ? (
@@ -218,19 +218,21 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
) : setup === null ? (
- {error ?? t('m.Fbnf310')}
+
+ {error ?? t('voiceSettings.failedLoadVoiceSettingsMessage')}
+
) : (
- {t('m.L4c5Sxw')}
+ {t('voiceSettings.dictation')}
- {t('m.23v3WVE')}
- {t('m.4g1gMYA')}
+ {t('voiceSettings.enable')}
+ {t('voiceSettings.dictate')}
- {t('m.Jh4zuEU')}
- {t('m.uwVWBGE')}
+ {t('voiceSettings.dictationMode')}
+ {t('voiceSettings.togglePress')}
{DICTATION_MODES.map((mode) => {
@@ -269,7 +271,9 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
- {t('m.n-BJK-c')}
+
+ {t('voiceSettings.speechModel')}
+
[
@@ -281,7 +285,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
onPress={() => setModelDrawerOpen(true)}
>
- {t('m.C-t7pm8')}
+ {t('voiceSettings.speechModelMessage')}
{selectedModelLabel}
@@ -295,7 +299,7 @@ export default function VoiceSettingsScreen(): React.JSX.Element {
)}
setModelDrawerOpen(false)}>
- {t('m.C-t7pm8')}
+ {t('voiceSettings.speechModelMessage')}
{setup ? (
{card.agentLabel}
- {card.messageCount} {card.messageCount === 1 ? t('m.fZXkGhQ') : t('m.tL7Cy3c')}
+ {card.messageCount}{' '}
+ {card.messageCount === 1
+ ? t('mobileAgentSessionHistoryList.message')
+ : t('mobileAgentSessionHistoryList.messages')}
{showCurrentWorktreeBadge && card.isCurrentWorktree ? (
- {t('m.f1-v-HM')}
+
+ {t('mobileAgentSessionHistoryList.current')}
+
) : null}
{session && onResume ? (
@@ -153,7 +158,7 @@ function AgentHistoryCardRow({
disabled={resumeActionState?.disabled}
hitSlop={8}
accessibilityRole="button"
- accessibilityLabel={t('m.p7fz5tw')}
+ accessibilityLabel={t('mobileAgentSessionHistoryList.resume')}
>
{resumeActionState?.loading ? (
diff --git a/mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx b/mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx
index 7c6562f046b..520efd559aa 100644
--- a/mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx
+++ b/mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx
@@ -28,15 +28,13 @@ import { useMobileAgentHistoryState } from './use-mobile-agent-history-state'
import { buildMobileAgentHistorySections } from './agent-history-sections'
import { shouldShowMobileCurrentWorktreeBadge } from './agent-history-current-worktree-badge'
import { MobileAgentSessionHistoryList } from './MobileAgentSessionHistoryList'
-import {
- resolveMobileAiVaultSessionResumeTarget,
- type MobileAiVaultResumeFolderWorkspace,
- type MobileAiVaultResumeProjectGroup,
- type MobileAiVaultResumeRepo
-} from './agent-history-resume-target'
+import { resolveMobileAiVaultSessionResumeTarget } from './agent-history-resume-target'
+import type * as ResumeTarget from './agent-history-resume-target'
import { buildMobileAgentHistoryResumeActionState } from './agent-history-session-card'
import { styles } from './agent-history-styles'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator } from '@/i18n/mobile-i18n'
+
+const tr = createMobileTranslator('agentHistory')
export type MobileAgentSessionHistoryPanelProps = {
hostId: string
@@ -45,9 +43,9 @@ export type MobileAgentSessionHistoryPanelProps = {
}
const SCOPE_TABS: { scope: AiVaultScope; label: string }[] = [
- { scope: 'workspace', label: t('m.0k6Zchk') },
- { scope: 'project', label: t('m.dhgeP_o') },
- { scope: 'all', label: t('m.rcPfxtE') }
+ { scope: 'workspace', label: tr('workspace') },
+ { scope: 'project', label: tr('project') },
+ { scope: 'all', label: tr('all') }
]
export function MobileAgentSessionHistoryPanel({
@@ -151,12 +149,12 @@ export function MobileAgentSessionHistoryPanel({
return
}
if (!client || connState !== 'connected') {
- setResumeMessage(t('m.BLr07Ao'))
+ setResumeMessage(tr('waiting'))
triggerError()
return
}
if (!session.sessionId) {
- setResumeMessage(t('m.8fvhHmw'))
+ setResumeMessage(tr('session'))
triggerError()
return
}
@@ -196,7 +194,7 @@ export function MobileAgentSessionHistoryPanel({
target.terminalPlatform
)
if (!platform) {
- setResumeMessage(t('m.ADvyKkM'))
+ setResumeMessage(tr('unableDetermine'))
triggerError()
return
}
@@ -214,7 +212,7 @@ export function MobileAgentSessionHistoryPanel({
})
resumeMutationRegistryRef.current.releaseOnSuccess(session.id)
triggerSuccess()
- setResumeMessage(t('m.sibM7yE'))
+ setResumeMessage(tr('agentSessionQueued'))
router.push(
`/h/${encodeURIComponent(hostId)}/session/${encodeURIComponent(target.worktreeId)}` as Parameters<
typeof router.push
@@ -222,7 +220,7 @@ export function MobileAgentSessionHistoryPanel({
)
} catch (err) {
triggerError()
- setResumeMessage(err instanceof Error ? err.message : t('m.HsI5rsc'))
+ setResumeMessage(err instanceof Error ? err.message : tr('failed'))
} finally {
resumeLaunchInFlightRef.current = false
setResumingSessionId(null)
@@ -248,13 +246,13 @@ export function MobileAgentSessionHistoryPanel({
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={() => router.back()}
hitSlop={8}
- accessibilityLabel={t('m.bGNaHw8')}
+ accessibilityLabel={tr('back')}
>
- {t('m.z2KOXZE')}
+ {tr('agentSessionHistory')}
{worktreeLabel}
@@ -264,7 +262,7 @@ export function MobileAgentSessionHistoryPanel({
style={({ pressed }) => [styles.refreshButton, pressed && styles.refreshButtonPressed]}
onPress={() => void onRefresh()}
hitSlop={8}
- accessibilityLabel={t('m.Qvd5WD0')}
+ accessibilityLabel={tr('refresh')}
>
@@ -277,15 +275,15 @@ export function MobileAgentSessionHistoryPanel({
) : screenState.kind === 'unsupported' ? (
- {t('m.yRlsHYk')}
- {t('m.D1lHtt4')}
+ {tr('agentSessionHistoryUnavailable')}
+ {tr('update')}
) : screenState.kind === 'error' ? (
- {t('m.IFh38kk')}
+ {tr('unableLoad')}
{screenState.message}
- {t('m.7OL03t8')}
+ {tr('retry')}
) : (
@@ -311,7 +309,7 @@ export function MobileAgentSessionHistoryPanel({
style={styles.searchInput}
value={query}
onChangeText={setQuery}
- placeholder={t('m.Uc72mxE')}
+ placeholder={tr('search')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -320,8 +318,8 @@ export function MobileAgentSessionHistoryPanel({
{issues.length > 0 ? (
- {t(issues.length === 1 ? 'm.xnvhKbA' : 'm.UXXYuws', {
- value0: issues.length
+ {tr(issues.length === 1 ? 'issueCountTranscript' : 'issueCountTranscripts', {
+ issueCount: issues.length
})}
@@ -333,8 +331,8 @@ export function MobileAgentSessionHistoryPanel({
) : null}
{sections.length === 0 ? (
- {t('m.KkgSO8k')}
- {query ? t('m.X8748Hs') : t('m.L_8qprI')}
+ {tr('noAgent')}
+ {query ? tr('noSessions') : tr('noPast')}
) : (
): Promise<{
- repos: MobileAiVaultResumeRepo[]
- folderWorkspaces: MobileAiVaultResumeFolderWorkspace[]
- projectGroups: MobileAiVaultResumeProjectGroup[]
+ repos: ResumeTarget.MobileAiVaultResumeRepo[]
+ folderWorkspaces: ResumeTarget.MobileAiVaultResumeFolderWorkspace[]
+ projectGroups: ResumeTarget.MobileAiVaultResumeProjectGroup[]
settings: MobileAiVaultResumeSettings | null
worktrees: Worktree[] | null
}> {
@@ -389,18 +387,18 @@ async function loadMobileResumeMetadata(client: Pick):
.catch(() => null)
])
if (!repoResponse.ok) {
- throw new Error(repoResponse.error?.message || t('m.hRiZhQg'))
+ throw new Error(repoResponse.error?.message || tr('unableLoadWorkspace'))
}
- const repoResult = repoResponse.result as { repos?: MobileAiVaultResumeRepo[] }
+ const repoResult = repoResponse.result as { repos?: ResumeTarget.MobileAiVaultResumeRepo[] }
const folderWorkspaceResult =
folderWorkspaceResponse?.ok === true
? (folderWorkspaceResponse.result as {
- folderWorkspaces?: MobileAiVaultResumeFolderWorkspace[]
+ folderWorkspaces?: ResumeTarget.MobileAiVaultResumeFolderWorkspace[]
})
: null
const projectGroupResult =
projectGroupResponse?.ok === true
- ? (projectGroupResponse.result as { groups?: MobileAiVaultResumeProjectGroup[] })
+ ? (projectGroupResponse.result as { groups?: ResumeTarget.MobileAiVaultResumeProjectGroup[] })
: null
const settingsResult =
settingsResponse?.ok === true
diff --git a/mobile/src/agent-history/agent-history-resume-target.ts b/mobile/src/agent-history/agent-history-resume-target.ts
index b4e65844ae3..82312dca3ad 100644
--- a/mobile/src/agent-history/agent-history-resume-target.ts
+++ b/mobile/src/agent-history/agent-history-resume-target.ts
@@ -107,12 +107,12 @@ export function mobileAiVaultResumeTargetBlockMessage(
status: MobileAiVaultResumeTargetStatus
): string {
if (status === 'runtime') {
- return t('m.GLFjyPk')
+ return t('agentHistoryResumeTarget.resume')
}
if (status === 'ssh') {
- return t('m.eTFpmzo')
+ return t('agentHistoryResumeTarget.session')
}
- return t('m.mWMZ-dk')
+ return t('agentHistoryResumeTarget.open')
}
export function resolveMobileAiVaultSessionResumeTarget(args: {
diff --git a/mobile/src/agent-history/agent-history-session-card.ts b/mobile/src/agent-history/agent-history-session-card.ts
index f01ea464134..9768ba68ec4 100644
--- a/mobile/src/agent-history/agent-history-session-card.ts
+++ b/mobile/src/agent-history/agent-history-session-card.ts
@@ -45,7 +45,7 @@ export function buildMobileAgentHistoryCard(
id: session.id,
agent: session.agent,
agentLabel: aiVaultAgentLabel(session.agent),
- title: session.title || t('m.VgO3m0E'),
+ title: session.title || t('agentHistorySessionCard.untitled'),
lastMessage: latestTurn?.text.trim() ?? '',
messageCount: session.messageCount,
timeAgo: Number.isFinite(updatedAtMs) ? formatTimeAgo(updatedAtMs, now) : '',
diff --git a/mobile/src/agent-history/use-mobile-agent-history-state.ts b/mobile/src/agent-history/use-mobile-agent-history-state.ts
index 77a88f00d9f..4c17f3968d0 100644
--- a/mobile/src/agent-history/use-mobile-agent-history-state.ts
+++ b/mobile/src/agent-history/use-mobile-agent-history-state.ts
@@ -79,7 +79,12 @@ export function useMobileAgentHistoryState(params: MobileAgentHistoryStateParams
// (connState flips re-run the load effect) instead of tearing it
// down to a full-screen error, matching the host list screen.
setScreenState((prev) =>
- prev.kind === 'ready' ? prev : { kind: 'error', message: t('m.nSh69OQ') }
+ prev.kind === 'ready'
+ ? prev
+ : {
+ kind: 'error',
+ message: t('useMobileAgentHistoryState.waiting')
+ }
)
}
return
@@ -94,7 +99,9 @@ export function useMobileAgentHistoryState(params: MobileAgentHistoryStateParams
return
}
if (!statusResponse.ok) {
- throw new Error(statusResponse.error?.message || t('m.THbZzp4'))
+ throw new Error(
+ statusResponse.error?.message || t('useMobileAgentHistoryState.unableReach')
+ )
}
const status = (statusResponse as RpcSuccess).result as StatusWithCapabilities
setHostStatusResult(status)
@@ -124,7 +131,7 @@ export function useMobileAgentHistoryState(params: MobileAgentHistoryStateParams
return
}
if (!response.ok) {
- throw new Error(response.error?.message || t('m.ukxwfJ8'))
+ throw new Error(response.error?.message || t('useMobileAgentHistoryState.unableLoad'))
}
const result = (response as RpcSuccess).result as AiVaultListResult
setScreenState({ kind: 'ready', sessions: result.sessions, issues: result.issues })
@@ -132,7 +139,8 @@ export function useMobileAgentHistoryState(params: MobileAgentHistoryStateParams
if (!isCurrent()) {
return
}
- const message = err instanceof Error ? err.message : t('m.ukxwfJ8')
+ const message =
+ err instanceof Error ? err.message : t('useMobileAgentHistoryState.unableLoad')
setHostStatusResult(null)
setScreenState({ kind: 'error', message })
}
diff --git a/mobile/src/agent-history/worktree-navigation-actions.ts b/mobile/src/agent-history/worktree-navigation-actions.ts
index b42d1aa66ef..08e54de0bd2 100644
--- a/mobile/src/agent-history/worktree-navigation-actions.ts
+++ b/mobile/src/agent-history/worktree-navigation-actions.ts
@@ -22,7 +22,7 @@ type Args = {
export function buildWorktreeNavigationActions(args: Args): ActionSheetAction[] {
const actions: ActionSheetAction[] = [
{
- label: t('m.XjyxBLA'),
+ label: t('worktreeNavigationActions.source'),
icon: GitBranch,
onPress: () => {
const params = new URLSearchParams({ name: args.worktreeName, origin: 'host' })
@@ -35,7 +35,7 @@ export function buildWorktreeNavigationActions(args: Args): ActionSheetAction[]
]
if (args.hostCapabilities.includes(MOBILE_AI_VAULT_CAPABILITY)) {
actions.push({
- label: t('m.Au06U2c'),
+ label: t('worktreeNavigationActions.agent'),
renderIcon: () =>
MobileAgentSessionHistoryIcon({ size: 16, color: colors.textSecondary, strokeWidth: 2 }),
onPress: () => {
diff --git a/mobile/src/browser/MobileBrowserKeyRow.tsx b/mobile/src/browser/MobileBrowserKeyRow.tsx
index 0ee60d3aaaa..cd0382b33ea 100644
--- a/mobile/src/browser/MobileBrowserKeyRow.tsx
+++ b/mobile/src/browser/MobileBrowserKeyRow.tsx
@@ -24,7 +24,7 @@ export function MobileBrowserKeyRow({ disabled, onKeypress }: Props): React.JSX.
onPress={() => onKeypress(key)}
>
- {key === 'Backspace' ? '⌫' : key === 'Escape' ? t('m.u8NH0Xk') : key}
+ {key === 'Backspace' ? '⌫' : key === 'Escape' ? t('mobileBrowserKeyRow.esc') : key}
))}
diff --git a/mobile/src/browser/MobileBrowserPane.tsx b/mobile/src/browser/MobileBrowserPane.tsx
index 56d05f618ba..ba75bafc776 100644
--- a/mobile/src/browser/MobileBrowserPane.tsx
+++ b/mobile/src/browser/MobileBrowserPane.tsx
@@ -431,11 +431,11 @@ export function MobileBrowserPane({
busyRef.current = false
setBusy(false)
if (screencastSupported === false) {
- setError(t('m.X2WJPN4'))
+ setError(t('mobileBrowserPane.update'))
} else if (screencastSupported === null) {
- setError(t('m.lBu6FGw'))
+ setError(t('mobileBrowserPane.checking'))
} else if (!tab.browserPageId) {
- setError(t('m.YmwDAcU'))
+ setError(t('mobileBrowserPane.browserPage'))
}
return
}
@@ -447,7 +447,7 @@ export function MobileBrowserPane({
}
busyRef.current = false
setBusy(false)
- setError(t('m.ZoS2fOc'))
+ setError(t('mobileBrowserPane.browserStreamTimed'))
}, 15_000)
const clearStartupTimer = (): void => {
if (startupTimer) {
@@ -503,7 +503,7 @@ export function MobileBrowserPane({
} else if (event.type === 'dialog') {
setDialog({
dialogType: event.dialogType ?? 'alert',
- message: event.message ?? t('m.a6UgDc8')
+ message: event.message ?? t('mobileBrowserPane.browserDialog')
})
} else if (event.type === 'dialogClosed') {
setDialog(null)
@@ -513,7 +513,8 @@ export function MobileBrowserPane({
busyRef.current = false
setBusy(false)
}
- const message = event.message ?? event.error?.message ?? t('m.21rrqn0')
+ const message =
+ event.message ?? event.error?.message ?? t('mobileBrowserPane.browserStreamFailed')
if (shouldSurfaceBrowserError(message)) {
if (readyRef.current) {
readyRef.current = false
@@ -579,7 +580,7 @@ export function MobileBrowserPane({
setError(null)
return (response as RpcSuccess).result
} catch (err) {
- const message = browserErrorMessage(err, t('m.9E99YI8'))
+ const message = browserErrorMessage(err, t('mobileBrowserPane.browserCommand'))
if (!opts.suppressError && shouldSurfaceBrowserError(message)) {
setError(message)
}
@@ -597,7 +598,7 @@ export function MobileBrowserPane({
const navigateToAddress = useCallback(async () => {
const url = normalizeBrowserUrl(addressValue)
if (!url) {
- setError(t('m.5dQ6Hbc'))
+ setError(t('mobileBrowserPane.enter'))
return
}
const result = (await sendBrowserRequest(
@@ -630,7 +631,7 @@ export function MobileBrowserPane({
x: pending.point.x,
y: pending.point.y
}),
- t('m.A-4DgN0')
+ t('mobileBrowserPane.browserPointerMove')
)
assertRpcOk(
await client.sendRequest('browser.mouseWheel', {
@@ -638,7 +639,7 @@ export function MobileBrowserPane({
dx: pending.dx,
dy: pending.dy
}),
- t('m.yrjs9M0')
+ t('mobileBrowserPane.browserScroll')
)
setError(null)
} catch {
@@ -683,15 +684,15 @@ export function MobileBrowserPane({
try {
assertRpcOk(
await client.sendRequest('browser.mouseMove', { ...base, x: point.x, y: point.y }),
- t('m.A-4DgN0')
+ t('mobileBrowserPane.browserPointerMove')
)
assertRpcOk(
await client.sendRequest('browser.mouseDown', { ...base, button }),
- t('m.oaarOD4')
+ t('mobileBrowserPane.browserPointerDown')
)
assertRpcOk(
await client.sendRequest('browser.mouseUp', { ...base, button }),
- t('m._ax72Jw')
+ t('mobileBrowserPane.browserPointerUp')
)
setError(null)
} catch {
@@ -794,7 +795,7 @@ export function MobileBrowserPane({
}
rightClickSentRef.current = true
void sendPointerClick(point, 'right')
- onToast(t('m.X1FYz1o'))
+ onToast(t('mobileBrowserPane.right'))
}, LONG_PRESS_MS)
},
[clearLongPressTimer, frameGeometry, mapTouchPoint, onToast, sendPointerClick]
@@ -939,7 +940,7 @@ export function MobileBrowserPane({
{ suppressError: true }
)
if (result !== null) {
- onToast(t('m.aJGSaVI'))
+ onToast(t('mobileBrowserPane.sent'))
} else {
setKeyboardValue(text)
}
@@ -1086,21 +1087,21 @@ export function MobileBrowserPane({
@@ -1119,7 +1120,7 @@ export function MobileBrowserPane({
keyboardType={Platform.OS === 'ios' ? 'url' : 'default'}
numberOfLines={1}
returnKeyType="go"
- placeholder={t('m.-00MlTU')}
+ placeholder={t('mobileBrowserPane.url')}
placeholderTextColor={colors.textMuted}
editable={!controlsDisabled}
/>
@@ -1229,7 +1230,7 @@ export function MobileBrowserPane({
{dialog ? (
- {t('m.z1nkBLw')}
+ {t('mobileBrowserPane.browserDialogMessage')}
{dialog.message}
{dialog.dialogType !== 'alert' ? (
@@ -1240,7 +1241,7 @@ export function MobileBrowserPane({
]}
onPress={() => void sendDialogCommand('browser.dialogDismiss')}
>
- {t('m.RXEfHVA')}
+ {t('mobileBrowserPane.cancel')}
) : null}
void sendDialogCommand('browser.dialogAccept')}
>
- {t('m.48esWoc')}
+ {t('mobileBrowserPane.ok')}
@@ -1281,7 +1282,7 @@ export function MobileBrowserPane({
style={styles.keyboardInput}
value={keyboardValue}
onChangeText={setKeyboardValue}
- placeholder={t('m.g3GvsOs')}
+ placeholder={t('mobileBrowserPane.type')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -1292,7 +1293,7 @@ export function MobileBrowserPane({
style={[styles.sendButton, (controlsDisabled || !keyboardValue) && styles.disabled]}
disabled={controlsDisabled || !keyboardValue}
onPress={() => void sendKeyboardText()}
- accessibilityLabel={t('m.rfYWlSA')}
+ accessibilityLabel={t('mobileBrowserPane.send')}
>
diff --git a/mobile/src/browser/MobileBrowserPointerModifiers.tsx b/mobile/src/browser/MobileBrowserPointerModifiers.tsx
index 4365eade448..90ff1ed41d9 100644
--- a/mobile/src/browser/MobileBrowserPointerModifiers.tsx
+++ b/mobile/src/browser/MobileBrowserPointerModifiers.tsx
@@ -5,10 +5,10 @@ import { t } from '@/i18n/mobile-i18n'
export type BrowserPointerModifier = 'cmd' | 'ctrl' | 'alt' | 'shift'
const BROWSER_POINTER_MODIFIERS: { id: BrowserPointerModifier; label: string }[] = [
- { id: 'cmd', label: t('m.IW8xp4k') },
- { id: 'ctrl', label: t('m.EqW8StQ') },
- { id: 'alt', label: t('m.fP87QIY') },
- { id: 'shift', label: t('m.GTbLYFM') }
+ { id: 'cmd', label: t('mobileBrowserPointerModifiers.cmd') },
+ { id: 'ctrl', label: t('mobileBrowserPointerModifiers.ctrl') },
+ { id: 'alt', label: t('mobileBrowserPointerModifiers.alt') },
+ { id: 'shift', label: t('mobileBrowserPointerModifiers.shift') }
]
type Props = {
@@ -39,7 +39,9 @@ export function MobileBrowserPointerModifiers({
onPress={() => onToggle(modifier.id)}
accessibilityRole="button"
accessibilityState={{ selected, disabled }}
- accessibilityLabel={t('m.gZUBadw', { value0: modifier.label })}
+ accessibilityLabel={t('mobileBrowserPointerModifiers.modifier', {
+ modifierLabel: modifier.label
+ })}
>
@@ -56,7 +56,9 @@ function ViewModeButton({
onPress={onPress}
accessibilityRole="button"
accessibilityState={{ selected, disabled }}
- accessibilityLabel={t('m.lV607bI', { value0: label.toLowerCase() })}
+ accessibilityLabel={t('mobileBrowserViewModeSwitch.show', {
+ browserLabel: label.toLowerCase()
+ })}
>
{label}
diff --git a/mobile/src/components/AuthFailedBanner.tsx b/mobile/src/components/AuthFailedBanner.tsx
index 0ea3d8863df..ac9664b2500 100644
--- a/mobile/src/components/AuthFailedBanner.tsx
+++ b/mobile/src/components/AuthFailedBanner.tsx
@@ -19,18 +19,20 @@ export function AuthFailedBanner({
}) {
return (
- {t('m.IrfKQh8')}
+ {t('authFailedBanner.authentication')}
{canRetry && (
- {t('m.ujiecek')}
+ {t('authFailedBanner.retry')}
)}
- {t('m.KuqR8FY')}
+ {t('authFailedBanner.re')}
- {t('m.q-MNnd4')}
+
+ {t('authFailedBanner.remove')}
+
diff --git a/mobile/src/components/CodexResetCreditAction.tsx b/mobile/src/components/CodexResetCreditAction.tsx
index 1965fbc1245..60513d5403d 100644
--- a/mobile/src/components/CodexResetCreditAction.tsx
+++ b/mobile/src/components/CodexResetCreditAction.tsx
@@ -24,7 +24,8 @@ export function CodexResetCreditAction({
{summary.availabilityLabel}
- {[summary.expiryLabel, scopeLabel].filter(Boolean).join(' · ') || t('m.wA_0d2E')}
+ {[summary.expiryLabel, scopeLabel].filter(Boolean).join(' · ') ||
+ t('codexResetCreditAction.earned')}
@@ -46,7 +55,9 @@ export function CodexResetCreditAction({
) : (
)}
- {busy ? t('m.LN50bQ0') : t('m.2LrOLw8')}
+
+ {busy ? t('codexResetCreditAction.resetting') : t('codexResetCreditAction.useReset')}
+
>
diff --git a/mobile/src/components/ConfirmModal.tsx b/mobile/src/components/ConfirmModal.tsx
index 9b65dc90197..d298d6f198b 100644
--- a/mobile/src/components/ConfirmModal.tsx
+++ b/mobile/src/components/ConfirmModal.tsx
@@ -18,8 +18,8 @@ export function ConfirmModal({
visible,
title,
message,
- confirmLabel = t('m.OxB9eF0'),
- cancelLabel = t('m.QVUePYc'),
+ confirmLabel = t('confirmModal.confirm'),
+ cancelLabel = t('confirmModal.cancel'),
destructive = false,
onConfirm,
onCancel
diff --git a/mobile/src/components/CustomKeyModal.tsx b/mobile/src/components/CustomKeyModal.tsx
index 6982a2abec3..c8a6e6dd639 100644
--- a/mobile/src/components/CustomKeyModal.tsx
+++ b/mobile/src/components/CustomKeyModal.tsx
@@ -67,17 +67,17 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
] satisfies readonly { id: TerminalShortcutModifier; label: string; glyph?: string }[]
const specialKeyGroups: { title: string; ids: string[]; columns: number }[] = [
{
- title: t('m.1RunS2Y'),
+ title: t('customKeyModal.editing'),
ids: ['escape', 'tab', 'enter', 'backspace', 'delete', 'insert', 'space'],
columns: 4
},
{
- title: t('m.ClgDZUM'),
+ title: t('customKeyModal.navigation'),
ids: ['arrowUp', 'arrowDown', 'arrowLeft', 'arrowRight', 'home', 'end', 'pageUp', 'pageDown'],
columns: 4
},
{
- title: t('m.WwKbTEk'),
+ title: t('customKeyModal.function'),
ids: ['f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12'],
columns: 6
}
@@ -186,7 +186,7 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
[styles.backButton, pressed && styles.backButtonPressed]}
onPress={onBack}
- accessibilityLabel={t('m.v1Nn-IY')}
+ accessibilityLabel={t('customKeyModal.back')}
>
@@ -194,10 +194,10 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
)}
- {step === 'choose-type' && t('m._g9qkig')}
- {step === 'shortcut-combo' && t('m.Lr_GVFQ')}
- {step === 'special-keys' && t('m.rMV0BMU')}
- {step === 'text-macro' && t('m.fNBP1Us')}
+ {step === 'choose-type' && t('customKeyModal.addShortcut')}
+ {step === 'shortcut-combo' && t('customKeyModal.shortcut')}
+ {step === 'special-keys' && t('customKeyModal.pick')}
+ {step === 'text-macro' && t('customKeyModal.text')}
@@ -208,16 +208,16 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
style={({ pressed }) => [styles.row, pressed && styles.rowPressed]}
onPress={() => setStep('shortcut-combo')}
>
- {t('m.Lr_GVFQ')}
- {t('m.Y7zDQOM')}
+ {t('customKeyModal.shortcut')}
+ {t('customKeyModal.build')}
[styles.row, pressed && styles.rowPressed]}
onPress={() => setStep('text-macro')}
>
- {t('m.fNBP1Us')}
- {t('m.I-Rlhvc')}
+ {t('customKeyModal.text')}
+ {t('customKeyModal.send')}
{onManageShortcuts ? (
<>
@@ -226,8 +226,8 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
style={({ pressed }) => [styles.row, pressed && styles.rowPressed]}
onPress={onManageShortcuts}
>
- {t('m.BFsLjpc')}
- {t('m.w7YJ0Kw')}
+ {t('customKeyModal.manage')}
+ {t('customKeyModal.show')}
>
) : null}
@@ -254,7 +254,7 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
- {t('m.9jQVv-8')}
+ {t('customKeyModal.modifiers')}
{shortcutModifierOptions.map((modifier) => {
const selected = shortcutModifiers.includes(modifier.id)
@@ -285,7 +285,7 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
- {t('m.QlB11DI')}
+ {t('customKeyModal.key')}
[styles.moreLink, pressed && styles.moreLinkPressed]}
onPress={() => setStep('special-keys')}
>
- {t('m.GSrBito')}
+ {t('customKeyModal.more')}
@@ -312,7 +312,7 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
- {t('m.ndVygIU')}
+ {t('customKeyModal.add')}
@@ -359,28 +359,28 @@ export function CustomKeyModal({ visible, onClose, onKeysChanged, onManageShortc
{step === 'text-macro' && (
- {t('m.zkM-vYk')}
+ {t('customKeyModal.label')}
- {t('m.YZWk8R4')}
+ {t('customKeyModal.command')}
- {t('m.N7UodPY')}
+ {t('customKeyModal.press')}
- {t('m._g9qkig')}
+ {t('customKeyModal.addShortcut')}
diff --git a/mobile/src/components/DragReorderList.tsx b/mobile/src/components/DragReorderList.tsx
index b288631e848..2e2fd5c7d11 100644
--- a/mobile/src/components/DragReorderList.tsx
+++ b/mobile/src/components/DragReorderList.tsx
@@ -297,11 +297,11 @@ function DragReorderRow({
style={styles.handle}
accessible
accessibilityRole="button"
- accessibilityLabel={t('m.-lwE4Q0')}
- accessibilityHint={t('m.T-H1CUQ')}
+ accessibilityLabel={t('dragReorderList.drag')}
+ accessibilityHint={t('dragReorderList.use')}
accessibilityActions={[
- { name: 'moveUp', label: t('m.ee4D14o') },
- { name: 'moveDown', label: t('m.uGHhnC0') }
+ { name: 'moveUp', label: t('dragReorderList.moveUp') },
+ { name: 'moveDown', label: t('dragReorderList.moveDown') }
]}
onAccessibilityAction={(event) => {
if (event.nativeEvent.actionName === 'moveUp') {
diff --git a/mobile/src/components/HostProtocolGate.tsx b/mobile/src/components/HostProtocolGate.tsx
index 51c4794edea..87e1f80a619 100644
--- a/mobile/src/components/HostProtocolGate.tsx
+++ b/mobile/src/components/HostProtocolGate.tsx
@@ -16,7 +16,7 @@ const HostStatusGatesContext = createContext(null)
export function useHostProtocolGates(): HostStatusGates {
const gates = useContext(HostStatusGatesContext)
if (!gates) {
- const invariantViolation = new Error(t('m.3cWf_os'))
+ const invariantViolation = new Error(t('hostProtocolGate.use'))
throw invariantViolation
}
return gates
@@ -37,7 +37,10 @@ export function HostProtocolGate({ hostId, children }: Props) {
// Why: child routes may call newer RPCs on mount, so wait until compatibility is known.
return (
-
+
)
}
diff --git a/mobile/src/components/MobileDictationSetupSheet.tsx b/mobile/src/components/MobileDictationSetupSheet.tsx
index 343100df1f9..2d3a1e6bedd 100644
--- a/mobile/src/components/MobileDictationSetupSheet.tsx
+++ b/mobile/src/components/MobileDictationSetupSheet.tsx
@@ -49,7 +49,7 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
setError(null)
return next.models.some(isModelInFlight)
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.lUsptPY'))
+ setError(err instanceof Error ? err.message : t('mobileDictationSetupSheet.failed'))
return undefined
}
}, [client])
@@ -80,7 +80,7 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
await refreshSetup()
} catch (err) {
triggerError()
- setError(err instanceof Error ? err.message : t('m.0rsS1Dw'))
+ setError(err instanceof Error ? err.message : t('mobileDictationSetupSheet.downloadFailed'))
} finally {
setBusy(null)
}
@@ -102,7 +102,7 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
onReady?.()
} catch (err) {
triggerError()
- setError(err instanceof Error ? err.message : t('m.jX7Yn3E'))
+ setError(err instanceof Error ? err.message : t('mobileDictationSetupSheet.couldNotSelect'))
} finally {
setBusy(null)
}
@@ -119,7 +119,7 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
try {
setSetup(await setDictationConfig(client, { enabled }))
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.kocNlo8'))
+ setError(err instanceof Error ? err.message : t('mobileDictationSetupSheet.couldNotUpdate'))
}
},
[client]
@@ -130,8 +130,8 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
{/* Why: BottomDrawer already scrolls its children in a keyboard-aware container;
a nested capped ScrollView cut off the lower controls. */}
- {t('m.13hFHO4')}
- {t('m.D5YFHLU')}
+ {t('mobileDictationSetupSheet.setUpVoice')}
+ {t('mobileDictationSetupSheet.setupInstructions')}
{setup === null ? (
@@ -140,7 +140,7 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
) : (
<>
- {t('m.6WwF0_8')}
+ {t('mobileDictationSetupSheet.dictation')}
void handleToggleEnabled(v)} />
@@ -154,27 +154,35 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
{model.label}
{model.recommended ? (
- {t('m.TJd8_nE')}
+
+ {t('mobileDictationSetupSheet.recommended')}
+
) : null}
- {model.provider === 'openai' ? t('m.bh_QQps') : formatSize(model.sizeBytes)}
+ {model.provider === 'openai'
+ ? t('mobileDictationSetupSheet.open')
+ : formatSize(model.sizeBytes)}
{inFlight && model.progress != null
? ` · ${Math.round(model.progress * 100)}%`
: model.status === 'extracting'
- ? t('m.PG_Pfbo')
+ ? t('mobileDictationSetupSheet.extracting')
: ''}
{model.provider === 'openai' ? (
- {model.status === 'ready' ? t('m.D90AZhs') : t('m.qf7IWvA')}
+ {model.status === 'ready'
+ ? t('mobileDictationSetupSheet.api')
+ : t('mobileDictationSetupSheet.setUpDesktop')}
) : model.status === 'ready' ? (
isSelected ? (
- {t('m.ri8swSc')}
+
+ {t('mobileDictationSetupSheet.use')}
+
) : (
void handleUseModel(model)}
>
- {t('m.N18umz0')}
+
+ {t('mobileDictationSetupSheet.useMessage')}
+
)
) : inFlight ? (
@@ -204,7 +214,9 @@ export function MobileDictationSetupSheet({ visible, client, onClose, onReady }:
) : (
<>
- {t('m.oJ3sUM4')}
+
+ {t('mobileDictationSetupSheet.download')}
+
>
)}
diff --git a/mobile/src/components/MobileDiffReviewBody.tsx b/mobile/src/components/MobileDiffReviewBody.tsx
index 1050cb5c17c..a20fbae46ea 100644
--- a/mobile/src/components/MobileDiffReviewBody.tsx
+++ b/mobile/src/components/MobileDiffReviewBody.tsx
@@ -41,22 +41,28 @@ export function MobileDiffReviewBody({
onRetry
}: Props) {
if (screenState.kind === 'loading') {
- return
+ return
}
if (screenState.kind === 'error' || screenState.kind === 'unavailable') {
return (
)
}
if (filteredCount === 0) {
- return
+ return (
+
+ )
}
if (diffState.kind === 'loading') {
- return
+ return
}
if (diffState.kind !== 'ready') {
return
@@ -91,7 +97,9 @@ export function MobileDiffReviewBody({
})
}}
ListFooterComponent={
- diffState.truncated ? {t('m.W6MLNo0')} : null
+ diffState.truncated ? (
+ {t('mobileDiffReviewBody.diffTruncated')}
+ ) : null
}
/>
)
@@ -106,22 +114,22 @@ function DiffUnavailableState({
}) {
const title =
diffState.kind === 'binary'
- ? t('m.Cku_aRM')
+ ? t('mobileDiffReviewBody.binary')
: diffState.kind === 'too-large'
- ? t('m.BrE_aCg')
+ ? t('mobileDiffReviewBody.diffTooLarge')
: diffState.kind === 'deleted'
- ? t('m.9Sv7Jb4')
- : t('m.Rajm1co')
+ ? t('mobileDiffReviewBody.deleted')
+ : t('mobileDiffReviewBody.diffUnavailable')
const text =
diffState.kind === 'binary'
- ? t('m.FdOHIhk')
+ ? t('mobileDiffReviewBody.fileCannot')
: diffState.kind === 'too-large'
- ? t('m.YeQabYs')
+ ? t('mobileDiffReviewBody.diffTooLargeMobile')
: diffState.kind === 'deleted'
- ? t('m.Em5nLwQ')
+ ? t('mobileDiffReviewBody.fileDeleted')
: diffState.kind === 'error'
? diffState.message
- : t('m.PpZpLWw')
+ : t('mobileDiffReviewBody.select')
return
}
@@ -150,10 +158,10 @@ function CenteredState({
style={({ pressed }) => [styles.retryButton, pressed && styles.buttonPressed]}
onPress={onRetry}
accessibilityRole="button"
- accessibilityLabel={t('m.RF7UWwo')}
+ accessibilityLabel={t('mobileDiffReviewBody.retryLoading')}
>
- {t('m.GWwDGTE')}
+ {t('mobileDiffReviewBody.retry')}
) : null}
diff --git a/mobile/src/components/MobileDiffReviewDrawers.tsx b/mobile/src/components/MobileDiffReviewDrawers.tsx
index 614bbf4c51d..c4a72782801 100644
--- a/mobile/src/components/MobileDiffReviewDrawers.tsx
+++ b/mobile/src/components/MobileDiffReviewDrawers.tsx
@@ -22,10 +22,12 @@ export function MobileDiffReviewDrawers({ controller }: Props) {
<>
0
- ? t('m._TCuNKQ', { value0: controller.reviewedUnstagedCount })
+ ? t('mobileDiffReviewDrawers.reviewedFileCountReviewed', {
+ reviewedFileCount: controller.reviewedUnstagedCount
+ })
: undefined
}
actions={overflowActions}
@@ -33,20 +35,22 @@ export function MobileDiffReviewDrawers({ controller }: Props) {
/>
controller.setSendSheet(null)}
/>
{
const target = controller.discardTarget
@@ -69,7 +73,7 @@ function useSendActions(controller: ReturnType ({
- label: `${terminal.title || t('m.4GOORsg')} (${terminal.terminal.slice(0, 6)})`,
+ label: `${terminal.title || t('mobileDiffReviewDrawers.terminal')} (${terminal.terminal.slice(0, 6)})`,
icon: Send,
disabled: comments.length === 0,
skipAutoClose: true,
@@ -79,14 +83,14 @@ function useSendActions(controller: ReturnType void controller.createTerminalAndSend(comments)
},
{
- label: t('m.SGgu3t8'),
+ label: t('mobileDiffReviewDrawers.copy'),
icon: Copy,
disabled:
controller.screenState.kind !== 'ready' || controller.screenState.comments.length === 0,
@@ -100,21 +104,21 @@ function useOverflowActions(controller: ReturnType(
() => [
{
- label: t('m.SGgu3t8'),
+ label: t('mobileDiffReviewDrawers.copy'),
icon: Copy,
disabled:
controller.screenState.kind !== 'ready' || controller.screenState.comments.length === 0,
onPress: () => void controller.copyNotes()
},
{
- label: t('m.bboDcz4'),
+ label: t('mobileDiffReviewDrawers.sendUnsent'),
icon: Send,
disabled: controller.unsentComments.length === 0,
skipAutoClose: true,
onPress: () => void controller.openSendSheet()
},
{
- label: t('m.AMn9p6c'),
+ label: t('mobileDiffReviewDrawers.clear'),
icon: Trash2,
disabled:
controller.screenState.kind !== 'ready' ||
@@ -123,14 +127,14 @@ function useOverflowActions(controller: ReturnType void controller.clearSentNotes()
},
{
- label: t('m.9YSL2XY'),
+ label: t('mobileDiffReviewDrawers.stageReviewedFiles'),
icon: Check,
disabled: controller.reviewedUnstagedCount === 0 || controller.busyAction !== null,
skipAutoClose: true,
onPress: () => void controller.stageReviewedFiles()
},
{
- label: t('m.lDOi4xI'),
+ label: t('mobileDiffReviewDrawers.mark'),
icon: X,
disabled:
controller.screenState.kind !== 'ready' ||
@@ -140,7 +144,7 @@ function useOverflowActions(controller: ReturnType void controller.markUnreviewed()
},
{
- label: t('m.QyPs23A'),
+ label: t('mobileDiffReviewDrawers.open'),
icon: FileText,
disabled: !controller.currentItem || controller.currentItem.scope === 'branch',
onPress: () => void controller.openInSession()
@@ -154,10 +158,12 @@ function sendSheetMessage(
controller: ReturnType
): string | undefined {
return controller.sendSheet?.kind === 'loading'
- ? t('m.ycKwNOI')
+ ? t('mobileDiffReviewDrawers.loading')
: controller.sendSheet?.kind === 'error'
? controller.sendSheet.message
- : t('m.5Rc0T-w', { value0: controller.unsentComments.length })
+ : t('mobileDiffReviewDrawers.unsent', {
+ unsentCommentCount: controller.unsentComments.length
+ })
}
function NoteComposerDrawer({ controller }: Props) {
@@ -168,19 +174,23 @@ function NoteComposerDrawer({ controller }: Props) {
- {composer?.mode === 'edit' ? t('m.vX8hCPw') : t('m.SqSZ_D4')}
+ {composer?.mode === 'edit'
+ ? t('mobileDiffReviewDrawers.edit')
+ : t('mobileDiffReviewDrawers.add')}
{composer?.mode === 'create' && composer.lineNumber > 0
- ? t('m.YlMekyY', { value0: composer.lineNumber })
- : t('m.K4ExXj0')}
+ ? t('mobileDiffReviewDrawers.line', {
+ lineNumber: composer.lineNumber
+ })
+ : t('mobileDiffReviewDrawers.file')}
[styles.iconButton, pressed && styles.iconButtonPressed]}
onPress={controller.closeComposer}
accessibilityRole="button"
- accessibilityLabel={t('m.cy6hF-c')}
+ accessibilityLabel={t('mobileDiffReviewDrawers.cancel')}
>
@@ -191,7 +201,7 @@ function NoteComposerDrawer({ controller }: Props) {
onChangeText={controller.setComposerBody}
multiline
autoFocus
- placeholder={t('m.2lwuEDc')}
+ placeholder={t('mobileDiffReviewDrawers.reviewNote')}
placeholderTextColor={colors.textMuted}
accessibilityLabel={composerLabel(composer)}
/>
@@ -210,8 +220,10 @@ function composerLabel(
composer: { mode: 'create'; lineNumber: number } | { mode: 'edit'; comment: DiffComment } | null
): string {
return composer?.mode === 'create' && composer.lineNumber > 0
- ? t('m.972Qfrg', { value0: composer.lineNumber })
- : t('m.2lwuEDc')
+ ? t('mobileDiffReviewDrawers.saveNote', {
+ lineNumber: composer.lineNumber
+ })
+ : t('mobileDiffReviewDrawers.reviewNote')
}
function DeleteNoteButton({ onPress }: { onPress: () => Promise }) {
@@ -220,10 +232,10 @@ function DeleteNoteButton({ onPress }: { onPress: () => Promise }) {
style={({ pressed }) => [styles.secondaryButton, pressed && styles.buttonPressed]}
onPress={() => void onPress()}
accessibilityRole="button"
- accessibilityLabel={t('m.7BEb-8o')}
+ accessibilityLabel={t('mobileDiffReviewDrawers.deleteNote')}
>
- {t('m.-bToH9I')}
+ {t('mobileDiffReviewDrawers.delete')}
)
}
@@ -249,7 +261,7 @@ function SaveNoteButton({
accessibilityLabel={composerLabel(composer)}
>
- {t('m.ls_e0g8')}
+ {t('mobileDiffReviewDrawers.save')}
)
}
@@ -262,17 +274,17 @@ function CompletionDrawer({ controller }: Props) {
visible={controller.showCompletion}
onClose={() => controller.setShowCompletion(false)}
>
- {t('m.du7kB18')}
+ {t('mobileDiffReviewDrawers.reviewComplete')}
{t(
controller.queue.length === 1
? noteCount === 1
- ? 'm.QlrZNys'
- : 'm.J7M3gnY'
+ ? 'mobileDiffReviewDrawers.reviewedFileCountFileReviewedNoteCountNote'
+ : 'mobileDiffReviewDrawers.reviewedFileCountFileReviewedNoteCountNotes'
: noteCount === 1
- ? 'm.uM2_gxc'
- : 'm.JrNt3Dk',
- { value0: controller.queue.length, value1: noteCount }
+ ? 'mobileDiffReviewDrawers.reviewedFileCountFilesReviewedNoteCountNote'
+ : 'mobileDiffReviewDrawers.reviewedFileCountFilesReviewedNoteCountNotes',
+ { reviewedFileCount: controller.queue.length, noteCount: noteCount }
)}
@@ -281,20 +293,22 @@ function CompletionDrawer({ controller }: Props) {
disabled={controller.reviewedUnstagedCount === 0}
onPress={() => void controller.stageReviewedFiles()}
accessibilityRole="button"
- accessibilityLabel={t('m.XhmaYgY')}
+ accessibilityLabel={t('mobileDiffReviewDrawers.stageReviewedFilesAccessibility')}
>
- {t('m.a1hiCFE')}
+
+ {t('mobileDiffReviewDrawers.stageReviewed')}
+
[styles.primaryButton, pressed && styles.buttonPressed]}
disabled={controller.unsentComments.length === 0}
onPress={() => void controller.openSendSheet()}
accessibilityRole="button"
- accessibilityLabel={t('m.XNffV5A')}
+ accessibilityLabel={t('mobileDiffReviewDrawers.sendNotesAgent')}
>
- {t('m.voLBMwU')}
+ {t('mobileDiffReviewDrawers.sendNotes')}
diff --git a/mobile/src/components/MobileDiffReviewFileSummary.tsx b/mobile/src/components/MobileDiffReviewFileSummary.tsx
index 3bdd18a1a23..f8007cdbc3f 100644
--- a/mobile/src/components/MobileDiffReviewFileSummary.tsx
+++ b/mobile/src/components/MobileDiffReviewFileSummary.tsx
@@ -66,7 +66,11 @@ export function MobileDiffReviewFileSummary({
{mobileReviewScopeLabel(item)}
- {item.oldPath ? t('m.Tqe6zfQ', { value0: item.oldPath }) : ''}
+ {item.oldPath
+ ? t('mobileDiffReviewFileSummary.old', {
+ oldPath: item.oldPath
+ })
+ : ''}
@@ -74,13 +78,21 @@ export function MobileDiffReviewFileSummary({
{currentIndex + 1}/{filteredCount}
- {item.isReviewed ? {t('m.TGeBFA8')} : null}
- {item.changedSinceReview ? {t('m.cV_5zt0')} : null}
+ {item.isReviewed ? (
+ {t('mobileDiffReviewFileSummary.reviewed')}
+ ) : null}
+ {item.changedSinceReview ? (
+ {t('mobileDiffReviewFileSummary.changed')}
+ ) : null}
{item.noteCount > 0 ? (
{mobileReviewNoteCountLabel(item.noteCount)}
) : null}
{item.staleNoteCount > 0 ? (
- {t('m.OAIsqbU', { value0: item.staleNoteCount })}
+
+ {t('mobileDiffReviewFileSummary.staleNote', {
+ staleNoteCount: item.staleNoteCount
+ })}
+
) : null}
{fileNotes.length > 0 ? (
@@ -91,13 +103,13 @@ export function MobileDiffReviewFileSummary({
style={({ pressed }) => [styles.fileNote, pressed && styles.fileNotePressed]}
onPress={() => onEditNote(note)}
accessibilityRole="button"
- accessibilityLabel={t('m.6NQSDSg')}
+ accessibilityLabel={t('mobileDiffReviewFileSummary.edit')}
>
{note.body}
{staleCommentIds.has(note.id) ? (
- {t('m.PpqbMu4')}
+ {t('mobileDiffReviewFileSummary.stale')}
) : null}
))}
@@ -109,20 +121,20 @@ export function MobileDiffReviewFileSummary({
disabled={hunkDisabled}
onPress={() => onJumpHunk('previous')}
accessibilityRole="button"
- accessibilityLabel={t('m.co1PXQY')}
+ accessibilityLabel={t('mobileDiffReviewFileSummary.previous')}
>
- {t('m.N0W7j-Y')}
+ {t('mobileDiffReviewFileSummary.hunk')}
[styles.hunkButton, pressed && styles.hunkButtonPressed]}
disabled={hunkDisabled}
onPress={() => onJumpHunk('next')}
accessibilityRole="button"
- accessibilityLabel={t('m.-v8Njek')}
+ accessibilityLabel={t('mobileDiffReviewFileSummary.next')}
>
- {t('m.N0W7j-Y')}
+ {t('mobileDiffReviewFileSummary.hunk')}
diff --git a/mobile/src/components/MobileDiffReviewFooter.tsx b/mobile/src/components/MobileDiffReviewFooter.tsx
index 83b0b9892e6..1ca5ebfa76f 100644
--- a/mobile/src/components/MobileDiffReviewFooter.tsx
+++ b/mobile/src/components/MobileDiffReviewFooter.tsx
@@ -44,10 +44,10 @@ export function MobileDiffReviewFooter({
disabled={busyAction !== null}
onPress={() => onGitMutation('git.stage', item)}
accessibilityRole="button"
- accessibilityLabel={t('m.SzcIpKs')}
+ accessibilityLabel={t('mobileDiffReviewFooter.stageFile')}
>
- {t('m.JiM1DAU')}
+ {t('mobileDiffReviewFooter.stage')}
) : null}
{item.canUnstage ? (
@@ -56,10 +56,10 @@ export function MobileDiffReviewFooter({
disabled={busyAction !== null}
onPress={() => onGitMutation('git.unstage', item)}
accessibilityRole="button"
- accessibilityLabel={t('m.VZPK0FM')}
+ accessibilityLabel={t('mobileDiffReviewFooter.unstageFile')}
>
- {t('m.v58oW_E')}
+ {t('mobileDiffReviewFooter.unstage')}
) : null}
{item.canDiscard ? (
@@ -68,10 +68,10 @@ export function MobileDiffReviewFooter({
disabled={busyAction !== null}
onPress={() => onDiscard(item)}
accessibilityRole="button"
- accessibilityLabel={t('m.TpLj1K8')}
+ accessibilityLabel={t('mobileDiffReviewFooter.discardFile')}
>
- {t('m.lL_q8JA')}
+ {t('mobileDiffReviewFooter.discard')}
) : null}
@@ -80,7 +80,7 @@ export function MobileDiffReviewFooter({
style={({ pressed }) => [styles.navButton, pressed && styles.buttonPressed]}
onPress={() => onMoveFile('previous')}
accessibilityRole="button"
- accessibilityLabel={t('m.0CC3Pjk')}
+ accessibilityLabel={t('mobileDiffReviewFooter.previous')}
>
@@ -88,10 +88,10 @@ export function MobileDiffReviewFooter({
style={({ pressed }) => [styles.footerButton, pressed && styles.buttonPressed]}
onPress={onAddFileNote}
accessibilityRole="button"
- accessibilityLabel={t('m.e_IyR5Y')}
+ accessibilityLabel={t('mobileDiffReviewFooter.add')}
>
- {t('m.vRhESp0')}
+ {t('mobileDiffReviewFooter.note')}
[
@@ -101,18 +101,20 @@ export function MobileDiffReviewFooter({
]}
onPress={onMarkReviewed}
accessibilityRole="button"
- accessibilityLabel={t('m.a2xZWo8')}
+ accessibilityLabel={t('mobileDiffReviewFooter.markFile')}
>
- {item.isReviewed ? t('m.gUbQPjk') : t('m.gLGElnY')}
+ {item.isReviewed
+ ? t('mobileDiffReviewFooter.reviewed')
+ : t('mobileDiffReviewFooter.markReviewed')}
[styles.navButton, pressed && styles.buttonPressed]}
onPress={() => onMoveFile('next')}
accessibilityRole="button"
- accessibilityLabel={t('m.n5_ZJMM')}
+ accessibilityLabel={t('mobileDiffReviewFooter.next')}
>
diff --git a/mobile/src/components/MobileDiffReviewHeader.tsx b/mobile/src/components/MobileDiffReviewHeader.tsx
index eef71bb5f11..098b2e0f516 100644
--- a/mobile/src/components/MobileDiffReviewHeader.tsx
+++ b/mobile/src/components/MobileDiffReviewHeader.tsx
@@ -54,13 +54,13 @@ export function MobileDiffReviewHeader({
style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}
onPress={onBack}
accessibilityRole="button"
- accessibilityLabel={t('m.Xot6WdE')}
+ accessibilityLabel={t('mobileDiffReviewHeader.back')}
>
- {t('m.1lIaLfU')}
+ {t('mobileDiffReviewHeader.changes')}
{worktreeLabel}
@@ -71,7 +71,7 @@ export function MobileDiffReviewHeader({
style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}
onPress={onOpenPRSidebar}
accessibilityRole="button"
- accessibilityLabel={t('m.GAXIVbU')}
+ accessibilityLabel={t('mobileDiffReviewHeader.openPull')}
>
@@ -80,14 +80,17 @@ export function MobileDiffReviewHeader({
style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}
onPress={onOpenActions}
accessibilityRole="button"
- accessibilityLabel={t('m.LU8BxDQ')}
+ accessibilityLabel={t('mobileDiffReviewHeader.openReview')}
>
- {t('m.fEoGCmQ', { value0: reviewedCount, value1: queueLength })}
+ {t('mobileDiffReviewHeader.reviewed', {
+ reviewedCount: reviewedCount,
+ queueLength: queueLength
+ })}
{mobileReviewUnsentNoteCountLabel(unsentCount)}
@@ -107,7 +110,9 @@ export function MobileDiffReviewHeader({
onPress={() => onSelectFilter(item)}
accessibilityRole="button"
accessibilityState={{ selected: filter === item }}
- accessibilityLabel={t('m.qcWQKWI', { value0: mobileReviewFilterLabel(item) })}
+ accessibilityLabel={t('mobileDiffReviewHeader.show', {
+ mobileReviewFilterLabel: mobileReviewFilterLabel(item)
+ })}
>
{mobileReviewFilterLabel(item)}
diff --git a/mobile/src/components/MobileDiffReviewLine.tsx b/mobile/src/components/MobileDiffReviewLine.tsx
index 59ff0bc13b1..b455eb953d4 100644
--- a/mobile/src/components/MobileDiffReviewLine.tsx
+++ b/mobile/src/components/MobileDiffReviewLine.tsx
@@ -20,10 +20,17 @@ type Props = {
function accessibilityLabelForLine(line: MobileDiffLine): string {
const number = mobileDiffLineNumber(line)
const label =
- line.kind === 'add' ? t('m.bnfXRLU') : line.kind === 'delete' ? t('m.0l1OykU') : t('m.9FhY-Sk')
+ line.kind === 'add'
+ ? t('mobileDiffReviewLine.added')
+ : line.kind === 'delete'
+ ? t('mobileDiffReviewLine.deleted')
+ : t('mobileDiffReviewLine.context')
return number
- ? t('m.FjJb7Lo', { value0: label, value1: number })
- : t('m.CKtsHVY', { value0: label })
+ ? t('mobileDiffReviewLine.lineLabelLineLine', {
+ lineLabel: label,
+ lineNumber: number
+ })
+ : t('mobileDiffReviewLine.lineLabelLine', { lineLabel: label })
}
function canCommentOnLine(line: MobileDiffLine): boolean {
@@ -65,7 +72,9 @@ export function MobileDiffReviewLine({
accessibilityRole={canComment ? 'button' : 'text'}
accessibilityLabel={
canComment && line.newLineNumber !== undefined
- ? t('m.mCd0V4A', { value0: line.newLineNumber })
+ ? t('mobileDiffReviewLine.add', {
+ newLineNumber: line.newLineNumber
+ })
: accessibilityLabelForLine(line)
}
>
@@ -81,7 +90,9 @@ export function MobileDiffReviewLine({
style={({ pressed }) => [styles.noteButton, pressed && styles.noteButtonPressed]}
onPress={() => onEditNote(comment)}
accessibilityRole="button"
- accessibilityLabel={t('m.mIZ0_V0', { value0: comment.lineNumber })}
+ accessibilityLabel={t('mobileDiffReviewLine.edit', {
+ lineNumber: comment.lineNumber
+ })}
>
0
- ? t('m.AYqemqw', { value0: props.worktreeCounts.active })
+ ? t('mobileHostCard.active', {
+ activeWorktreeCount: props.worktreeCounts.active
+ })
: null
]
.filter(Boolean)
@@ -63,7 +70,7 @@ export function MobileHostCard(props: {
) : null}
{props.verdict.kind === 'unreachable' && !props.host.relay ? (
- {t('m.4bPe4Ao')}
+ {t('mobileHostCard.update')}
) : null}
diff --git a/mobile/src/components/MobileHtmlPreview.tsx b/mobile/src/components/MobileHtmlPreview.tsx
index 4f0029a0f5d..89a61cbc02b 100644
--- a/mobile/src/components/MobileHtmlPreview.tsx
+++ b/mobile/src/components/MobileHtmlPreview.tsx
@@ -24,18 +24,18 @@ export function MobileHtmlPreview({ html, renderSource }: Props) {
setMode('preview')}
- accessibilityLabel={t('m.-FhPMsI')}
+ accessibilityLabel={t('mobileHtmlPreview.previewRendered')}
>
- {t('m.bvUfBWI')}
+ {t('mobileHtmlPreview.preview')}
setMode('source')}
- accessibilityLabel={t('m.BE93iOI')}
+ accessibilityLabel={t('mobileHtmlPreview.view')}
>
- {t('m.HdJ9GVY')}
+ {t('mobileHtmlPreview.source')}
{mode === 'preview' ? (
diff --git a/mobile/src/components/MobileMarkdown.tsx b/mobile/src/components/MobileMarkdown.tsx
index 3fd09d32c23..c4f4eeb268b 100644
--- a/mobile/src/components/MobileMarkdown.tsx
+++ b/mobile/src/components/MobileMarkdown.tsx
@@ -80,7 +80,7 @@ function renderInline(text: string, onOpenFile?: (relativePath: string) => void)
if (image) {
parts.push(
openMarkdownUrl(image[2]!)}>
- {image[1] || t('m.oitC92A')}
+ {image[1] || t('mobileMarkdown.image')}
)
} else if (link) {
@@ -190,7 +190,7 @@ function MobileMarkdownInner({ content, fallback = '', textScale = 1, onOpenFile
style={styles.imageFrame}
onPress={() => openMarkdownUrl(block.url)}
>
- {block.alt || t('m.fTbhbgg')}
+ {block.alt || t('mobileMarkdown.open')}
{block.url}
@@ -223,9 +223,17 @@ function MobileMarkdownInner({ content, fallback = '', textScale = 1, onOpenFile
))}
{hiddenRows > 0 || hiddenColumns > 0 ? (
- {hiddenRows > 0 ? t('m.Jmh-3ik', { value0: hiddenRows }) : ''}
+ {hiddenRows > 0
+ ? t('mobileMarkdown.hiddenRow', {
+ hiddenRowCount: hiddenRows
+ })
+ : ''}
{hiddenRows > 0 && hiddenColumns > 0 ? ' · ' : ''}
- {hiddenColumns > 0 ? t('m.kijMg1M', { value0: hiddenColumns }) : ''}
+ {hiddenColumns > 0
+ ? t('mobileMarkdown.hiddenColumn', {
+ hiddenColumnCount: hiddenColumns
+ })
+ : ''}
) : null}
@@ -243,7 +251,7 @@ function MobileMarkdownInner({ content, fallback = '', textScale = 1, onOpenFile
? `${itemIndex + 1}.`
: '-'
: item.checked
- ? t('m.ywMqsWY')
+ ? t('mobileMarkdown.x')
: '[ ]'}
diff --git a/mobile/src/components/MobilePRSidebar.tsx b/mobile/src/components/MobilePRSidebar.tsx
index 2b6e9e427a4..5c5ea5efeac 100644
--- a/mobile/src/components/MobilePRSidebar.tsx
+++ b/mobile/src/components/MobilePRSidebar.tsx
@@ -167,12 +167,12 @@ function PrSidebarContent({
return (
- {t('m.-ZCN2f0')}
+ {t('mobilePrsidebar.loading')}
)
}
if (branch === 'error') {
- const message = state.kind === 'error' ? state.message : t('m.nfDKqg4')
+ const message = state.kind === 'error' ? state.message : t('mobilePrsidebar.something')
return (
{message}
@@ -180,10 +180,10 @@ function PrSidebarContent({
style={styles.retryButton}
onPress={onRetry}
accessibilityRole="button"
- accessibilityLabel={t('m.Re9yZkw')}
+ accessibilityLabel={t('mobilePrsidebar.retryLoading')}
>
- {t('m.viizK3M')}
+ {t('mobilePrsidebar.retry')}
)
@@ -191,7 +191,8 @@ function PrSidebarContent({
if (branch === 'blocked' || actions.blocked) {
// Permanent failure (R9): explanatory, no retry-encouragement styling. A
// mutation-time block (actions.blocked) routes here even from a ready state.
- const message = actions.blocked ?? (state.kind === 'blocked' ? state.message : t('m.UL6zDWw'))
+ const message =
+ actions.blocked ?? (state.kind === 'blocked' ? state.message : t('mobilePrsidebar.not'))
return (
{message}
diff --git a/mobile/src/components/MobilePrBasePicker.tsx b/mobile/src/components/MobilePrBasePicker.tsx
index 8547698ce34..f38cb539337 100644
--- a/mobile/src/components/MobilePrBasePicker.tsx
+++ b/mobile/src/components/MobilePrBasePicker.tsx
@@ -87,7 +87,7 @@ export function MobilePrBasePicker({
}}
onFocus={() => setFocused(true)}
onBlur={() => setFocused(false)}
- placeholder={t('m.O3OecWo')}
+ placeholder={t('mobilePrBasePicker.main')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
diff --git a/mobile/src/components/MobileRichMarkdownEditor.tsx b/mobile/src/components/MobileRichMarkdownEditor.tsx
index ff765d4dee1..61d4888393d 100644
--- a/mobile/src/components/MobileRichMarkdownEditor.tsx
+++ b/mobile/src/components/MobileRichMarkdownEditor.tsx
@@ -91,21 +91,69 @@ type ToolbarItem = {
}
const TOOLBAR_ITEMS: ToolbarItem[] = [
- { command: 'paragraph', label: t('m.3Ph2vuM'), icon: Pilcrow },
- { command: 'heading1', label: t('m.Tkw-XG4'), icon: Heading1 },
- { command: 'heading2', label: t('m.T0-0mLw'), icon: Heading2 },
- { command: 'heading3', label: t('m.qpILEoE'), icon: Heading3 },
- { command: 'bold', label: t('m.TcUIfHg'), icon: Bold },
- { command: 'italic', label: t('m.zwoUjcU'), icon: Italic },
- { command: 'strike', label: t('m.wwdkeIc'), icon: Strikethrough },
- { command: 'bulletList', label: t('m.hKyID9A'), icon: List },
- { command: 'orderedList', label: t('m._79TK6I'), icon: ListOrdered },
- { command: 'taskList', label: t('m.jPlQhig'), icon: ListTodo },
- { command: 'quote', label: t('m.dQOT7tM'), icon: Quote },
- { command: 'link', label: t('m.eLAtZAk'), icon: Link },
- { command: 'image', label: t('m.fT3N_UQ'), icon: ImageIcon },
- { command: 'inlineCode', label: t('m.h1ikg-I'), icon: Code2 },
- { command: 'codeBlock', label: t('m.sLMnsJA'), icon: FileCode2 }
+ {
+ command: 'paragraph',
+ label: t('mobileRichMarkdownEditor.body'),
+ icon: Pilcrow
+ },
+ {
+ command: 'heading1',
+ label: t('mobileRichMarkdownEditor.h1'),
+ icon: Heading1
+ },
+ {
+ command: 'heading2',
+ label: t('mobileRichMarkdownEditor.h2'),
+ icon: Heading2
+ },
+ {
+ command: 'heading3',
+ label: t('mobileRichMarkdownEditor.h3'),
+ icon: Heading3
+ },
+ { command: 'bold', label: t('mobileRichMarkdownEditor.bold'), icon: Bold },
+ {
+ command: 'italic',
+ label: t('mobileRichMarkdownEditor.italic'),
+ icon: Italic
+ },
+ {
+ command: 'strike',
+ label: t('mobileRichMarkdownEditor.strike'),
+ icon: Strikethrough
+ },
+ {
+ command: 'bulletList',
+ label: t('mobileRichMarkdownEditor.bullet'),
+ icon: List
+ },
+ {
+ command: 'orderedList',
+ label: t('mobileRichMarkdownEditor.numbered'),
+ icon: ListOrdered
+ },
+ {
+ command: 'taskList',
+ label: t('mobileRichMarkdownEditor.checklist'),
+ icon: ListTodo
+ },
+ { command: 'quote', label: t('mobileRichMarkdownEditor.quote'), icon: Quote },
+ { command: 'link', label: t('mobileRichMarkdownEditor.link'), icon: Link },
+ {
+ command: 'image',
+ label: t('mobileRichMarkdownEditor.image'),
+ icon: ImageIcon
+ },
+ {
+ command: 'inlineCode',
+ label: t('mobileRichMarkdownEditor.inline'),
+ icon: Code2
+ },
+ {
+ command: 'codeBlock',
+ label: t('mobileRichMarkdownEditor.code'),
+ icon: FileCode2
+ }
]
function MobileRichMarkdownEditorInner({
diff --git a/mobile/src/components/MobileSearchField.tsx b/mobile/src/components/MobileSearchField.tsx
index f43f947e59a..ca651d5b9c3 100644
--- a/mobile/src/components/MobileSearchField.tsx
+++ b/mobile/src/components/MobileSearchField.tsx
@@ -44,7 +44,7 @@ export function MobileSearchField({
placeholder,
onClear,
showClear,
- clearAccessibilityLabel = t('m.5GRCze0'),
+ clearAccessibilityLabel = t('mobileSearchField.clear'),
autoFocus = false,
focusKey,
returnKeyType = 'search',
diff --git a/mobile/src/components/MobileWorkspaceNameInput.tsx b/mobile/src/components/MobileWorkspaceNameInput.tsx
index cd0218f7311..a519ad57a38 100644
--- a/mobile/src/components/MobileWorkspaceNameInput.tsx
+++ b/mobile/src/components/MobileWorkspaceNameInput.tsx
@@ -33,7 +33,7 @@ export function MobileWorkspaceNameInput({
return (
diff --git a/mobile/src/components/NewWorktreeModal.tsx b/mobile/src/components/NewWorktreeModal.tsx
index ffa117f34f1..aaae75720a2 100644
--- a/mobile/src/components/NewWorktreeModal.tsx
+++ b/mobile/src/components/NewWorktreeModal.tsx
@@ -430,7 +430,7 @@ function NewWorktreeModalContent({
setSshState({
targetId: selectedRepoConnectionId,
status: 'error',
- error: err instanceof Error ? err.message : t('m.Gli-J-E'),
+ error: err instanceof Error ? err.message : t('newWorktreeModal.failedRead'),
reconnectAttempt: 0
})
}
@@ -554,7 +554,7 @@ function NewWorktreeModalContent({
setSshState({
targetId: selectedRepoConnectionId,
status: 'error',
- error: err instanceof Error ? err.message : t('m.FYj9qCM'),
+ error: err instanceof Error ? err.message : t('newWorktreeModal.failedConnect'),
reconnectAttempt: 0
})
} finally {
@@ -572,7 +572,11 @@ function NewWorktreeModalContent({
try {
if (sshGate.requiresConnection) {
- setError(t('m.9ZRI2cs', { value0: selectedRepo.displayName }))
+ setError(
+ t('newWorktreeModal.connectDisplay', {
+ displayName: selectedRepo.displayName
+ })
+ )
return
}
let latestRuntimeSettings = runtimeSettings
@@ -592,7 +596,7 @@ function NewWorktreeModalContent({
) {
setSelectedAgent(pickPreferredNewWorktreeAgent(latestRuntimeSettings, detectedAgentIds))
setAgentOverridden(false)
- setError(t('m.F1iAV4A'))
+ setError(t('newWorktreeModal.selected'))
return
}
@@ -612,7 +616,7 @@ function NewWorktreeModalContent({
setupDecision = options.setupOverride
} else if (setupRunPolicy === 'ask') {
if (!setupDecisionChoice) {
- setError(t('m.rwQDraY'))
+ setError(t('newWorktreeModal.choose'))
return
}
setupDecision = setupDecisionChoice
@@ -670,7 +674,7 @@ function NewWorktreeModalContent({
onClose()
onCreated(result.worktreeId, result.name)
} catch (e) {
- setError(e instanceof Error ? e.message : t('m.jSxyaws'))
+ setError(e instanceof Error ? e.message : t('newWorktreeModal.failedCreate'))
} finally {
createInFlightRef.current = false
setCreating(false)
@@ -743,7 +747,7 @@ function NewWorktreeModalContent({
transitionDrawer('form')
await handleCreate({ setupOverride: 'run', approvedSetupContentHash: approvedHash })
} catch (err) {
- setError(err instanceof Error ? err.message : t('m.C8UjQk0'))
+ setError(err instanceof Error ? err.message : t('newWorktreeModal.failedTrust'))
} finally {
setupTrustActionInFlightRef.current = false
if (!createInFlightRef.current) {
@@ -788,8 +792,8 @@ function NewWorktreeModalContent({
>
- {t('m.ZK7Il8w')}
- {t('m.sMWTBAA')}
+ {t('newWorktreeModal.create')}
+ {t('newWorktreeModal.pick')}
{loading ? (
@@ -798,12 +802,12 @@ function NewWorktreeModalContent({
) : repos.length === 0 ? (
- {t('m.osrkufA')}
+ {t('newWorktreeModal.no')}
) : (
<>
- {t('m.38lAWJQ')}
+ {t('newWorktreeModal.repository')}
{
@@ -820,7 +824,7 @@ function NewWorktreeModalContent({
style={[styles.fieldButtonText, !selectedRepo && styles.fieldButtonPlaceholder]}
numberOfLines={1}
>
- {selectedRepo?.displayName ?? t('m.2Kl8BY4')}
+ {selectedRepo?.displayName ?? t('newWorktreeModal.select')}
@@ -828,7 +832,9 @@ function NewWorktreeModalContent({
setError('')}
@@ -841,7 +847,7 @@ function NewWorktreeModalContent({
{selectedRepoConnectionId ? (
- {t('m.JNDDz3c')}
+ {t('newWorktreeModal.ssh')}
- {selectedRepo?.displayName ?? t('m.AmkPWYA')}
+ {selectedRepo?.displayName ?? t('newWorktreeModal.remote')}
{workspaceSshStatusLabel(sshGate.status)}
@@ -872,7 +878,9 @@ function NewWorktreeModalContent({
onPress={() => void connectSelectedSshRepo()}
>
- {sshGate.connectInProgress ? t('m.oroOvnM') : t('m.O93svfk')}
+ {sshGate.connectInProgress
+ ? t('newWorktreeModal.connecting')
+ : t('newWorktreeModal.connect')}
)}
@@ -883,7 +891,7 @@ function NewWorktreeModalContent({
) : null}
- {t('m.VEK8Z7E')}
+ {t('newWorktreeModal.agent')}
- {sshGate.requiresConnection ? t('m.M2A4pJA') : selectedAgent.label}
+ {sshGate.requiresConnection
+ ? t('newWorktreeModal.connectRepositoryFirst')
+ : selectedAgent.label}
setShowAdvanced(!showAdvanced)}>
- {t('m.ATo76K0')}
+ {t('newWorktreeModal.advanced')}
{showAdvanced ? (
) : (
@@ -917,12 +927,12 @@ function NewWorktreeModalContent({
/>
- {t('m.LMAqKNQ')}
+ {t('newWorktreeModal.note')}
- {t('m.0cbkbTE')}
+ {t('newWorktreeModal.setup')}
{setupSource && (
- {setupSource === 'orca.yaml' ? t('m.hiRz7rE') : t('m.8ckUTUg')}
+ {setupSource === 'orca.yaml'
+ ? t('newWorktreeModal.orca')
+ : t('newWorktreeModal.hooks')}
)}
@@ -951,7 +963,7 @@ function NewWorktreeModalContent({
]}
onPress={() => setSetupDecisionChoice('run')}
>
- {t('m.0qYyICI')}
+ {t('newWorktreeModal.run')}
setSetupDecisionChoice('skip')}
>
- {t('m.sZHa-TU')}
+ {t('newWorktreeModal.skip')}
) : (
- {t('m.obLmzkw')}
+
+ {t('newWorktreeModal.runSetup')}
+
) : (
- {sshGate.requiresConnection ? t('m.g5YUeP0') : t('m.ZK7Il8w')}
+ {sshGate.requiresConnection
+ ? t('newWorktreeModal.connectRepository')
+ : t('newWorktreeModal.create')}
)}
@@ -1026,7 +1042,7 @@ function NewWorktreeModalContent({
handleRepoSelected(item.repo)}
@@ -1038,7 +1054,7 @@ function NewWorktreeModalContent({
{
diff --git a/mobile/src/components/ProtocolBlockScreen.tsx b/mobile/src/components/ProtocolBlockScreen.tsx
index a576e940f1c..78fee54484d 100644
--- a/mobile/src/components/ProtocolBlockScreen.tsx
+++ b/mobile/src/components/ProtocolBlockScreen.tsx
@@ -17,20 +17,22 @@ export function ProtocolBlockScreen({ verdict }: Props) {
const mobileUpdateTarget =
Platform.OS === 'ios'
? {
- label: t('m.oxg5VTs'),
+ label: t('protocolBlockScreen.openApp'),
url: IOS_APP_STORE_URL,
storeName: t('protocol.block.appStoreName')
}
: {
- label: t('m.h3ZwGv0'),
+ label: t('protocolBlockScreen.openGit'),
url: RELEASES_URL,
storeName: t('protocol.block.githubReleasesName')
}
const primaryAction = isMobileTooOld
? { label: mobileUpdateTarget.label, url: mobileUpdateTarget.url }
- : { label: t('m.h3ZwGv0'), url: RELEASES_URL }
+ : { label: t('protocolBlockScreen.openGit'), url: RELEASES_URL }
- const title = isMobileTooOld ? t('m.NkNSfjQ') : t('m.amP19yQ')
+ const title = isMobileTooOld
+ ? t('protocolBlockScreen.updateOrcaMobile')
+ : t('protocolBlockScreen.updateOrcaYour')
const body = isMobileTooOld
? t('protocol.block.mobileTooOldBody', { storeName: mobileUpdateTarget.storeName })
: t('protocol.block.desktopTooOldBody')
@@ -57,7 +59,7 @@ export function ProtocolBlockScreen({ verdict }: Props) {
router.replace('/')
}}
>
- {t('m.kA_OuTE')}
+ {t('protocolBlockScreen.back')}
{recoveryNote}
diff --git a/mobile/src/components/SetupHookTrustDrawer.tsx b/mobile/src/components/SetupHookTrustDrawer.tsx
index fe6f596f11e..71e82875f20 100644
--- a/mobile/src/components/SetupHookTrustDrawer.tsx
+++ b/mobile/src/components/SetupHookTrustDrawer.tsx
@@ -41,15 +41,21 @@ export function SetupHookTrustDrawer({
{prompt.previouslyApproved
- ? t('m.egQ-qgQ', { value0: prompt.repoName })
- : t('m.SSMlLr8', { value0: prompt.repoName })}
+ ? t('setupHookTrustDrawer.repo', {
+ repoName: prompt.repoName
+ })
+ : t('setupHookTrustDrawer.runSetup', {
+ repoName: prompt.repoName
+ })}
- {t('m.JU7DVfY')}
+ {t('setupHookTrustDrawer.repositorys')}
- {prompt.previouslyApproved ? t('m.gxXtGpI') : t('m.m7jxYm8')}
+ {prompt.previouslyApproved
+ ? t('setupHookTrustDrawer.new')
+ : t('setupHookTrustDrawer.setup')}
{prompt.scriptContent}
@@ -57,16 +63,16 @@ export function SetupHookTrustDrawer({
- {t('m.wOCs5LA')}
+ {t('setupHookTrustDrawer.runHooks')}
- {t('m.hUSRq7I')}
+ {t('setupHookTrustDrawer.always')}
- {t('m.Pe9Dmhc')}
+ {t('setupHookTrustDrawer.do')}
diff --git a/mobile/src/components/SmartWorkspaceAdvancedFields.tsx b/mobile/src/components/SmartWorkspaceAdvancedFields.tsx
index e0109513dde..4959cdcc309 100644
--- a/mobile/src/components/SmartWorkspaceAdvancedFields.tsx
+++ b/mobile/src/components/SmartWorkspaceAdvancedFields.tsx
@@ -18,12 +18,12 @@ export function SmartWorkspaceAdvancedFields({ composer, selectedRepoIsGit }: Pr
<>
{selection ? (
- {t('m.jueQw6Q')}
+ {t('smartWorkspaceAdvancedFields.name')}
- {t('m.CATZTEM')}
+ {t('smartWorkspaceAdvancedFields.branch')}
- {t('m.Yz166iM', { value0: composer.reuseEligibleBranch })}
+ {t('smartWorkspaceAdvancedFields.reuse', {
+ reuseEligibleBranch: composer.reuseEligibleBranch
+ })}
- {t('m.J6XOFqM')}
+ {t('smartWorkspaceSourceDrawer.name')}
- {t('m.A6zs-7I')}
+ {t('smartWorkspaceSourceDrawer.done')}
@@ -207,21 +207,25 @@ export function SmartWorkspaceSourceDrawer({
{crossRepoPrompt ? (
- {t('m.WDddFyg', {
- value0: crossRepoPrompt.link.slug.owner,
- value1: crossRepoPrompt.link.slug.repo
+ {t('smartWorkspaceSourceDrawer.item', {
+ owner: crossRepoPrompt.link.slug.owner,
+ repo: crossRepoPrompt.link.slug.repo
})}
- {t('m.h8XKauY')}
+
+ {t('smartWorkspaceSourceDrawer.cancel')}
+
void handleAcceptCrossRepo()}
>
- {t('m.FLDQvbE', { value0: crossRepoPrompt.matchingRepo.displayName })}
+ {t('smartWorkspaceSourceDrawer.switch', {
+ displayName: crossRepoPrompt.matchingRepo.displayName
+ })}
@@ -229,9 +233,9 @@ export function SmartWorkspaceSourceDrawer({
) : null}
{!sshReady && effectiveMode !== 'text' && effectiveMode !== 'linear' ? (
- {t('m.2sNZWLI')}
+ {t('smartWorkspaceSourceDrawer.connect')}
) : needsGitHubRemote ? (
- {t('m.LbOI-wE')}
+ {t('smartWorkspaceSourceDrawer.ssh')}
) : error ? (
{error}
) : null}
@@ -250,9 +254,9 @@ export function SmartWorkspaceSourceDrawer({
) : showEmpty ? (
- {emptyHint || t('m.QjSzvc4')}
+ {emptyHint || t('smartWorkspaceSourceDrawer.no')}
) : rows.length === 0 && effectiveMode === 'text' ? (
- {t('m.qNPX_ws')}
+ {t('smartWorkspaceSourceDrawer.typeWorkspace')}
) : null
}
renderItem={({ item }) => (
@@ -305,7 +309,7 @@ export function SmartWorkspaceSourceDrawer({
style={styles.search}
value={composer.name}
onChangeText={composer.setName}
- placeholder={t('m.qOsqJv0')}
+ placeholder={t('smartWorkspaceSourceDrawer.typeName')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
diff --git a/mobile/src/components/SmartWorkspaceSourceField.tsx b/mobile/src/components/SmartWorkspaceSourceField.tsx
index 6428fd3e00d..dc8000eee35 100644
--- a/mobile/src/components/SmartWorkspaceSourceField.tsx
+++ b/mobile/src/components/SmartWorkspaceSourceField.tsx
@@ -62,7 +62,7 @@ export function SmartWorkspaceSourceField({
return (
- {label} {t('m.eMl2uLM')}
+ {label} {t('smartWorkspaceSourceField.optional')}
{selection ? (
@@ -92,7 +92,7 @@ export function SmartWorkspaceSourceField({
onChangeText={composer.setName}
onFocus={openDrawer}
editable={!disabled && interactive}
- placeholder={t('m.HHq8Y80')}
+ placeholder={t('smartWorkspaceSourceField.type')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
diff --git a/mobile/src/components/SmartWorkspaceSourceRow.tsx b/mobile/src/components/SmartWorkspaceSourceRow.tsx
index 26997de0252..b5d3daeb2b3 100644
--- a/mobile/src/components/SmartWorkspaceSourceRow.tsx
+++ b/mobile/src/components/SmartWorkspaceSourceRow.tsx
@@ -22,27 +22,29 @@ function resolveRowContent(row: SourceRow): RowContent {
case 'use-name':
return {
icon: ,
- title: t('m.uK2T1OQ', { value0: row.name }),
- subtitle: t('m.Z7csSYQ')
+ title: t('smartWorkspaceSourceRow.use', { rowName: row.name }),
+ subtitle: t('smartWorkspaceSourceRow.name')
}
case 'create-branch':
return {
icon: ,
- title: t('m.dDSXnKk', { value0: row.name }),
- subtitle: t('m.zTK803o')
+ title: t('smartWorkspaceSourceRow.create', {
+ rowName: row.name
+ }),
+ subtitle: t('smartWorkspaceSourceRow.new')
}
case 'github':
return {
icon: ,
title: row.item.title,
- subtitle: `${row.item.type === 'pr' ? t('m.Jq988q0') : t('m.kWDpsSU')}${row.item.number}`,
+ subtitle: `${row.item.type === 'pr' ? t('smartWorkspaceSourceRow.pr') : t('smartWorkspaceSourceRow.issue')}${row.item.number}`,
status: row.item.state
}
case 'gitlab':
return {
icon: ,
title: row.item.title,
- subtitle: `${row.item.type === 'mr' ? t('m.G_t8Rjg') : t('m.kWDpsSU')}${row.item.number}`,
+ subtitle: `${row.item.type === 'mr' ? t('smartWorkspaceSourceRow.mr') : t('smartWorkspaceSourceRow.issue')}${row.item.number}`,
status: row.item.state
}
case 'branch':
@@ -55,7 +57,7 @@ function resolveRowContent(row: SourceRow): RowContent {
return {
icon: ,
title: row.issue.title,
- subtitle: `${row.issue.identifier} · ${row.issue.team?.key ?? t('m.17Ky5K0')}`,
+ subtitle: `${row.issue.identifier} · ${row.issue.team?.key ?? t('smartWorkspaceSourceRow.linear')}`,
status: row.issue.state?.name
}
default:
diff --git a/mobile/src/components/TerminalShortcutSettings.tsx b/mobile/src/components/TerminalShortcutSettings.tsx
index 940481f207b..4af6dd88520 100644
--- a/mobile/src/components/TerminalShortcutSettings.tsx
+++ b/mobile/src/components/TerminalShortcutSettings.tsx
@@ -223,8 +223,10 @@ export function TerminalShortcutSettings({
return (
<>
- {t('m.u1ZHouk')}
- {t('m.Odmd4jg')}
+
+ {t('terminalShortcutSettings.shortcut')}
+
+ {t('terminalShortcutSettings.toggle')}
- {t('m.P0qiUsA')}
- {t('m._YyvrjM')}
+ {t('terminalShortcutSettings.reset')}
+ {t('terminalShortcutSettings.show')}
- {t('m.EGxWrwk')}
+
+ {t('terminalShortcutSettings.custom')}
+
{customKeys.length === 0 ? (
<>
- {t('m.AwkMohI')}
+ {t('terminalShortcutSettings.no')}
>
@@ -302,8 +306,8 @@ export function TerminalShortcutSettings({
onPress={() => setShowCustomKeyModal(true)}
>
- {t('m.d-64Q0E')}
- {t('m.CgJBkqk')}
+ {t('terminalShortcutSettings.add')}
+ {t('terminalShortcutSettings.create')}
diff --git a/mobile/src/components/TextInputModal.tsx b/mobile/src/components/TextInputModal.tsx
index 1ecdb5fe599..96fa6158fb7 100644
--- a/mobile/src/components/TextInputModal.tsx
+++ b/mobile/src/components/TextInputModal.tsx
@@ -32,7 +32,7 @@ export function TextInputModal({
message,
defaultValue = '',
placeholder,
- submitLabel = t('m.GbS1Gw0'),
+ submitLabel = t('textInputModal.save'),
selectTextOnFocus = false,
allowEmpty = false,
keyboardType,
@@ -91,7 +91,7 @@ export function TextInputModal({
style={({ pressed }) => [styles.cancelButton, pressed && styles.buttonPressed]}
onPress={onCancel}
>
- {t('m.NOYO7QE')}
+ {t('textInputModal.cancel')}
[
diff --git a/mobile/src/components/VoiceModelList.tsx b/mobile/src/components/VoiceModelList.tsx
index acb5ec511f8..0b72348998e 100644
--- a/mobile/src/components/VoiceModelList.tsx
+++ b/mobile/src/components/VoiceModelList.tsx
@@ -69,21 +69,21 @@ export function VoiceModelList({
{model.label}
{model.recommended ? (
- {t('m.B45mQIQ')}
+ {t('voiceModelList.recommended')}
) : null}
{modelMeta(model)}
{model.provider === 'openai' ? (
- {model.status === 'ready' ? t('m.JnTRemk') : t('m.j2yOGiA')}
+ {model.status === 'ready' ? t('voiceModelList.api') : t('voiceModelList.set')}
) : model.status === 'ready' ? (
{isSelected ? (
- {t('m.kg-vs7o')}
+ {t('voiceModelList.use')}
) : (
) : (
- {t('m.EorN5mI')}
+ {t('voiceModelList.useMessage')}
)}
)}
@@ -105,7 +105,9 @@ export function VoiceModelList({
style={({ pressed }) => [styles.iconButton, pressed && styles.actionPressed]}
disabled={anyBusy}
onPress={() => onDelete(model)}
- accessibilityLabel={t('m.r6942Dw', { value0: model.label })}
+ accessibilityLabel={t('voiceModelList.delete', {
+ commandLabel: model.label
+ })}
>
{deleteBusy ? (
diff --git a/mobile/src/components/WorkspaceDetailPlaceholder.tsx b/mobile/src/components/WorkspaceDetailPlaceholder.tsx
index 2d5693b7c59..453ff31a069 100644
--- a/mobile/src/components/WorkspaceDetailPlaceholder.tsx
+++ b/mobile/src/components/WorkspaceDetailPlaceholder.tsx
@@ -11,8 +11,8 @@ export function WorkspaceDetailPlaceholder() {
- {t('m.qe5Mx6E')}
- {t('m.6qylM4Q')}
+ {t('workspaceDetailPlaceholder.no')}
+ {t('workspaceDetailPlaceholder.pick')}
)
}
diff --git a/mobile/src/components/WorktreeListRow.tsx b/mobile/src/components/WorktreeListRow.tsx
index 74668eebcc4..8245babaf42 100644
--- a/mobile/src/components/WorktreeListRow.tsx
+++ b/mobile/src/components/WorktreeListRow.tsx
@@ -131,7 +131,7 @@ function WorktreeListRowComponent({
)}
{isFolderWorkspace && (
- {t('m.uQ24VuE')}
+ {t('worktreeListRow.folder')}
)}
({
{lineageDepth > 0 && (
- {t('m.lCIVZpI')}
+ {t('worktreeListRow.child')}
)}
{/* Repo glyph+name only when not already grouped under this repo;
diff --git a/mobile/src/components/accounts-snapshot.ts b/mobile/src/components/accounts-snapshot.ts
index 05c7dd11e1a..31aa6f04989 100644
--- a/mobile/src/components/accounts-snapshot.ts
+++ b/mobile/src/components/accounts-snapshot.ts
@@ -82,7 +82,7 @@ export const RateLimitRuntimeTargetSchema = z
if (target.runtime === 'host' && target.wslDistro !== null) {
context.addIssue({
code: 'custom',
- message: t('m.EIhMdN0'),
+ message: t('accountsSnapshot.hostRate'),
path: ['wslDistro']
})
}
@@ -93,7 +93,7 @@ export const RateLimitRuntimeTargetSchema = z
) {
context.addIssue({
code: 'custom',
- message: t('m.ZlNO6fQ'),
+ message: t('accountsSnapshot.wslRate'),
path: ['wslDistro']
})
}
@@ -138,7 +138,7 @@ const CodexAccountSummarySchema = z
if (runtime === 'host' && account.wslDistro != null) {
context.addIssue({
code: 'custom',
- message: t('m.OZiafyo'),
+ message: t('accountsSnapshot.hostCodex'),
path: ['wslDistro']
})
}
@@ -149,7 +149,7 @@ const CodexAccountSummarySchema = z
) {
context.addIssue({
code: 'custom',
- message: t('m.95Xks08'),
+ message: t('accountsSnapshot.wslCodex'),
path: ['wslDistro']
})
}
@@ -189,14 +189,14 @@ export const AccountsSnapshotSchema = z
if (snapshot.rateLimits.claude && snapshot.rateLimits.claude.provider !== 'claude') {
context.addIssue({
code: 'custom',
- message: t('m.OWfo7Qc'),
+ message: t('accountsSnapshot.claude'),
path: ['rateLimits', 'claude', 'provider']
})
}
if (snapshot.rateLimits.codex && snapshot.rateLimits.codex.provider !== 'codex') {
context.addIssue({
code: 'custom',
- message: t('m.N8kYEP4'),
+ message: t('accountsSnapshot.codex'),
path: ['rateLimits', 'codex', 'provider']
})
}
@@ -204,7 +204,7 @@ export const AccountsSnapshotSchema = z
if (entry.rateLimits && entry.rateLimits.provider !== 'claude') {
context.addIssue({
code: 'custom',
- message: t('m.4NLLG4A'),
+ message: t('accountsSnapshot.inactiveClaude'),
path: ['rateLimits', 'inactiveClaudeAccounts', index, 'rateLimits', 'provider']
})
}
@@ -213,7 +213,7 @@ export const AccountsSnapshotSchema = z
if (entry.rateLimits && entry.rateLimits.provider !== 'codex') {
context.addIssue({
code: 'custom',
- message: t('m.CkCg0Xk'),
+ message: t('accountsSnapshot.inactiveCodex'),
path: ['rateLimits', 'inactiveCodexAccounts', index, 'rateLimits', 'provider']
})
}
@@ -230,7 +230,7 @@ export type AccountsSnapshot = z.infer
export class InvalidAccountsSnapshotError extends Error {
constructor() {
- super(t('m.l0xDyns'))
+ super(t('accountsSnapshot.invalid'))
this.name = 'InvalidAccountsSnapshotError'
}
}
diff --git a/mobile/src/components/codex-reset-credit.ts b/mobile/src/components/codex-reset-credit.ts
index 74fdc0eae2b..7ef1c310837 100644
--- a/mobile/src/components/codex-reset-credit.ts
+++ b/mobile/src/components/codex-reset-credit.ts
@@ -76,16 +76,18 @@ export function getCodexResetCreditSummary(
expiryLabel =
count === 1
? duration === 'now'
- ? t('m.aaZ_2qE')
- : t('m.1neVPtc', { value0: duration })
+ ? t('codexResetCredit.expiresNow')
+ : t('codexResetCredit.expiresDuration', { duration: duration })
: duration === 'now'
- ? t('m.nH5aDJ4')
- : t('m.fA_ezvI', { value0: duration })
+ ? t('codexResetCredit.nextExpiresNow')
+ : t('codexResetCredit.nextExpiresDuration', { duration: duration })
}
return {
availableCount: count,
availabilityLabel:
- count === 1 ? t('m.CfvCAaE', { value0: count }) : t('m.myZTLv0', { value0: count }),
+ count === 1
+ ? t('codexResetCredit.resetCountReset', { resetCount: count })
+ : t('codexResetCredit.resetCountResets', { resetCount: count }),
expiryLabel
}
}
@@ -96,18 +98,24 @@ export function getCodexResetCreditOutcomeCopy(outcome: CodexResetCreditOutcome)
} {
switch (outcome) {
case 'reset':
- return { title: t('m.QiJiFeQ'), message: t('m.3qHVa1w') }
+ return {
+ title: t('codexResetCredit.rate'),
+ message: t('codexResetCredit.codex')
+ }
case 'alreadyRedeemed':
- return { title: t('m.9b3h0Pg'), message: t('m.3qHVa1w') }
+ return {
+ title: t('codexResetCredit.resetAlready'),
+ message: t('codexResetCredit.codex')
+ }
case 'nothingToReset':
return {
- title: t('m.JMEauuw'),
- message: t('m.Um-XfOo')
+ title: t('codexResetCredit.nothing'),
+ message: t('codexResetCredit.noEligible')
}
case 'noCredit':
return {
- title: t('m._-grAdc'),
- message: t('m.zFyydp8')
+ title: t('codexResetCredit.noReset'),
+ message: t('codexResetCredit.account')
}
}
}
@@ -164,12 +172,12 @@ function decodeResetResult(
expectedScope: CodexResetCreditExpectedScope
): CodexResetCreditRpcResult {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
- throw new Error(t('m.dWotxRU'))
+ throw new Error(t('codexResetCredit.invalid'))
}
const result = value as Record
const scope = CodexResetCreditExpectedScopeSchema.safeParse(result.scope)
if (!scope.success || !scopesEqual(scope.data, expectedScope)) {
- throw new Error(t('m.dWotxRU'))
+ throw new Error(t('codexResetCredit.invalid'))
}
const snapshot = decodeAccountsSnapshot(result.snapshot)
if (result.status === 'rejectedBeforeProvider') {
@@ -184,7 +192,7 @@ function decodeResetResult(
reason !== 'offerUnavailable' &&
reason !== 'offerChanged')
) {
- throw new Error(t('m.dWotxRU'))
+ throw new Error(t('codexResetCredit.invalid'))
}
return {
status: 'rejectedBeforeProvider',
@@ -203,7 +211,7 @@ function decodeResetResult(
outcome !== 'noCredit' &&
outcome !== 'alreadyRedeemed')
) {
- throw new Error(t('m.dWotxRU'))
+ throw new Error(t('codexResetCredit.invalid'))
}
const snapshotAccount = snapshot.codex.accounts.find(
(account) => account.id === scope.data.accountId
@@ -214,7 +222,7 @@ function decodeResetResult(
getActiveCodexAccountIdForRateLimitTarget(snapshot) !== scope.data.accountId ||
snapshotAccount?.updatedAt !== scope.data.accountRevision
) {
- throw new Error(t('m.dWotxRU'))
+ throw new Error(t('codexResetCredit.invalid'))
}
return {
outcome,
diff --git a/mobile/src/components/mounted-bottom-drawer.tsx b/mobile/src/components/mounted-bottom-drawer.tsx
index 4c89467a282..8635c47b4fd 100644
--- a/mobile/src/components/mounted-bottom-drawer.tsx
+++ b/mobile/src/components/mounted-bottom-drawer.tsx
@@ -295,7 +295,7 @@ export function MountedBottomDrawer({
diff --git a/mobile/src/components/new-worktree-agent-selection.ts b/mobile/src/components/new-worktree-agent-selection.ts
index f51fc084e48..12e7b660f1e 100644
--- a/mobile/src/components/new-worktree-agent-selection.ts
+++ b/mobile/src/components/new-worktree-agent-selection.ts
@@ -19,7 +19,7 @@ export const NEW_WORKTREE_AGENT_OPTIONS: NewWorktreeAgentOption[] = MOBILE_AGENT
export const NEW_WORKTREE_BLANK_AGENT: NewWorktreeAgentOption = {
id: '__blank__',
- label: t('m.84CVutM')
+ label: t('newWorktreeAgentSelection.blank')
}
export function newWorktreeAgentOptionFor(id: string | null | undefined): NewWorktreeAgentOption {
diff --git a/mobile/src/components/pr-sidebar/MermaidDiagram.tsx b/mobile/src/components/pr-sidebar/MermaidDiagram.tsx
index a2b1ec94950..36137da0a80 100644
--- a/mobile/src/components/pr-sidebar/MermaidDiagram.tsx
+++ b/mobile/src/components/pr-sidebar/MermaidDiagram.tsx
@@ -26,7 +26,7 @@ export function MermaidDiagram({ source, base }: Props) {
return (
- {t('m.W6bmrY4')}
+ {t('mermaidDiagram.mermaid')}
- {t('m.W6bmrY4')}
+ {t('mermaidDiagram.mermaid')}
{source}
diff --git a/mobile/src/components/pr-sidebar/MobileLinkPrForm.tsx b/mobile/src/components/pr-sidebar/MobileLinkPrForm.tsx
index 1f20e4bcf7e..bc7ff06217a 100644
--- a/mobile/src/components/pr-sidebar/MobileLinkPrForm.tsx
+++ b/mobile/src/components/pr-sidebar/MobileLinkPrForm.tsx
@@ -47,23 +47,23 @@ export function MobileLinkPrForm({ client, worktreeId, onCancel, onLinked }: Pro
return (
- {t('m.f8ZsL9k')}
+ {t('mobileLinkPrForm.linkExisting')}
- {t('m.ZLWuIYo')}
+ {t('mobileLinkPrForm.cancel')}
- {t('m.D2wJo3U')}
+ {t('mobileLinkPrForm.pr')}
) : (
- {parsed ? t('m.UzLJy8Q', { value0: parsed }) : t('m.kPLcd1A')}
+ {parsed
+ ? t('mobileLinkPrForm.linkLinked', {
+ linkedItemNumber: parsed
+ })
+ : t('mobileLinkPrForm.linkPull')}
)}
diff --git a/mobile/src/components/pr-sidebar/MobilePrComposeForm.tsx b/mobile/src/components/pr-sidebar/MobilePrComposeForm.tsx
index 5faca629c68..2d4dda413ef 100644
--- a/mobile/src/components/pr-sidebar/MobilePrComposeForm.tsx
+++ b/mobile/src/components/pr-sidebar/MobilePrComposeForm.tsx
@@ -78,7 +78,7 @@ export function MobilePrComposeForm({
draft
})
if (!response.ok) {
- setError(response.error?.message || t('m.Tf6JzYM'))
+ setError(response.error?.message || t('mobilePrComposeForm.failed'))
return
}
const result = (response as RpcSuccess).result as {
@@ -96,7 +96,7 @@ export function MobilePrComposeForm({
}
} catch (err) {
triggerError()
- setError(err instanceof Error ? err.message : t('m.Tf6JzYM'))
+ setError(err instanceof Error ? err.message : t('mobilePrComposeForm.failed'))
} finally {
setGenerating(false)
}
@@ -167,7 +167,11 @@ export function MobilePrComposeForm({
- {t('m.gTT3Qik', { value0: copy.reviewLabel })}
+
+ {t('mobilePrComposeForm.new', {
+ reviewType: copy.reviewLabel
+ })}
+
void generate()}
accessibilityRole="button"
- accessibilityLabel={t('m.h8LEFjY', { value0: copy.reviewLabel })}
+ accessibilityLabel={t('mobilePrComposeForm.generateReview', {
+ reviewType: copy.reviewLabel
+ })}
>
{generating ? (
) : (
)}
- {generating ? t('m.E5u75yA') : t('m.w4jN8ic')}
+
+ {generating ? t('mobilePrComposeForm.generating') : t('mobilePrComposeForm.generate')}
+
@@ -207,7 +215,7 @@ export function MobilePrComposeForm({
style={[styles.branchToken, baseConflict && styles.branchTokenError]}
numberOfLines={1}
>
- {base || t('m.RIaVSo8')}
+ {base || t('task.base')}
) : null}
@@ -217,32 +225,36 @@ export function MobilePrComposeForm({
style={styles.titleInput}
value={title}
onChangeText={setTitle}
- placeholder={t('m.JnixruY')}
+ placeholder={t('mobilePrComposeForm.title')}
placeholderTextColor={colors.textMuted}
editable={!fieldsLocked}
- accessibilityLabel={t('m.CYW43ss', { value0: copy.titleLabel })}
+ accessibilityLabel={t('mobilePrComposeForm.reviewTypeTitle', {
+ reviewType: copy.titleLabel
+ })}
/>
{generating ? (
- {t('m.UsM_A3E')}
+ {t('mobilePrComposeForm.generatingTitle')}
) : null}
- {t('m.oPjbjuk')}
+ {t('mobilePrComposeForm.base')}
- {t('m.3Yb2tD4')}
+ {t('mobilePrComposeForm.createDraft')}
{error || submitDisabledReason ? (
@@ -282,11 +294,19 @@ export function MobilePrComposeForm({
{pushBeforeCreate
? draft
- ? t('m.aUTTsqg', { value0: copy.shortLabel })
- : t('m.YpkfCr0', { value0: copy.shortLabel })
+ ? t('mobilePrComposeForm.pushCreateDraft', {
+ reviewType: copy.shortLabel
+ })
+ : t('mobilePrComposeForm.pushCreateReview', {
+ reviewType: copy.shortLabel
+ })
: draft
- ? t('m.zouGGt0', { value0: copy.shortLabel })
- : t('m.T0kbQLc', { value0: copy.shortLabel })}
+ ? t('mobilePrComposeForm.createDraftReview', {
+ reviewType: copy.shortLabel
+ })
+ : t('mobilePrComposeForm.createReview', {
+ reviewType: copy.shortLabel
+ })}
diff --git a/mobile/src/components/pr-sidebar/MobilePrViewPanel.tsx b/mobile/src/components/pr-sidebar/MobilePrViewPanel.tsx
index a1c32d1fee7..e8e13f9f43d 100644
--- a/mobile/src/components/pr-sidebar/MobilePrViewPanel.tsx
+++ b/mobile/src/components/pr-sidebar/MobilePrViewPanel.tsx
@@ -41,12 +41,12 @@ export function MobilePrViewPanelBody({
: !isGithubRepo
? ({
kind: 'blocked',
- message: t('m._svp6us')
+ message: t('mobilePrViewPanel.hosted')
} as const)
: branch === null
? ({
kind: 'error',
- message: t('m.LINjP1k')
+ message: t('mobilePrViewPanel.current')
} as const)
: controller.prSidebarState
diff --git a/mobile/src/components/pr-sidebar/PRActionsSection.tsx b/mobile/src/components/pr-sidebar/PRActionsSection.tsx
index f9c5e962855..0b3906e2cf9 100644
--- a/mobile/src/components/pr-sidebar/PRActionsSection.tsx
+++ b/mobile/src/components/pr-sidebar/PRActionsSection.tsx
@@ -66,7 +66,7 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
setUnlinkError(outcome.error)
}
} catch (err) {
- setUnlinkError(err instanceof Error ? err.message : t('m.uLhV2xU'))
+ setUnlinkError(err instanceof Error ? err.message : t('practionsSection.failed'))
} finally {
setUnlinking(false)
}
@@ -75,22 +75,26 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
const confirmCopy = (): { title: string; message: string; confirmLabel: string } => {
if (confirm?.kind === 'merge') {
return {
- title: t('m._0lAHWg'),
- message: t('m.zNuHY-c', { value0: pr.number }),
- confirmLabel: t('m.4DTdO1w')
+ title: t('practionsSection.mergePullRequest'),
+ message: t('practionsSection.will', { pullRequestNumber: pr.number }),
+ confirmLabel: t('practionsSection.merge')
}
}
if (confirm?.kind === 'state' && confirm.state === 'closed') {
return {
- title: t('m.02Qj2V4'),
- message: t('m.b_7nPgo', { value0: pr.number }),
- confirmLabel: t('m.gL1buuY')
+ title: t('practionsSection.closePullRequest'),
+ message: t('practionsSection.pullRequestNumberWillClosed', {
+ pullRequestNumber: pr.number
+ }),
+ confirmLabel: t('task.close')
}
}
return {
- title: t('m.oCXRjL8'),
- message: t('m.3XhqaKU', { value0: pr.number }),
- confirmLabel: t('m.zRLzboM')
+ title: t('practionsSection.reopenPullRequest'),
+ message: t('practionsSection.pullRequestNumberWillReopened', {
+ pullRequestNumber: pr.number
+ }),
+ confirmLabel: t('task.reopen')
}
}
@@ -124,7 +128,7 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
}}
disabled={mergeBusy}
accessibilityRole="button"
- accessibilityLabel={t('m.8xiSsiA')}
+ accessibilityLabel={t('practionsSection.mergePullRequestAccessibility')}
>
{mergeBusy ? (
@@ -132,14 +136,14 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
)}
- {t('m.8xiSsiA')}
+ {t('practionsSection.mergePullRequestAccessibility')}
) : null}
{showAutoMerge ? (
- {t('m.0J91CIk')}
+ {t('practionsSection.auto')}
{
@@ -149,13 +153,13 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
disabled={autoMergeBusy}
accessibilityRole="switch"
accessibilityState={{ checked: autoMerge }}
- accessibilityLabel={t('m.X0q7qvA')}
+ accessibilityLabel={t('practionsSection.toggle')}
>
{autoMergeBusy ? (
) : (
- {autoMerge ? t('m.oSg4C5A') : t('m.Al6-RQA')}
+ {autoMerge ? t('practionsSection.on') : t('practionsSection.off')}
)}
@@ -177,7 +181,11 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
}}
disabled={stateBusy}
accessibilityRole="button"
- accessibilityLabel={avail.canClose ? t('m.Pz82S8w') : t('m.2xdqaDc')}
+ accessibilityLabel={
+ avail.canClose
+ ? t('practionsSection.closePullRequestAccessibility')
+ : t('practionsSection.reopenPullRequestAccessibility')
+ }
>
{stateBusy ? : null}
- {avail.canClose ? t('m.gL1buuY') : t('m.zRLzboM')}
+ {avail.canClose ? t('task.close') : t('task.reopen')}
) : null}
@@ -200,14 +208,14 @@ export function PRActionsSection({ pr, actions, client, worktreeId, onUnlinked }
onPress={() => void unlink()}
disabled={unlinkBusy}
accessibilityRole="button"
- accessibilityLabel={t('m.ZqSwRWA')}
+ accessibilityLabel={t('practionsSection.unlinkPull')}
>
{unlinking ? (
) : (
)}
- {t('m.nO4i6C8')}
+ {t('practionsSection.unlink')}
) : null}
diff --git a/mobile/src/components/pr-sidebar/PRCheckDetail.tsx b/mobile/src/components/pr-sidebar/PRCheckDetail.tsx
index 0c0fca645a8..15665fe07a8 100644
--- a/mobile/src/components/pr-sidebar/PRCheckDetail.tsx
+++ b/mobile/src/components/pr-sidebar/PRCheckDetail.tsx
@@ -34,7 +34,7 @@ export function PRCheckDetailView({ entry }: { entry: DetailEntry | undefined })
if (!entry.details) {
return (
- {t('m.xJbH0vA')}
+ {t('prcheckDetail.no')}
)
}
@@ -48,7 +48,7 @@ export function PRCheckDetailView({ entry }: { entry: DetailEntry | undefined })
return (
{isEmpty ? (
- {t('m.xJbH0vA')}
+ {t('prcheckDetail.no')}
) : (
<>
{content.summaryLines.map((line, index) => (
@@ -58,7 +58,7 @@ export function PRCheckDetailView({ entry }: { entry: DetailEntry | undefined })
))}
{content.annotations.length > 0 ? (
- {t('m.x1QqPYg')}
+ {t('prcheckDetail.annotations')}
{content.annotations.map((annotation, index) => (
@@ -72,7 +72,7 @@ export function PRCheckDetailView({ entry }: { entry: DetailEntry | undefined })
))}
{content.annotationsTruncated ? (
- {t('m.HW_qZBo')}
+ {t('prcheckDetail.showingFirst20')}
) : null}
) : null}
@@ -83,7 +83,7 @@ export function PRCheckDetailView({ entry }: { entry: DetailEntry | undefined })
))}
{content.jobsTruncated ? (
- {t('m.q6iGz3o')}
+ {t('prcheckDetail.showingFirst100')}
) : null}
) : null}
diff --git a/mobile/src/components/pr-sidebar/PRChecksSection.tsx b/mobile/src/components/pr-sidebar/PRChecksSection.tsx
index ad28140baba..efb71c32088 100644
--- a/mobile/src/components/pr-sidebar/PRChecksSection.tsx
+++ b/mobile/src/components/pr-sidebar/PRChecksSection.tsx
@@ -71,7 +71,7 @@ export function PRChecksSection({ checks, client, worktreeId, prRepo, actions, t
// spinning forever — fall back to an error detail.
entry = {
status: 'error',
- message: err instanceof Error ? err.message : t('m.hIvuhiQ')
+ message: err instanceof Error ? err.message : t('prchecksSection.failed')
}
}
setDetailCache((prev) => ({ ...prev, [key]: entry }))
@@ -134,7 +134,7 @@ export function PRChecksSection({ checks, client, worktreeId, prRepo, actions, t
return (
actions.rerunFailingChecks()}
disabled={rerunBusy}
accessibilityRole="button"
- accessibilityLabel={t('m.TkRK-a4')}
+ accessibilityLabel={t('prchecksSection.rerun')}
>
{rerunBusy ? (
@@ -170,12 +170,17 @@ export function PRChecksSection({ checks, client, worktreeId, prRepo, actions, t
- {t(summary.failed === 1 ? 'm.lXLSjWw' : 'm.N7XOlnE', {
- value0: summary.failed
- })}
+ {t(
+ summary.failed === 1
+ ? 'prchecksSection.failingCheckCountFailingCheck'
+ : 'prchecksSection.failingCheckCountFailingChecks',
+ {
+ failingCheckCount: summary.failed
+ }
+ )}
- {t('m.t67jzCk')}
+ {t('prchecksSection.inspect')}
{triage.isBusy ? (
) : (
)}
- {t('m.QiC7wz8')}
+ {t('prchecksSection.fix')}
) : null}
@@ -207,7 +212,9 @@ export function PRChecksSection({ checks, client, worktreeId, prRepo, actions, t
style={styles.row}
onPress={() => toggle(check)}
accessibilityRole="button"
- accessibilityLabel={t('m.wKKGPQ8', { value0: check.name })}
+ accessibilityLabel={t('prchecksSection.check', {
+ checkName: check.name
+ })}
>
@@ -227,7 +234,9 @@ export function PRChecksSection({ checks, client, worktreeId, prRepo, actions, t
onPress={() => void Linking.openURL(url).catch(() => {})}
hitSlop={6}
accessibilityRole="button"
- accessibilityLabel={t('m.WPX7hnI', { value0: check.name })}
+ accessibilityLabel={t('prchecksSection.open', {
+ checkName: check.name
+ })}
>
diff --git a/mobile/src/components/pr-sidebar/PRCommentCard.tsx b/mobile/src/components/pr-sidebar/PRCommentCard.tsx
index 0f522597eb4..803999b710c 100644
--- a/mobile/src/components/pr-sidebar/PRCommentCard.tsx
+++ b/mobile/src/components/pr-sidebar/PRCommentCard.tsx
@@ -131,7 +131,7 @@ export const PRCommentCard = memo(function PRCommentCard({
) : null}
{comment.isResolved ? (
- {t('m.C_gXfCo')}
+ {t('prcommentCard.resolved')}
) : null}
{comment.url ? (
@@ -149,8 +149,8 @@ export const PRCommentCard = memo(function PRCommentCard({
{editOpen && actions ? (
- {t('m.Ragn9hY')}
+ {t('prcommentCard.reply')}
{canMutate ? (
- {t('m.wS1VT0I')}
+ {t('prcommentCard.edit')}
) : null}
{canMutate ? (
@@ -201,10 +201,12 @@ export const PRCommentCard = memo(function PRCommentCard({
disabled={deleteBusy}
hitSlop={6}
accessibilityRole="button"
- accessibilityLabel={t('m.u9hUgiY')}
+ accessibilityLabel={t('prcommentCard.deleteComment')}
>
- {deleteBusy ? '…' : t('m.4idOoK8')}
+
+ {deleteBusy ? '…' : t('prcommentCard.delete')}
+
) : null}
{canResolve ? (
@@ -214,7 +216,11 @@ export const PRCommentCard = memo(function PRCommentCard({
disabled={resolveBusy}
hitSlop={6}
accessibilityRole="button"
- accessibilityLabel={comment.isResolved ? t('m.mkEkYMY') : t('m.2PITe20')}
+ accessibilityLabel={
+ comment.isResolved
+ ? t('prcommentCard.unresolveThread')
+ : t('prcommentCard.resolveThread')
+ }
>
{comment.isResolved ? (
@@ -222,7 +228,11 @@ export const PRCommentCard = memo(function PRCommentCard({
)}
- {resolveBusy ? '…' : comment.isResolved ? t('m.A6XXe-4') : t('m.7oybC2M')}
+ {resolveBusy
+ ? '…'
+ : comment.isResolved
+ ? t('prcommentCard.unresolve')
+ : t('prcommentCard.resolve')}
) : null}
@@ -231,8 +241,8 @@ export const PRCommentCard = memo(function PRCommentCard({
{replyOpen && !editOpen && actions ? (
setReplyOpen(false)}
@@ -243,9 +253,9 @@ export const PRCommentCard = memo(function PRCommentCard({
{actions ? (
void actions.deleteComment(comment.id)}
onCancel={() => setConfirmDelete(false)}
diff --git a/mobile/src/components/pr-sidebar/PRCommentComposer.tsx b/mobile/src/components/pr-sidebar/PRCommentComposer.tsx
index 8009214a1ff..9c78944ee65 100644
--- a/mobile/src/components/pr-sidebar/PRCommentComposer.tsx
+++ b/mobile/src/components/pr-sidebar/PRCommentComposer.tsx
@@ -68,9 +68,9 @@ export function PRCommentComposer({
onPress={onCancel}
disabled={submitting}
accessibilityRole="button"
- accessibilityLabel={t('m.EXMnl_4')}
+ accessibilityLabel={t('prcommentComposer.cancel')}
>
- {t('m.EXMnl_4')}
+ {t('prcommentComposer.cancel')}
) : null}
-
+
{loadingDetails ? (
) : detailsFailed ? (
- {t('m.hO2eecI')}
+ {t('prcommentsSection.couldNotLoadDescription')}
) : body.trim() ? (
) : (
- {t('m.vdfQtbs')}
+ {t('prcommentsSection.noDescription')}
)}
0 ? (
@@ -144,11 +144,11 @@ export function PRCommentsSection({
{loadingDetails ? (
) : detailsFailed ? (
- {t('m.FVdefgc')}
+ {t('prcommentsSection.couldNotLoadComments')}
) : (
{comments.length === 0 ? (
- {t('m.xX8eZhc')}
+ {t('prcommentsSection.noComments')}
) : (
<>
{isPr ? (
@@ -197,11 +197,13 @@ export function PRCommentsSection({
>
{remaining > COMMENT_PAGE
- ? t('m.vV46Tns', {
- value0: COMMENT_PAGE,
- value1: remaining
+ ? t('prcommentsSection.showVisible', {
+ visibleCommentCount: COMMENT_PAGE,
+ remaining: remaining
})
- : t('m.cHoCGwY', { value0: remaining })}
+ : t('prcommentsSection.showRemaining', {
+ remainingCommentCount: remaining
+ })}
) : null}
@@ -213,8 +215,8 @@ export function PRCommentsSection({
{canComment && actions ? (
@@ -263,13 +265,23 @@ function CommentGroupView({
{count > 1
- ? t(group.kind === 'thread' ? 'm.lXnGpvs' : 'm.tQONwOQ', {
- value0: root.author,
- value1: count
- })
- : t(group.kind === 'thread' ? 'm.dG4O1e4' : 'm.njd-pFg', {
- value0: root.author
- })}
+ ? t(
+ group.kind === 'thread'
+ ? 'prcommentsSection.resolvedThreadAuthorReply'
+ : 'prcommentsSection.resolvedCommentAuthorReply',
+ {
+ author: root.author,
+ replyCount: count
+ }
+ )
+ : t(
+ group.kind === 'thread'
+ ? 'prcommentsSection.resolvedThreadAuthor'
+ : 'prcommentsSection.resolvedCommentAuthor',
+ {
+ author: root.author
+ }
+ )}
{expanded ? {cards} : null}
diff --git a/mobile/src/components/pr-sidebar/PRConflictingFilesSection.tsx b/mobile/src/components/pr-sidebar/PRConflictingFilesSection.tsx
index 17f5bb1cf7a..6f6001d6f6e 100644
--- a/mobile/src/components/pr-sidebar/PRConflictingFilesSection.tsx
+++ b/mobile/src/components/pr-sidebar/PRConflictingFilesSection.tsx
@@ -72,24 +72,29 @@ export function PRConflictingFilesSection({ pr, isRefreshing = false, triage }:
}
return (
-
+
{conflict.commitsBehind !== null && conflict.baseCommit !== null ? (
- {t(conflict.commitsBehind === 1 ? 'm.ngn4NjA' : 'm.93sCYQo', {
- value0: conflict.commitsBehind
- })}{' '}
+ {t(
+ conflict.commitsBehind === 1
+ ? 'prconflictingFilesSection.commitsBehindCommit'
+ : 'prconflictingFilesSection.commitsBehindCommits',
+ {
+ commitsBehind: conflict.commitsBehind
+ }
+ )}{' '}
{conflict.baseCommit})
) : null}
{conflict.fileDetailsUnavailable ? (
- {t('m.7Qv5eYo')}
+ {t('prconflictingFilesSection.branch')}
{noticeBody}
{conflict.mergeabilityRefreshCommands ? (
- {t('m.39Nl8mw')}
+ {t('prconflictingFilesSection.run')}
[
styles.copyCommandButton,
@@ -97,7 +102,7 @@ export function PRConflictingFilesSection({ pr, isRefreshing = false, triage }:
]}
onPress={() => void copyRefreshCommands()}
accessibilityRole="button"
- accessibilityLabel={t('m.6TXtA4Q')}
+ accessibilityLabel={t('prconflictingFilesSection.copyMergeability')}
>
{commandsCopied ? (
@@ -105,7 +110,9 @@ export function PRConflictingFilesSection({ pr, isRefreshing = false, triage }:
)}
- {commandsCopied ? t('m.7E56l1g') : t('m.KuLUlYc')}
+ {commandsCopied
+ ? t('prconflictingFilesSection.copied')
+ : t('prconflictingFilesSection.copyCommands')}
@@ -119,7 +126,7 @@ export function PRConflictingFilesSection({ pr, isRefreshing = false, triage }:
- {t('m.w2WcFns')}
+ {t('prconflictingFilesSection.conflicting')}
{triage.isBusy ? (
) : (
)}
- {t('m.zrerXGc')}
+
+ {t('prconflictingFilesSection.resolve')}
+
{triage.error ? {triage.error} : null}
diff --git a/mobile/src/components/pr-sidebar/PRReviewersSection.tsx b/mobile/src/components/pr-sidebar/PRReviewersSection.tsx
index 3e418cd1acd..a18836c2d83 100644
--- a/mobile/src/components/pr-sidebar/PRReviewersSection.tsx
+++ b/mobile/src/components/pr-sidebar/PRReviewersSection.tsx
@@ -62,23 +62,23 @@ export function PRReviewersSection({ details, actions, client, worktreeId }: Pro
style={styles.iconButton}
onPress={() => setPickerOpen(true)}
accessibilityRole="button"
- accessibilityLabel={t('m.E5rQqRQ')}
+ accessibilityLabel={t('prreviewersSection.add')}
>
)
return (
-
+
{loadingDetails ? (
- {t('m.Ryr3DCQ')}
+ {t('prreviewersSection.loading')}
) : detailsFailed ? (
- {t('m.T5Uc4Ao')}
+ {t('prreviewersSection.could')}
) : rows.length === 0 ? (
- {t('m.jBToX-I')}
+ {t('prreviewersSection.no')}
) : (
rows.map((row) => {
const busy = actions.isBusy({ kind: 'reviewer', login: row.login })
@@ -99,7 +99,7 @@ export function PRReviewersSection({ details, actions, client, worktreeId }: Pro
onPress={() => actions.removeReviewer(row.login)}
disabled={busy}
accessibilityRole="button"
- accessibilityLabel={t('m.8Est-xI', { value0: row.login })}
+ accessibilityLabel={t('prreviewersSection.remove', { login: row.login })}
>
{busy ? (
diff --git a/mobile/src/components/pr-sidebar/PRSidebarHeader.tsx b/mobile/src/components/pr-sidebar/PRSidebarHeader.tsx
index 618e7815318..8f9103aeada 100644
--- a/mobile/src/components/pr-sidebar/PRSidebarHeader.tsx
+++ b/mobile/src/components/pr-sidebar/PRSidebarHeader.tsx
@@ -50,7 +50,9 @@ export function PRSidebarHeader({
onPress={openPr}
disabled={!openPr}
accessibilityRole="link"
- accessibilityLabel={t('m.nbfmLgg', { value0: pr.number })}
+ accessibilityLabel={t('prsidebarHeader.open', {
+ pullRequestNumber: pr.number
+ })}
style={({ pressed }) => [
styles.badge,
{ borderColor: badgeColor },
@@ -63,7 +65,9 @@ export function PRSidebarHeader({
style={styles.prMetaStrong}
onPress={openPr}
accessibilityRole="link"
- accessibilityLabel={t('m.nbfmLgg', { value0: pr.number })}
+ accessibilityLabel={t('prsidebarHeader.open', {
+ pullRequestNumber: pr.number
+ })}
>
#{pr.number}
@@ -74,7 +78,9 @@ export function PRSidebarHeader({
onPress={openPr}
hitSlop={8}
accessibilityRole="link"
- accessibilityLabel={t('m.nbfmLgg', { value0: pr.number })}
+ accessibilityLabel={t('prsidebarHeader.open', {
+ pullRequestNumber: pr.number
+ })}
style={({ pressed }) => [styles.iconButton, pressed && { opacity: 0.6 }]}
>
@@ -154,21 +160,21 @@ function PRTitle({
onPress={cancel}
disabled={titleAction.saving}
accessibilityRole="button"
- accessibilityLabel={t('m.D-7jM08')}
+ accessibilityLabel={t('prsidebarHeader.cancelEditing')}
>
- {t('m.UgBLL4w')}
+ {t('prsidebarHeader.cancel')}
[composerStyles.submit, pressed && composerStyles.pressed]}
onPress={() => void save()}
disabled={titleAction.saving}
accessibilityRole="button"
- accessibilityLabel={t('m.xOwofss')}
+ accessibilityLabel={t('prsidebarHeader.saveTitle')}
>
{titleAction.saving ? (
) : (
- {t('m.oBmCrB8')}
+ {t('prsidebarHeader.save')}
)}
@@ -182,7 +188,7 @@ function PRTitle({
onPress={editable ? startEdit : undefined}
disabled={!editable}
accessibilityRole={editable ? 'button' : undefined}
- accessibilityLabel={editable ? t('m.E2VHius') : undefined}
+ accessibilityLabel={editable ? t('prsidebarHeader.edit') : undefined}
>
{title}
{editable ? (
diff --git a/mobile/src/components/pr-sidebar/PrSidebarCreateEmptyState.tsx b/mobile/src/components/pr-sidebar/PrSidebarCreateEmptyState.tsx
index 69922e1d04a..9dae3d9f8aa 100644
--- a/mobile/src/components/pr-sidebar/PrSidebarCreateEmptyState.tsx
+++ b/mobile/src/components/pr-sidebar/PrSidebarCreateEmptyState.tsx
@@ -98,7 +98,7 @@ export function PrSidebarCreateEmptyState({
setLoading(true)
try {
if (!gitBranch) {
- setCreateWarning(t('m.EMFMGnw'))
+ setCreateWarning(t('prSidebarCreateEmptyState.check'))
return
}
// Why: mobile skips the local compose step here and runs the hosted create
@@ -132,7 +132,7 @@ export function PrSidebarCreateEmptyState({
openMobilePrUrl(outcome.url)
onCreated()
} catch (err) {
- setCreateWarning(err instanceof Error ? err.message : t('m.tca0V2E'))
+ setCreateWarning(err instanceof Error ? err.message : t('prSidebarCreateEmptyState.failed'))
} finally {
setLoading(false)
}
@@ -161,14 +161,14 @@ export function PrSidebarCreateEmptyState({
- {t('m.TSDVcKU')}
+ {t('prSidebarCreateEmptyState.pull')}
[styles.iconButton, pressed && styles.iconButtonPressed]}
onPress={refreshPrState}
accessibilityRole="button"
- accessibilityLabel={t('m.YZFe3Qg')}
+ accessibilityLabel={t('prSidebarCreateEmptyState.refreshPull')}
hitSlop={6}
>
@@ -178,27 +178,31 @@ export function PrSidebarCreateEmptyState({
onPress={() => void openComposer()}
disabled={!canCreate || loading}
accessibilityRole="button"
- accessibilityLabel={t('m.Y_NnJ9M')}
+ accessibilityLabel={t('prSidebarCreateEmptyState.createPull')}
>
{loading ? (
) : (
)}
- {t('m.5kE-iVM')}
+ {t('prSidebarCreateEmptyState.createPr')}
- {orphanLinkedPR ? t('m.I3xSuPA', { value0: orphanLinkedPR }) : t('m.G2BaE-Y')}
+ {orphanLinkedPR
+ ? t('prSidebarCreateEmptyState.linked', {
+ pullRequestNumber: orphanLinkedPR
+ })
+ : t('prSidebarCreateEmptyState.no')}
{orphanLinkedPR
- ? t('m.maf-eds')
+ ? t('prSidebarCreateEmptyState.refreshCheck')
: gitBranch
- ? t('m.CmpszXU', { value0: gitBranch })
- : t('m.SRr0o4U')}
+ ? t('prSidebarCreateEmptyState.git', { gitBranch: gitBranch })
+ : t('prSidebarCreateEmptyState.current')}
{commitFailureRecovery ? (
setMode('link')}
disabled={!client}
accessibilityRole="button"
- accessibilityLabel={t('m._mT5R7M')}
+ accessibilityLabel={t('prSidebarCreateEmptyState.linkExistingPull')}
accessibilityState={{ disabled: !client }}
hitSlop={6}
>
@@ -226,7 +230,7 @@ export function PrSidebarCreateEmptyState({
color={client ? colors.textSecondary : colors.textMuted}
strokeWidth={2.2}
/>
- {t('m.eNX9Nmo')}
+ {t('prSidebarCreateEmptyState.linkExistingPr')}
diff --git a/mobile/src/components/pr-sidebar/ReviewerPickerDrawer.tsx b/mobile/src/components/pr-sidebar/ReviewerPickerDrawer.tsx
index dc99c0734f1..a5ff8371e03 100644
--- a/mobile/src/components/pr-sidebar/ReviewerPickerDrawer.tsx
+++ b/mobile/src/components/pr-sidebar/ReviewerPickerDrawer.tsx
@@ -62,7 +62,10 @@ export function ReviewerPickerDrawer({
})
.catch(() => {
if (!cancelled) {
- setLoad({ status: 'error', message: t('m.dVs-M9I') })
+ setLoad({
+ status: 'error',
+ message: t('reviewerPickerDrawer.failed')
+ })
}
})
return () => {
@@ -92,12 +95,12 @@ export function ReviewerPickerDrawer({
return (
- {t('m.K34xo24')}
+ {t('reviewerPickerDrawer.reviewers')}
) : ordered.length === 0 ? (
- {t('m.6OYLM7w')}
+ {t('reviewerPickerDrawer.no')}
) : (
@@ -127,7 +130,9 @@ export function ReviewerPickerDrawer({
accessibilityState={{ selected: requested }}
accessibilityLabel={
requested
- ? t('m.8Est-xI', { value0: item.login })
+ ? t('prreviewersSection.remove', {
+ login: item.login
+ })
: t('review.requestReviewer', { login: item.login })
}
>
diff --git a/mobile/src/components/pr-sidebar/markdown-blocks.ts b/mobile/src/components/pr-sidebar/markdown-blocks.ts
index a185981a149..639df1d5271 100644
--- a/mobile/src/components/pr-sidebar/markdown-blocks.ts
+++ b/mobile/src/components/pr-sidebar/markdown-blocks.ts
@@ -68,9 +68,13 @@ function parseSegment(text: string): MarkdownBlock[] {
}
if (m[1].toLowerCase() === 'details') {
const sm = SUMMARY.exec(m[2])
- const summary = sm ? stripHtmlTags(sm[1]).trim() : t('m.B0fOGkI')
+ const summary = sm ? stripHtmlTags(sm[1]).trim() : t('markdownBlocks.details')
const body = m[2].replace(SUMMARY, '')
- blocks.push({ kind: 'details', summary: summary || t('m.B0fOGkI'), body: parseSegment(body) })
+ blocks.push({
+ kind: 'details',
+ summary: summary || t('markdownBlocks.details'),
+ body: parseSegment(body)
+ })
} else {
blocks.push({ kind: 'quote', text: stripHtmlTags(m[2]).trim() })
}
diff --git a/mobile/src/components/pr-sidebar/pr-check-detail-content.ts b/mobile/src/components/pr-sidebar/pr-check-detail-content.ts
index 0493aaee9de..4f27db78323 100644
--- a/mobile/src/components/pr-sidebar/pr-check-detail-content.ts
+++ b/mobile/src/components/pr-sidebar/pr-check-detail-content.ts
@@ -91,7 +91,8 @@ export function presentCheckDetail(details: PRCheckRunDetails): CheckDetailConte
summaryLines,
annotations: details.annotations.slice(0, MAX_ANNOTATIONS).map(mapAnnotation),
annotationsTruncated: details.annotations.length > MAX_ANNOTATIONS,
- jobsLabel: failedJobs.length > 0 ? t('m.OJSrr6g') : t('m.g0JLO88'),
+ jobsLabel:
+ failedJobs.length > 0 ? t('prCheckDetailContent.failed') : t('prCheckDetailContent.jobs'),
jobs: visibleJobs.slice(0, MAX_JOBS).map(mapJob),
jobsTruncated: details.jobs.length > MAX_JOBS
}
diff --git a/mobile/src/components/pr-sidebar/pr-checks-presentation.ts b/mobile/src/components/pr-sidebar/pr-checks-presentation.ts
index 0b2065f8c1e..472d3ae0272 100644
--- a/mobile/src/components/pr-sidebar/pr-checks-presentation.ts
+++ b/mobile/src/components/pr-sidebar/pr-checks-presentation.ts
@@ -74,7 +74,14 @@ const OUTCOME_BY_STATE: Record = {
- open: t('m.sbQ_yBw'),
- merged: t('m.AF7gJFU'),
- draft: t('m.QYCFjQw'),
- closed: t('m.tNw1xEA')
+ open: t('prChecksPresentation.open'),
+ merged: t('prChecksPresentation.merged'),
+ draft: t('prChecksPresentation.draft'),
+ closed: t('prChecksPresentation.closed')
}
// State-badge color comes from the shared prStateToken so the sidebar badge and
@@ -215,20 +224,41 @@ function reviewStateLabel(state: string | null | undefined): {
} {
switch (state) {
case 'APPROVED':
- return { label: t('m.IloG18k'), token: 'statusGreen' }
+ return {
+ label: t('prChecksPresentation.approved'),
+ token: 'statusGreen'
+ }
case 'CHANGES_REQUESTED':
- return { label: t('m.rjj84-Y'), token: 'statusRed' }
+ return {
+ label: t('prChecksPresentation.changes'),
+ token: 'statusRed'
+ }
case 'COMMENTED':
- return { label: t('m.bF0aphw'), token: 'textSecondary' }
+ return {
+ label: t('prChecksPresentation.commented'),
+ token: 'textSecondary'
+ }
case 'DISMISSED':
- return { label: t('m.dmAcep8'), token: 'textSecondary' }
+ return {
+ label: t('prChecksPresentation.dismissed'),
+ token: 'textSecondary'
+ }
case 'PENDING':
- return { label: t('m.NEg29tM'), token: 'statusAmber' }
+ return {
+ label: t('prChecksPresentation.pending'),
+ token: 'statusAmber'
+ }
case null:
case undefined:
- return { label: t('m._IeDTL8'), token: 'textSecondary' }
+ return {
+ label: t('prChecksPresentation.reviewed'),
+ token: 'textSecondary'
+ }
default:
- return { label: t('m._IeDTL8'), token: 'textSecondary' }
+ return {
+ label: t('prChecksPresentation.reviewed'),
+ token: 'textSecondary'
+ }
}
}
@@ -250,7 +280,7 @@ export function getPRReviewerRows(item: ReviewDisplayItem): ReviewerRow[] {
login,
name: user.name,
avatarUrl: user.avatarUrl,
- stateLabel: t('m.RfH2kOg'),
+ stateLabel: t('prChecksPresentation.requested'),
token: 'statusAmber'
})
}
diff --git a/mobile/src/components/pr-sidebar/pr-comment-audience.ts b/mobile/src/components/pr-sidebar/pr-comment-audience.ts
index cc640d018e2..eb895f85b29 100644
--- a/mobile/src/components/pr-sidebar/pr-comment-audience.ts
+++ b/mobile/src/components/pr-sidebar/pr-comment-audience.ts
@@ -14,9 +14,9 @@ export { createBotAuthorOverrideSet }
export type PRCommentAudienceFilter = 'all' | 'human' | 'bot'
export const PR_COMMENT_AUDIENCE_FILTERS: { value: PRCommentAudienceFilter; label: string }[] = [
- { value: 'all', label: t('m.rkpE-Mg') },
- { value: 'human', label: t('m.4fGywsA') },
- { value: 'bot', label: t('m._RfDeuw') }
+ { value: 'all', label: t('prCommentAudience.all') },
+ { value: 'human', label: t('prCommentAudience.humans') },
+ { value: 'bot', label: t('prCommentAudience.bots') }
]
const BOT_LOGIN_SUFFIX = '[bot]'
@@ -100,10 +100,10 @@ export function filterPRCommentsByAudience(
export function getPRCommentAudienceEmptyLabel(filter: PRCommentAudienceFilter): string {
switch (filter) {
case 'bot':
- return t('m.BvW_4OE')
+ return t('prCommentAudience.noBot')
case 'human':
- return t('m.znwGBr8')
+ return t('prCommentAudience.noHuman')
case 'all':
- return t('m.AXw1J4E')
+ return t('prCommentAudience.noComments')
}
}
diff --git a/mobile/src/components/pr-sidebar/pr-comment-time.ts b/mobile/src/components/pr-sidebar/pr-comment-time.ts
index 52ae265d7cc..e5203e7d807 100644
--- a/mobile/src/components/pr-sidebar/pr-comment-time.ts
+++ b/mobile/src/components/pr-sidebar/pr-comment-time.ts
@@ -9,23 +9,25 @@ export function formatPrCommentRelativeTime(iso: string, nowMs: number): string
}
const delta = nowMs - ts
if (delta < 60_000) {
- return t('m.xbjFHYU')
+ return t('prCommentTime.just')
}
const minutes = Math.floor(delta / 60_000)
if (minutes < 60) {
- return t('m.XG7ieU0', { value0: minutes })
+ return t('prCommentTime.minutes', { minutes: minutes })
}
const hours = Math.floor(minutes / 60)
if (hours < 24) {
- return t('m.J9EQWOE', { value0: hours })
+ return t('prCommentTime.hours', { hours: hours })
}
const days = Math.floor(hours / 24)
if (days < 30) {
- return t('m.3u9-Kuw', { value0: days })
+ return t('prCommentTime.days', { days: days })
}
const months = Math.floor(days / 30)
if (months < 12) {
- return t('m.5mTslyc', { value0: months })
+ return t('prCommentTime.months', { months: months })
}
- return t('m.rBMjMUM', { value0: Math.floor(months / 12) })
+ return t('prCommentTime.years', {
+ years: Math.floor(months / 12)
+ })
}
diff --git a/mobile/src/components/use-codex-reset-credit-action.ts b/mobile/src/components/use-codex-reset-credit-action.ts
index 5b8132da39b..bc7f20bb8ce 100644
--- a/mobile/src/components/use-codex-reset-credit-action.ts
+++ b/mobile/src/components/use-codex-reset-credit-action.ts
@@ -16,9 +16,12 @@ function describeScope(snapshot: AccountsSnapshot, scope: CodexResetCreditExpect
const account = snapshot.codex.accounts.find((candidate) => candidate.id === scope.accountId)
const identity = account?.email ?? t('accounts.selectedManagedAccount')
if (scope.target.runtime === 'host') {
- return t('m.TUCQXxI', { value0: identity })
+ return t('useCodexResetCreditAction.identityHost', { identity: identity })
}
- return t('m.sDDLSuM', { value0: identity, value1: scope.target.wslDistro })
+ return t('useCodexResetCreditAction.identityWsl', {
+ identity: identity,
+ wslDistro: scope.target.wslDistro
+ })
}
export function useCodexResetCreditAction({
@@ -69,15 +72,27 @@ export function useCodexResetCreditAction({
})
onSnapshot(result.snapshot)
if ('status' in result) {
- const cleanupWarning = result.attemptJournalRetained ? t('m.d5V00qM') : ''
- Alert.alert(t('m.4DQGAog'), t('m.rii7ZAs', { value0: cleanupWarning }))
+ const cleanupWarning = result.attemptJournalRetained
+ ? t('useCodexResetCreditAction.phone')
+ : ''
+ Alert.alert(
+ t('useCodexResetCreditAction.reset'),
+ t('useCodexResetCreditAction.account', {
+ cleanupWarning: cleanupWarning
+ })
+ )
return
}
const copy = getCodexResetCreditOutcomeCopy(result.outcome)
- const cleanupWarning = result.attemptJournalRetained ? t('m.rXScUPU') : ''
+ const cleanupWarning = result.attemptJournalRetained
+ ? t('useCodexResetCreditAction.host')
+ : ''
Alert.alert(copy.title, `${copy.message}${cleanupWarning}`)
} catch (error) {
- Alert.alert(t('m.TKIeXbw'), error instanceof Error ? error.message : String(error))
+ Alert.alert(
+ t('useCodexResetCreditAction.could'),
+ error instanceof Error ? error.message : String(error)
+ )
} finally {
inFlightRef.current = false
setResetting(false)
@@ -92,10 +107,19 @@ export function useCodexResetCreditAction({
}
const confirmedScope = resetScope
const confirmedLabel = describeScope(snapshot, confirmedScope)
- Alert.alert(t('m.EzPa9ek'), t('m.5hDxS58', { value0: confirmedLabel }), [
- { text: t('m._nuDzHY'), style: 'cancel' },
- { text: t('m.VWnR13E'), onPress: () => void consume(confirmedScope) }
- ])
+ Alert.alert(
+ t('useCodexResetCreditAction.useRate'),
+ t('useCodexResetCreditAction.spends', {
+ confirmedLabel: confirmedLabel
+ }),
+ [
+ { text: t('useCodexResetCreditAction.cancel'), style: 'cancel' },
+ {
+ text: t('useCodexResetCreditAction.useReset'),
+ onPress: () => void consume(confirmedScope)
+ }
+ ]
+ )
}, [accountMutationBusy, connected, consume, resetScope, resetting, snapshot, supported])
return { supported, resetting, resetScope, scopeLabel, confirmReset }
diff --git a/mobile/src/diagnostics/troubleshoot-common-issues.tsx b/mobile/src/diagnostics/troubleshoot-common-issues.tsx
index 1eae793be71..06433e86c5e 100644
--- a/mobile/src/diagnostics/troubleshoot-common-issues.tsx
+++ b/mobile/src/diagnostics/troubleshoot-common-issues.tsx
@@ -14,38 +14,60 @@ export function getTroubleshootCommonIssues(): TroubleshootSection[] {
{
id: 'wifi',
icon: ,
- title: t('m.vuZn-_E'),
- instructions: [t('m.DFWK1QU'), t('m.h6u3Ajc'), t('m.jEL8NQc')]
+ title: t('troubleshootCommonIssues.different'),
+ instructions: [
+ t('troubleshootCommonIssues.both'),
+ t('troubleshootCommonIssues.ethernet'),
+ t('troubleshootCommonIssues.tryReconnecting')
+ ]
},
{
id: 'firewall',
icon: ,
- title: t('m.amY3iCs'),
- instructions: [t('m.REilmMs'), t('m.ayekp1A'), t('m.401zg0M'), t('m.rtC8ngI')]
+ title: t('troubleshootCommonIssues.firewall'),
+ instructions: [
+ t('troubleshootCommonIssues.mac'),
+ t('troubleshootCommonIssues.windows'),
+ t('troubleshootCommonIssues.linux'),
+ t('troubleshootCommonIssues.corporate')
+ ]
},
{
id: 'desktop',
icon: ,
- title: t('m.MED_8yU'),
- instructions: [t('m.i4fV_jk'), t('m.WkJ-I-g'), t('m.neP0TKg')]
+ title: t('troubleshootCommonIssues.desktop'),
+ instructions: [
+ t('troubleshootCommonIssues.orca'),
+ t('troubleshootCommonIssues.tryRestarting'),
+ t('troubleshootCommonIssues.after')
+ ]
},
{
id: 'timeout',
icon: ,
- title: t('m.AE3mc7A'),
- instructions: [t('m.uGWzUrE'), t('m.gvS1F3o'), t('m.S9tNuKw')]
+ title: t('troubleshootCommonIssues.connection'),
+ instructions: [
+ t('troubleshootCommonIssues.checkWi'),
+ t('troubleshootCommonIssues.go'),
+ t('troubleshootCommonIssues.restart')
+ ]
},
{
id: 'tailscale',
icon: ,
- title: t('m.ngjn4tY'),
- instructions: [t('m.T6EL0oM'), t('m.rmMn9Xc'), t('m.j0KeldQ'), t('m.PxeuBQc')]
+ title: t('troubleshootCommonIssues.tailscale'),
+ instructions: [
+ t('troubleshootCommonIssues.host'),
+ t('troubleshootCommonIssues.i'),
+ t('troubleshootCommonIssues.checkDesktop'),
+ t('troubleshootCommonIssues.update')
+ ]
},
{
id: 'vpn',
icon: ,
- title: t('m.jLhPXXQ'),
- instructions: [t('m.n-WXtiA'), t('m.MJ1SglY')]
+ title: t('troubleshootCommonIssues.other'),
+ instructions: [t('troubleshootCommonIssues.non'), t('troubleshootCommonIssues.disable')]
}
]
}
diff --git a/mobile/src/dictation/mobile-dictation-setup.ts b/mobile/src/dictation/mobile-dictation-setup.ts
index 01b6fc81f01..278adaed4eb 100644
--- a/mobile/src/dictation/mobile-dictation-setup.ts
+++ b/mobile/src/dictation/mobile-dictation-setup.ts
@@ -34,9 +34,9 @@ export async function fetchDictationSetup(
const response = await fetchDictationSetupResponse(client)
if (!response.ok) {
if (isLegacyDesktopSpeechSetupError(response.error)) {
- throw new Error(t('m.XOHYcMw'))
+ throw new Error(t('mobileDictationSetup.update'))
}
- throw new Error(response.error?.message || t('m.jcVunZ4'))
+ throw new Error(response.error?.message || t('mobileDictationSetup.failedLoad'))
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
@@ -60,7 +60,7 @@ export async function downloadDictationModel(
): Promise {
const response = await client.sendRequest('speech.models.download', { modelId })
if (!response.ok) {
- throw new Error(response.error?.message || t('m.hkwxfd0'))
+ throw new Error(response.error?.message || t('mobileDictationSetup.failedStart'))
}
}
@@ -70,7 +70,7 @@ export async function deleteDictationModel(
): Promise {
const response = await client.sendRequest('speech.models.delete', { modelId })
if (!response.ok) {
- throw new Error(response.error?.message || t('m.9VJGb2s'))
+ throw new Error(response.error?.message || t('mobileDictationSetup.failedDelete'))
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
@@ -81,7 +81,7 @@ export async function setDictationConfig(
): Promise {
const response = await client.sendRequest('speech.dictation.setup', params)
if (!response.ok) {
- throw new Error(response.error?.message || t('m.CdTon5s'))
+ throw new Error(response.error?.message || t('mobileDictationSetup.failedUpdate'))
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
diff --git a/mobile/src/files/MobileFileExplorerPanel.tsx b/mobile/src/files/MobileFileExplorerPanel.tsx
index 34c0dab845f..4ea68832032 100644
--- a/mobile/src/files/MobileFileExplorerPanel.tsx
+++ b/mobile/src/files/MobileFileExplorerPanel.tsx
@@ -69,7 +69,10 @@ export function MobileFileExplorerPanel(props: {
const rootLoad = relativePath === ''
if (!client || connState !== 'connected') {
- const message = connState === 'connected' ? t('m.vu5sSQI') : t('m.FuhqCI4')
+ const message =
+ connState === 'connected'
+ ? t('mobileFileExplorerPanel.connecting')
+ : t('mobileFileExplorerPanel.waiting')
if (rootLoad) {
const hasLoadedRoot =
(getDirectoryCacheState(directoryCacheRef.current, '')?.entries.length ?? 0) > 0
@@ -139,9 +142,13 @@ export function MobileFileExplorerPanel(props: {
setLegacyListTruncated(legacyResult.truncated)
return
}
- throw new Error(legacy.error?.message || response.error?.message || t('m.1Z6vya0'))
+ throw new Error(
+ legacy.error?.message ||
+ response.error?.message ||
+ t('mobileFileExplorerPanel.unable')
+ )
}
- throw new Error(response.error?.message || t('m.1Z6vya0'))
+ throw new Error(response.error?.message || t('mobileFileExplorerPanel.unable'))
}
if (
!isCurrentDirectoryLoad(directoryLoadRevisionsRef.current, scopeRef.current, loadToken)
@@ -162,7 +169,7 @@ export function MobileFileExplorerPanel(props: {
) {
return
}
- const message = err instanceof Error ? err.message : t('m.1Z6vya0')
+ const message = err instanceof Error ? err.message : t('mobileFileExplorerPanel.unable')
if (rootLoad) {
// Why: a failed background refresh keeps the cached tree browsable;
// only a cold load surfaces the full-screen error.
@@ -291,7 +298,7 @@ export function MobileFileExplorerPanel(props: {
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={() => onRequestClose?.()}
hitSlop={8}
- accessibilityLabel={t('m.A053H2s')}
+ accessibilityLabel={t('mobileFileExplorerPanel.close')}
>
@@ -300,18 +307,18 @@ export function MobileFileExplorerPanel(props: {
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={() => router.back()}
hitSlop={8}
- accessibilityLabel={t('m.vT-EgZw')}
+ accessibilityLabel={t('mobileFileExplorerPanel.back')}
>
)}
- {t('m.8ojoNLo')}
+ {t('mobileFileExplorerPanel.files')}
{worktreeLabel}
- {legacyListTruncated ? t('m.UomXr8g') : ''}
+ {legacyListTruncated ? t('mobileFileExplorerPanel.showing') : ''}
@@ -333,12 +340,12 @@ export function MobileFileExplorerPanel(props: {
connState !== 'connected' && hostId ? void forceReconnect(hostId) : void loadDirectory('')
}
>
- {t('m.LS0hOug')}
+ {t('mobileFileExplorerPanel.retry')}
) : rows.length === 0 ? (
- {t('m.CaZB1fk')}
+ {t('mobileFileExplorerPanel.no')}
) : (
setMode('source')}
accessibilityRole="button"
accessibilityState={{ selected: sourceSelected }}
- accessibilityLabel={t('m.12QKL8A')}
+ accessibilityLabel={t('mobileFileMarkdownPreview.viewMarkdown')}
>
setMode('preview')}
accessibilityRole="button"
accessibilityState={{ selected: previewSelected }}
- accessibilityLabel={t('m.ujEE5Aw')}
+ accessibilityLabel={t('mobileFileMarkdownPreview.viewRendered')}
>
{preview.message}
- {t('m.zqZaJJo')}
+ {t('mobileFilePreviewBody.retry')}
)
@@ -47,7 +47,7 @@ export function MobileFilePreviewBody({ preview, ...options }: Props) {
) : (
- {t('m.0U_34Zg')}
+ {t('mobileFilePreviewBody.empty')}
)
}
@@ -66,7 +66,9 @@ export function MobileFilePreviewBody({ preview, ...options }: Props) {
style={[styles.image, { width: options.imageWidth, height: options.imageHeight }]}
resizeMode="contain"
onError={options.onImageError}
- accessibilityLabel={t('m.cDZy2i8', { value0: options.title })}
+ accessibilityLabel={t('mobileFilePreviewBody.title', {
+ title: options.title
+ })}
/>
diff --git a/mobile/src/files/MobileFilePreviewEditableSource.tsx b/mobile/src/files/MobileFilePreviewEditableSource.tsx
index 56e9a9bcd42..c39757c2af6 100644
--- a/mobile/src/files/MobileFilePreviewEditableSource.tsx
+++ b/mobile/src/files/MobileFilePreviewEditableSource.tsx
@@ -50,7 +50,9 @@ export function MobileFilePreviewEditableSource({
autoCorrect={false}
selection={selection ?? undefined}
onSelectionChange={() => setSelection(null)}
- accessibilityLabel={t('m.yc-xh3U', { value0: title })}
+ accessibilityLabel={t('mobileFilePreviewEditableSource.title', {
+ title: title
+ })}
/>
)
diff --git a/mobile/src/files/MobileFilePreviewScreen.tsx b/mobile/src/files/MobileFilePreviewScreen.tsx
index d0349e436f1..2b7248fd84d 100644
--- a/mobile/src/files/MobileFilePreviewScreen.tsx
+++ b/mobile/src/files/MobileFilePreviewScreen.tsx
@@ -38,7 +38,9 @@ export function MobileFilePreviewScreen({ route }: Props) {
const { client, state: connState } = useHostClient(previewParams?.hostId)
const forceReconnect = useForceReconnect()
const [preview, setPreview] = useState(() =>
- route.ok ? { status: 'loading', message: t('m.Iqn4mt4') } : previewError(route.message)
+ route.ok
+ ? { status: 'loading', message: t('mobileFilePreviewScreen.loading') }
+ : previewError(route.message)
)
const [draftContent, setDraftContent] = useState('')
const [savedContent, setSavedContent] = useState('')
@@ -89,7 +91,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
const loadPreview = useCallback(async () => {
const loadSourceKey = previewSourceKey
if (!previewParams || !previewSource || loadSourceKey !== routePreviewSourceKey) {
- setPreview(previewError(route.ok ? t('m.uLXt2Qs') : route.message))
+ setPreview(previewError(route.ok ? t('mobileFilePreviewScreen.unableLoad') : route.message))
return
}
const preserveDirtyDraft =
@@ -97,14 +99,21 @@ export function MobileFilePreviewScreen({ route }: Props) {
draftContentRef.current !== savedContentRef.current
if (!client || connState !== 'connected') {
if (preserveDirtyDraft) {
- setSaveError(t('m.MCFjuu8'))
+ setSaveError(t('mobileFilePreviewScreen.waiting'))
return
}
- setPreview({ status: 'waiting', message: t('m.MCFjuu8'), reconnect: true })
+ setPreview({
+ status: 'waiting',
+ message: t('mobileFilePreviewScreen.waiting'),
+ reconnect: true
+ })
return
}
if (!preserveDirtyDraft) {
- setPreview({ status: 'loading', message: t('m.Iqn4mt4') })
+ setPreview({
+ status: 'loading',
+ message: t('mobileFilePreviewScreen.loading')
+ })
}
setSaveError('')
try {
@@ -134,7 +143,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
}
setPreview(result)
} catch (err) {
- const message = err instanceof Error ? err.message : t('m.uLXt2Qs')
+ const message = err instanceof Error ? err.message : t('mobileFilePreviewScreen.unableLoad')
if (preserveDirtyDraft) {
setSaveError(message)
return
@@ -212,7 +221,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
setSaveError(saveErrorMessageFromPreviewResult(result))
}
} catch (err) {
- const message = err instanceof Error ? err.message : t('m.jogAQ98')
+ const message = err instanceof Error ? err.message : t('mobileFilePreviewScreen.unableSave')
setSaveError(message)
} finally {
setSaving(false)
@@ -224,9 +233,13 @@ export function MobileFilePreviewScreen({ route }: Props) {
router.back()
return true
}
- Alert.alert(t('m.k969DeE'), t('m.vXalblI'), [
- { text: t('m.5cnTshE'), style: 'cancel' },
- { text: t('m.MpjZorw'), style: 'destructive', onPress: () => router.back() }
+ Alert.alert(t('mobileFilePreviewScreen.discardChanges'), t('mobileFilePreviewScreen.unsaved'), [
+ { text: t('mobileFilePreviewScreen.stay'), style: 'cancel' },
+ {
+ text: t('mobileFilePreviewScreen.discard'),
+ style: 'destructive',
+ onPress: () => router.back()
+ }
])
return true
}, [hasUnsavedTerminalArtifactDraft, router])
@@ -244,13 +257,13 @@ export function MobileFilePreviewScreen({ route }: Props) {
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={requestBack}
hitSlop={8}
- accessibilityLabel={t('m.nxnMGkU')}
+ accessibilityLabel={t('mobileFilePreviewScreen.back')}
>
- {title || t('m.76ELAmA')}
+ {title || t('mobileFilePreviewScreen.preview')}
{meta}
@@ -261,7 +274,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
style={[styles.saveButton, (!canSaveArtifact || saving) && styles.saveButtonDisabled]}
onPress={() => void saveArtifact()}
disabled={!canSaveArtifact || saving}
- accessibilityLabel={t('m.BnjL5Ho')}
+ accessibilityLabel={t('mobileFilePreviewScreen.save')}
>
@@ -271,7 +284,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
- setPreview({ status: 'error', message: t('m.uLXt2Qs'), reconnect: false })
+ setPreview({
+ status: 'error',
+ message: t('mobileFilePreviewScreen.unableLoad'),
+ reconnect: false
+ })
}
onRetry={retry}
/>
@@ -289,5 +306,7 @@ export function MobileFilePreviewScreen({ route }: Props) {
}
function saveErrorMessageFromPreviewResult(result: MobileFilePreviewResult): string {
- return result.status === 'error' || result.status === 'waiting' ? result.message : t('m.jogAQ98')
+ return result.status === 'error' || result.status === 'waiting'
+ ? result.message
+ : t('mobileFilePreviewScreen.unableSave')
}
diff --git a/mobile/src/files/MobileFilePreviewSourceText.tsx b/mobile/src/files/MobileFilePreviewSourceText.tsx
index 770596db478..74a2025908a 100644
--- a/mobile/src/files/MobileFilePreviewSourceText.tsx
+++ b/mobile/src/files/MobileFilePreviewSourceText.tsx
@@ -52,7 +52,11 @@ export function MobileFilePreviewSourceText({
{truncated ? (
) : null}
-
+
@@ -62,7 +66,9 @@ export function MobileFilePreviewSourceText({
export function MobileFilePreviewTruncatedNote({ byteLength }: { byteLength: number }) {
return (
- {t('m.mGhZjxw', { value0: formatPreviewByteLength(byteLength) })}
+ {t('mobileFilePreviewSourceText.preview', {
+ formatPreviewByteLength: formatPreviewByteLength(byteLength)
+ })}
)
}
diff --git a/mobile/src/files/mobile-file-explorer-row.tsx b/mobile/src/files/mobile-file-explorer-row.tsx
index 5b6eba746ac..773b76ca22d 100644
--- a/mobile/src/files/mobile-file-explorer-row.tsx
+++ b/mobile/src/files/mobile-file-explorer-row.tsx
@@ -30,7 +30,7 @@ export function MobileFileExplorerRow(props: Props) {
- {t('m.t2QYxhU')}
+ {t('mobileFileExplorerRow.loading')}
)
}
@@ -40,7 +40,7 @@ export function MobileFileExplorerRow(props: Props) {
- {item.message || t('m.dZsgG-M')}
+ {item.message || t('mobileFileExplorerRow.unable')}
[styles.inlineRetryButton, pressed && styles.rowPressed]}
@@ -48,9 +48,11 @@ export function MobileFileExplorerRow(props: Props) {
triggerSelection()
onRetryDirectory(item.relativePath)
}}
- accessibilityLabel={t('m.v4sDG-8', { value0: item.relativePath })}
+ accessibilityLabel={t('mobileFileExplorerRow.retryLoading', {
+ relativePath: item.relativePath
+ })}
>
- {t('m.CGYoYAY')}
+ {t('mobileFileExplorerRow.retry')}
)
@@ -111,10 +113,12 @@ function TreeRow(props: {
}}
accessibilityLabel={
isDirectory
- ? t('m.LuU4lSE', { value0: item.name })
+ ? t('mobileFileExplorerRow.open', { itemName: item.name })
: disabled
- ? t('m.AnmS3ZU', { value0: item.name })
- : t('m.F2AHmFI', { value0: item.name })
+ ? t('mobileFileExplorerRow.item', {
+ itemName: item.name
+ })
+ : t('mobileFileExplorerRow.preview', { itemName: item.name })
}
>
{isDirectory ? (
@@ -139,7 +143,9 @@ function TreeRow(props: {
{item.name}
- {disabled ? {t('m.m0QdE2U')} : null}
+ {disabled ? (
+ {t('mobileFileExplorerRow.unavailable')}
+ ) : null}
)
diff --git a/mobile/src/files/mobile-file-mutation-ownership.ts b/mobile/src/files/mobile-file-mutation-ownership.ts
index ee0ddff5db0..1c9b5f5498d 100644
--- a/mobile/src/files/mobile-file-mutation-ownership.ts
+++ b/mobile/src/files/mobile-file-mutation-ownership.ts
@@ -7,7 +7,7 @@ import type { RpcFailure, RpcSuccess } from '../transport/types'
import { t } from '@/i18n/mobile-i18n'
const FILE_MUTATION_TIMEOUT_MS = 15_000
-const SSH_OWNER_CHANGED_MESSAGE = t('m.hf0yXVE')
+const SSH_OWNER_CHANGED_MESSAGE = t('mobileFileMutationOwnership.could')
export type MobileFileMutationOwnership = SshMutationExpectation & {
expectedExecutionHostId: 'local' | `ssh:${string}`
diff --git a/mobile/src/files/mobile-file-preview-request.ts b/mobile/src/files/mobile-file-preview-request.ts
index 9f140b16ca4..c9258d0b54c 100644
--- a/mobile/src/files/mobile-file-preview-request.ts
+++ b/mobile/src/files/mobile-file-preview-request.ts
@@ -221,7 +221,7 @@ async function verifyTerminalArtifactBaseContent(
status: 'error',
error: {
status: 'error',
- message: t('m.kYWeCgo'),
+ message: t('mobileFilePreviewRequest.file'),
reconnect: false
}
}
diff --git a/mobile/src/files/mobile-file-preview-response.ts b/mobile/src/files/mobile-file-preview-response.ts
index 945a7a009b4..ed268c9c482 100644
--- a/mobile/src/files/mobile-file-preview-response.ts
+++ b/mobile/src/files/mobile-file-preview-response.ts
@@ -58,13 +58,25 @@ export function normalizeMobileFilePreviewResponse(
export function previewError(message: string): MobileFilePreviewResult {
const normalized = message.toLowerCase()
if (normalized === 'binary_file' || normalized.includes('binary_file')) {
- return { status: 'error', message: t('m.UfU4CAU'), reconnect: false }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.binary'),
+ reconnect: false
+ }
}
if (normalized === 'file_too_large' || normalized.includes('file_too_large')) {
- return { status: 'error', message: t('m.UFAFIP0'), reconnect: false }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.fileToo'),
+ reconnect: false
+ }
}
if (isTerminalArtifactGrantError(normalized)) {
- return { status: 'error', message: t('m.ktGDvZE'), reconnect: false }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.reload'),
+ reconnect: false
+ }
}
if (
normalized.includes('remote connection dropped') ||
@@ -72,7 +84,11 @@ export function previewError(message: string): MobileFilePreviewResult {
normalized.includes('disconnected') ||
normalized.includes('reconnect the ssh target')
) {
- return { status: 'error', message: t('m.X-whfMo'), reconnect: true }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.unableReach'),
+ reconnect: true
+ }
}
if (
normalized.includes('enoent') ||
@@ -80,9 +96,17 @@ export function previewError(message: string): MobileFilePreviewResult {
normalized.includes('not found') ||
normalized.includes('does not exist')
) {
- return { status: 'error', message: t('m.Jj_IDwY'), reconnect: false }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.fileNot'),
+ reconnect: false
+ }
+ }
+ return {
+ status: 'error',
+ message: t('mobileFilePreviewResponse.unableLoad'),
+ reconnect: false
}
- return { status: 'error', message: t('m.nbgr4H0'), reconnect: false }
}
export function formatPreviewByteLength(byteLength: number): string {
@@ -130,7 +154,7 @@ function normalizeTextPreviewResult(
result: unknown
): MobileFilePreviewResult {
if (!result || typeof result !== 'object') {
- return previewError(t('m.nbgr4H0'))
+ return previewError(t('mobileFilePreviewResponse.unableLoad'))
}
const preview = result as {
content?: unknown
@@ -142,7 +166,7 @@ function normalizeTextPreviewResult(
return previewError('binary_file')
}
if (typeof preview.content !== 'string') {
- return previewError(t('m.nbgr4H0'))
+ return previewError(t('mobileFilePreviewResponse.unableLoad'))
}
const kind = textKindForPreviewPath(relativePath)
if (preview.content.length === 0) {
diff --git a/mobile/src/files/mobile-file-preview-route.ts b/mobile/src/files/mobile-file-preview-route.ts
index 40b323ea772..219d4ce0065 100644
--- a/mobile/src/files/mobile-file-preview-route.ts
+++ b/mobile/src/files/mobile-file-preview-route.ts
@@ -60,11 +60,11 @@ export function normalizeMobileFilePreviewRouteParams(
const absolutePath = singleParam(params.absolutePath)
const grantId = singleParam(params.grantId)
if (!hostId || !worktreeId) {
- return { ok: false, message: t('m.2t0lh6U') }
+ return { ok: false, message: t('mobileFilePreviewRoute.unable') }
}
if (source === 'terminalArtifact') {
if (!absolutePath || !grantId) {
- return { ok: false, message: t('m.2t0lh6U') }
+ return { ok: false, message: t('mobileFilePreviewRoute.unable') }
}
return {
ok: true,
@@ -85,7 +85,7 @@ export function normalizeMobileFilePreviewRouteParams(
}
}
if (!relativePath) {
- return { ok: false, message: t('m.2t0lh6U') }
+ return { ok: false, message: t('mobileFilePreviewRoute.unable') }
}
return {
ok: true,
diff --git a/mobile/src/hooks/mobile-dictation-desktop-start.ts b/mobile/src/hooks/mobile-dictation-desktop-start.ts
index e4ca7fb67c8..c3c714949dc 100644
--- a/mobile/src/hooks/mobile-dictation-desktop-start.ts
+++ b/mobile/src/hooks/mobile-dictation-desktop-start.ts
@@ -116,7 +116,7 @@ export async function startMobileDictationDesktopSession(
// Commit in the same continuation as the final stale check; returning first
// would let a queued cancel resurrect microphone recording after cleanup.
if (!options.commitRecordingStart()) {
- throw new Error(t('m.LuqBIhs'))
+ throw new Error(t('mobileDictationDesktopStart.failed'))
}
} catch (err) {
const wasCurrent = isCurrentStart(options)
diff --git a/mobile/src/hooks/mobile-dictation-keep-awake.ts b/mobile/src/hooks/mobile-dictation-keep-awake.ts
index e55f80de926..90a62f575bd 100644
--- a/mobile/src/hooks/mobile-dictation-keep-awake.ts
+++ b/mobile/src/hooks/mobile-dictation-keep-awake.ts
@@ -35,7 +35,7 @@ function isNativeCallTimeout(err: unknown): boolean {
function withNativeCallTimeout(nativeCall: Promise): Promise {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
- const timeoutError = new Error(t('m.oQrz0NI'))
+ const timeoutError = new Error(t('mobileDictationKeepAwake.keep'))
timeoutError.name = KEEP_AWAKE_TIMEOUT_ERROR_NAME
reject(timeoutError)
}, MOBILE_DICTATION_KEEP_AWAKE_NATIVE_TIMEOUT_MS)
diff --git a/mobile/src/hooks/mobile-dictation-pending-audio-budget.ts b/mobile/src/hooks/mobile-dictation-pending-audio-budget.ts
index 30d11ef9537..a6ff7e8baaa 100644
--- a/mobile/src/hooks/mobile-dictation-pending-audio-budget.ts
+++ b/mobile/src/hooks/mobile-dictation-pending-audio-budget.ts
@@ -9,7 +9,9 @@ const MAX_PENDING_AUDIO_SECONDS = 5
export const MOBILE_DICTATION_MAX_PENDING_AUDIO_BYTES =
MOBILE_DICTATION_PCM_SAMPLE_RATE * PCM_BYTES_PER_SAMPLE * MAX_PENDING_AUDIO_SECONDS
-export const MOBILE_DICTATION_CONNECTION_SLOW_ERROR_MESSAGE = t('m.ueRRwRg')
+export const MOBILE_DICTATION_CONNECTION_SLOW_ERROR_MESSAGE = t(
+ 'mobileDictationPendingAudioBudget.connection'
+)
export class MobileDictationPendingAudioBudget {
private pendingBytes = 0
diff --git a/mobile/src/hooks/use-mobile-dictation.ts b/mobile/src/hooks/use-mobile-dictation.ts
index 8acdade0dc5..43e25bd1c5f 100644
--- a/mobile/src/hooks/use-mobile-dictation.ts
+++ b/mobile/src/hooks/use-mobile-dictation.ts
@@ -130,7 +130,7 @@ export function useMobileDictation(options: UseMobileDictationOptions): UseMobil
}
if (!permission.granted) {
setStatus('idle')
- throw new Error(t('m.InUuqhA'))
+ throw new Error(t('useMobileDictation.microphone'))
}
const initialized = await initialize()
@@ -143,7 +143,7 @@ export function useMobileDictation(options: UseMobileDictationOptions): UseMobil
}
if (!initialized) {
setStatus('idle')
- throw new Error(t('m.Pwq6G9w'))
+ throw new Error(t('useMobileDictation.failed'))
}
const dictationId = createMobileDictationId()
@@ -241,7 +241,7 @@ export function useMobileDictation(options: UseMobileDictationOptions): UseMobil
if (text) {
onTranscriptRef.current(text)
} else {
- reportError(new Error(t('m.qiXFVWc')))
+ reportError(new Error(t('useMobileDictation.no')))
}
} catch (err) {
failActiveDictation(dictationId, err)
diff --git a/mobile/src/i18n/locales/en.json b/mobile/src/i18n/locales/en.json
index 440cc1e78a9..c89fbd980d0 100644
--- a/mobile/src/i18n/locales/en.json
+++ b/mobile/src/i18n/locales/en.json
@@ -1,2180 +1,2608 @@
{
- "m": {
- "zWwi3-o": "Todo",
- "hWeTdOM": "In progress",
- "mg8ozqs": "In review",
- "EleEi2Q": "Done",
- "1Bc_S64": "PR Status",
- "BX2Np3Y": "Repository",
- "oBZu0_c": "Status",
- "Iq3a5so": "No Grouping",
- "y1TvQWs": "Server order",
- "FyGSYV4": "Manual",
- "yH1bPxU": "Repository, then workspace name",
- "v5H1mJY": "Repo",
- "egkm8qI": "Most recent output first",
- "2xJ96AA": "Recent",
- "BaGIgrE": "Alphabetical by name",
- "tQqkyxI": "Name",
- "RcmL46Y": "Agents that need attention, then recent activity",
- "6gEQgs0": "Agent activity",
- "KbmpcZs": "Reconnecting…",
- "6_SeqME": "Can't connect",
- "YAPgxBM": "Can't reach desktop",
- "G6a1Jqk": "Disconnected",
- "I-waJyg": "Connecting…",
- "jgGsba4": "Connected",
- "0BvjSKA": "Pairing invalid — re-pair with your desktop",
- "HguWCpQ": "Port must be 1–65535.",
- "dRmw4EQ": "Missing hostname.",
- "CshxztM": "Not a valid address.",
- "6lctDfQ": "Not a valid hostname.",
- "fX92Peg": "Host must not include a path or query.",
- "HQMAFdE": "Use ws:// or wss:// (or host:port).",
- "z85IfPo": "Enter a host address.",
- "lxKZMMw": "Expected exactly one endpoint for configured relay metadata",
- "e-zCiAo": "Relay host identity mismatch",
- "CjbcG3A": "Relay identity and endpoint must coexist",
- "HrWsdDM": "Clear line before cursor",
- "sL5fKGQ": "Ctrl+U",
- "Bd9qfdk": "Delete word backward",
- "jVVj75Y": "Ctrl+W",
- "0VWtVO8": "End of line",
- "5m_ucwE": "Ctrl+E",
- "CKFp_QM": "Start of line",
- "u9q9lPQ": "Ctrl+A",
- "mcvHf4o": "Reverse search",
- "a2Cb3GE": "Ctrl+R",
- "hqWfNmA": "Suspend process",
- "NIdsbYo": "Ctrl+Z",
- "Eqaj8oY": "Clear screen",
- "R6ZcIz8": "Ctrl+L",
- "PBPnPeQ": "Send EOF",
- "vFYSo0s": "Ctrl+D",
- "AzHoQzM": "Interrupt terminal",
- "ke03J5M": "Ctrl+C",
- "v5WSGO0": "Arrow Right",
- "RiGIavM": "Arrow Left",
- "vVsy7qk": "Arrow Down",
- "IwJi8TY": "Arrow Up",
- "fNgDk9o": "Forward delete",
- "gmy3A7M": "Del",
- "6TRPiic": "Backspace",
- "l6KJT3M": "Space",
- "p7_d2FU": "Shift Tab",
- "S9DH8y4": "Shift+Tab",
- "9KFo5zM": "Enter",
- "hM5KUAw": "Tab",
- "jHe6UUU": "Escape",
- "bNejRmQ": "Esc",
- "UnBBA1A": "Reload",
- "p2soPzg": "Terminal failed to load",
- "IwMISoQ": "All",
- "J54idHw": "Closed",
- "sKFSmrM": "Merged",
- "dGRdl38": "Open",
- "_NhxpRw": "Name",
- "efmLHxE": "Branch",
- "JEQaLyM": "GitLab",
- "j6H-ZB8": "Linear",
- "fLijFJI": "GitHub",
- "0GQcyjg": "Smart",
- "TgLMnDc": "Use repo-relative directories, not root, absolute paths, or parent segments.",
- "M0WKvoE": "Add at least one directory.",
- "fCVCUqw": "WSL reset scopes require an exact distro",
- "TJPBpxE": "Host reset scopes cannot name a WSL distro",
- "CgVIb2E": "Diff truncated for mobile preview.",
- "mZj5XBY": "Unable to Load Diff",
- "v6-Hc8I": "Close committed diff preview",
- "I6GjQO8": "Committed on branch",
- "6lym-WQ": "{{value0}}..HEAD",
- "P2fbbug": "Show details",
- "eysP-fI": "Hide details",
- "6Pb0W84": "Show commit failure details",
- "7eT5oiE": "Hide commit failure details",
- "-RbEI6M": "Fix",
- "3iqxoCY": "Fix commit failure with AI",
- "Hol4rtI": "Commit failed",
- "fcDHZ1U": "No commits.",
- "Qb3CogY": "Retry",
- "kylGvPU": "Waiting for desktop...",
- "y0bB4-s": "No file changes",
- "c_4jbTI": "Failed to load history",
- "O_0cF4M": "{{value0}} changed",
- "cLOWzDM": "{{value0}} staged",
- "Dysvcf0": "{{value0}} on branch",
- "8tFmU9A": "Generate commit message with AI",
- "PTohtCY": "Cancel commit message generation",
- "uTRYt2U": "Commit message",
- "2X52pxU": "No staged files",
- "ELJU7AQ": "Commit message disabled. No staged files.",
- "yKqTr9E": "Working tree is clean.",
- "89qgAps": "No local changes",
- "8E6deJU": "Open source control actions",
- "DHXoi2A": "Unstage All",
- "9pCKA8U": "Stage All",
- "o_TTJDk": "Reconnecting to desktop...",
- "PW__oVI": "Open committed change {{value0}}",
- "tZHFwCg": "Loading committed changes...",
- "m_C8jkI": "Committed on Branch",
- "IET9hpI": "Discard {{value0}}",
- "WTkbKTE": "Stage {{value0}}",
- "9OoD7rs": "Unstage {{value0}}",
- "av_Mh7U": "Unresolved conflict",
- "4a6Yo9s": "Open changed file {{value0}}",
- "SrSDY0M": "from {{value0}}",
- "Pt1enm0": "Refresh source control",
- "5lXW9sQ": "Open pull request on the web",
- "HUC1SZA": "Open pull request #{{value0}} on the web",
- "PjA8ztc": "Source Control",
- "OtpFc0w": "Back to session",
- "MDlHRa0": "Close source control",
- "84pwQsY": "Open it in your browser?",
- "4E80Be4": "Pull Request Created",
- "n9UDFoo": "Switch Branch",
- "Oh7cEhY": "Discard changes to \"{{value0}}\"? This cannot be undone.",
- "7IMotMA": "Discard Change",
- "7p6X0C0": "Source Control",
- "dggV318": "Retry",
- "SlcSA9A": "Unable to Load",
- "UgUD08U": "Source Control Unavailable",
- "Q1mHSX4": "Create pull request",
- "xoN_ZQM": "Loading pull request…",
- "jrzi7yY": "Committed on Branch",
- "cU7VGGA": "Failed to generate commit message",
- "6N6POoY": "Create Pull Request",
- "8fhgeQQ": "Branch changed while preparing the pull request.",
- "zAg6hUc": "Could not generate a commit message. Add one in Source Control, then retry.",
- "x1skfkY": "Resolve or stage changes before creating a pull request.",
- "695pbL4": "Resolve conflicts before creating a pull request.",
- "QeyCTxE": "Push failed. Resolve the push error, then try again.",
- "hjs2AB4": "Commits",
- "bOc3nUM": "Switch branch",
- "ntik19Q": "Rebase onto base",
- "r_MPRhE": "Publish Branch",
- "3blspe8": "Fetch",
- "_Pq5EEw": "Push & Create PR",
- "IgtghkE": "Create PR",
- "ZFwznUg": "Commit & Sync",
- "4pU4zTo": "Commit & Push",
- "_Srm4Jk": "Commit",
- "s7LT0Wk": "Failed to launch agent",
- "Ngsl81c": "Waiting for desktop...",
- "h4RNhQ0": "Failed to generate commit message",
- "IhhRQcI": "Check out a branch before creating a pull request.",
- "8lyq50g": "Update Orca desktop to use Source Control on mobile.",
- "v0PMFRE": "Unable to resolve the base branch for comparison.",
- "xLlZko0": "Waiting for desktop...",
- "0MDy3xU": "Unable to open diff",
- "iO0cooo": "Source control action failed",
- "0EPx-aA": "Agent is working",
- "vCnFzKQ": "Close",
- "8xevGic": "Reload",
- "m4hO2RY": "Forward",
- "SKku3yE": "Back",
- "GZwtZCE": "Browser",
- "EwbB5VI": "Next",
- "ZEWq5OM": "Send answer",
- "yxcaJwo": "Cancel",
- "7nef7b0": "Type your answer",
- "biG4V5Q": "Other…",
- "imHMT2Y": "Send message",
- "0JFch-U": "Dictate",
- "r9MfglU": "Stop dictation",
- "o_uvOaw": "Attach image",
- "8VDRuNk": "Remove image",
- "lHpfBcs": "Queued",
- "85E7hns": "Scroll this message to top",
- "m5GqFPc": "Copy message",
- "0bAYawM": "{{value0}}×",
- "0mLnbZ0": "… {{value0}} more tool calls",
- "O8aNMg0": "Send reply",
- "psOJLjQ": "Type your reply…",
- "bSeVb4U": "Or type a reply…",
- "NR7KpaA": "Submit selected options",
- "BcZ8-jY": "Submit{{value0}}",
- "55yDVNk": "Message, @files, /commands",
- "AXyDPsE": "Waiting for terminal…",
- "gFSApKE": "Reconnecting…",
- "X8_vuao": "Stop",
- "1oeCDU8": "Stop the agent",
- "J3nTi3Q": "Tools",
- "HgMEzFE": "Collapse",
- "MWJZkOQ": "Scroll to latest",
- "AexlW6I": "Load earlier messages",
- "u8wilUo": "Checks",
- "6R8BWsw": "Agent History",
- "a4FTXPM": "Start voice dictation",
- "4Bofttg": "Starting voice dictation",
- "467WHFs": "Cancel voice dictation",
- "lmt1VYs": "Stop voice dictation",
- "diKZlw8": "Long press to attach a file instead",
- "THy0254": "Attach a photo",
- "Vl7Dj48": "Sending image",
- "mr8N0cA": "Add Quick Command",
- "SZAlJoE": "Save",
- "z9Me_JI": "Cancel",
- "nB0fh-Q": "Project",
- "spBXyhw": "Global",
- "JVmE8Lo": "Scope",
- "iAdHX2w": "Submit immediately instead of only inserting text.",
- "S9UUSi8": "Append Enter",
- "MsJOHDg": "Advanced",
- "WFigoqY": "Supports skills, file paths, and built-in commands.",
- "YGxS8ck": "npm run dev",
- "j_uWjuQ": "Ask the agent to investigate this workspace",
- "2WUowpg": "Command Text",
- "v512Bqc": "Prompt",
- "9D9oj64": "Choose agent",
- "th44i2A": "Agent",
- "AQ41agY": "Action",
- "pcq4xtU": "Start dev server",
- "GXMFUnA": "Label",
- "CQKw8CA": "Agent Prompt",
- "9xkz8HQ": "Terminal Command",
- "r6942Dw": "Delete {{value0}}",
- "N8k0x7U": "Edit {{value0}}",
- "VrXVT_A": "Run {{value0}}",
- "Jqxtf0c": "Quick command limit reached",
- "LmWWV94": "New quick command",
- "YWp9eI8": "Global",
- "0ye1crk": "This project",
- "stjjcN4": "No matching quick commands.",
- "WGZgVlw": "No quick commands yet.",
- "Mlzs2q8": "Search quick commands...",
- "c7kUeNA": "Save terminal commands or agent prompts for quick access.",
- "XUyBgA4": "Back",
- "8mDod7I": "This quick command will be removed from your saved list.",
- "y7ppLrs": "Delete \"{{value0}}\"?",
- "gz_v97k": "Failed to update review thread.",
- "ssoDq0g": "Failed to update title.",
- "fZbxiK0": "Close",
- "9OSp60k": "Update Orca desktop to review changes on mobile.",
- "RSAKe4M": "Committed changes response was invalid",
- "hKX4q6A": "Committed on branch",
- "LHMnD5o": "Permission requested",
- "zqu69ik": "Allow always",
- "3EBdICM": "Deny",
- "sjphObI": "Allow",
- "QX9RTgc": "Close Tabs to the Right",
- "_ijK2wo": "Close Tabs to the Left",
- "XxfyMlc": "Close Other Tabs",
- "k32XW6w": "Close",
- "5s4VNsw": "Clear Terminal",
- "2wFDKaY": "Rename",
- "umfRNkc": "Failed to merge pull request.",
- "vXd8YYA": "Failed to refresh pull request.",
- "Lq5nqds": "Attach failed (reconnecting)",
- "kOr-gVg": "Failed to save review",
- "AtE6oQA": "Waiting for desktop...",
- "HkX9h2s": "Missing worktree",
- "-k-F-P0": "{{value0}} staged",
- "tyXkf4g": "{{value0}} staged, {{value1}} failed",
- "L-xz6vw": "Waiting for desktop...",
- "MOtwYRI": "Source control action failed",
- "x0Dr_H8": "Waiting for desktop...",
- "U2LqmGk": "Review notes sent",
- "LtedJAM": "Review notes copied",
- "NSS4Or0": "Attach failed",
- "hJYA7AQ": "Image too large to attach",
- "JdGd1Ic": "Photo permission denied",
- "tu-qlN0": "Attach failed (disconnected)",
- "JlNqDLA": "Attach failed",
- "-YjNIcU": "Image too large to attach",
- "jdkmIaw": "Photo permission denied",
- "Kc1O9hE": "Attach failed (disconnected)",
- "AandnA4": "Not connected",
- "62Wqvcg": "Failed to launch agent",
- "WXv-mcQ": "Waiting for desktop…",
- "zchh0X0": "Comment action failed",
- "6VPjkF8": "Failed to update title.",
- "RqzbvDE": "Not connected to desktop.",
- "weTQMew": "Paste failed",
- "5dhlsXo": "Image too large to paste",
- "gG0saX0": "Paste failed (disconnected)",
- "Ezj8Uog": "Paste too large (max 256 KiB)",
- "e1BO4eM": "Failed to load quick commands",
- "K20RdWM": "Skip notifications for now",
- "KP3UPPY": "Not now",
- "sSrQIeg": "Enable agent notifications",
- "QM9B4lA": "Enable notifications",
- "B5cl_6I": "Open sessions in the terminal",
- "9bF2iuQ": "Keep terminal",
- "tYyQCnY": "Open sessions in Chat UI",
- "KogvSYY": "Use Chat UI",
- "3vHqv6U": "Get notified on this device when an agent needs your input or finishes a task.",
- "dV8UVHg": "Choose whether supported agent sessions open in the terminal or Chat UI on this device. Press and hold a session tab to switch its view, or change the default later in Settings.",
- "OmdgGNs": "Stay updated while away",
- "o9LxHPg": "How should sessions open?",
- "CaZB1fk": "No files found",
- "LS0hOug": "Retry",
- "UomXr8g": "- Showing first 5000",
- "8ojoNLo": "Files",
- "vT-EgZw": "Back to session",
- "A053H2s": "Close files",
- "ujEE5Aw": "View rendered Markdown preview",
- "12QKL8A": "View Markdown source",
- "cDZy2i8": "{{value0}} image",
- "0U_34Zg": "Empty file",
- "zqZaJJo": "Retry",
- "yc-xh3U": "{{value0}} editor",
- "uLXt2Qs": "Unable to load preview",
- "BnjL5Ho": "Save terminal artifact",
- "nxnMGkU": "Back to files",
- "vXalblI": "Unsaved edits will be lost.",
- "k969DeE": "Discard changes?",
- "Iqn4mt4": "Loading preview...",
- "MCFjuu8": "Waiting for desktop...",
- "1_VaWXc": "File preview",
- "mGhZjxw": "Preview truncated. File size: {{value0}}.",
- "m0QdE2U": "Unavailable on mobile",
- "F2AHmFI": "Preview file {{value0}}",
- "AnmS3ZU": "{{value0}} unavailable on mobile",
- "LuU4lSE": "Open folder {{value0}}",
- "CGYoYAY": "Retry",
- "v4sDG-8": "Retry loading {{value0}}",
- "t2QYxhU": "Loading...",
- "kYWeCgo": "File changed on desktop. Reload preview before saving",
- "nbgr4H0": "Unable to load preview",
- "Jj_IDwY": "File not found",
- "X-whfMo": "Unable to reach the desktop filesystem",
- "ktGDvZE": "Reload preview before saving",
- "UFAFIP0": "File too large for mobile preview",
- "UfU4CAU": "Binary preview unavailable",
- "2t0lh6U": "Unable to load preview",
- "jLhPXXQ": "Other VPN Interference",
- "ngjn4tY": "Tailscale Host Unreachable",
- "AE3mc7A": "Connection Timeout",
- "MED_8yU": "Desktop App Not Running",
- "amY3iCs": "Firewall Blocking Port 6768",
- "vuZn-_E": "Different WiFi Networks",
- "q-MNnd4": "Remove",
- "KuqR8FY": "Re-pair",
- "ujiecek": "Retry",
- "IrfKQh8": "Authentication failed — try reconnecting first; if it keeps failing, re-pair from desktop.",
- "2LrOLw8": "Use reset",
- "LN50bQ0": "Resetting…",
- "8CLIWuE": "Uses one earned reset for the active Codex account",
- "Y2o7mgc": "Uses one earned reset for {{value0}}",
- "7uEIrNQ": "Use Codex rate-limit reset",
- "fNZPjTQ": "Resetting Codex rate limits",
- "_g9qkig": "Add Shortcut",
- "N7UodPY": "Press Enter",
- "YZWk8R4": "Command",
- "zkM-vYk": "Label",
- "ndVygIU": "Add",
- "GSrBito": "More keys — Tab, arrows, F1–F12…",
- "QlB11DI": "Key",
- "9jQVv-8": "Modifiers",
- "w7YJ0Kw": "Show, hide, or reorder shortcut keys",
- "BFsLjpc": "Manage Shortcuts",
- "I-Rlhvc": "Send custom text command",
- "fNBP1Us": "Text Macro",
- "Y7zDQOM": "Build Ctrl, Alt, and Shift key chords",
- "Lr_GVFQ": "Shortcut Combo",
- "v1Nn-IY": "Back",
- "WwKbTEk": "Function",
- "ClgDZUM": "Navigation",
- "1RunS2Y": "Editing",
- "Dl9mAnI": "Shift",
- "Mz-qIO4": "Alt",
- "OZLCEBo": "Ctrl",
- "uGHhnC0": "Move down",
- "ee4D14o": "Move up",
- "T-H1CUQ": "Use the move up and move down actions to reorder without dragging",
- "-lwE4Q0": "Drag to reorder",
- "qvnQ47I": "Checking host compatibility",
- "oJ3sUM4": "Download",
- "N18umz0": "Use",
- "ri8swSc": "In use",
- "qf7IWvA": "Set up on desktop",
- "D90AZhs": "API key set",
- "PG_Pfbo": "· extracting…",
- "bh_QQps": "OpenAI API",
- "TJd8_nE": "Recommended",
- "6WwF0_8": "Dictation enabled",
- "D5YFHLU": "Download a model and enable dictation on your desktop — all from here.",
- "13hFHO4": "Set up voice dictation",
- "kocNlo8": "Could not update",
- "jX7Yn3E": "Could not select model",
- "0rsS1Dw": "Download failed",
- "lUsptPY": "Failed to load",
- "GWwDGTE": "Retry",
- "RF7UWwo": "Retry loading review",
- "W6MLNo0": "Diff truncated for mobile preview.",
- "e6R_IPM": "Loading diff...",
- "Ku2wK-g": "Try a different review filter.",
- "3-RMeIo": "No Reviewable Changes",
- "e5sIbV0": "Unable to Load Review",
- "r-dK9lI": "Review Unavailable",
- "On0H_JY": "Loading review...",
- "voLBMwU": "Send Notes",
- "XNffV5A": "Send notes to agent",
- "a1hiCFE": "Stage Reviewed",
- "XhmaYgY": "Stage reviewed files",
- "du7kB18": "Review Complete",
- "ls_e0g8": "Save",
- "-bToH9I": "Delete",
- "7BEb-8o": "Delete note",
- "2lwuEDc": "Review note",
- "cy6hF-c": "Cancel note",
- "K4ExXj0": "File note",
- "YlMekyY": "Line {{value0}}",
- "SqSZ_D4": "Add Note",
- "vX8hCPw": "Edit Note",
- "QyPs23A": "Open in Session",
- "lDOi4xI": "Mark Unreviewed",
- "9YSL2XY": "Stage Reviewed Files",
- "AMn9p6c": "Clear Sent Notes",
- "bboDcz4": "Send Unsent Notes",
- "SGgu3t8": "Copy Notes",
- "qljZwNc": "New Agent Session",
- "ajcWpiI": "Discard changes to \"{{value0}}\"? This cannot be undone.",
- "1V8B5pc": "Discard File",
- "_TCuNKQ": "{{value0}} reviewed unstaged files can be staged",
- "oCVOA0w": "Review Actions",
- "cq6J0Qk": "{{value0}} reviewed, {{value1}}",
- "N0W7j-Y": "Hunk",
- "-v8Njek": "Next hunk",
- "co1PXQY": "Previous hunk",
- "PpqbMu4": "Stale",
- "6NQSDSg": "Edit file note",
- "cV_5zt0": "Changed",
- "TGeBFA8": "Reviewed",
- "Tqe6zfQ": " from {{value0}}",
- "OAIsqbU": "{{value0}} stale",
- "n5_ZJMM": "Next file",
- "gLGElnY": "Mark Reviewed",
- "gUbQPjk": "Reviewed",
- "a2xZWo8": "Mark file reviewed",
- "vRhESp0": "Note",
- "e_IyR5Y": "Add file note",
- "0CC3Pjk": "Previous file",
- "lL_q8JA": "Discard",
- "TpLj1K8": "Discard file",
- "v58oW_E": "Unstage",
- "VZPK0FM": "Unstage file",
- "JiM1DAU": "Stage",
- "SzcIpKs": "Stage file",
- "r-agX-k": "All",
- "qcWQKWI": "Show {{value0}} review files",
- "LU8BxDQ": "Open review actions",
- "GAXIVbU": "Open pull request sidebar",
- "1lIaLfU": "Changes",
- "Xot6WdE": "Back",
- "fEoGCmQ": "{{value0}}/{{value1}} reviewed",
- "mIZ0_V0": "Edit note on line {{value0}}",
- "mCd0V4A": "Add note on line {{value0}}",
- "4bPe4Ao": "Update desktop Orca and sign in to connect from anywhere",
- "HdJ9GVY": "Source",
- "BE93iOI": "View HTML source",
- "bvUfBWI": "Preview",
- "-FhPMsI": "Preview rendered HTML",
- "ywMqsWY": "[x]",
- "kijMg1M": "{{value0}} more columns",
- "Jmh-3ik": "{{value0}} more rows",
- "viizK3M": "Retry",
- "Re9yZkw": "Retry loading pull request",
- "-ZCN2f0": "Loading pull request…",
- "O3OecWo": "main",
- "sLMnsJA": "Code block",
- "h1ikg-I": "Inline code",
- "fT3N_UQ": "Image",
- "eLAtZAk": "Link",
- "dQOT7tM": "Quote",
- "jPlQhig": "Checklist",
- "_79TK6I": "Numbered list",
- "hKyID9A": "Bullet list",
- "wwdkeIc": "Strike",
- "zwoUjcU": "Italic",
- "TcUIfHg": "Bold",
- "qpILEoE": "H3",
- "T0-0mLw": "H2",
- "Tkw-XG4": "H1",
- "3Ph2vuM": "Body",
- "UIMZetU": "Workspace name",
- "ybPEhxk": "New workspace",
- "VEK8Z7E": "Agent",
- "38lAWJQ": "Repository",
- "ZK7Il8w": "Create Workspace",
- "g5YUeP0": "Connect Repository",
- "obLmzkw": "Run setup command",
- "sZHa-TU": "Skip",
- "0qYyICI": "Run",
- "0cbkbTE": "Setup script",
- "LMAqKNQ": "Note",
- "ATo76K0": "Advanced",
- "M2A4pJA": "Connect repository first",
- "O93svfk": "Connect",
- "oroOvnM": "Connecting...",
- "JNDDz3c": "SSH Connection",
- "EFTSrpI": "Workspace name",
- "yymZMiQ": "Name or 'Create From'",
- "osrkufA": "No repositories found",
- "sMWTBAA": "Pick a repository and agent to spin up a new workspace.",
- "C8UjQk0": "Failed to trust setup script.",
- "jSxyaws": "Failed to create workspace",
- "rwQDraY": "Choose whether to run the setup script.",
- "F1iAV4A": "Selected agent is disabled. Choose an enabled agent before creating.",
- "kA_OuTE": "Back to hosts",
- "h3ZwGv0": "Open GitHub Releases",
- "oxg5VTs": "Open App Store",
- "Pe9Dmhc": "Don't run",
- "hUSRq7I": "Always trust and run",
- "wOCs5LA": "Run hooks",
- "m7jxYm8": "Setup script",
- "gxXtGpI": "New setup script",
- "JU7DVfY": "This repository's orca.yaml runs before the workspace starts. Only run it if you trust this repository.",
- "SSMlLr8": "Run setup from {{value0}}?",
- "egQ-qgQ": "{{value0}}'s setup script changed",
- "Lkm1Ms4": "Derived from name",
- "CATZTEM": "Branch name",
- "MJ_zXUU": "Workspace name",
- "jueQw6Q": "Name",
- "Yz166iM": "Reuse branch “{{value0}}”",
- "qOsqJv0": "Type a name or search a source",
- "qNPX_ws": "Type a workspace name in the field below.",
- "LbOI-wE": "This SSH repo needs a GitHub remote to list issues and PRs.",
- "2sNZWLI": "Connect the repository to search sources.",
- "h8XKauY": "Cancel",
- "A6zs-7I": "Done",
- "J6XOFqM": "Name or 'Create From'",
- "WDddFyg": "This item lives in {{value0}}/ {{value1}}.",
- "FLDQvbE": "Switch to {{value0}}",
- "HHq8Y80": "Type a name or search a source",
- "eMl2uLM": "[Optional]",
- "zTK803o": "New branch",
- "dDSXnKk": "Create branch \"{{value0}}\"",
- "Z7csSYQ": "Name this workspace",
- "uK2T1OQ": "Use \"{{value0}}\"",
- "CgJBkqk": "Create key combo or text macro",
- "d-64Q0E": "Add Custom Shortcut…",
- "AwkMohI": "No custom shortcuts defined yet.",
- "EGxWrwk": "CUSTOM SHORTCUTS",
- "_YyvrjM": "Show every built-in shortcut key in the original order",
- "P0qiUsA": "Reset Defaults",
- "Odmd4jg": "Toggle keys to show or hide them, and hold the grip to drag a key into the order you want on the terminal shortcut bar.",
- "u1ZHouk": "SHORTCUT BAR",
- "NOYO7QE": "Cancel",
- "8Zue0js": "Download",
- "jCov6Mc": "Delete",
- "EorN5mI": "Use",
- "kg-vs7o": "In use",
- "j2yOGiA": "Set up on desktop",
- "JnTRemk": "API key set",
- "B45mQIQ": "Recommended",
- "6qylM4Q": "Pick a workspace from the sidebar to open its terminal here.",
- "qe5Mx6E": "No workspace open",
- "JLc6yd4": "children",
- "ugLQfPg": "child",
- "lCIVZpI": "Child",
- "uQ24VuE": "Folder",
- "CkCg0Xk": "Inactive Codex limits use the wrong provider identity",
- "4NLLG4A": "Inactive Claude limits use the wrong provider identity",
- "N8kYEP4": "Codex limits use the wrong provider identity",
- "OWfo7Qc": "Claude limits use the wrong provider identity",
- "95Xks08": "WSL Codex accounts require an exact distro",
- "OZiafyo": "Host Codex accounts cannot name a WSL distro",
- "ZlNO6fQ": "WSL rate-limit targets require an exact distro",
- "EIhMdN0": "Host rate-limit targets cannot name a WSL distro",
- "zFyydp8": "This account has no earned reset credits available.",
- "_-grAdc": "No reset available",
- "Um-XfOo": "No eligible Codex rate-limit window is exhausted.",
- "JMEauuw": "Nothing to reset",
- "3qHVa1w": "Codex usage has been refreshed.",
- "9b3h0Pg": "Reset already applied",
- "QiJiFeQ": "Rate limits reset",
- "V9XaZZ8": "Dismiss drawer",
- "84CVutM": "Blank Terminal",
- "5hDxS58": "This spends one earned reset for {{value0}} and immediately resets eligible rate-limit windows.",
- "EzPa9ek": "Use a rate-limit reset?",
- "TKIeXbw": "Could not reset rate limits",
- "rii7ZAs": "The account or reset offer changed before the host contacted Codex. Review the updated details, then confirm again.{{value0}}",
- "4DQGAog": "Reset details changed",
- "W6bmrY4": "mermaid",
- "kPLcd1A": "Link pull request",
- "UzLJy8Q": "Link #{{value0}}",
- "5tB7Tdg": "#123 or https://github.com/owner/repo/pull/123",
- "D2wJo3U": "PR number or GitHub URL",
- "ZLWuIYo": "Cancel",
- "f8ZsL9k": "Link existing pull request",
- "T0kbQLc": "Create {{value0}}",
- "zouGGt0": "Create draft {{value0}}",
- "YpkfCr0": "Push & create {{value0}}",
- "aUTTsqg": "Push & create draft {{value0}}",
- "3Yb2tD4": "Create as draft",
- "oPjbjuk": "Base",
- "UsM_A3E": "Generating title and description…",
- "-QF2aQc": "{{value0}} description",
- "-uhp5Eo": "Description (optional)",
- "CYW43ss": "{{value0}} title",
- "JnixruY": "Title",
- "56ar5ss": "Cancel",
- "w4jN8ic": "Generate",
- "E5u75yA": "Generating…",
- "Tf6JzYM": "Failed to generate PR fields",
- "gTT3Qik": "New {{value0}}",
- "LINjP1k": "Current branch unavailable.",
- "_svp6us": "Hosted review panel unavailable for this provider.",
- "nO4i6C8": "Unlink",
- "ZqSwRWA": "Unlink pull request",
- "zRLzboM": "Reopen",
- "gL1buuY": "Close",
- "2xdqaDc": "Reopen pull request",
- "Pz82S8w": "Close pull request",
- "Al6-RQA": "Off",
- "oSg4C5A": "On",
- "X0q7qvA": "Toggle auto-merge",
- "0J91CIk": "Auto-merge when ready",
- "8xiSsiA": "Merge pull request",
- "3XhqaKU": "#{{value0}} will be reopened.",
- "oCXRjL8": "Reopen pull request?",
- "b_7nPgo": "#{{value0}} will be closed without merging.",
- "02Qj2V4": "Close pull request?",
- "zNuHY-c": "This will merge #{{value0}} into its base branch.",
- "_0lAHWg": "Merge pull request?",
- "uLhV2xU": "Failed to unlink pull request.",
- "q6iGz3o": "Showing first 100 jobs",
- "HW_qZBo": "Showing first 20 annotations",
- "x1QqPYg": "Annotations",
- "xJbH0vA": "No details available.",
- "WPX7hnI": "Open {{value0}} on the web",
- "wKKGPQ8": "{{value0}} check details",
- "QiC7wz8": "Fix",
- "O95nvcA": "Fix failing checks with AI",
- "t67jzCk": "Inspect details or start an AI fix pass.",
- "TkRK-a4": "Rerun failing checks",
- "hyZyn8M": "Checks",
- "XfucVi0": "{{value0}} failing check{{value1}}",
- "W8A4HvA": "This permanently deletes the comment on GitHub.",
- "xGeFr98": "Delete comment?",
- "p4p6sek": "Write a reply…",
- "7oybC2M": "Resolve",
- "A6XXe-4": "Unresolve",
- "2PITe20": "Resolve thread",
- "mkEkYMY": "Unresolve thread",
- "4idOoK8": "Delete",
- "u9hUgiY": "Delete comment",
- "wS1VT0I": "Edit",
- "Fs36PXM": "Edit comment",
- "Ragn9hY": "Reply",
- "s3o5DeE": "Reply to comment",
- "Bnwan2Q": "Edit comment…",
- "FKCKtAo": "Open comment on GitHub",
- "C_gXfCo": "resolved",
- "EXMnl_4": "Cancel",
- "2Mrfqx0": "Add a comment…",
- "xX8eZhc": "No comments yet.",
- "FVdefgc": "Could not load comments. Tap refresh to try again.",
- "_l0TaO0": "Comments",
- "vdfQtbs": "No description provided.",
- "hO2eecI": "Could not load description. Tap refresh to try again.",
- "6VkqcQk": "Description",
- "vV46Tns": "Show {{value0}} more of {{value1}}",
- "cHoCGwY": "Show {{value0}} more",
- "wAwFDJY": "Resolved {{value0}} by {{value1}} {{value2}}",
- "zrerXGc": "Resolve conflicts with AI",
- "w2WcFns": "Conflicting files",
- "KuLUlYc": "Copy commands",
- "7E56l1g": "Copied",
- "6TXtA4Q": "Copy mergeability refresh commands",
- "39Nl8mw": "Run from this worktree",
- "7Qv5eYo": "This branch has conflicts that must be resolved",
- "93sCYQo": "{{value0}} commits behind (base commit:",
- "ngn4NjA": "{{value0}} commit behind (base commit:",
- "mTbAh0Q": "commit",
- "DnSMHG0": "Conflicts",
- "8Est-xI": "Remove {{value0}}",
- "jBToX-I": "No reviewers requested",
- "T5Uc4Ao": "Could not load reviewers. Tap refresh to try again.",
- "Ryr3DCQ": "Loading reviewers…",
- "fX2uAEU": "Reviewers",
- "E5rQqRQ": "Add or remove reviewers",
- "E2VHius": "Edit pull request title",
- "oBmCrB8": "Save",
- "xOwofss": "Save title",
- "UgBLL4w": "Cancel",
- "D-7jM08": "Cancel editing title",
- "nbfmLgg": "Open pull request #{{value0}} on the web",
- "eNX9Nmo": "Link an existing PR",
- "_mT5R7M": "Link an existing pull request",
- "SRr0o4U": "The current branch is not linked to an open PR.",
- "CmpszXU": "{{value0}} is not linked to an open PR.",
- "maf-eds": "Refresh to check again, or create a new PR for this branch.",
- "G2BaE-Y": "No open pull request",
- "I3xSuPA": "Linked PR #{{value0}} unavailable",
- "5kE-iVM": "Create PR",
- "Y_NnJ9M": "Create pull request",
- "YZFe3Qg": "Refresh pull request",
- "TSDVcKU": "Pull request",
- "tca0V2E": "Failed to create pull request.",
- "EMFMGnw": "Check out a branch before creating a pull request.",
- "6OYLM7w": "No matching people",
- "Ne-d-yA": "Search people",
- "K34xo24": "Reviewers",
- "dVs-M9I": "Failed to load people",
- "_IeDTL8": "Reviewed",
- "NEg29tM": "Pending",
- "dmAcep8": "Dismissed",
- "bF0aphw": "Commented",
- "rjj84-Y": "Changes requested",
- "IloG18k": "Approved",
- "hCKjn9A": "No checks",
- "_RfDeuw": "Bots",
- "4fGywsA": "Humans",
- "rkpE-Mg": "All",
- "u8NH0Xk": "Esc",
- "rfYWlSA": "Send text to browser",
- "g3GvsOs": "Type on page…",
- "48esWoc": "OK",
- "RXEfHVA": "Cancel",
- "z1nkBLw": "Browser Dialog",
- "-00MlTU": "URL",
- "GVCAd00": "Reload",
- "-YMBg9U": "Forward",
- "a_PEZW8": "Back",
- "5dQ6Hbc": "Enter a valid URL.",
- "ZoS2fOc": "Browser stream timed out.",
- "YmwDAcU": "Browser page is not available yet.",
- "lBu6FGw": "Checking desktop browser streaming support.",
- "X2WJPN4": "Update desktop Orca to stream browser tabs on mobile.",
- "gZUBadw": "{{value0}} click modifier",
- "GTbLYFM": "Shift",
- "fP87QIY": "Alt",
- "EqW8StQ": "Ctrl",
- "IW8xp4k": "Cmd",
- "lV607bI": "Show {{value0}} website view",
- "eJJUzYE": "Mobile",
- "3TuUR-s": "Web",
- "p7fz5tw": "Resume agent session",
- "f1-v-HM": "current worktree",
- "tL7Cy3c": "messages",
- "fZXkGhQ": "message",
- "L_8qprI": "No past agent sessions in this scope.",
- "X8748Hs": "No sessions match your search.",
- "KkgSO8k": "No agent sessions",
- "Uc72mxE": "Search sessions, repo:, path:",
- "7OL03t8": "Retry",
- "IFh38kk": "Unable to Load",
- "D1lHtt4": "Update Orca on this host to browse agent session history.",
- "yRlsHYk": "Agent Session History Unavailable",
- "Qvd5WD0": "Refresh agent sessions",
- "z2KOXZE": "Agent Session History",
- "bGNaHw8": "Back",
- "HsI5rsc": "Failed to resume session.",
- "sibM7yE": "Agent session queued.",
- "ADvyKkM": "Unable to determine host platform.",
- "8fvhHmw": "This session is missing a resume id.",
- "BLr07Ao": "Waiting for host...",
- "rcPfxtE": "All",
- "dhgeP_o": "Project",
- "0k6Zchk": "Workspace",
- "E5PTzrk": "{{value0}} {{value1}} skipped",
- "nSh69OQ": "Waiting for host…",
- "Au06U2c": "Agent Session History",
- "XjyxBLA": "Source Control",
- "pBOdX2k": "@orca_build",
- "qfIlnqY": "stablyai/orca",
- "1sjQKuE": "onOrca.dev",
- "wRf8z4A": "Open-source agent IDE for 100x builders",
- "o1zkACA": "Orca",
- "qBqOdtg": "About",
- "wdyLCXU": "Open terminal links",
- "K6VU-6c": "Choose where HTTP(S) links tapped in terminal output open.",
- "gh7VaTc": "LINKS",
- "GJwMNak": "Browser",
- "Wj6QRnE": "Open in Safari, Chrome, or another browser on this phone.",
- "hIo6XgE": "Phone browser",
- "Z49nZqQ": "Open in the streamed browser from your paired desktop.",
- "OcnHGtE": "Orca browser on desktop",
- "POUjxlM": "No paired hosts.",
- "FX9lUwo": "No connection events yet this session. Events appear as the app dials this host.",
- "GiZXYb8": "Copy diagnostics",
- "DYy9eRs": "Copied",
- "mu5iayg": " · attempt {{value0}}",
- "x43FzPs": "Connection log",
- "rqAbU9s": "You're connected",
- "bKwbnYs": "Scan the code",
- "N1Ra8Og": "Open Orca desktop",
- "o8-uNXo": "Remove \"{{value0}}\"? You can re-pair later.",
- "yOJT3HY": "Remove Host",
- "t1m0jcA": "Remove",
- "dqjXxV8": "Edit host",
- "RwT781U": "Disconnect",
- "JnIDr0Y": "7d",
- "_KqkyAU": "5h",
- "VXpHvL4": "Account usage",
- "8CNCPA8": "New Workspace",
- "lWqrsbM": "Pair Desktop",
- "1St5QBU": "Quick Actions",
- "y7w0hIs": "Tasks",
- "ROZQW2U": "Resume",
- "81Qrbno": "Desktops",
- "TPknwrs": "PRs created",
- "4uJ9yUY": "Agent time",
- "qFFbXcQ": "Agents spawned",
- "9i5ZhFo": "Welcome back",
- "9HldFAc": "How it works",
- "QT_H7rk": "Pair with Orca on your computer to check on your agents, jump into any terminal, and drive work from your phone.",
- "8vieqXE": "Connect your desktop",
- "VjaDNq0": "Orca",
- "GLgoz1s": "Please try again.",
- "U7WlIpo": "Could not remove host",
- "tNj4XnM": "Open {{value0}} tasks",
- "1_sz9cs": "No task sources connected",
- "aOm3VN4": "Onboarding progress",
- "mB8kw4M": "Orca",
- "6vGSxlM": "Notification settings could not be updated. Try again.",
- "Dl9ttFI": "Your choice could not be saved. Try again.",
- "LutlQWg": "Open sessions in Chat UI",
- "p0ydSMw": "Off",
- "OXcAS68": "On",
- "sW_6PG4": "Choose how supported agent sessions (Claude, Codex, and other chat-capable agents) open on this device. Terminal shows the raw CLI; Chat UI shows a chat interface like the desktop app. You can still switch any individual session from its long-press menu.",
- "R7mksio": "DEFAULT VIEW",
- "ao09T48": "Chat UI",
- "yTJLwao": "Back",
- "x7lqDGA": "Open Settings",
- "aXWuT8I": "Agent notifications",
- "GIjQvDw": "Notifications",
- "sKiKFEI": "Back to home",
- "zDZEMlw": "Connecting…",
- "gZ1SfD8": "Cancel",
- "V-NORJA": "Pair",
- "3LfZ8xU": "You opened a pairing link from your desktop. Confirm to add it to your hosts.",
- "ymuJ-Uc": "Pair with this desktop?",
- "AHFOidY": "Pairing failed: {{value0}}",
- "uZiEDJ8": "Couldn't connect within {{value0}}s — see log below for where it stalled",
- "-jAAi0E": "orca://pair?code=... or paste the code",
- "G-MJBZU": "Copy the code shown under the QR on your computer.",
- "klFU7hQ": "Paste pairing code",
- "Q_qrUNw": "Paste code instead",
- "_C6l3j4": "Try Again",
- "T3HZLEU": "Connecting…",
- "U_fkYz4": "Or paste pairing code",
- "dTFolus": "Scan the QR code",
- "mPdpsdo": "Go to Settings → Mobile",
- "dFxLHEw": "Open Orca on your computer",
- "wvDgXHk": "Open Settings",
- "Scz67W0": "Continue",
- "b6n4c_8": "Enable camera access in Settings, or paste the pairing code instead.",
- "InfekMg": "Scan the QR code from Orca on your desktop, or paste the pairing code instead.",
- "sBkGoYA": "Camera Access Disabled",
- "0VOtRkg": "Pair with desktop",
- "HVl7cpc": "Pairing failed: {{value0}}",
- "zyTFKp4": "Couldn't connect within {{value0}}s — see log below for where it stalled",
- "feaDGg4": "Not a valid pairing code — copy it from your computer and paste again",
- "iHaWj50": "Not a valid Orca QR code",
- "AIhB-fM": "Back to home",
- "eQE_ziw": "Missing pairing code",
- "cFPanOU": "Support",
- "7jufUfc": "Privacy Policy",
- "EJmGYjM": "Retry",
- "ks7el1o": "Retry clearing pairing credentials",
- "kiQMppk": "Couldn't check cleanup status on this device. Retry to be safe.",
- "Wh-JD8U": "Couldn't confirm cleanup for {{value0}} credential{{value1}} on this device.",
- "K-uhruk": "Cleanup still couldn't be confirmed. Try again later.",
- "BFrWnfA": "Pairing credential cleanup",
- "EELdtVU": "About",
- "0aipMZQ": "Troubleshooting",
- "i8QR0SY": "Notifications",
- "rm30Zkg": "Voice",
- "ttAM7Ds": "Browser",
- "-aB74WM": "Chat UI",
- "QlyWJyY": "Terminal",
- "0cOgjik": "Settings",
- "lfAeAOI": "Terminal text size",
- "nN25Xmo": "Restore {{value0}}",
- "rE4IiF8": "Off",
- "qR5mpHo": "On",
- "AsTLd6A": "Autocomplete & autocorrect",
- "mK_kCfI": "Enable phone-style autocomplete, autocorrect, and spelling suggestions in the terminal command bar. Off by default so the keyboard never rewrites commands, flags, or paths. Direct keyboard input (when keys go straight to the terminal) always sends raw keystrokes, so suggestions don't apply there.",
- "18J3yr0": "KEYBOARD INPUT",
- "QcL6LT4": "Text size",
- "nzfG92c": "Scale the terminal text. Smaller sizes fit more columns with side margins; larger sizes show fewer columns — drag sideways to pan. You can also pinch to zoom in the terminal itself, which updates this setting. Per-device display only; doesn't change the desktop terminal.",
- "OS-rNTI": "TEXT SIZE",
- "U2mtyZg": "No paired desktops yet. Pair one to control terminal behavior.",
- "-fV3Ce8": "While you're using a terminal on your phone, Orca shrinks it to fit your screen. When you close the app or switch away, this controls whether it stays at phone size (so interactive CLI tools don't reflow) or resizes back to your desktop. You can always use Restore this terminal or Restore all terminals on the banner to resize manually.",
- "f9vgUHc": "WHEN YOU LEAVE THE APP",
- "kJj5Z2g": "Terminal",
- "rU9qdt0": "After 30 minutes",
- "p2EWmRg": "After 5 minutes",
- "gBGOsCI": "After 1 minute",
- "q6VQcZE": "Keep at phone size (default)",
- "75Kr_24": "Largest (200%)",
- "tAn81tY": "Larger (150%)",
- "HqP6IBw": "Large (125%)",
- "0OKOsKY": "Default (100%)",
- "CAs8oUM": "Smaller (75%)",
- "hiouM1M": "Smallest (50%)",
- "2J8vm70": "Common issues",
- "bwJLtK4": "View connection log",
- "5xQU6vw": "Run diagnostics",
- "B5C2aso": "Run again",
- "dQs8-jc": "Running…",
- "DIEmGuM": "Troubleshooting",
- "8sOFcoA": "Platform",
- "Ie918PM": "Hosts",
- "3gA9qeo": "Internet",
- "_IfUZ2s": "Paired hosts",
- "C-t7pm8": "Speech Model",
- "n-BJK-c": "SPEECH MODEL",
- "uwVWBGE": "Toggle: press once to start, again to stop. Hold: dictate while held.",
- "Jh4zuEU": "Dictation Mode",
- "4g1gMYA": "Dictate text into any focused pane on your desktop.",
- "23v3WVE": "Enable Voice Dictation",
- "L4c5Sxw": "DICTATION",
- "pJrwjt0": "Connect to a desktop to manage voice settings.",
- "pSmQbNo": "Voice",
- "Wgx1aTY": "Delete failed",
- "O-GK4L4": "Download failed",
- "cpL32fY": "Could not select model",
- "PiXz3AQ": "Could not update",
- "wFKD2Es": "Failed to load voice settings",
- "hYUl_w0": "Hold",
- "yxHp0Uc": "Toggle",
- "fO2nz88": "Pull Request",
- "AcEIxcI": "Changes",
- "atubgYk": "Agent Session History",
- "MZqxT8s": "Source Control",
- "wtxV_i4": "Terminal",
- "YTfV9-o": "Tasks",
- "KVY3pfk": "Accounts",
- "0zcPPW8": "Edit host",
- "esqB5TM": "Host",
- "lXRU_hQ": "Add or re-authenticate accounts from desktop Settings → Accounts.",
- "z0N4v1Y": "Loading accounts…",
- "XheJ_p8": "Accounts",
- "08ocQGs": "7d",
- "YmnN8fw": "5h",
- "rjJXJpg": "Use the agent's own login",
- "uuo9M60": "System default",
- "5TVCgEg": "Could not switch account",
- "nnr0WpI": "Host not found",
- "Cop_m2o": "Invalid accounts snapshot from host",
- "sqHaM-Q": "Connecting to {{value0}}…",
- "dYplni8": "Accepts IP, host:port, or ws:// / wss://. Missing port defaults to the current port (or 6768).",
- "kMmtf5E": "Address",
- "jHccG1s": "Host name",
- "wLjwLQg": "Name",
- "KytWtss": "Change the display name or connection address. Address edits only switch where this phone connects — they do not re-pair. Use this when the same desktop is reachable at a different IP (for example home LAN vs Tailscale).",
- "LS3NecQ": "Go back",
- "OOhGw28": "Save",
- "ugYhCr4": "Save host",
- "NKISHlY": "Edit host",
- "K8w9o8U": "Back",
- "sI26LXo": "Failed to save host.",
- "7UECNUc": "Enter a name.",
- "koyS6Oc": "Failed to load host.",
- "T_ULLfI": "This host was removed from this phone.",
- "yLNjPPk": "Missing host.",
- "eB5hKE4": "Connects to {{value0}}",
- "HbMqJ5k": "Remove \"{{value0}}\"? You can re-pair later.",
- "tndsmJE": "Remove Host",
- "PCaw7X8": "Delete",
- "7b05QJE": "Sleep",
- "jQgIadE": "Cancel",
- "sCHpXNI": "Delete Worktree",
- "aCNuYPE": "Repositories",
- "MFWDh4g": "Hide default branch",
- "1w-t3vQ": "Hide sleeping",
- "bd8B2ME": "Workspaces",
- "5IYckMg": "Clear filters",
- "S8jJ9v4": "Filter",
- "fVWdjBk": "Group By",
- "hFsVshM": "Sort By",
- "sUx-id0": "PR",
- "CzGUIP8": "Repo",
- "GAUYfWk": "Status",
- "mZ5NlSU": "Group",
- "LgVSSVY": "Search workspaces",
- "AYkrJs8": "Close search",
- "LIEbwVI": "New workspace",
- "qs3IfgE": "Floating Workspace",
- "V5DOCOQ": "Tasks",
- "CVlu0tE": "Accounts",
- "KYYIQO4": "Group workspaces",
- "jZR1hFw": "Sort by {{value0}}",
- "kz_Kdkw": "Filter workspaces",
- "6oNXq-k": "Filter workspaces, 1 active filter",
- "DxBfvEc": "Filter workspaces, {{value0}} active filters",
- "Iq0v42M": "Hide sidebar",
- "2FFC6Og": "Reconnect",
- "IDkp2AI": "Back to hosts",
- "QHBQ8yI": "Please try again.",
- "P_OTj14": "Could not remove host",
- "2FRJWFs": "Host not found",
- "2hirWvg": "Filter{{value0}}",
- "asTmnrM": "Delete \"{{value0}}\" ({{value1}})?",
- "ZhTpuGQ": "Update Item",
- "sSNY3pg": "Merge Pull Request",
- "cR4zEEM": "Merge Request",
- "l77C_aI": "Choose how this pull request should be merged.",
- "AxbwZZ0": "Choose how this merge request should be merged.",
- "ax5V10c": "Merge method",
- "ZDweAzI": "Change status",
- "Fc7HS-c": "Merge merge request",
- "QnAsBMo": "GitHub reports merge conflicts.",
- "MPMGVuk": "Merge pull request",
- "vW7-nd4": "Copy GitHub link",
- "xD9cVOU": "Copied",
- "tS4SSLM": "Copy Linear link",
- "14O3-ys": "Create Workspace",
- "ftImAuc": "Creating...",
- "D7U7kB4": "No comments.",
- "AXmMT_g": "Discussion",
- "z1ts1Vw": "Add sub-issue",
- "G6AAKyI": "Sub-issue title",
- "czxJ7iQ": "Open",
- "8MKn4Lk": "No sub-issues.",
- "yIapPk8": "Sub-issues",
- "-uupizo": "No pipeline runs for this MR.",
- "pzBhZI4": "None",
- "re5Bmac": "{{value0}} jobs",
- "iaudYyQ": "Pipeline",
- "XLoI3kU": "File contents unavailable.",
- "jh3_4KI": "Binary file.",
- "DtNbEWc": "Mark viewed",
- "11IaYcI": "Mark unviewed",
- "PYs8iJY": "View",
- "_Qr_OQY": "Hide",
- "WhM0uCg": "Changed files",
- "Ct4OwyY": "No checks found.",
- "Hhu9oHM": "Rerun all",
- "jphAkJQ": "Rerun failed",
- "ruk6BoQ": "Refresh",
- "XlbT3Zg": "Checks",
- "KoPjVCY": "Request review",
- "WTd49qc": "Request reviewers",
- "k2ppyKs": "No reviewer suggestions found.",
- "Re-pmxo": "Loading reviewers...",
- "ifA4snA": "No reviewers requested.",
- "hDVISbQ": "Reviewers",
- "FQRH8fY": "Update assignees",
- "X_A_K1Q": "Remove usernames, comma separated",
- "K9otrEQ": "Add usernames, comma separated",
- "--H0boQ": "No assignable users found for this repository.",
- "gX4WIW4": "Loading assignees...",
- "oL0nsd4": "Assignees",
- "K9OxCfg": "Update labels",
- "gyu0Q6w": "Remove labels, comma separated",
- "ByJ_aqM": "Add labels, comma separated",
- "ySDu5JQ": "No labels in this repository.",
- "vYfgNJ8": "Loading labels...",
- "GhHLbBA": "Labels",
- "OOzqk6Q": "Save title",
- "6b2exyc": "Title",
- "bmXEQhk": "Save description",
- "xX2Cp7c": "Description",
- "iM5LG78": "Project",
- "b3RSkG0": "Assignee",
- "Fa6K7yI": "Status",
- "o2-QUvU": "Type",
- "mDTZEr4": "Refresh details",
- "bS5_420": "Merge requires this repository in Orca.",
- "9bffkjg": "Close item",
- "vegmy2w": "Reopen item",
- "jKf3DPI": "Open in GitHub",
- "fngWtc4": "Workspaces can only be created from GitHub issues and pull requests.",
- "MVHK0qg": "Delete",
- "BhSglbo": "Edit",
- "2MyR_iQ": "Reply",
- "Rjjl1iA": "Resolve thread",
- "qEc1OYo": "Reopen thread",
- "Fv7ly30": "Cancel",
- "xxWLKS8": "Save",
- "loMCIgM": "Edit comment",
- "z1fMPAI": "Show",
- "Uv1hPbA": "{{value0}} comments",
- "GKSPk20": "Clear field",
- "akD0kZQ": "Save field",
- "5gzka0E": "Text",
- "1jNZjFQ": "Number",
- "KulyzJY": "YYYY-MM-DD",
- "CXQp8Pw": "No iterations available.",
- "6tQv41I": "Enter a date as YYYY-MM-DD.",
- "DqtxPEI": "Enter a valid number.",
- "JV1Xsds": "Project fields",
- "3p4QMPc": "Clear type",
- "5DEGuK4": "No issue types configured for this repository.",
- "w23rmTc": "Loading issue types...",
- "1YuDgI8": "Issue type",
- "NnYhRJs": "Project item",
- "jGZods8": "Draft issue",
- "xcg6mvE": "Issue",
- "Bawm-QY": "Pull request",
- "eGT8LNM": "Copy repository",
- "p3aCd2Y": "Repository not in Orca",
- "eNyNmbU": "Don't run",
- "llz-FzM": "Always trust and run",
- "520CKU4": "Failed to trust setup script.",
- "m-fVevQ": "Run hooks",
- "XPutx64": "Setup script",
- "vtdIQWU": "New setup script",
- "Q3oUbk4": "This repository's orca.yaml runs on your machine before the workspace starts. Only run it if you trust this repository.",
- "M_Pqsow": "Run setup from {{value0}}?",
- "QetdCKc": "{{value0}}'s setup script changed",
- "xd1VuYs": "Skip setup and create",
- "b0Ah5tg": "Run setup and create",
- "N0pQdfg": "Run Setup Script?",
- "g2mP3mE": "src/renderer packages/ui",
- "chkWwSI": "Directories",
- "oh8k9MM": "Renderer UI",
- "7dCN6Lk": "Name",
- "al2hOTo": "Edit Sparse Preset",
- "m6fKanI": "New Sparse Preset",
- "6-gKCU8": "New preset",
- "m38OFiM": "Use the whole repository",
- "0fqNjoo": "Full checkout",
- "6xj6dHo": "Sparse Checkout",
- "uwfc5JU": "No branches match.",
- "ajFYYlY": "Use this repository's configured base",
- "tJhJMIQ": "Default branch",
- "ww9236A": "Search branches",
- "O0AHKnE": "Pick an existing branch or ref.",
- "vqofDcI": "Start From",
- "wD7tyKU": "Agent",
- "RBS8OI4": "Repository",
- "SWOSFtY": "Connect Repository",
- "phVPn2Q": "Detecting agents...",
- "4F__ZBY": "Repository not found.",
- "6kKiG2U": "Add a Git repository before creating a Linear workspace.",
- "naggWL4": "Start from",
- "8PDq1d4": "Advanced",
- "SRP0mzk": "Connect repository first",
- "5URSVzY": "[Optional]",
- "nr-rmnA": "Workspace Name",
- "eDrVQno": "Connect",
- "HIci8AI": "Connecting...",
- "hcl0Sms": "SSH Connection",
- "UHWW7sY": "Create Workspace In",
- "8aaa0oM": "Your key is encrypted via the host OS keychain and stored locally.",
- "KV_5X9g": "Linear Settings / Security / New API key",
- "CCoHJhM": "lin_api_...",
- "a4vIye8": "Personal API key",
- "6EAEvD4": "Paste a Personal API key to browse issues from that workspace.",
- "jbMHil8": "Connect Linear workspace",
- "Xg1P3sw": "Linear Team",
- "wSJtlQc": "Create Issue",
- "cnRpEac": "Add context",
- "dxkQ090": "Task title",
- "GbFyuJM": "Origin",
- "CF9OlC4": "Upstream",
- "3U3WMlI": "Issue source",
- "czBdX7w": "Team",
- "ZXVz3A4": "Create an issue in the selected Linear team.",
- "V9yDSos": "Create an issue in the selected repository.",
- "QoLelVI": "Sort Tasks",
- "Jhimi1k": "Display Properties",
- "skslBcE": "Order Linear Issues",
- "4wjHjFU": "Group Linear Issues",
- "59_okJI": "Linear View",
- "GpSeJMA": "No states available",
- "_mQhK7g": "Loading states...",
- "xw1L5lQ": "Change Status",
- "dEIGNBo": "All teams",
- "UL55j-A": "Choose which teams appear in Tasks.",
- "ZnNVwOs": "Linear Teams",
- "nLSftbc": "Failed to switch workspace",
- "3Nokros": "Linear Workspace",
- "jnRj_2I": "Linear Filter",
- "k98CNAU": "GitLab Filter",
- "roI3I5g": "GitLab View",
- "EQxa0Qk": "Hidden from cards",
- "p0Rtsu4": "Shown on cards",
- "nOtNSyE": "This view has no extra fields to show.",
- "3YhoII8": "Choose which Project fields appear on item cards.",
- "kqKUAww": "Project Fields",
- "TcKUEto": "Project Sort",
- "pTwUfTs": "Orca doesn't support this GitHub Project layout yet.",
- "E_vNSwU": "Project View",
- "4KsU0uw": "Choose Project View",
- "RzP96Tg": "No more projects.",
- "HH8i3aE": "No matching projects.",
- "yJYA52k": "Browse all",
- "2BAkBs4": "Browse all (loading...)",
- "70mLMDk": "Pin",
- "d2YMdrw": "Recent",
- "6WVhiZM": "Remove",
- "Rn74bFA": "Pinned",
- "0Dc-Ym0": "Tap to retry.",
- "dbO6elU": "No projects loaded",
- "wpUutIo": "Failed to load projects",
- "9srv5vA": "Use Add by URL to reach missing projects.",
- "x8yvGR0": "Some organizations didn't load ({{value0}}).",
- "rTimB6Y": "Couldn't load projects from {{value0}}.",
- "25-g19E": "Add",
- "i7LVjnE": "Adding...",
- "Qyb0AbI": "Add by URL or owner/number",
- "gBglOLc": "Search projects",
- "6e87BT8": "Choose a project view for the Tasks page.",
- "4pG_Id0": "GitHub Projects",
- "5kq0ekc": "Loads older results",
- "cR6luW0": "Loaded",
- "K80V7xk": "Jump to a loaded or available result page.",
- "Zpsg1Hk": "GitHub Pages",
- "41d4YcM": "Issues",
- "sQ-iS-M": "Pull Requests",
- "LkEKGa8": "GitHub View",
- "a5ldOMU": "No alternate issue sources available.",
- "LGWybvE": "Choose whether each repository queries and creates work from upstream or origin.",
- "aqrdcoU": "GitHub Issue Sources",
- "FohFTKc": "All repositories",
- "ec9l6fo": "Choose which repositories to query.",
- "pMWEK5w": "Repositories",
- "JAnflBU": "Task Source",
- "7L6hVV8": "Next page",
- "7aV6RlU": "Page {{value0}}",
- "mDUXZ5M": "Select page, Page {{value0}}",
- "eLSyiVk": "Previous page",
- "SlWRC8A": "Change status from {{value0}}",
- "XHZQUAc": "No project items",
- "F7DoZNU": "Browse projects",
- "UqRLwDk": "Choose a GitHub project",
- "IQp4SP8": "Connect Linear",
- "42DYBxM": "Browse and start work on your assigned Linear issues directly from Tasks.",
- "L9oPTag": "Connect your Linear account",
- "J73iv2w": "This mobile Tasks view needs a newer desktop runtime.",
- "iUDJtXI": "Update Orca desktop",
- "KQkXL08": "Sub-issue data is unavailable for your token.",
- "yF0bGcQ": "Retry",
- "aCzhUtY": "Retrying...",
- "QU-Uflw": "Retry loading issues from {{value0}}/{{value1}}",
- "91ACsJY": "Couldn't load issues from",
- "7WH7i2M": "Search {{value0}} tasks...",
- "RzsrKAc": "Search project view...",
- "niMSGwc": "Display",
- "_TeSdI8": "Tasks",
- "-Qqso-0": "All workspaces",
- "Hs-i62I": "View order",
- "UhoT2i4": "Send comment",
- "_I4A15k": "Add a comment",
- "piHodso": "Failed to update issue source",
- "XuKemqY": "Failed to create task",
- "Sni1IDk": "Failed to create Linear sub-issue",
- "GdZdv18": "Failed to load Linear sub-issue",
- "YpcHVvo": "Failed to add Linear comment",
- "gNpYapQ": "Failed to update Linear issue",
- "_t92UNY": "Failed to merge",
- "wPJymlU": "GitHub reports merge conflicts. Open in GitHub to continue.",
- "k4ojp0Y": "Failed to reply",
- "jRm4RmA": "Failed to add review comment",
- "4Si7jXY": "Unable to comment without the PR head SHA.",
- "b6obzk0": "Failed to load file contents",
- "7sESNDQ": "Unable to load file contents for this pull request.",
- "Akq8bGo": "Failed to update review thread",
- "3JBRDbM": "Failed to update viewed state",
- "HCcPUIo": "Unable to sync viewed state for this pull request.",
- "ppWaFdk": "Failed to rerun checks",
- "_sMIbrI": "Failed to refresh checks",
- "eYVZBag": "Failed to request reviewers",
- "4-krOeE": "Failed to copy text",
- "Y45YlXw": "Failed to copy link",
- "-bXRzXk": "Failed to add comment",
- "nOlVFQ0": "Failed to update GitLab item",
- "PA_I94w": "Failed to update GitHub pull request",
- "aulxiV4": "Failed to update GitHub issue",
- "BvA66yA": "Failed to update status",
- "qVRnj6M": "Failed to merge pull request",
- "QKHONdI": "Failed to update issue type",
- "Z7UA1fA": "This project issue type cannot be edited from mobile.",
- "QbIagpk": "Failed to update project field",
- "TE3rsP8": "Failed to update item",
- "2lpu738": "This project item cannot be edited from mobile.",
- "UbvF6N4": "Failed to delete comment",
- "22DpbZo": "This project comment cannot be deleted from mobile.",
- "Lw1c31w": "Failed to edit comment",
- "fToZEE4": "This project comment cannot be edited from mobile.",
- "aCTe1aA": "Add the project item repository to Orca before creating a workspace.",
- "8r702TY": "Failed to create workspace",
- "xWmoUM8": "Failed to save sparse preset.",
- "MNvx1_M": "Failed to search branches.",
- "f8dRWFk": "Failed to load sparse presets.",
- "WG-yXgM": "Open a shell",
- "0uj422Y": "Failed to load issue types",
- "quO-aRc": "Failed to load assignees",
- "661kq0E": "Failed to load labels",
- "BRtGSdQ": "Failed to load details",
- "us3-SEs": "Failed to load Linear context",
- "-QPTwEw": "Failed to add project.",
- "W2b7E0I": "Expected a project URL or owner/number.",
- "6aqSQa0": "Failed to select project",
- "XhuO-88": "Failed to load project view",
- "y6brnh8": "Failed to load more GitHub tasks",
- "bMml9Hw": "Connection failed",
- "eVVS8u4": "Failed to load tasks",
- "jxeDUBI": "Failed to load Tasks settings",
- "AmP4Z_A": "Update Orca desktop to use Tasks on mobile.",
- "_SIoB4k": "Add review comment",
- "T2C3fss": "No text changes found.",
- "_96Solc": "Group by repository, then newest activity",
- "45bce5E": "Newest activity first",
- "43utnp4": "Updated",
- "ncl7fEY": "Pending GitLab todos",
- "uLI9QAU": "My Todos",
- "CNrYYPU": "Merge requests and issues by repository",
- "fxhXe98": "Project MRs",
- "Vejw8iE": "Review requests assigned to you",
- "ox2Q3X4": "Needs review",
- "Qcb2h_k": "Pull requests authored by you",
- "DitaVA4": "Mine",
- "4q-Iqts": "Open pull requests",
- "90lx_rw": "Open issues assigned to you",
- "NeeUliY": "Assigned to me",
- "4HZ7SXw": "Open GitHub issues",
- "QNj7rUo": "GitHub Projects views",
- "LB-QyhM": "Projects",
- "RU009FY": "GitHub pull requests",
- "Xj-3fdg": "PRs",
- "PAK8mwc": "GitHub issues",
- "ISISlFo": "Priority",
- "kpxCp5s": "Identifier",
- "Dd-TzXA": "No grouping",
- "JKx6Gd0": "Grouped columns",
- "uoATjeA": "Board",
- "6GAUUa8": "Compact issue rows",
- "tIgX1ak": "List",
- "CW8el5g": "Recently completed issues",
- "HauqL5Y": "Completed",
- "kRDldqg": "Issues created by you",
- "o_j-FoE": "Created",
- "eNsBySI": "Issues assigned to you",
- "pP-07nE": "My Issues",
- "_kT7uQE": "Open issues across connected workspaces",
- "gIF8518": "All",
- "Svu67QM": "Any GitLab state",
- "m5Y69Pc": "Closed issues and merge requests",
- "BpviSSw": "Closed",
- "fM4vagY": "Merged merge requests",
- "GtruncU": "Merged",
- "Dm3BEDs": "Open issues and merge requests",
- "L9I1oLA": "Assigned and team issues",
- "R_7ye6M": "Linear",
- "cBPoyj8": "Issues and merge requests",
- "BaXOO9M": "GitLab",
- "monYp5Q": "Issues and pull requests",
- "gcczsRA": "GitHub",
- "fCKRINY": "Showing first {{value0}} of {{value1}} diff lines.",
- "0WWDhS8": "Comment on line {{value0}}",
- "LJbwLTk": "Resolved {{value0}} by {{value1}}",
- "3fJQdKo": "Source: {{value0}}",
- "F0yrwZ0": "Sort: {{value0}}",
- "ntCXZ5E": "Fields: {{value0}}",
- "rkPw0BI": "Group: {{value0}}",
- "KPrnw08": "Order: {{value0}}",
- "p08Gdhs": "Preferred issue source upstream is unavailable for {{value0}}. Using origin.",
- "3-41cjc": "+{{value0}} fields",
- "g8lrpKM": "into {{value0}}",
- "2x3FfB8": "Querying {{value0}}",
- "T-_RK2o": "Page {{value0}}",
- "AHMKHtc": "{{value0}} teams",
- "GRCIny0": "New {{value0}} Issue",
- "z7RLmIM": "File in {{value0}}",
- "Cb83OoQ": "Create from {{value0}}",
- "Fg7BUfE": "Branch name: {{value0}}",
- "Cx8BTNg": "{{value0}} requires a setup choice before creating this workspace.",
- "-1cVb10": "{{value0}}/{{value1}} is not added to Orca. Add this repository from the desktop app, then refresh mobile Tasks.",
- "TLa90Qg": "GitHub Project · {{value0}} {{value1}}",
- "sNIGIT0": "{{value0}} · {{value1}} · {{value2}}d",
- "Y1upIE8": "Quick commands",
- "j34FFK4": "Remove",
- "RLWvqn8": "Remove this custom shortcut?",
- "PKSYVds": "https://example.com",
- "ZabOoVw": "Enter a URL, or leave blank for a new tab.",
- "tKOmSkM": "New Browser",
- "pg8WJ-k": "Terminal name",
- "gKi8D7w": "Rename Terminal",
- "gahpqR8": "Replace the phone draft with the latest desktop file?",
- "tMSSoFA": "Discard Changes",
- "psn3klQ": "Discard & Leave",
- "IytTrKE": "Copy All & Leave",
- "knjkJaM": "Copy or discard phone drafts before leaving.",
- "28Q3TbY": "Unsaved markdown changes",
- "a6FBCvM": "Refresh",
- "a79zJAw": "Copy Path",
- "_VDitck": "Copy Notes",
- "-So6IQg": "Choose an agent session for the current notes.",
- "eBYSC7A": "Send Review Notes",
- "c_XP7YM": "Markdown Note",
- "vL8HgZo": "Browser",
- "1ELofI0": "Terminal",
- "-95LQlw": "New Tab",
- "UDf4wts": "Paste",
- "IdjCS0U": "Create Tab",
- "S2Yv1rU": "Creating...",
- "Xb4fMs0": "No tabs in this session",
- "jBv9pDk": "Dismiss workspace creation warning",
- "uDcv4AM": "More session actions",
- "zUxrlPw": "Reconnect to desktop",
- "z6d7HxM": "Back to worktrees",
- "m6V9ozk": "Agent Presets Unavailable",
- "yBLhh9Y": "No Enabled Agents",
- "pUeIX0M": "Detecting Agents",
- "Ggr0PGg": "Browser page is not available yet.",
- "xdJzAj8": "Desktop update required for mobile browser streaming",
- "6kcq1T8": "Edit this quick command before running it",
- "BYmvBAo": "Selection cleared (scrolled out of buffer)",
- "_0rBKLA": "Couldn't copy",
- "A6mZ2G0": "Copied",
- "m332RRE": "Couldn't clear terminal",
- "8hc6lac": "Terminal cleared",
- "528pc28": "Input too large (max 256 KiB)",
- "RJlcmtM": "Open Orca on the host to wake sleeping agents.",
- "JnDupXg": "Saved",
- "XIoxeds": "Couldn't copy notes",
- "dl26MWM": "Notes copied",
- "TDYOpzk": "Failed to delete note",
- "ya3rgTk": "Failed to save note",
- "TX0YgPk": "Note added",
- "ElSO0Bs": "Couldn't load markdown",
- "eIqJOeA": "{{value0}} preview",
- "GF9YPY8": "{{value0}} image",
- "yHsoXLM": "Send",
- "Kvcps20": "Send review notes to AI",
- "i7mE8Wc": "Copy",
- "G46090U": "Copy review notes",
- "o0woxZM": "{{value0}} review {{value1}}",
- "bjh73HM": "No review notes",
- "bNrgw7Q": "Save note",
- "AJOY4oY": "Cancel",
- "vCc2hyw": "Add review note",
- "AMX0qpI": "Delete note on line {{value0}}",
- "XjRhzvI": "Add note on line {{value0}}",
- "7su6EMM": "{{value0}} diff line {{value1}}",
- "fAJsFIg": "Save",
- "Hy2xmeg": "Discard",
- "8Uro2f0": "Retry",
- "HtCuTmQ": "Line {{value0}}",
- "qrdoHLM": "Commit failed.",
- "Qpl1k5o": "Committed changes unavailable.",
- "aqSqtLI": "Step {{value0}}",
- "XfBogi0": "{{value0}} tool {{value1}}",
- "WL3i_AY": "image",
- "tSzSq0U": "Attached image",
- "9kO5k1s": "File",
- "76ELAmA": "Preview",
- "dZsgG-M": "Unable to load folder",
- "wA_0d2E": "Earned Codex rate-limit reset",
- "CiFc9DQ": "e.g. pnpm build",
- "d0JpJz4": "e.g. Build",
- "rMV0BMU": "Pick a key",
- "fTbhbgg": "Open image",
- "oitC92A": "image",
- "8ckUTUg": "HOOKS",
- "hiRz7rE": "ORCA.YAML",
- "by8gktU": "Write a note",
- "AmkPWYA": "Remote repository",
- "2Kl8BY4": "Select a repository",
- "QjSzvc4": "No results found.",
- "RIaVSo8": "base",
- "IOLibYw": "System default",
- "2r4Wqzo": "Pairing log",
- "G_n7Zxg": "Pairing log",
- "Fbnf310": "Failed to load voice settings.",
- "4HGax2g": "No worktrees",
- "oRXGJpo": "No worktrees match filters",
- "d-FojRM": "No matching worktrees",
- "Y4yzly8": "Search worktrees",
- "ThGUKR8": "Search worktrees…",
- "3GdsXVQ": "Host",
- "I0vv7aw": "No type",
- "pjrxOkU": "{{value0}} directories",
- "DvuAE90": "1 directory",
- "EmJ0ZpA": "Remote repository",
- "mDtuNkA": "Select a repository",
- "kbZvL2g": "Linear issue",
- "Wg2C-lo": "Items",
- "ybs6rJE": "Open view in GitHub",
- "KVqCyig": "Shortcut",
- "WaegjuQ": "File",
- "Dy-chOU": "Markdown",
- "ps5grWg": "Send command",
- "XNw0eg0": "Type a command…",
- "Rddk0Io": "Typed text is sent directly to the active terminal",
- "JQAVlGc": "Show keyboard for live terminal input",
- "WbNNU2M": "Add custom shortcut",
- "UjbgRFg": "Paste from clipboard",
- "g0S-mpY": "Switch to live terminal input",
- "LNjU0eA": "Switch to buffered command input",
- "CAFCbk0": "Switch to phone mode",
- "QB6eVqs": "Switch to desktop mode",
- "jbJql9k": "Hides the software keyboard and keeps the current terminal session open.",
- "O4uFjyM": "Dismiss keyboard",
- "1Ef6jA8": "Loading terminal",
- "5g1_I7Y": "Checking desktop capabilities — try again in a moment",
- "UoNS0D4": "Desktop update required for quick commands",
- "7IGdkR0": "New tab",
- "Td8lqm0": "Open source control",
- "8NqLc0E": "Open file explorer",
- "OcU2d6s": "Couldn't send notes",
- "4BJ8B0k": "Notes sent",
- "SM7vigo": "{{value0}} file",
- "Dwq_r1o": "{{value0}} files",
- "mLbULQw": "{{value0}} commit",
- "TWTFkY0": "{{value0}} commits",
- "t2Awy1s": "vs {{value0}}",
- "B2yGeak": "Connection interrupted",
- "TI9qKn0": "Unknown terminal error",
- "R0VwXOs": "No commit message generated",
- "-CpqM4g": "This branch is not ready for a {{value0}} yet.",
- "aDtTv18": "Create {{value0}}",
- "8TO561E": "Pull requests are not available for this repo",
- "Xh63VTo": "Checking branch status...",
- "o8ul7Iw": "Publish Branch first",
- "9tlos5E": "Enter a commit message",
- "jzI4z6s": "Stage at least one file",
- "Pej4iSQ": "Source control action failed",
- "67FHeO0": "Unable to load source control",
- "Z4IRqv4": "Unable to load committed changes",
- "GXYBPqk": "No upstream",
- "1YRKLD4": "{{value0}} ahead, {{value1}} behind",
- "kbozpKo": "Live input",
- "_MGGD5E": "Starting mic",
- "Q7SP9fo": "Processing",
- "y6GQnVA": "Listening",
- "vXUuukQ": "Quick Commands",
- "1rvpPn4": "Choose Agent",
- "SbxgQXc": "Add Quick Command",
- "gaaVrjY": "Edit Quick Command",
- "uVgCcno": "Delete",
- "jmIvPBQ": "Cancel",
- "0dIGtV8": "Line: {{value0}}",
- "ZueS87g": "Lines: {{value0}}-{{value1}}",
- "hLNcWyo": "Scope: file",
- "57DUHqU": "the agent",
- "0hhZYns": "Unable to open in session",
- "1Z6vya0": "Unable to load files",
- "FuhqCI4": "Waiting for desktop...",
- "vu5sSQI": "Connecting to desktop...",
- "MpjZorw": "Discard",
- "5cnTshE": "Stay",
- "jogAQ98": "Unable to save file",
- "Rajm1co": "Diff Unavailable",
- "9Sv7Jb4": "Deleted File",
- "BrE_aCg": "Diff Too Large",
- "Cku_aRM": "Binary Diff",
- "9FhY-Sk": "Context",
- "0l1OykU": "Deleted",
- "bnfXRLU": "Added",
- "eiEI8yY": " · {{value0}} active",
- "qNgdEE0": "{{value0}} worktree{{value1}}{{value2}}",
- "UL6zDWw": "Not permitted — your GitHub account is not connected.",
- "nfDKqg4": "Something went wrong.",
- "amP19yQ": "Update Orca on your computer",
- "NkNSfjQ": "Update Orca Mobile",
- "VWnR13E": "Use reset",
- "_nuDzHY": "Cancel",
- "rXScUPU": "The host confirmed this attempt, but this phone could not clear its retry record. A later retry will reuse the same safe operation ID.",
- "d5V00qM": "This phone could not clear the discarded retry record. Retrying it is safe, but the record must be cleared before a new reset can be confirmed for this account.",
- "B0fOGkI": "Details",
- "21rrqn0": "Browser stream failed.",
- "ukxwfJ8": "Unable to load agent sessions",
- "dVAzjOs": "Get notified on this device when an agent needs your input or finishes a task.",
- "uzWRFSg": "Notifications are disabled in system settings.",
- "J055vls": "None selected",
- "qVCBvFg": "Recent",
- "uGLg5VY": "No Linear tasks",
- "ifuEhog": "No GitLab tasks",
- "haGU2eY": "No GitHub tasks",
- "OCkeuqU": "No matching tasks",
- "Q9YN3Hk": "Connect to a host to load tasks",
- "inyDHB0": "Choose project",
- "73-jDqg": "{{value0}} teams",
- "rqyU6Yo": "1 team",
- "5U1KC3A": "Workspace",
- "DiuXQZo": "Fields",
- "BJUllKs": "{{value0}}/{{value1}} fields",
- "qzEC9yM": "ascending",
- "2IFEfeA": "descending",
- "zrhQGaA": "{{value0}} repos",
- "nt1k3hc": "{{value0}} repository",
- "qzhASv0": "{{value0}} repositories",
- "dBmZ43Q": "All repos",
- "yX2I5Qc": "{{value0}} sources",
- "x8ioLCA": "Select target",
- "OR0Rh2U": "\"{{value0}}\" already exists.",
- "jBhX2v4": "Name must be 80 characters or fewer.",
- "RT1HPds": "Name is required.",
- "TxiIlg0": "Couldn't copy drafts",
- "HimYt6k": "Path copied",
- "S6RbGW8": "{{value0}} — tap to retry",
- "-4K4pmw": "{{value0}} tabs",
- "KRxO3Ug": "1 tab",
- "vFcOLlo": "Loading tabs",
- "6P8BtkA": "Browser command failed",
- "sYGlLWQ": "Failed to create browser",
- "HyIWUac": "Enter a valid URL",
- "6oL3kaQ": "Failed to create markdown note",
- "sgQvHe0": "Quick command",
- "BphZ5Gw": "Failed to create terminal",
- "DKTAFXw": "Save failed",
- "qIT8ceU": "Couldn't load file preview",
- "XD1EPRc": "Couldn't load diff preview",
- "sJ7CwDw": "File too large for mobile preview",
- "8Ho6nkA": "Binary preview unavailable",
- "X1e46P4": "Dictation inserted",
- "V4EVATY": "Changed on desktop",
- "RwIU_9I": "Read only",
- "hPnnpWc": "Direct · LAN",
- "f3Si3vU": "Direct · Tailscale",
- "Lo_8ioI": "Orca Relay",
- "QNvTsRo": "No {{value0}}",
- "nDyX2e8": "Blank Terminal",
- "7wOLCCY": "Disconnected",
- "FZM-PD0": "Connection failed",
- "wOY1nLM": "Reconnect failed",
- "55lbvEs": "Authentication failed",
- "uEprraQ": "Reconnecting",
- "XpcB6Lk": "Deploying relay",
- "Y4pY3mY": "Connecting",
- "GyhUU1I": "Connected",
- "VtNQIUo": "Push succeeded, but {{value0}} creation failed: {{value1}}",
- "3fVn1VI": "Abort merge",
- "S5cNB0c": "Abort rebase",
- "wFxT3pM": "Aborting…",
- "wL23gbE": "No branch",
- "EiCMRDA": "Unstaged",
- "YcfLGog": "Staged",
- "ZnNoGOU": "Branch",
- "ubcC1kU": "Terminal",
- "nMoq2GI": "File",
- "oS6AL4Y": "Markdown",
- "YHLAtbk": "Browser",
- "tgyhT8Q": "New Browser",
- "bdYtRH8": "Worktree",
- "972Qfrg": "Save note on line {{value0}}",
- "5Rc0T-w": "{{value0}} unsent notes",
- "VuvuQv0": "{{value0}} unsent note",
- "2KfV5_M": "{{value0}} note",
- "87GezVA": "{{value0}} notes",
- "ZGxcUL4": "Unreviewed",
- "08Yk1Go": "Notes",
- "ycKwNOI": "Loading agent sessions...",
- "FjJb7Lo": "{{value0}} line {{value1}}",
- "sDDLSuM": "{{value0}} on WSL {{value1}}",
- "TUCQXxI": "{{value0}} on the host",
- "mWMZ-dk": "Open a local workspace before resuming a session.",
- "eTFpmzo": "This session is stored on the host machine, so it cannot be resumed in an SSH workspace. Open a local workspace for this project.",
- "GLFjyPk": "Resume from history is not available in runtime-hosted workspaces.",
- "WVNYnak": "After {{value0}}s",
- "xYaQ41Y": "repository hooks",
- "EJg7NQU": "local hooks",
- "BeBymFk": "orca.yaml",
- "px-yCeQ": "{{value0}} comment",
- "24Kgyy4": "No comments yet",
- "PAtCwbU": "Top-level comment",
- "br73014": "Review thread",
- "Ak34AMw": "Resolved review thread",
- "oj0ltFk": "Review",
- "BWgU598": "Resolved review",
- "6rtcg5s": "Open in Linear",
- "N_IsXzY": "Open in GitLab",
- "SpAtwKU": "Linear ticket",
- "MKTNAHg": "{{value0}} todo",
- "mYLUh0s": "Merge request",
- "PoPA1vA": "Empty",
- "cAXZUp4": "Merge PR #{{value0}}?",
- "X5VvyPQ": "Rebase and merge PR #{{value0}}?",
- "LCOEY5w": "Squash and merge PR #{{value0}}?",
- "1Shau08": "Squash and merge",
- "psZ6Lys": "PR",
- "xLFr_Co": "merge request",
- "PAnLDcM": "Create merge commit",
- "b9yLdBs": "Rebase and merge",
- "6MEByr4": "Unknown",
- "cbIMuqY": "Able to merge",
- "YEiNYxU": "Blocked",
- "OXTehpM": "Behind",
- "hIW5XEU": "Conflicts",
- "AXgAxVM": "Merge",
- "Sos7PxI": "{{value0}}/{{value1}} passed",
- "Uc3hFHs": "{{value0}} pending",
- "L37iq1E": "{{value0}} failing",
- "X9M1AcA": "No checks",
- "pmjWIDk": "GitLab todo",
- "kjZMz_U": "Locked",
- "1WEmdBA": "Draft",
- "BbDPGbM": "Redacted",
- "qJU9f5Q": "{{value0}} review note",
- "QGcvPOc": "{{value0}} review notes",
- "kYCT6qM": "Resolved thread by {{value0}}",
- "ahIRbHk": "Resolved comment by {{value0}}",
- "qcFeMQM": "Current & upcoming",
- "DCkRqC8": "Couldn't confirm cleanup for {{value0}} credential on this device.",
- "XStfhOk": "Couldn't confirm cleanup for {{value0}} credentials on this device.",
- "xnvhKbA": "{{value0}} transcript skipped",
- "UXXYuws": "{{value0}} transcripts skipped",
- "QlrZNys": "{{value0}} file reviewed, {{value1}} note",
- "J7M3gnY": "{{value0}} file reviewed, {{value1}} notes",
- "uM2_gxc": "{{value0}} files reviewed, {{value1}} note",
- "JrNt3Dk": "{{value0}} files reviewed, {{value1}} notes",
- "Id8zorY": "{{value0}} worktree",
- "t4PccRo": "{{value0}} worktrees",
- "AYqemqw": "{{value0}} active",
- "lXLSjWw": "{{value0}} failing check",
- "N7XOlnE": "{{value0}} failing checks",
- "dG4O1e4": "Resolved thread by {{value0}}",
- "lXnGpvs": "Resolved thread by {{value0}} ({{value1}})",
- "njd-pFg": "Resolved comment by {{value0}}",
- "tQONwOQ": "Resolved comment by {{value0}} ({{value1}})",
- "uxZVTz8": "{{value0}} tool call",
- "IlwwqQs": "{{value0}} tool calls",
- "OLmV45U": "Untitled",
- "S-avV-Y": "{{value0}} reviewed file staged",
- "IPu47z8": "{{value0}} reviewed files staged",
- "TxG95wU": "check Tailscale",
- "oBMMuM8": "GitHub work items require a GitHub remote for SSH repositories",
- "m4LECc4": "Floating Workspace",
- "ueRRwRg": "Connection is too slow for voice dictation. Try again when the connection improves.",
- "hf0yXVE": "Couldn't verify the SSH connection. Reconnect the host and try again.",
- "XOHYcMw": "Update the paired desktop Orca app to use mobile voice settings.",
- "cuSNE9k": "Idle",
- "cfFE9JM": "Done",
- "eSniHCo": "Interrupted",
- "clLXJRk": "Waiting for input",
- "CeMk5QY": "Blocked",
- "xLtCpIk": "Working",
- "RvLuxao": "Pull request #{{value0}}, {{value1}}, {{value2}}{{value3}}. Open pull request.",
- "oDQaC0g": "Pull request unavailable: {{value0}}",
- "MkY5xK4": "Loading pull request",
- "qE1-68U": "Creating review...",
- "JokOS5o": "Force pushing with lease...",
- "0BMXLfE": "Pushing commits...",
- "PnL-W2o": "Publishing branch...",
- "uN9IaYI": "Committing changes...",
- "us6yszU": "Generating commit message...",
- "eCa7Me8": "Staging changes...",
- "Kdbzhtg": "This branch is not ready for a {{value0}} yet.",
- "eeoaUzE": "Push the base branch before creating a {{value0}}.",
- "dhReg-4": "Creating a {{value0}} from this fork is not supported.",
- "UNrSqqU": "A {{value0}} already exists for this branch.",
- "CMzOREY": "Creating {{value0}}s is not supported for this repo.",
- "i65iwXo": "Authenticate before creating a {{value0}}.",
- "h5c6qGM": "Sync this branch before creating a {{value0}}.",
- "aDj0ISs": "Publish commits before creating a {{value0}}.",
- "J6J02jo": "Switch to a feature branch before creating a {{value0}}.",
- "eL3YqZQ": "Check out a branch before creating a {{value0}}.",
- "fS2uz3k": "Commit changes before creating a {{value0}}.",
- "YnkDu_A": "Orca could not confirm whether this branch already has a {{value0}}. Try again in a moment.",
- "nUw7_cE": "{{value0}} created, but Orca could not refresh it yet.",
- "89Qhlf4": "{{value0}} #{{value1}} is already open.",
- "G0fuKJo": "Nothing to commit. Branch is up to date.",
- "qgmf_L8": "Push",
- "0OsPYDw": "Pull",
- "gSinyKw": "Force push with lease to update the remote branch.",
- "5MUJYGA": "Publish this branch to origin.",
- "5OKMsK4": "Check out a branch before publishing commits.",
- "eSJfk9k": "Stage at least one file to commit.",
- "MM3ixxY": "Stage all changes.",
- "YnDfQwA": "Enter a commit message to commit.",
- "sJ8R-8c": "Commit staged changes.",
- "lBQzq_8": "Resolve conflicts before committing.",
- "aIqyvoY": "Try again once the remote operation finishes.",
- "YkxQqGg": "Remote operation in progress.",
- "cOOTv9E": "Force push in progress.",
- "GqPiXjg": "Commit in progress.",
- "6Z1Zr78": "Publish Branch",
- "gqhNZGI": "Sync",
- "AvE0E2k": "Stage All",
- "7HjRY3c": "Commit",
- "koj5rtA": "Force Push",
- "63siVQ8": "Request failed: {{value0}}",
- "8I2nZuQ": "Skipped",
- "Ba1jOdE": "Neutral",
- "lyHptRM": "Timed out",
- "thrHxG4": "Cancelled",
- "NO0ZjtQ": "Failed",
- "6lXfNVk": "Successful",
- "9XDJxdU": "In progress",
- "AXw1J4E": "No comments yet.",
- "znwGBr8": "No human comments.",
- "BvW_4OE": "No bot comments.",
- "jG05lVM": "{{value0}} of {{value1}} failed to load.",
- "zrt1n24": "No reviewers",
- "yMw_C-k": "Changes requested",
- "O3Knlx4": "Approved",
- "ziWbd9A": "Open pull request checks",
- "z4-dCLM": "Browse and resume agent sessions",
- "td40qOY": "Your desktop will appear here. Everything is encrypted end-to-end.",
- "-SigWBo": "Tap the button above to open the scanner. Point at the QR code on your screen.",
- "aCJTiqw": "Go to Settings → Mobile and generate a pairing QR code.",
- "_wFCKE8": "Could not test",
- "gdHptko": "No connection",
- "DxL3QsM": "Unexpected response",
- "O1SHffI": "Connected",
- "uJRC49k": "Could not read host data",
- "AtwKjZ4": "None — scan a QR to pair",
- "OCWSDG0": "{{value0}} paired",
- "s5C2oPk": "No description.",
- "AnvMzjI": "Copy notes instead",
- "0IFqHX0": "New agent session",
- "k5E-6Qo": "Check the host connection",
- "AXVCL9g": "Iteration",
- "G_aoVj8": "Failed to create workspace",
- "2t3siE4": "current",
- "X4spS84": "Commit failed",
- "Cqqzv8U": "Unable to refresh source control",
- "8Tx_eZw": "Failed to create pull request",
- "DIh5pvA": "Failed to update linked review",
- "D8-XyhU": "Failed to update linked pull request",
- "GaTugx8": "Local commits would be lost; pull instead",
- "qajmB_0": "Nothing to fast-forward",
- "fp_5pjo": "Fast-forward",
- "UWyesQ8": "Fast-forward ({{value0}})",
- "qq_p9K0": "Branch is already published",
- "5Vkd48o": "Branch is up to date",
- "N0HpMMg": "Sync",
- "26SoVIw": "Sync (↓{{value0}} ↑{{value1}})",
- "Ia0aBfU": "Nothing to pull",
- "0pGBpyQ": "Pull",
- "oCECucM": "Pull ({{value0}})",
- "zgbzIDs": "Nothing to push",
- "eBZzWkw": "Push",
- "9Xtk0Pg": "Push ({{value0}})",
- "cBrXr-8": "Commit failed",
- "5jVDzOo": "Waiting for desktop...",
- "cIZvHNg": "Connecting to desktop...",
- "zniLwck": "Unable to load committed diff",
- "NJJe3ZA": "Request failed: github.resolveReviewThread",
- "xWj8WHk": "Request failed: github.updatePRTitle",
- "o-JIJFg": "Request failed: {{value0}}",
- "jdt98Vo": "Request failed: {{value0}}",
- "aLzpW3w": "Committed changes failed",
- "nKp2Mj0": "Committed changes unavailable",
- "FJnzL9Y": "Unstaged",
- "senOKG4": "Staged",
- "OtjVKog": "Terminal",
- "tod-ra0": "Transcript stream failed",
- "GmBjriA": "Switch to chat view",
- "dqKsMqY": "Switch to terminal view",
- "502R_mE": "Switch to Phone",
- "0XbzIAs": "Switch to Desktop",
- "BGT_JFw": "Terminal",
- "MOOmRCc": "Unable to load diff",
- "1ymIBpg": "Unable to load review",
- "vMHt0l8": "Unable to load agent sessions",
- "4GOORsg": "Terminal",
- "FYj9qCM": "Failed to connect to SSH repository.",
- "Gli-J-E": "Failed to read SSH connection state.",
- "17Ky5K0": "Linear",
- "kWDpsSU": "Issue #",
- "G_t8Rjg": "MR !",
- "Jq988q0": "PR #",
- "a6UgDc8": "Browser dialog",
- "VgO3m0E": "Untitled session",
- "X0HdEQ0": "Connect",
- "Ho177Ac": "Reconnect",
- "ImyX3J0": "Reachable at {{value0}}",
- "JwcgRbU": "Pin",
- "dgZsiv8": "Unpin",
- "TNd6PjA": "Default",
- "dXnxHU4": "{{value0}} · Default",
- "dMUK4L8": "Unsupported layout on mobile",
- "hy_B4J8": "View #{{value0}}",
- "yvbNVZo": "Sort ascending",
- "YKWIedk": "Currently {{value0}} · tap for {{value1}}",
- "P-ZWamw": "Uses GitHub rank order",
- "fERYVNg": "Uses {{value0}} {{value1}}",
- "iD-UhpY": "Failed to create Linear issue",
- "T_YfEh0": "Select a Linear team first.",
- "ffJZE1A": "Failed to create {{value0}} issue",
- "C3TiEsc": "Add a Git repository before creating a {{value0}} issue.",
- "2cHUFuY": "Failed to create sub-issue",
- "KcjImC4": "Sub-issue not found",
- "ct__F0Q": "Failed to reopen thread",
- "LVc8Fk0": "Failed to resolve thread",
- "fpX38uo": "Failed to sync viewed state with GitHub.",
- "lanbga8": "Invalid checks response",
- "lSNLJ4s": "Failed to update GitHub status",
- "8U28lt8": "Failed to update GitHub item",
- "QI7iJCw": "Selected agent is disabled. Choose an enabled agent before creating.",
- "AGIjbJU": "Connect {{value0}} before creating a workspace.",
- "eCcpIL4": "Failed to connect to SSH repository.",
- "CyTKwng": "Failed to read SSH connection state.",
- "cTL2xfk": "blank",
- "-JNPw2M": "Details not found",
- "s_tAbdk": "This project has no supported views.",
- "caw13Gk": "Failed to connect Linear",
- "bNtRw1Q": "Failed to load GitLab tasks",
- "Bt_rGOI": "Failed to load GitHub tasks",
- "ObzOf3Y": "Iteration",
- "7wx0uDo": "Unassigned",
- "14_Cpwk": "Unable to create untitled markdown note",
- "1s8dFXg": "Terminal input is locked by another client.",
- "v-nMJVc": "Failed to send notes",
- "5GHrSsw": "Failed to save review notes",
- "-0DsFBU": "Waiting for desktop...",
- "I4VlaAs": "Unable to read markdown",
- "65j23gQ": "Send {{value0}}",
- "3ivaga8": "Edit {{value0}}",
- "9ZRI2cs": "Connect {{value0}} before creating a workspace.",
- "h8LEFjY": "Generate {{value0}} details with AI",
- "rOYT-0U": "Allow {{value0}}?",
- "671hHtA": "Open it in your browser?\n\n{{value0}}",
- "dTuoCp0": "Squash and merge {{value0}} #{{value1}}?",
- "M2j9mpc": "{{value0}} comments",
- "xZ4TQL8": "Select page, Page {{value0}} of {{value1}}",
- "7LorW8k": "Page {{value0}} of {{value1}}",
- "CKtsHVY": "{{value0}} line",
- "ACQh2cM": "{{value0}} is already open.",
- "al8M9-M": "Pull {{value0}}, push {{value1}}.",
- "UIMnif0": "Pull {{value0}} commit.",
- "35baKac": "Pull {{value0}} commits.",
- "y7z5WcU": "Push {{value0}} commit.",
- "0yFIngw": "Push {{value0}} commits.",
- "gx2zC4w": "Not a valid pairing code",
- "WABgCvg": "Missing pairing code",
- "_c5oKe0": "Open",
- "aalP-X8": "Discard",
- "cTkYeR8": "Merge Request",
- "OpWJNnA": "merge request",
- "BWWtnQM": "MR",
- "GqNlrAs": "Pull Request",
- "rUwwMh4": "pull request",
- "Qic_Aa4": "PR",
- "-YeAYjI": "Discard",
- "myZTLv0": "{{value0}} resets available",
- "CfvCAaE": "{{value0}} reset available",
- "aaZ_2qE": "Expires now",
- "1neVPtc": "Expires in {{value0}}",
- "nH5aDJ4": "Next expires now",
- "fA_ezvI": "Next expires in {{value0}}",
- "4DTdO1w": "Merge",
- "pZ3OPxE": "Save",
- "eVLkMyE": "Comment",
- "g0JLO88": "Jobs",
- "OJSrr6g": "Failed jobs",
- "RfH2kOg": "Requested",
- "EaX2_X8": "Remove",
- "y2BBXrA": "Confirm",
- "7RncVJk": "Requested",
- "6BZSEjI": "Open",
- "3OzvpCE": "just now",
- "sC5iGOA": "Closed",
- "epStUOc": "In Progress",
- "sMpsrkY": "In Review",
- "LEXdDEk": "Done",
- "QESpnhs": "Terminal WebView render process ended",
- "9IP25z8": "Terminal WebView HTTP error",
- "GY53tDU": "Terminal WebView load failed",
- "_dDm4ic": "F12",
- "T7RTOC4": "F11",
- "d6orzBg": "F10",
- "rI3MEx0": "F9",
- "DR9i7SU": "F8",
- "EbNp-x4": "F7",
- "xOj4ngY": "F6",
- "MmdqLFU": "F5",
- "dMpOhHI": "F4",
- "fNbslzw": "F3",
- "5OQeDMc": "F2",
- "wPNSaMQ": "F1",
- "Z-W6Rzg": "Page down",
- "1n1QZYk": "Page up",
- "6UajMWQ": "End",
- "r2L-IvQ": "Home",
- "EvEE7WE": "Arrow right",
- "1TJf6c4": "Arrow left",
- "jB50jh8": "Arrow down",
- "S_D2PxQ": "Arrow up",
- "JAhWIZE": "Insert",
- "Wt9qvqo": "PgDn",
- "1qkhXPI": "PgUp",
- "bh9E9Gk": "Ins",
- "lCZrWn4": "Shift",
- "zN_6g9g": "Alt",
- "mthhwXw": "Ctrl",
- "fpKzlOM": "OpenClaw",
- "rZEdz3o": "Devin",
- "Lrz_Jb8": "Hermes",
- "tNRBWNU": "Rovo Dev",
- "X7ZF7JI": "Qwen Code",
- "yUpY07s": "Mistral Vibe",
- "HG6jBAg": "Kimi",
- "uvSF6-U": "Droid",
- "Vly29R0": "Cursor",
- "dSfrwic": "Continue",
- "WeGqDrY": "Command Code",
- "fm231VU": "Codebuff",
- "Vqp3lvY": "Cline",
- "RCPC-L0": "Autohand Code",
- "ufugQXE": "Auggie",
- "6Y3GKfY": "Charm",
- "kej-9Lc": "Kiro",
- "FYcf7kI": "Kilocode",
- "njg39j4": "Amp",
- "Gqznj90": "Goose",
- "FWr_S8c": "Aider",
- "tkhwBEU": "Antigravity",
- "qcMaCQk": "Gemini",
- "GovXMeA": "OMP",
- "BWhYVOA": "Pi",
- "STuGb5Q": "Trae",
- "Y9bn4gA": "Ante",
- "imGLJZs": "MiMo Code",
- "qar2VvQ": "OpenCode",
- "7u-Lga4": "GitHub Copilot",
- "58N2Zh8": "Grok",
- "Tvbh_c4": "Codex",
- "4os-vWc": "OpenClaude",
- "cUAuG8c": "Claude Agent Teams",
- "OZJxvKQ": "Claude",
- "x04i9ik": "Failed to resolve base branch.",
- "vuFM3_E": "{{value0}}mo",
- "m8V_LQQ": "just now",
- "-DRFeFw": "Staged Changes",
- "cdicUlU": "Untracked Files",
- "cbaJlCE": "Changes",
- "knjcZG0": "Failed to stage changes",
- "2m5o9w0": "Failed to force push with lease",
- "I8tYYd4": "Failed to push commits",
- "HtBxXOI": "Failed to publish branch",
- "r9Wy-Q8": "Commits",
- "Xawq6ME": "Pull Request",
- "TMv0RaY": "Changes",
- "tKcJoxk": "Base branch must differ from the head branch.",
- "yBuJIFU": "Choose a base branch.",
- "b89N2ws": "Enter a {{value0}} title.",
- "E7yK5NU": "Wait for generation to finish.",
- "DAVoau0": "Message, @files, /commands",
- "zGX7CcI": "Response not sent",
- "v7vfn5Q": "Response unconfirmed — check chat before retrying",
- "6dxPsys": "Response not sent (disconnected)",
- "sxVCOxI": "Choose an option",
- "-D7_HMY": "Unable to load pull request",
- "xEMYAIw": "Pairing invalid",
- "G1BrrUQ": "Reconnecting",
- "7mbOxzE": "Disconnected",
- "Fr9Rdq8": "Connected",
- "yqEocVY": "Securing",
- "S_1cAME": "Connecting",
- "eOcfBcE": "Answer not sent",
- "ukuLb_A": "Answer unconfirmed — check chat before retrying",
- "UnHHxag": "Answer partly sent — check chat before retrying",
- "O2gcQk0": "Answer not sent (disconnected)",
- "htcCRsA": "Cancel not sent",
- "chT2Z44": "Cancel unconfirmed — check chat before retrying",
- "Z_x_TcE": "Cancel not sent (disconnected)",
- "c6Kd_Ps": "Message not sent",
- "4Xgw97k": "Message not sent (disconnected)",
- "ZkABdzg": "Message not sent",
- "klTsRAk": "Delivery unconfirmed — check chat before retrying",
- "t_qfHRA": "Message not sent (disconnected)",
- "S9MYUPk": "Stop not sent",
- "i8UxPTM": "Stop unconfirmed — check chat before retrying",
- "ZhefrDE": "Stop not sent (terminal not ready)",
- "QVUePYc": "Cancel",
- "OxB9eF0": "Confirm",
- "PpZpLWw": "Select a file to review.",
- "Em5nLwQ": "This file was deleted. Add a file note or mark it reviewed.",
- "YeQabYs": "This diff is too large for the mobile preview.",
- "FdOHIhk": "This file cannot be rendered as text on mobile.",
- "5GRCze0": "Clear search",
- "GbS1Gw0": "Save",
- "tNw1xEA": "Closed",
- "QYCFjQw": "Draft",
- "AF7gJFU": "Merged",
- "sbQ_yBw": "Open",
- "rBMjMUM": "{{value0}}y ago",
- "5mTslyc": "{{value0}}mo ago",
- "3u9-Kuw": "{{value0}}d ago",
- "J9EQWOE": "{{value0}}h ago",
- "XG7ieU0": "{{value0}}m ago",
- "xbjFHYU": "just now",
- "aJGSaVI": "Sent",
- "_ax72Jw": "Browser pointer up failed",
- "oaarOD4": "Browser pointer down failed",
- "A-4DgN0": "Browser pointer move failed",
- "yrjs9M0": "Browser scroll failed",
- "9E99YI8": "Browser command failed",
- "kZGbeC4": "Linear",
- "fvIr9H8": "GitLab",
- "TH4OaOM": "GitHub",
- "xPjEgDM": "Low",
- "7LgwgJM": "Medium",
- "_pcc0Zw": "High",
- "e3kayEE": "Urgent",
- "X1FYz1o": "Right click",
- "AX4IXS0": "Unexpected Linear tasks response",
- "SX56B0U": "Unable to resolve branch base",
- "f-93Rxs": "Failed to load commit history",
- "O6Amqhs": "Branch status unavailable",
- "9AhI4NI": "Commit failed",
- "D2XJD5Q": "Source control action failed",
- "1yTzUoY": "Waiting for desktop...",
- "aNYrFtc": "No base branch to rebase onto",
- "rF-O-TA": "Waiting for desktop...",
- "q53ZKds": "Binary branch diff preview unavailable on mobile",
- "AAVqwEI": "Terminal input is locked",
- "kiGJQl0": "Failed to send resume command",
- "n6zBfFc": "Created terminal response was invalid",
- "GWephQg": "Failed to create terminal",
- "KEeLFyA": "Could not prepare this legacy Codex session. Retry resume.",
- "64b63WI": "Clipboard image content must be base64",
- "Oht8bkc": "Clipboard image is too large",
- "u_SAyGc": "Committed diff is unavailable",
- "qK2AOt0": "Diff response was invalid",
- "47q1BdE": "Unable to load diff",
- "1eue8fY": "Unable to load review notes",
- "EgST0cw": "Source control response was invalid",
- "9Z6xNzo": "Unable to load changes",
- "kyy8tNA": "Terminal input is locked",
- "-j2Yzyc": "Failed to send prompt",
- "8WPx578": "Created terminal response was invalid",
- "p20YlWo": "Failed to create terminal",
- "dzoAXdg": "Failed to save review state",
- "a3rNaLA": "Waiting for desktop...",
- "LYAe0FE": "Created terminal response was invalid",
- "NhC30K0": "Failed to create terminal",
- "-NMYOgc": "Terminal input is locked",
- "tpf9SfA": "Failed to send notes",
- "eH92OqQ": "Failed to encode resized clipboard image",
- "qYK5Ouo": "Failed to save quick command",
- "LuqBIhs": "Failed to start microphone recording",
- "oQrz0NI": "Keep-awake native call timed out",
- "qiXFVWc": "No speech detected.",
- "Pwq6G9w": "Failed to initialize microphone",
- "InUuqhA": "Microphone permission denied",
- "CdTon5s": "Failed to update dictation settings",
- "9VJGb2s": "Failed to delete model",
- "hkwxfd0": "Failed to start download",
- "jcVunZ4": "Failed to load dictation models",
- "3cWf_os": "useHostProtocolGates must be used inside ",
- "l0xDyns": "Invalid accounts snapshot from host",
- "dWotxRU": "Invalid reset response from host",
- "hIvuhiQ": "Failed to load check details",
- "hRiZhQg": "Unable to load workspace metadata.",
- "THbZzp4": "Unable to reach host",
- "MJ1SglY": "Disable that VPN or enable split tunneling / \"Allow LAN\".",
- "n-WXtiA": "Non-Tailscale VPNs can route local traffic through a remote server.",
- "PxeuBQc": "Update the Tailscale app — recent releases fix reconnect bugs.",
- "j0KeldQ": "Check the desktop is awake and shows as connected in your tailnet.",
- "rmMn9Xc": "iOS/Android can silently wedge the tunnel: toggle Tailscale off and back on in the Tailscale app.",
- "T6EL0oM": "Host addresses like 100.x.x.x or *.ts.net connect through Tailscale — keep it ON.",
- "S9tNuKw": "Restart both apps if timeouts persist.",
- "gvS1F3o": "Go back to the host list and tap your host to retry.",
- "uGWzUrE": "Check WiFi signal strength on your phone.",
- "neP0TKg": "After an update, you may need to re-pair via QR code.",
- "WkJ-I-g": "Try restarting Orca — the companion server starts on launch.",
- "i4fV_jk": "Orca must be open on your desktop to accept connections.",
- "rtC8ngI": "Corporate/school networks may block P2P — try a personal hotspot.",
- "401zg0M": "Linux: sudo ufw allow 6768",
- "ayekp1A": "Windows: Defender Firewall → Allow app — enable Orca for Private networks.",
- "REilmMs": "macOS: System Settings → Network → Firewall — allow Orca.",
- "jEL8NQc": "Try reconnecting WiFi on both devices.",
- "h6u3Ajc": "Ethernet and WiFi must share the same subnet.",
- "DFWK1QU": "Both devices must be on the same LAN (unless connected through Tailscale).",
- "q1Pbqtk": "Selected",
- "p2fnv7c": "{{value0}} {{value1}}",
- "nEDriRI": "Terminal did not initialize - no ready signal from the terminal view",
- "7IfxObc": "Tap to show keyboard",
- "quM4RwQ": "Uploading image to host",
- "ha7j7qM": "Preparing microphone",
- "_-dmI2A": "Transcribing on desktop",
- "GGXoono": "Tap mic to stop",
- "97h575A": "Review required",
- "39Q08OU": "{{value0}} reviewer",
- "d8cyKVY": "{{value0}} reviewers",
- "UMqLjMs": "Unresolved checks"
+ "mobileWorkspaceStatuses": {
+ "todo": "Todo",
+ "progress": "In progress",
+ "review": "In review",
+ "done": "Done"
+ },
+ "workspaceListPickerOptions": {
+ "pr": "PR Status",
+ "status": "Status",
+ "no": "No Grouping",
+ "server": "Server order",
+ "manual": "Manual",
+ "repository": "Repository, then workspace name",
+ "repo": "Repo",
+ "most": "Most recent output first",
+ "recent": "Recent",
+ "alphabetical": "Alphabetical by name",
+ "name": "Name",
+ "agents": "Agents that need attention, then recent activity",
+ "agent": "Agent activity"
+ },
+ "agentRowDisplay": {
+ "idle": "Idle",
+ "done": "Done",
+ "interrupted": "Interrupted",
+ "waiting": "Waiting for input",
+ "blocked": "Blocked",
+ "working": "Working",
+ "just": "just now"
+ },
+ "workspacePrStatusGroups": {
+ "closed": "Closed",
+ "progress": "In Progress",
+ "review": "In Review",
+ "done": "Done"
+ },
+ "task": {
+ "repository": "Repository",
+ "close": "Close",
+ "reopen": "Reopen",
+ "pullRequest": "Pull Request",
+ "updateItem": "Update Item",
+ "mergePullRequestTitle": "Merge Pull Request",
+ "mergeRequestTitle": "Merge Request",
+ "chooseHowPull": "Choose how this pull request should be merged.",
+ "chooseHowMerge": "Choose how this merge request should be merged.",
+ "mergeMethod": "Merge method",
+ "changeStatusMessage": "Change status",
+ "mergeMerge": "Merge merge request",
+ "gitHubReportsMergeConflicts": "GitHub reports merge conflicts.",
+ "mergePullRequest": "Merge pull request",
+ "copyGit": "Copy GitHub link",
+ "copied": "Copied",
+ "copyLinear": "Copy Linear link",
+ "createWorkspaceMessage": "Create Workspace",
+ "creating": "Creating...",
+ "noComments": "No comments.",
+ "discussion": "Discussion",
+ "addSub": "Add sub-issue",
+ "subIssueTitle": "Sub-issue title",
+ "open": "Open",
+ "noSub": "No sub-issues.",
+ "subIssues": "Sub-issues",
+ "noPipeline": "No pipeline runs for this MR.",
+ "none": "None",
+ "pipelineJob": "{{pipelineJobCount}} jobs",
+ "pipeline": "Pipeline",
+ "fileContents": "File contents unavailable.",
+ "binary": "Binary file.",
+ "markViewed": "Mark viewed",
+ "markUnviewed": "Mark unviewed",
+ "view": "View",
+ "hide": "Hide",
+ "changed": "Changed files",
+ "noChecks": "No checks found.",
+ "rerunAll": "Rerun all",
+ "rerunFailed": "Rerun failed",
+ "refresh": "Refresh",
+ "checks": "Checks",
+ "requestReview": "Request review",
+ "requestReviewers": "Request reviewers",
+ "noReviewer": "No reviewer suggestions found.",
+ "loadingReviewers": "Loading reviewers...",
+ "noReviewersRequested": "No reviewers requested.",
+ "reviewers": "Reviewers",
+ "updateAssignees": "Update assignees",
+ "removeUsernames": "Remove usernames, comma separated",
+ "addUsernames": "Add usernames, comma separated",
+ "noAssignable": "No assignable users found for this repository.",
+ "loadingAssignees": "Loading assignees...",
+ "assignees": "Assignees",
+ "updateLabels": "Update labels",
+ "removeLabels": "Remove labels, comma separated",
+ "addLabels": "Add labels, comma separated",
+ "noLabels": "No labels in this repository.",
+ "loadingLabels": "Loading labels...",
+ "labels": "Labels",
+ "saveTitle": "Save title",
+ "title": "Title",
+ "saveDescription": "Save description",
+ "description": "Description",
+ "project": "Project",
+ "assignee": "Assignee",
+ "status": "Status",
+ "type": "Type",
+ "refreshDetails": "Refresh details",
+ "mergeRequires": "Merge requires this repository in Orca.",
+ "closeItem": "Close item",
+ "reopenItem": "Reopen item",
+ "openGitHub": "Open in GitHub",
+ "workspaces": "Workspaces can only be created from GitHub issues and pull requests.",
+ "delete": "Delete",
+ "edit": "Edit",
+ "reply": "Reply",
+ "resolve": "Resolve thread",
+ "reopenThread": "Reopen thread",
+ "cancel": "Cancel",
+ "save": "Save",
+ "editComment": "Edit comment",
+ "show": "Show",
+ "commentCountComments": "{{commentCount}} comments",
+ "clearField": "Clear field",
+ "saveField": "Save field",
+ "text": "Text",
+ "number": "Number",
+ "yyyy": "YYYY-MM-DD",
+ "noIterations": "No iterations available.",
+ "enterDate": "Enter a date as YYYY-MM-DD.",
+ "enterValid": "Enter a valid number.",
+ "projectFieldsMessage": "Project fields",
+ "clearType": "Clear type",
+ "noIssue": "No issue types configured for this repository.",
+ "loadingIssue": "Loading issue types...",
+ "issueType": "Issue type",
+ "projectItem": "Project item",
+ "draftIssue": "Draft issue",
+ "issue": "Issue",
+ "pullRequestMessage": "Pull request",
+ "copyRepository": "Copy repository",
+ "repositoryNotOrca": "Repository not in Orca",
+ "do": "Don't run",
+ "always": "Always trust and run",
+ "failedTrust": "Failed to trust setup script.",
+ "runHooks": "Run hooks",
+ "setup": "Setup script",
+ "newSetup": "New setup script",
+ "orcaYamlTrustWarning": "This repository's orca.yaml runs on your machine before the workspace starts. Only run it if you trust this repository.",
+ "runSetupRepo": "Run setup from {{repoName}}?",
+ "repoNameS": "{{repoName}}'s setup script changed",
+ "skip": "Skip setup and create",
+ "runSetupCreate": "Run setup and create",
+ "runSetupScript": "Run Setup Script?",
+ "src": "src/renderer packages/ui",
+ "directories": "Directories",
+ "renderer": "Renderer UI",
+ "name": "Name",
+ "editSparse": "Edit Sparse Preset",
+ "newSparse": "New Sparse Preset",
+ "newPreset": "New preset",
+ "useWhole": "Use the whole repository",
+ "full": "Full checkout",
+ "sparse": "Sparse Checkout",
+ "noBranches": "No branches match.",
+ "useRepositorys": "Use this repository's configured base",
+ "defaultBranch": "Default branch",
+ "searchBranches": "Search branches",
+ "pick": "Pick an existing branch or ref.",
+ "startMessage": "Start From",
+ "agent": "Agent",
+ "connectRepository": "Connect Repository",
+ "detecting": "Detecting agents...",
+ "repositoryNotFound": "Repository not found.",
+ "addGitRepositoryBeforeCreatingLinear": "Add a Git repository before creating a Linear workspace.",
+ "start": "Start from",
+ "advanced": "Advanced",
+ "connectRepositoryFirst": "Connect repository first",
+ "optional": "[Optional]",
+ "workspaceName": "Workspace Name",
+ "connect": "Connect",
+ "connecting": "Connecting...",
+ "ssh": "SSH Connection",
+ "createWorkspace": "Create Workspace In",
+ "your": "Your key is encrypted via the host OS keychain and stored locally.",
+ "linearSettings": "Linear Settings / Security / New API key",
+ "lin": "lin_api_...",
+ "personal": "Personal API key",
+ "paste": "Paste a Personal API key to browse issues from that workspace.",
+ "connectLinearWorkspace": "Connect Linear workspace",
+ "linearTeam": "Linear Team",
+ "createIssue": "Create Issue",
+ "addContext": "Add context",
+ "taskTitle": "Task title",
+ "origin": "Origin",
+ "upstream": "Upstream",
+ "issueSource": "Issue source",
+ "team": "Team",
+ "createIssueSelectedLinear": "Create an issue in the selected Linear team.",
+ "createIssueSelectedRepository": "Create an issue in the selected repository.",
+ "sortTasks": "Sort Tasks",
+ "displayProperties": "Display Properties",
+ "orderLinearIssues": "Order Linear Issues",
+ "groupLinearIssues": "Group Linear Issues",
+ "linearView": "Linear View",
+ "noStates": "No states available",
+ "loadingStates": "Loading states...",
+ "changeStatus": "Change Status",
+ "allTeams": "All teams",
+ "chooseWhichTeams": "Choose which teams appear in Tasks.",
+ "linearTeams": "Linear Teams",
+ "failedSwitch": "Failed to switch workspace",
+ "linearWorkspace": "Linear Workspace",
+ "linearFilter": "Linear Filter",
+ "gitLabFilter": "GitLab Filter",
+ "gitLabView": "GitLab View",
+ "hidden": "Hidden from cards",
+ "shown": "Shown on cards",
+ "viewHas": "This view has no extra fields to show.",
+ "chooseWhichProject": "Choose which Project fields appear on item cards.",
+ "projectFields": "Project Fields",
+ "projectSort": "Project Sort",
+ "orcaDoes": "Orca doesn't support this GitHub Project layout yet.",
+ "projectView": "Project View",
+ "chooseProjectView": "Choose Project View",
+ "noMore": "No more projects.",
+ "noMatchingProjects": "No matching projects.",
+ "browseAll": "Browse all",
+ "browseAllLoading": "Browse all (loading...)",
+ "pin": "Pin",
+ "recent": "Recent",
+ "remove": "Remove",
+ "pinned": "Pinned",
+ "tap": "Tap to retry.",
+ "noProjects": "No projects loaded",
+ "failedLoadProjects": "Failed to load projects",
+ "useAdd": "Use Add by URL to reach missing projects.",
+ "some": "Some organizations didn't load ({{githubProjectPartialFailureCount}}).",
+ "couldNotLoadProjects": "Couldn't load projects from {{owner}}.",
+ "add": "Add",
+ "adding": "Adding...",
+ "addUrl": "Add by URL or owner/number",
+ "searchProjects": "Search projects",
+ "chooseProjectViewTasks": "Choose a project view for the Tasks page.",
+ "gitHubProjects": "GitHub Projects",
+ "loads": "Loads older results",
+ "loaded": "Loaded",
+ "jump": "Jump to a loaded or available result page.",
+ "gitHubPages": "GitHub Pages",
+ "issues": "Issues",
+ "pullRequests": "Pull Requests",
+ "gitHubView": "GitHub View",
+ "noAlternate": "No alternate issue sources available.",
+ "chooseWhether": "Choose whether each repository queries and creates work from upstream or origin.",
+ "gitHubIssue": "GitHub Issue Sources",
+ "allRepositories": "All repositories",
+ "chooseWhichRepositories": "Choose which repositories to query.",
+ "repositories": "Repositories",
+ "taskSource": "Task Source",
+ "next": "Next page",
+ "pagePage": "Page {{pageNumber}}",
+ "selectPagePageGithubCurrentPage": "Select page, Page {{githubCurrentPage}}",
+ "previous": "Previous page",
+ "changeStatusName": "Change status from {{fromName}}",
+ "noProject": "No project items",
+ "browseProjects": "Browse projects",
+ "chooseGit": "Choose a GitHub project",
+ "connectLinear": "Connect Linear",
+ "browseStart": "Browse and start work on your assigned Linear issues directly from Tasks.",
+ "connectYour": "Connect your Linear account",
+ "mobile": "This mobile Tasks view needs a newer desktop runtime.",
+ "updateOrcaDesktop": "Update Orca desktop",
+ "subIssueData": "Sub-issue data is unavailable for your token.",
+ "retry": "Retry",
+ "retrying": "Retrying...",
+ "retryLoading": "Retry loading issues from {{owner}}/{{repo}}",
+ "couldNotLoadIssues": "Couldn't load issues from",
+ "searchProvider": "Search {{providerLabel}} tasks...",
+ "searchProject": "Search project view...",
+ "display": "Display",
+ "tasks": "Tasks",
+ "allWorkspaces": "All workspaces",
+ "viewOrder": "View order",
+ "send": "Send comment",
+ "addComment": "Add a comment",
+ "failedUpdateIssueSource": "Failed to update issue source",
+ "failedCreateTask": "Failed to create task",
+ "failedCreateLinearSub": "Failed to create Linear sub-issue",
+ "failedLoadLinearSub": "Failed to load Linear sub-issue",
+ "failedAddLinear": "Failed to add Linear comment",
+ "failedUpdateLinear": "Failed to update Linear issue",
+ "failedMerge": "Failed to merge",
+ "gitHubReportsMergeConflictsOpen": "GitHub reports merge conflicts. Open in GitHub to continue.",
+ "failedReply": "Failed to reply",
+ "failedAddReview": "Failed to add review comment",
+ "unableComment": "Unable to comment without the PR head SHA.",
+ "failedLoadFile": "Failed to load file contents",
+ "unableLoad": "Unable to load file contents for this pull request.",
+ "failedUpdateReview": "Failed to update review thread",
+ "failedUpdateViewed": "Failed to update viewed state",
+ "unableSync": "Unable to sync viewed state for this pull request.",
+ "failedRerun": "Failed to rerun checks",
+ "failedRefresh": "Failed to refresh checks",
+ "failedRequest": "Failed to request reviewers",
+ "failedCopyText": "Failed to copy text",
+ "failedCopyLink": "Failed to copy link",
+ "failedAddComment": "Failed to add comment",
+ "failedUpdateGitLab": "Failed to update GitLab item",
+ "failedUpdateGitHubPull": "Failed to update GitHub pull request",
+ "failedUpdateGitHubIssue": "Failed to update GitHub issue",
+ "failedUpdateStatus": "Failed to update status",
+ "failedMergePull": "Failed to merge pull request",
+ "failedUpdateIssueType": "Failed to update issue type",
+ "projectIssue": "This project issue type cannot be edited from mobile.",
+ "failedUpdateProject": "Failed to update project field",
+ "failedUpdateItem": "Failed to update item",
+ "projectItemCannot": "This project item cannot be edited from mobile.",
+ "failedDelete": "Failed to delete comment",
+ "projectCommentCannotDeleted": "This project comment cannot be deleted from mobile.",
+ "failedEdit": "Failed to edit comment",
+ "projectCommentCannotEdited": "This project comment cannot be edited from mobile.",
+ "addProject": "Add the project item repository to Orca before creating a workspace.",
+ "failedCreateWorkspace": "Failed to create workspace",
+ "failedSave": "Failed to save sparse preset.",
+ "failedSearch": "Failed to search branches.",
+ "failedLoadSparse": "Failed to load sparse presets.",
+ "openShell": "Open a shell",
+ "failedLoadIssue": "Failed to load issue types",
+ "failedLoadAssignees": "Failed to load assignees",
+ "failedLoadLabels": "Failed to load labels",
+ "failedLoadDetails": "Failed to load details",
+ "failedLoadLinearContext": "Failed to load Linear context",
+ "failedAddProject": "Failed to add project.",
+ "expected": "Expected a project URL or owner/number.",
+ "failedSelect": "Failed to select project",
+ "failedLoadProject": "Failed to load project view",
+ "failedLoadMore": "Failed to load more GitHub tasks",
+ "connection": "Connection failed",
+ "failedLoadTasks": "Failed to load tasks",
+ "failedLoadTasksSettings": "Failed to load Tasks settings",
+ "updateOrcaDesktopUse": "Update Orca desktop to use Tasks on mobile.",
+ "addReview": "Add review comment",
+ "noText": "No text changes found.",
+ "groupRepository": "Group by repository, then newest activity",
+ "newest": "Newest activity first",
+ "updated": "Updated",
+ "pending": "Pending GitLab todos",
+ "myTodos": "My Todos",
+ "mergeRequests": "Merge requests and issues by repository",
+ "projectMrs": "Project MRs",
+ "reviewRequests": "Review requests assigned to you",
+ "needs": "Needs review",
+ "pullRequestsAuthored": "Pull requests authored by you",
+ "mine": "Mine",
+ "openPull": "Open pull requests",
+ "openIssuesAssigned": "Open issues assigned to you",
+ "assignedMe": "Assigned to me",
+ "openGitHubIssues": "Open GitHub issues",
+ "gitHubProjectsViews": "GitHub Projects views",
+ "projects": "Projects",
+ "gitHubPull": "GitHub pull requests",
+ "prs": "PRs",
+ "gitHubIssues": "GitHub issues",
+ "priority": "Priority",
+ "identifier": "Identifier",
+ "noGrouping": "No grouping",
+ "grouped": "Grouped columns",
+ "board": "Board",
+ "compact": "Compact issue rows",
+ "list": "List",
+ "recently": "Recently completed issues",
+ "completed": "Completed",
+ "issuesCreated": "Issues created by you",
+ "created": "Created",
+ "issuesAssigned": "Issues assigned to you",
+ "myIssues": "My Issues",
+ "openIssuesAcross": "Open issues across connected workspaces",
+ "all": "All",
+ "any": "Any GitLab state",
+ "closedIssues": "Closed issues and merge requests",
+ "closed": "Closed",
+ "mergedMerge": "Merged merge requests",
+ "merged": "Merged",
+ "openIssuesMerge": "Open issues and merge requests",
+ "assignedTeam": "Assigned and team issues",
+ "linear": "Linear",
+ "issuesMerge": "Issues and merge requests",
+ "gitLab": "GitLab",
+ "issuesPull": "Issues and pull requests",
+ "gitHub": "GitHub",
+ "diffPreviewTruncated": "Showing first {{maxRenderedPrDiffLines}} of {{totalLineCount}} diff lines.",
+ "commentLine": "Comment on line {{commentLine}}",
+ "source": "Source: {{githubIssueSourceLabel}}",
+ "sortGithub": "Sort: {{githubProjectSortLabel}}",
+ "fieldsGithub": "Fields: {{githubProjectFieldsLabel}}",
+ "groupLinearGroup": "Group: {{linearGroupLabel}}",
+ "orderLinearOrder": "Order: {{linearOrderLabel}}",
+ "preferred": "Preferred issue source upstream is unavailable for {{repoName}}. Using origin.",
+ "plus": "+{{githubProjectSummaryFieldCount}} fields",
+ "baseBranch": "into {{baseBranch}}",
+ "querying": "Querying {{prs}}",
+ "teamCount": "{{teamCount}} teams",
+ "newProvider": "New {{providerLabel}} Issue",
+ "fileIssue": "File in {{issueSource}}",
+ "createRef": "Create from {{refName}}",
+ "branch": "Branch name: {{localBranchName}}",
+ "repoNameRequires": "{{repoName}} requires a setup choice before creating this workspace.",
+ "owner": "{{owner}}/{{repo}} is not added to Orca. Add this repository from the desktop app, then refresh mobile Tasks.",
+ "gitHubProject": "GitHub Project · {{repository}} {{projectNumber}}",
+ "iterationStatus": "{{iterationStatus}} · {{startDate}} · {{durationDays}}d",
+ "base": "base",
+ "noType": "No type",
+ "directory": "{{directoryCount}} directories",
+ "oneDirectory": "1 directory",
+ "remote": "Remote repository",
+ "selectRepository": "Select a repository",
+ "linearIssue": "Linear issue",
+ "items": "Items",
+ "openView": "Open view in GitHub",
+ "noLinear": "No Linear tasks",
+ "noGitLab": "No GitLab tasks",
+ "noGitHub": "No GitHub tasks",
+ "noMatchingTasks": "No matching tasks",
+ "connectHost": "Connect to a host to load tasks",
+ "chooseProject": "Choose project",
+ "oneTeam": "1 team",
+ "workspace": "Workspace",
+ "fields": "Fields",
+ "githubProject": "{{githubProjectSummaryFieldCount}}/{{githubProjectAvailableSummaryFieldCount}} fields",
+ "ascending": "ascending",
+ "descending": "descending",
+ "selectedHosted": "{{selectedHostedRepoCount}} repos",
+ "repositoryCountRepository": "{{repositoryCount}} repository",
+ "repositoryCountRepositories": "{{repositoryCount}} repositories",
+ "allRepos": "All repos",
+ "githubIssue": "{{githubIssueSourceRowCount}} sources",
+ "selectTarget": "Select target",
+ "workspaceSparse": "\"{{workspaceSparseDraftNameCollisionName}}\" already exists.",
+ "nameMust": "Name must be 80 characters or fewer.",
+ "nameRequired": "Name is required.",
+ "repositoryHooks": "repository hooks",
+ "local": "local hooks",
+ "orcaYaml": "orca.yaml",
+ "commentCountComment": "{{commentCount}} comment",
+ "noCommentsYet": "No comments yet",
+ "top": "Top-level comment",
+ "reviewThread": "Review thread",
+ "resolvedReviewThread": "Resolved review thread",
+ "review": "Review",
+ "resolvedReview": "Resolved review",
+ "openLinear": "Open in Linear",
+ "openGitLab": "Open in GitLab",
+ "linearTicket": "Linear ticket",
+ "todo": "{{todoTarget}} todo",
+ "mergeRequest": "Merge request",
+ "empty": "Empty",
+ "mergePr": "Merge PR #{{pullRequestNumber}}?",
+ "rebaseMergePr": "Rebase and merge PR #{{pullRequestNumber}}?",
+ "squashMergePr": "Squash and merge PR #{{pullRequestNumber}}?",
+ "squashMerge": "Squash and merge",
+ "pr": "PR",
+ "mergeRequestMessage": "merge request",
+ "createMerge": "Create merge commit",
+ "rebaseMerge": "Rebase and merge",
+ "unknown": "Unknown",
+ "able": "Able to merge",
+ "blocked": "Blocked",
+ "behind": "Behind",
+ "conflicts": "Conflicts",
+ "merge": "Merge",
+ "gitLabTodo": "GitLab todo",
+ "locked": "Locked",
+ "draft": "Draft",
+ "redacted": "Redacted",
+ "resolvedThread": "Resolved thread by {{commentAuthor}}",
+ "resolvedComment": "Resolved comment by {{commentAuthor}}",
+ "current": "Current & upcoming",
+ "failedCount": "{{failedCount}} of {{repositoryCount}} failed to load.",
+ "noReviewers": "No reviewers",
+ "changes": "Changes requested",
+ "approved": "Approved",
+ "noDescription": "No description.",
+ "default": "Default",
+ "subtitle": "{{subtitle}} · Default",
+ "unsupported": "Unsupported layout on mobile",
+ "viewProject": "View #{{projectViewNumber}}",
+ "sortAscending": "Sort ascending",
+ "currently": "Currently {{currentSortDirection}} · tap for {{nextSortDirection}}",
+ "usesGit": "Uses GitHub rank order",
+ "usesSort": "Uses {{sortFieldName}} {{sortDirection}}",
+ "failedCreateLinearIssue": "Failed to create Linear issue",
+ "selectLinear": "Select a Linear team first.",
+ "failedCreateProvider": "Failed to create {{provider}} issue",
+ "addGitRepositoryBeforeCreatingProvider": "Add a Git repository before creating a {{provider}} issue.",
+ "failedCreateSub": "Failed to create sub-issue",
+ "subIssueNot": "Sub-issue not found",
+ "failedReopen": "Failed to reopen thread",
+ "failedResolve": "Failed to resolve thread",
+ "failedSync": "Failed to sync viewed state with GitHub.",
+ "invalid": "Invalid checks response",
+ "failedUpdateGitHubStatus": "Failed to update GitHub status",
+ "failedUpdateGitHubItem": "Failed to update GitHub item",
+ "selectedAgent": "Selected agent is disabled. Choose an enabled agent before creating.",
+ "connectDisplay": "Connect {{displayName}} before creating a workspace.",
+ "failedConnectSsh": "Failed to connect to SSH repository.",
+ "failedRead": "Failed to read SSH connection state.",
+ "details": "Details not found",
+ "projectHas": "This project has no supported views.",
+ "failedConnectLinear": "Failed to connect Linear",
+ "failedLoadGitLab": "Failed to load GitLab tasks",
+ "failedLoadGitHub": "Failed to load GitHub tasks",
+ "iteration": "Iteration",
+ "unassigned": "Unassigned",
+ "editPreset": "Edit {{presetName}}",
+ "squashMergeConfirmation": "Squash and merge {{reviewType}} #{{pullRequestNumber}}?",
+ "discussionComment": "{{commentCount}} comments",
+ "selectPagePageGithubCurrentPageGithub": "Select page, Page {{githubCurrentPage}} of {{githubTotalPages}}",
+ "pageGithub": "Page {{githubCurrentPage}} of {{githubTotalPages}}",
+ "confirm": "Confirm",
+ "requested": "Requested",
+ "low": "Low",
+ "medium": "Medium",
+ "high": "High",
+ "urgent": "Urgent",
+ "selected": "Selected",
+ "action": "{{actionVerb}} {{taskKindLabel}}"
+ },
+ "accounts": {
+ "host": "Host",
+ "add": "Add or re-authenticate accounts from desktop Settings → Accounts.",
+ "loading": "Loading accounts…",
+ "accounts": "Accounts",
+ "seven": "7d",
+ "five": "5h",
+ "use": "Use the agent's own login",
+ "system": "System default",
+ "could": "Could not switch account",
+ "hostNot": "Host not found",
+ "invalid": "Invalid accounts snapshot from host",
+ "connecting": "Connecting to {{hostName}}…",
+ "selectedManagedAccount": "the selected managed account"
+ },
+ "edit": {
+ "accepts": "Accepts IP, host:port, or ws:// / wss://. Missing port defaults to the current port (or 6768).",
+ "address": "Address",
+ "hostName": "Host name",
+ "name": "Name",
+ "connectionAddressDescription": "Change the display name or connection address. Address edits only switch where this phone connects — they do not re-pair. Use this when the same desktop is reachable at a different IP (for example home LAN vs Tailscale).",
+ "go": "Go back",
+ "save": "Save",
+ "saveHost": "Save host",
+ "edit": "Edit host",
+ "back": "Back",
+ "failedSave": "Failed to save host.",
+ "enter": "Enter a name.",
+ "failedLoad": "Failed to load host.",
+ "hostRemoved": "This host was removed from this phone.",
+ "missing": "Missing host.",
+ "connects": "Connects to {{endpoint}}"
+ },
+ "host": {
+ "removeHostName": "Remove \"{{hostName}}\"? You can re-pair later.",
+ "removeHost": "Remove Host",
+ "delete": "Delete",
+ "sleep": "Sleep",
+ "cancel": "Cancel",
+ "deleteWorktree": "Delete Worktree",
+ "repositories": "Repositories",
+ "hideDefault": "Hide default branch",
+ "hideSleeping": "Hide sleeping",
+ "workspaces": "Workspaces",
+ "clear": "Clear filters",
+ "filter": "Filter",
+ "groupTitle": "Group By",
+ "sort": "Sort By",
+ "pr": "PR",
+ "repo": "Repo",
+ "status": "Status",
+ "group": "Group",
+ "searchWorkspaces": "Search workspaces",
+ "close": "Close search",
+ "new": "New workspace",
+ "floating": "Floating Workspace",
+ "tasks": "Tasks",
+ "accounts": "Accounts",
+ "groupWorkspaces": "Group workspaces",
+ "sortSelected": "Sort by {{selectedSortLabel}}",
+ "filterWorkspaces": "Filter workspaces",
+ "filterWorkspaces1": "Filter workspaces, 1 active filter",
+ "filterWorkspacesActive": "Filter workspaces, {{activeFilterCount}} active filters",
+ "hideSidebar": "Hide sidebar",
+ "reconnect": "Reconnect",
+ "back": "Back to hosts",
+ "please": "Please try again.",
+ "could": "Could not remove host",
+ "hostNot": "Host not found",
+ "filterActive": "Filter{{activeFilterCount}}",
+ "deleteDisplay": "Delete \"{{displayName}}\" ({{branch}})?",
+ "noWorktrees": "No worktrees",
+ "noWorktreesMatch": "No worktrees match filters",
+ "noMatching": "No matching worktrees",
+ "searchWorktreesAccessibility": "Search worktrees",
+ "searchWorktrees": "Search worktrees…",
+ "host": "Host",
+ "recent": "Recent",
+ "pin": "Pin",
+ "unpin": "Unpin",
+ "remove": "Remove"
+ },
+ "quickCommandsTabButton": {
+ "quick": "Quick commands"
+ },
+ "worktreeId": {
+ "remove": "Remove",
+ "removeCustom": "Remove this custom shortcut?",
+ "https": "https://example.com",
+ "enterUrl": "Enter a URL, or leave blank for a new tab.",
+ "newBrowser": "New Browser",
+ "terminalName": "Terminal name",
+ "rename": "Rename Terminal",
+ "replace": "Replace the phone draft with the latest desktop file?",
+ "discardChanges": "Discard Changes",
+ "discardLeave": "Discard & Leave",
+ "copyAll": "Copy All & Leave",
+ "copyDiscard": "Copy or discard phone drafts before leaving.",
+ "unsaved": "Unsaved markdown changes",
+ "refresh": "Refresh",
+ "copyPath": "Copy Path",
+ "copyNotes": "Copy Notes",
+ "choose": "Choose an agent session for the current notes.",
+ "sendReviewNotes": "Send Review Notes",
+ "markdownNote": "Markdown Note",
+ "browser": "Browser",
+ "terminal": "Terminal",
+ "newTabTitle": "New Tab",
+ "paste": "Paste",
+ "create": "Create Tab",
+ "creating": "Creating...",
+ "noTabs": "No tabs in this session",
+ "dismissWorkspace": "Dismiss workspace creation warning",
+ "more": "More session actions",
+ "reconnect": "Reconnect to desktop",
+ "back": "Back to worktrees",
+ "agent": "Agent Presets Unavailable",
+ "noEnabled": "No Enabled Agents",
+ "detecting": "Detecting Agents",
+ "browserPage": "Browser page is not available yet.",
+ "desktopUpdateRequiredMobile": "Desktop update required for mobile browser streaming",
+ "edit": "Edit this quick command before running it",
+ "selection": "Selection cleared (scrolled out of buffer)",
+ "couldNotCopy": "Couldn't copy",
+ "copied": "Copied",
+ "couldNotClear": "Couldn't clear terminal",
+ "terminalCleared": "Terminal cleared",
+ "input": "Input too large (max 256 KiB)",
+ "openOrca": "Open Orca on the host to wake sleeping agents.",
+ "saved": "Saved",
+ "couldNotCopyNotes": "Couldn't copy notes",
+ "notesCopied": "Notes copied",
+ "failedDelete": "Failed to delete note",
+ "failedSaveNote": "Failed to save note",
+ "note": "Note added",
+ "couldNotLoadMarkdown": "Couldn't load markdown",
+ "titlePreview": "{{title}} preview",
+ "titleImage": "{{title}} image",
+ "send": "Send",
+ "sendReviewNotesAi": "Send review notes to AI",
+ "copy": "Copy",
+ "copyReview": "Copy review notes",
+ "noReview": "No review notes",
+ "saveNote": "Save note",
+ "cancel": "Cancel",
+ "addReview": "Add review note",
+ "delete": "Delete note on line {{lineNumber}}",
+ "addNote": "Add note on line {{commentLine}}",
+ "titleDiff": "{{title}} diff line {{lineNumber}}",
+ "save": "Save",
+ "discard": "Discard",
+ "retry": "Retry",
+ "line": "Line {{lineNumber}}",
+ "shortcut": "Shortcut",
+ "file": "File",
+ "markdown": "Markdown",
+ "sendCommand": "Send command",
+ "type": "Type a command…",
+ "typed": "Typed text is sent directly to the active terminal",
+ "show": "Show keyboard for live terminal input",
+ "addCustom": "Add custom shortcut",
+ "pasteClipboard": "Paste from clipboard",
+ "switchLive": "Switch to live terminal input",
+ "switchBuffered": "Switch to buffered command input",
+ "switchPhone": "Switch to phone mode",
+ "switchDesktop": "Switch to desktop mode",
+ "hides": "Hides the software keyboard and keeps the current terminal session open.",
+ "dismissKeyboard": "Dismiss keyboard",
+ "loadingTerminal": "Loading terminal",
+ "checking": "Checking desktop capabilities — try again in a moment",
+ "desktopUpdateRequiredQuick": "Desktop update required for quick commands",
+ "newTab": "New tab",
+ "openSource": "Open source control",
+ "openFile": "Open file explorer",
+ "couldNotSend": "Couldn't send notes",
+ "notesSent": "Notes sent",
+ "couldNotCopyDrafts": "Couldn't copy drafts",
+ "path": "Path copied",
+ "verdict": "{{verdictDisplayLabel}} — tap to retry",
+ "visible": "{{visibleTabCount}} tabs",
+ "one": "1 tab",
+ "loadingTabs": "Loading tabs",
+ "browserCommand": "Browser command failed",
+ "failedCreateBrowser": "Failed to create browser",
+ "enterValid": "Enter a valid URL",
+ "failedCreateMarkdown": "Failed to create markdown note",
+ "quick": "Quick command",
+ "failedCreateTerminal": "Failed to create terminal",
+ "saveFailed": "Save failed",
+ "couldNotLoadFile": "Couldn't load file preview",
+ "couldNotLoadDiff": "Couldn't load diff preview",
+ "fileToo": "File too large for mobile preview",
+ "binary": "Binary preview unavailable",
+ "dictation": "Dictation inserted",
+ "changed": "Changed on desktop",
+ "read": "Read only",
+ "commentCountReviewNote": "{{commentCount}} review note",
+ "commentCountReviewNotes": "{{commentCount}} review notes",
+ "copyNotesInstead": "Copy notes instead",
+ "newAgent": "New agent session",
+ "check": "Check the host connection",
+ "unableCreate": "Unable to create untitled markdown note",
+ "terminalInput": "Terminal input is locked by another client.",
+ "failedSend": "Failed to send notes",
+ "failedSaveReview": "Failed to save review notes",
+ "waiting": "Waiting for desktop...",
+ "unableRead": "Unable to read markdown",
+ "sendKey": "Send {{keyLabel}}",
+ "open": "Open"
+ },
+ "layout": {
+ "changes": "Changes",
+ "agent": "Agent Session History",
+ "source": "Source Control",
+ "terminal": "Terminal",
+ "tasks": "Tasks",
+ "accounts": "Accounts",
+ "edit": "Edit host"
+ },
+ "connectionHealth": {
+ "reconnecting": "Reconnecting…",
+ "cannotConnect": "Can't connect",
+ "cannotReach": "Can't reach desktop",
+ "disconnected": "Disconnected",
+ "connecting": "Connecting…",
+ "connected": "Connected",
+ "pairing": "Pairing invalid — re-pair with your desktop",
+ "check": "check Tailscale"
+ },
+ "hostEndpoint": {
+ "port": "Port must be 1–65535.",
+ "missing": "Missing hostname.",
+ "notValidAddress": "Not a valid address.",
+ "notValidHostname": "Not a valid hostname.",
+ "host": "Host must not include a path or query.",
+ "use": "Use ws:// or wss:// (or host:port).",
+ "enter": "Enter a host address."
+ },
+ "mobileRelayHostOverlay": {
+ "expected": "Expected exactly one endpoint for configured relay metadata",
+ "relayHost": "Relay host identity mismatch",
+ "relayIdentity": "Relay identity and endpoint must coexist"
+ },
+ "mobileRelayRpcStreams": {
+ "connection": "Connection interrupted"
+ },
+ "mobileConnectionPathLabel": {
+ "directLan": "Direct · LAN",
+ "directTailscale": "Direct · Tailscale",
+ "orca": "Orca Relay"
+ },
+ "pairConfirmState": {
+ "not": "Not a valid pairing code",
+ "missing": "Missing pairing code"
+ },
+ "terminalAccessoryKeyCatalog": {
+ "clearLine": "Clear line before cursor",
+ "ctrlPlusU": "Ctrl+U",
+ "delete": "Delete word backward",
+ "ctrlPlusW": "Ctrl+W",
+ "end": "End of line",
+ "ctrlPlusE": "Ctrl+E",
+ "start": "Start of line",
+ "ctrlPlus": "Ctrl+A",
+ "reverse": "Reverse search",
+ "ctrlPlusR": "Ctrl+R",
+ "suspend": "Suspend process",
+ "ctrlPlusZ": "Ctrl+Z",
+ "clearScreen": "Clear screen",
+ "ctrlPlusL": "Ctrl+L",
+ "send": "Send EOF",
+ "ctrlPlusD": "Ctrl+D",
+ "interrupt": "Interrupt terminal",
+ "ctrlPlusC": "Ctrl+C",
+ "arrowRight": "Arrow Right",
+ "arrowLeft": "Arrow Left",
+ "arrowDown": "Arrow Down",
+ "arrowUp": "Arrow Up",
+ "forward": "Forward delete",
+ "del": "Del",
+ "backspace": "Backspace",
+ "space": "Space",
+ "shiftTab": "Shift Tab",
+ "shiftPlus": "Shift+Tab",
+ "enter": "Enter",
+ "tab": "Tab",
+ "escape": "Escape",
+ "esc": "Esc"
+ },
+ "terminalWebviewEngineErrorState": {
+ "reload": "Reload",
+ "terminal": "Terminal failed to load"
+ },
+ "terminalWebviewNotificationDispatch": {
+ "unknown": "Unknown terminal error"
+ },
+ "terminalWebView": {
+ "terminalWebViewRender": "Terminal WebView render process ended",
+ "terminalWebViewHttp": "Terminal WebView HTTP error",
+ "terminalWebViewLoad": "Terminal WebView load failed"
+ },
+ "terminalAccessoryKeys": {
+ "f12": "F12",
+ "f11": "F11",
+ "f10": "F10",
+ "f9": "F9",
+ "f8": "F8",
+ "f7": "F7",
+ "f6": "F6",
+ "f5": "F5",
+ "f4": "F4",
+ "f3": "F3",
+ "f2": "F2",
+ "f1": "F1",
+ "pageDown": "Page down",
+ "pageUp": "Page up",
+ "end": "End",
+ "home": "Home",
+ "arrowRight": "Arrow right",
+ "arrowLeft": "Arrow left",
+ "arrowDown": "Arrow down",
+ "arrowUp": "Arrow up",
+ "insert": "Insert",
+ "pgDn": "PgDn",
+ "pgUp": "PgUp",
+ "ins": "Ins",
+ "shift": "Shift",
+ "alt": "Alt",
+ "ctrl": "Ctrl"
+ },
+ "terminalWebviewReadyWatchdog": {
+ "terminal": "Terminal did not initialize - no ready signal from the terminal view"
+ },
+ "mobileSmartSourceModes": {
+ "all": "All",
+ "closed": "Closed",
+ "merged": "Merged",
+ "open": "Open",
+ "name": "Name",
+ "branch": "Branch",
+ "gitLab": "GitLab",
+ "linear": "Linear",
+ "gitHub": "GitHub",
+ "smart": "Smart"
+ },
+ "sparsePresetDraft": {
+ "use": "Use repo-relative directories, not root, absolute paths, or parent segments.",
+ "add": "Add at least one directory."
+ },
+ "mobileGithubProjectGroupSort": {
+ "no": "No {{fieldName}}",
+ "iteration": "Iteration"
+ },
+ "workspaceAgentSelection": {
+ "blank": "Blank Terminal"
+ },
+ "workspaceSshGate": {
+ "disconnected": "Disconnected",
+ "connection": "Connection failed",
+ "reconnect": "Reconnect failed",
+ "authentication": "Authentication failed",
+ "reconnecting": "Reconnecting",
+ "deploying": "Deploying relay",
+ "connecting": "Connecting",
+ "connected": "Connected"
+ },
+ "mobileHostedCheckStatus": {
+ "passed": "{{passedCheckCount}}/{{totalCheckCount}} passed",
+ "pending": "{{pendingCheckCount}} pending",
+ "review": "Review required",
+ "reviewerCountReviewer": "{{reviewerCount}} reviewer",
+ "reviewerCountReviewers": "{{reviewerCount}} reviewers"
+ },
+ "worktreeCreateRetry": {
+ "failed": "Failed to create workspace"
+ },
+ "mobileTuiAgents": {
+ "openClaw": "OpenClaw",
+ "devin": "Devin",
+ "hermes": "Hermes",
+ "rovo": "Rovo Dev",
+ "qwen": "Qwen Code",
+ "mistral": "Mistral Vibe",
+ "kimi": "Kimi",
+ "droid": "Droid",
+ "cursor": "Cursor",
+ "continue": "Continue",
+ "command": "Command Code",
+ "codebuff": "Codebuff",
+ "cline": "Cline",
+ "autohand": "Autohand Code",
+ "auggie": "Auggie",
+ "charm": "Charm",
+ "kiro": "Kiro",
+ "kilocode": "Kilocode",
+ "amp": "Amp",
+ "goose": "Goose",
+ "aider": "Aider",
+ "antigravity": "Antigravity",
+ "gemini": "Gemini",
+ "omp": "OMP",
+ "pi": "Pi",
+ "trae": "Trae",
+ "ante": "Ante",
+ "mi": "MiMo Code",
+ "openCode": "OpenCode",
+ "git": "GitHub Copilot",
+ "grok": "Grok",
+ "codex": "Codex",
+ "openClaude": "OpenClaude",
+ "claudeAgent": "Claude Agent Teams",
+ "claude": "Claude"
+ },
+ "useMobileComposerSource": {
+ "failed": "Failed to resolve base branch."
+ },
+ "linearMobileIssueRead": {
+ "unexpected": "Unexpected Linear tasks response"
+ },
+ "codexResetAttemptJournal": {
+ "wsl": "WSL reset scopes require an exact distro",
+ "host": "Host reset scopes cannot name a WSL distro"
+ },
+ "mobileBranchDiffPreviewDrawer": {
+ "diff": "Diff truncated for mobile preview.",
+ "unable": "Unable to Load Diff",
+ "close": "Close committed diff preview",
+ "committed": "Committed on branch",
+ "base": "{{baseRef}}..HEAD"
+ },
+ "mobileCommitFailurePanel": {
+ "showDetails": "Show details",
+ "hideDetails": "Hide details",
+ "showCommit": "Show commit failure details",
+ "hideCommit": "Hide commit failure details",
+ "fix": "Fix",
+ "fixCommit": "Fix commit failure with AI",
+ "commitFailed": "Commit failed",
+ "commitFailedMessage": "Commit failed."
+ },
+ "mobileGitHistoryList": {
+ "noCommits": "No commits.",
+ "retry": "Retry",
+ "waiting": "Waiting for desktop...",
+ "noFile": "No file changes",
+ "failed": "Failed to load history"
+ },
+ "mobileSourceControlBranchCard": {
+ "unstaged": "{{unstagedCount}} changed",
+ "staged": "{{stagedCount}} staged",
+ "branch": "{{branchCount}} on branch"
+ },
+ "mobileSourceControlContent": {
+ "generate": "Generate commit message with AI",
+ "cancel": "Cancel commit message generation",
+ "commitMessage": "Commit message",
+ "noStaged": "No staged files",
+ "commitMessageDisabled": "Commit message disabled. No staged files.",
+ "working": "Working tree is clean.",
+ "noLocal": "No local changes",
+ "open": "Open source control actions",
+ "unstage": "Unstage All",
+ "stage": "Stage All",
+ "reconnecting": "Reconnecting to desktop..."
+ },
+ "mobileSourceControlFileRows": {
+ "openCommitted": "Open committed change {{filePath}}",
+ "loading": "Loading committed changes...",
+ "committedBranch": "Committed on Branch",
+ "discard": "Discard {{path}}",
+ "stage": "Stage {{path}}",
+ "unstage": "Unstage {{path}}",
+ "unresolved": "Unresolved conflict",
+ "openChanged": "Open changed file {{path}}",
+ "old": "from {{oldPath}}",
+ "committedChanges": "Committed changes unavailable."
+ },
+ "mobileSourceControlHeader": {
+ "refresh": "Refresh source control",
+ "openPullRequestWeb": "Open pull request on the web",
+ "openPullRequestPull": "Open pull request #{{pullRequestNumber}} on the web",
+ "source": "Source Control",
+ "back": "Back to session",
+ "close": "Close source control"
+ },
+ "mobileSourceControlModals": {
+ "openYourBrowser": "Open it in your browser?",
+ "pull": "Pull Request Created",
+ "switch": "Switch Branch",
+ "discardChanges": "Discard changes to \"{{path}}\"? This cannot be undone.",
+ "discardChange": "Discard Change",
+ "source": "Source Control",
+ "current": "current",
+ "openYourBrowserCreated": "Open it in your browser?\n\n{{createdPrWarning}}",
+ "open": "Open",
+ "discard": "Discard"
+ },
+ "mobileSourceControlPanel": {
+ "retry": "Retry",
+ "unable": "Unable to Load",
+ "source": "Source Control Unavailable"
+ },
+ "mobileSourceControlPrChip": {
+ "create": "Create pull request",
+ "loadingPullRequest": "Loading pull request…",
+ "pullRequestPull": "Pull request #{{pullRequestNumber}}, {{stateLabel}}, {{checkSummary}}{{commentSummary}}. Open pull request.",
+ "pullRequestUnavailable": "Pull request unavailable: {{summaryMessage}}",
+ "loadingPullRequestMessage": "Loading pull request"
+ },
+ "mobileBranchCompare": {
+ "committed": "Committed on Branch",
+ "changedFileCountFile": "{{changedFileCount}} file",
+ "changedFileCountFiles": "{{changedFileCount}} files",
+ "commitCountCommit": "{{commitCount}} commit",
+ "commitCountCommits": "{{commitCount}} commits",
+ "vs": "vs {{baseRef}}"
+ },
+ "mobileCommitMessageAi": {
+ "failed": "Failed to generate commit message",
+ "no": "No commit message generated"
+ },
+ "mobileCreatePrAction": {
+ "createPull": "Create Pull Request",
+ "branch": "This branch is not ready for a {{reviewType}} yet.",
+ "createReview": "Create {{reviewType}}"
+ },
+ "mobileHostedReviewCreateIntent": {
+ "branch": "Branch changed while preparing the pull request.",
+ "could": "Could not generate a commit message. Add one in Source Control, then retry.",
+ "resolveStage": "Resolve or stage changes before creating a pull request.",
+ "resolveConflicts": "Resolve conflicts before creating a pull request.",
+ "creating": "Creating review...",
+ "force": "Force pushing with lease...",
+ "pushing": "Pushing commits...",
+ "publishing": "Publishing branch...",
+ "committing": "Committing changes...",
+ "generating": "Generating commit message...",
+ "staging": "Staging changes...",
+ "failed": "Failed to stage changes"
+ },
+ "mobileHostedReviewService": {
+ "pushFailed": "Push failed. Resolve the push error, then try again.",
+ "pushSucceeded": "Push succeeded, but {{reviewType}} creation failed: {{errorMessage}}",
+ "failed": "Failed to create pull request"
+ },
+ "mobileSourceControlActions": {
+ "commits": "Commits",
+ "switch": "Switch branch",
+ "rebase": "Rebase onto base",
+ "publishBranch": "Publish Branch",
+ "fetch": "Fetch",
+ "pushCreate": "Push & Create PR",
+ "create": "Create PR",
+ "commitSync": "Commit & Sync",
+ "commitPush": "Commit & Push",
+ "commit": "Commit",
+ "pullRequests": "Pull requests are not available for this repo",
+ "checking": "Checking branch status...",
+ "publishBranchFirst": "Publish Branch first",
+ "enter": "Enter a commit message",
+ "stage": "Stage at least one file",
+ "local": "Local commits would be lost; pull instead",
+ "nothingFast": "Nothing to fast-forward",
+ "fastForward": "Fast-forward",
+ "fastForwardBehind": "Fast-forward ({{behindCommitCount}})",
+ "branchAlready": "Branch is already published",
+ "branchUp": "Branch is up to date",
+ "sync": "Sync",
+ "syncBehind": "Sync (↓{{behindCommitCount}} ↑{{aheadCommitCount}})",
+ "nothingPull": "Nothing to pull",
+ "pull": "Pull",
+ "pullBehind": "Pull ({{behindCommitCount}})",
+ "nothingPush": "Nothing to push",
+ "push": "Push",
+ "pushAhead": "Push ({{aheadCommitCount}})"
+ },
+ "useMobileCommitFailureRecovery": {
+ "failed": "Failed to launch agent",
+ "waiting": "Waiting for desktop..."
+ },
+ "useMobileCommitMessageGeneration": {
+ "failed": "Failed to generate commit message"
+ },
+ "useMobileCreatePrRunner": {
+ "check": "Check out a branch before creating a pull request."
+ },
+ "useMobileSourceControlLoaders": {
+ "update": "Update Orca desktop to use Source Control on mobile.",
+ "unableResolve": "Unable to resolve the base branch for comparison.",
+ "unableLoadSource": "Unable to load source control",
+ "unableLoadCommitted": "Unable to load committed changes",
+ "waiting": "Waiting for desktop...",
+ "connecting": "Connecting to desktop..."
+ },
+ "useMobileSourceControlOpeners": {
+ "waiting": "Waiting for desktop...",
+ "unableOpen": "Unable to open diff",
+ "unableLoad": "Unable to load committed diff",
+ "binary": "Binary branch diff preview unavailable on mobile"
+ },
+ "useMobileSourceControlRunners": {
+ "source": "Source control action failed"
+ },
+ "useMobileSourceControlCommitRunners": {
+ "source": "Source control action failed",
+ "commit": "Commit failed"
+ },
+ "mobileSourceControlScreenState": {
+ "noUpstream": "No upstream",
+ "ahead": "{{aheadCommitCount}} ahead, {{behindCommitCount}} behind",
+ "noBranch": "No branch"
+ },
+ "mobileSourceControlConflictAbort": {
+ "abortMerge": "Abort merge",
+ "abortRebase": "Abort rebase",
+ "aborting": "Aborting…"
+ },
+ "mobilePrChipSummary": {
+ "failing": "{{failingCheckCount}} failing",
+ "no": "No checks",
+ "unresolved": "Unresolved checks"
+ },
+ "mobilePrCreate": {
+ "branch": "This branch is not ready for a {{reviewType}} yet.",
+ "push": "Push the base branch before creating a {{reviewType}}.",
+ "creatingReviewTypeFork": "Creating a {{reviewType}} from this fork is not supported.",
+ "reviewTypeAlreadyExists": "A {{reviewType}} already exists for this branch.",
+ "creatingReviewTypeS": "Creating {{reviewType}}s is not supported for this repo.",
+ "authenticate": "Authenticate before creating a {{reviewType}}.",
+ "sync": "Sync this branch before creating a {{reviewType}}.",
+ "publish": "Publish commits before creating a {{reviewType}}.",
+ "switch": "Switch to a feature branch before creating a {{reviewType}}.",
+ "check": "Check out a branch before creating a {{reviewType}}.",
+ "commit": "Commit changes before creating a {{reviewType}}.",
+ "orca": "Orca could not confirm whether this branch already has a {{reviewType}}. Try again in a moment.",
+ "reviewTypeCreated": "{{reviewType}} created, but Orca could not refresh it yet.",
+ "reviewTypePull": "{{reviewType}} #{{pullRequestNumber}} is already open.",
+ "reviewTypeAlreadyOpen": "{{reviewType}} is already open."
+ },
+ "mobileSourceControlPrimaryAction": {
+ "nothing": "Nothing to commit. Branch is up to date.",
+ "push": "Push",
+ "pull": "Pull",
+ "forcePushLease": "Force push with lease to update the remote branch.",
+ "publishBranchOrigin": "Publish this branch to origin.",
+ "check": "Check out a branch before publishing commits.",
+ "stageLeast": "Stage at least one file to commit.",
+ "stageAllChanges": "Stage all changes.",
+ "enter": "Enter a commit message to commit.",
+ "commitStaged": "Commit staged changes.",
+ "resolve": "Resolve conflicts before committing.",
+ "try": "Try again once the remote operation finishes.",
+ "remote": "Remote operation in progress.",
+ "forcePushProgress": "Force push in progress.",
+ "commitProgress": "Commit in progress.",
+ "publishBranch": "Publish Branch",
+ "sync": "Sync",
+ "stageAll": "Stage All",
+ "commit": "Commit",
+ "forcePush": "Force Push",
+ "pullBehind": "Pull {{behindCommitCount}}, push {{aheadCommitCount}}.",
+ "pullCommitCountCommit": "Pull {{commitCount}} commit.",
+ "pullCommitCountCommits": "Pull {{commitCount}} commits.",
+ "pushCommitCountCommit": "Push {{commitCount}} commit.",
+ "pushCommitCountCommits": "Push {{commitCount}} commits."
+ },
+ "mobileHostedReviewGitPreparation": {
+ "commit": "Commit failed",
+ "unable": "Unable to refresh source control"
+ },
+ "mobilePrLink": {
+ "failedUpdateLinkedReview": "Failed to update linked review",
+ "failedUpdateLinkedPull": "Failed to update linked pull request"
+ },
+ "hostedReviewCopy": {
+ "mergeRequestTitle": "Merge Request",
+ "mergeRequest": "merge request",
+ "mr": "MR",
+ "pullRequestTitle": "Pull Request",
+ "pullRequest": "pull request",
+ "pr": "PR"
+ },
+ "mobileGitHistory": {
+ "months": "{{months}}mo",
+ "just": "just now",
+ "failed": "Failed to load commit history"
+ },
+ "mobileGitStatus": {
+ "staged": "Staged Changes",
+ "untracked": "Untracked Files",
+ "changes": "Changes"
+ },
+ "mobileHostedReviewRemotePrerequisite": {
+ "failedForce": "Failed to force push with lease",
+ "failedPush": "Failed to push commits",
+ "failedPublish": "Failed to publish branch"
+ },
+ "mobileSourceControlHubTab": {
+ "commits": "Commits",
+ "pull": "Pull Request",
+ "changes": "Changes"
+ },
+ "prComposeValidation": {
+ "base": "Base branch must differ from the head branch.",
+ "choose": "Choose a base branch.",
+ "enter": "Enter a {{reviewType}} title.",
+ "wait": "Wait for generation to finish."
+ },
+ "mobileBranchBaseRef": {
+ "unable": "Unable to resolve branch base"
+ },
+ "useMobileGitRequests": {
+ "branch": "Branch status unavailable",
+ "commit": "Commit failed",
+ "source": "Source control action failed",
+ "waiting": "Waiting for desktop..."
+ },
+ "useMobileSourceControlActionSheetRunners": {
+ "no": "No base branch to rebase onto",
+ "waiting": "Waiting for desktop..."
+ },
+ "mobileAgentWorkingIndicator": {
+ "agent": "Agent is working"
+ },
+ "mobileBrowserTabActionSheet": {
+ "reload": "Reload",
+ "forward": "Forward",
+ "back": "Back",
+ "browser": "Browser"
+ },
+ "mobileNativeChatAsk": {
+ "next": "Next",
+ "send": "Send answer",
+ "cancel": "Cancel",
+ "type": "Type your answer",
+ "other": "Other…",
+ "step": "Step {{stepNumber}}"
+ },
+ "mobileNativeChatComposer": {
+ "send": "Send message",
+ "dictate": "Dictate",
+ "stop": "Stop dictation",
+ "attach": "Attach image",
+ "remove": "Remove image",
+ "message": "Message, @files, /commands"
+ },
+ "mobileNativeChatMessage": {
+ "queued": "Queued",
+ "scroll": "Scroll this message to top",
+ "copy": "Copy message",
+ "callCountTimes": "{{callCount}}×",
+ "remaining": "… {{remainingToolCallCount}} more tool calls",
+ "image": "image",
+ "attached": "Attached image",
+ "callCountToolCall": "{{callCount}} tool call",
+ "callCountToolCalls": "{{callCount}} tool calls"
+ },
+ "mobileNativeChatQuestion": {
+ "send": "Send reply",
+ "typeYour": "Type your reply…",
+ "typeReply": "Or type a reply…",
+ "submitSelectedOptions": "Submit selected options",
+ "submitSelectedCommand": "Submit{{selectedCommandCount}}",
+ "choose": "Choose an option"
+ },
+ "mobileNativeChatView": {
+ "message": "Message, @files, /commands",
+ "waiting": "Waiting for terminal…",
+ "reconnecting": "Reconnecting…",
+ "stop": "Stop",
+ "stopAgent": "Stop the agent",
+ "tools": "Tools",
+ "collapse": "Collapse",
+ "scroll": "Scroll to latest",
+ "load": "Load earlier messages"
+ },
+ "mobileSessionHeaderMoreActionsSheet": {
+ "checks": "Checks",
+ "agent": "Agent History",
+ "open": "Open pull request checks",
+ "browse": "Browse and resume agent sessions"
+ },
+ "mobileTerminalInputActions": {
+ "start": "Start voice dictation",
+ "starting": "Starting voice dictation",
+ "cancel": "Cancel voice dictation",
+ "stop": "Stop voice dictation",
+ "long": "Long press to attach a file instead",
+ "attach": "Attach a photo",
+ "sending": "Sending image"
+ },
+ "quickCommandEditorForm": {
+ "add": "Add Quick Command",
+ "save": "Save",
+ "cancel": "Cancel",
+ "project": "Project",
+ "global": "Global",
+ "scope": "Scope",
+ "submit": "Submit immediately instead of only inserting text.",
+ "append": "Append Enter",
+ "advanced": "Advanced",
+ "supports": "Supports skills, file paths, and built-in commands.",
+ "npm": "npm run dev",
+ "ask": "Ask the agent to investigate this workspace",
+ "command": "Command Text",
+ "prompt": "Prompt",
+ "choose": "Choose agent",
+ "agent": "Agent",
+ "action": "Action",
+ "start": "Start dev server",
+ "label": "Label",
+ "agentPrompt": "Agent Prompt",
+ "terminal": "Terminal Command"
+ },
+ "quickCommandsList": {
+ "edit": "Edit {{commandLabel}}",
+ "run": "Run {{commandLabel}}",
+ "quick": "Quick command limit reached",
+ "new": "New quick command",
+ "global": "Global",
+ "project": "This project",
+ "noMatching": "No matching quick commands.",
+ "noQuick": "No quick commands yet.",
+ "search": "Search quick commands..."
+ },
+ "quickCommandsSheet": {
+ "save": "Save terminal commands or agent prompts for quick access.",
+ "back": "Back",
+ "quickCommand": "This quick command will be removed from your saved list.",
+ "deleteDelete": "Delete \"{{deleteLabel}}\"?",
+ "quickCommands": "Quick Commands",
+ "choose": "Choose Agent",
+ "add": "Add Quick Command",
+ "edit": "Edit Quick Command",
+ "delete": "Delete",
+ "cancel": "Cancel",
+ "untitled": "Untitled"
+ },
+ "githubPr": {
+ "failedUpdateReview": "Failed to update review thread.",
+ "failedUpdateTitle": "Failed to update title.",
+ "requestFailedRequest": "Request failed: {{requestMethod}}",
+ "requestFailedGithubResolve": "Request failed: github.resolveReviewThread",
+ "requestFailedGithubUpdate": "Request failed: github.updatePRTitle"
+ },
+ "mobileBulkCloseSheetActions": {
+ "close": "Close"
+ },
+ "mobileDiffReviewLoaders": {
+ "update": "Update Orca desktop to review changes on mobile.",
+ "committedChangesResponse": "Committed changes response was invalid",
+ "committedChangesFailed": "Committed changes failed",
+ "committedChangesUnavailable": "Committed changes unavailable",
+ "committedDiff": "Committed diff is unavailable",
+ "diff": "Diff response was invalid",
+ "unableLoadDiff": "Unable to load diff",
+ "unableLoadReview": "Unable to load review notes",
+ "source": "Source control response was invalid",
+ "unableLoadChanges": "Unable to load changes"
+ },
+ "mobileDiffReviewQueue": {
+ "committed": "Committed on branch",
+ "unstaged": "Unstaged",
+ "staged": "Staged"
+ },
+ "mobileNativeChatPermission": {
+ "permission": "Permission requested",
+ "allowAlways": "Allow always",
+ "deny": "Deny",
+ "allow": "Allow",
+ "allowPermission": "Allow {{permissionName}}?"
+ },
+ "mobileTabCloseSelection": {
+ "closeTabsRight": "Close Tabs to the Right",
+ "closeTabsLeft": "Close Tabs to the Left",
+ "closeOther": "Close Other Tabs"
+ },
+ "mobileTerminalActionSheetActions": {
+ "close": "Close",
+ "clear": "Clear Terminal",
+ "rename": "Rename",
+ "switchPhone": "Switch to Phone",
+ "switchDesktop": "Switch to Desktop"
+ },
+ "prActionsEngine": {
+ "failedMerge": "Failed to merge pull request.",
+ "failedRefresh": "Failed to refresh pull request."
+ },
+ "useMobileAttachmentInputLeaseGate": {
+ "attach": "Attach failed (reconnecting)"
+ },
+ "useMobileDiffReviewCommentActions": {
+ "failedSaveReview": "Failed to save review",
+ "failedSaveReviewState": "Failed to save review state",
+ "waiting": "Waiting for desktop..."
+ },
+ "diffReview": {
+ "waiting": "Waiting for desktop...",
+ "missing": "Missing worktree",
+ "unableLoadDiff": "Unable to load diff",
+ "unableLoadReview": "Unable to load review"
+ },
+ "useMobileDiffReviewGitActions": {
+ "stagedFile": "{{stagedFileCount}} staged, {{failedFileCount}} failed",
+ "waiting": "Waiting for desktop...",
+ "source": "Source control action failed",
+ "stagedReviewedFile": "{{staged}} reviewed file staged",
+ "stagedReviewedFiles": "{{staged}} reviewed files staged"
+ },
+ "useMobileDiffReviewSendActions": {
+ "waiting": "Waiting for desktop...",
+ "reviewNotesSent": "Review notes sent",
+ "reviewNotesCopied": "Review notes copied",
+ "unable": "Unable to load agent sessions",
+ "created": "Created terminal response was invalid",
+ "failedCreate": "Failed to create terminal",
+ "terminal": "Terminal input is locked",
+ "failedSend": "Failed to send notes"
+ },
+ "useMobileImageAttachment": {
+ "attachFailed": "Attach failed",
+ "image": "Image too large to attach",
+ "photo": "Photo permission denied",
+ "attachFailedDisconnected": "Attach failed (disconnected)"
+ },
+ "useMobileNativeChatImageAttachments": {
+ "attachFailed": "Attach failed",
+ "image": "Image too large to attach",
+ "photo": "Photo permission denied",
+ "attachFailedDisconnected": "Attach failed (disconnected)",
+ "messageNotSent": "Message not sent",
+ "messageNotSentDisconnected": "Message not sent (disconnected)"
+ },
+ "useMobilePrActions": {
+ "not": "Not connected"
+ },
+ "useMobilePrAiTriage": {
+ "failed": "Failed to launch agent",
+ "waiting": "Waiting for desktop…"
+ },
+ "useMobilePrCommentActions": {
+ "comment": "Comment action failed"
+ },
+ "useMobilePrTitleAction": {
+ "failed": "Failed to update title.",
+ "not": "Not connected to desktop."
+ },
+ "useMobileTerminalPaste": {
+ "pasteFailed": "Paste failed",
+ "image": "Image too large to paste",
+ "pasteFailedDisconnected": "Paste failed (disconnected)",
+ "pasteToo": "Paste too large (max 256 KiB)",
+ "failed": "Failed to encode resized clipboard image"
+ },
+ "useQuickCommands": {
+ "failedLoad": "Failed to load quick commands",
+ "failedSave": "Failed to save quick command"
+ },
+ "mobileDiffReviewScreenModel": {
+ "all": "All",
+ "unstaged": "Unstaged",
+ "staged": "Staged",
+ "branch": "Branch",
+ "unsent": "{{unsentCount}} unsent note",
+ "noteCountNote": "{{noteCount}} note",
+ "noteCountNotes": "{{noteCount}} notes",
+ "unreviewed": "Unreviewed",
+ "notes": "Notes"
+ },
+ "mobileTerminalLiveInputStatus": {
+ "live": "Live input",
+ "starting": "Starting mic",
+ "processing": "Processing",
+ "listening": "Listening",
+ "tapShow": "Tap to show keyboard",
+ "uploading": "Uploading image to host",
+ "preparing": "Preparing microphone",
+ "transcribing": "Transcribing on desktop",
+ "tapMic": "Tap mic to stop"
+ },
+ "mobileNativeChatRenderData": {
+ "agent": "the agent"
+ },
+ "useMobileDiffReviewInteractions": {
+ "unable": "Unable to open in session"
+ },
+ "mobileTerminalTabAgent": {
+ "terminal": "Terminal",
+ "file": "File",
+ "markdown": "Markdown",
+ "browser": "Browser",
+ "new": "New Browser"
+ },
+ "worktreeLabel": {
+ "worktree": "Worktree"
+ },
+ "floatingWorkspace": {
+ "floating": "Floating Workspace"
+ },
+ "githubPrRpc": {
+ "request": "Request failed: {{requestMethod}}"
+ },
+ "mobileDiffReviewRpc": {
+ "terminal": "Terminal"
+ },
+ "mobileNativeChatStreamFrame": {
+ "transcript": "Transcript stream failed"
+ },
+ "mobileNativeChatToggleAction": {
+ "switchChat": "Switch to chat view",
+ "switchTerminal": "Switch to terminal view"
+ },
+ "mobileTerminalRecords": {
+ "terminal": "Terminal"
+ },
+ "mobileNativeChatPermissionSend": {
+ "responseNotSent": "Response not sent",
+ "responseUnconfirmed": "Response unconfirmed — check chat before retrying",
+ "responseNotSentDisconnected": "Response not sent (disconnected)"
+ },
+ "mobilePrSidebarState": {
+ "unable": "Unable to load pull request"
+ },
+ "mobileSessionRouteHelpers": {
+ "pairing": "Pairing invalid",
+ "reconnecting": "Reconnecting",
+ "disconnected": "Disconnected",
+ "connected": "Connected",
+ "securing": "Securing",
+ "connecting": "Connecting"
+ },
+ "useMobileNativeChatAnswerSend": {
+ "answerNotSent": "Answer not sent",
+ "answerUnconfirmed": "Answer unconfirmed — check chat before retrying",
+ "answerPartly": "Answer partly sent — check chat before retrying",
+ "answerNotSentDisconnected": "Answer not sent (disconnected)"
+ },
+ "useMobileNativeChatCancelAsk": {
+ "cancelNotSent": "Cancel not sent",
+ "cancelUnconfirmed": "Cancel unconfirmed — check chat before retrying",
+ "cancelNotSentDisconnected": "Cancel not sent (disconnected)"
+ },
+ "useMobileNativeChatMessageSend": {
+ "messageNotSent": "Message not sent",
+ "delivery": "Delivery unconfirmed — check chat before retrying",
+ "messageNotSentDisconnected": "Message not sent (disconnected)"
+ },
+ "useMobileNativeChatStop": {
+ "stopNotSent": "Stop not sent",
+ "stopUnconfirmed": "Stop unconfirmed — check chat before retrying",
+ "stopNotSentTerminal": "Stop not sent (terminal not ready)"
+ },
+ "aiVaultResumeLaunch": {
+ "terminal": "Terminal input is locked",
+ "failedSend": "Failed to send resume command",
+ "created": "Created terminal response was invalid",
+ "failedCreate": "Failed to create terminal"
+ },
+ "aiVaultResumePreparation": {
+ "could": "Could not prepare this legacy Codex session. Retry resume."
+ },
+ "mobileClipboardImage": {
+ "clipboard": "Clipboard image content must be base64"
+ },
+ "prAiTriageLaunch": {
+ "terminal": "Terminal input is locked",
+ "failedSend": "Failed to send prompt",
+ "created": "Created terminal response was invalid",
+ "failedCreate": "Failed to create terminal"
+ },
+ "voiceModelList": {
+ "delete": "Delete {{commandLabel}}",
+ "useMessage": "Use",
+ "use": "In use",
+ "set": "Set up on desktop",
+ "api": "API key set",
+ "recommended": "Recommended"
+ },
+ "authFailedBanner": {
+ "remove": "Remove",
+ "re": "Re-pair",
+ "retry": "Retry",
+ "authentication": "Authentication failed — try reconnecting first; if it keeps failing, re-pair from desktop."
+ },
+ "codexResetCreditAction": {
+ "useReset": "Use reset",
+ "resetting": "Resetting…",
+ "usesOneEarnedResetActive": "Uses one earned reset for the active Codex account",
+ "usesOneEarnedResetScope": "Uses one earned reset for {{scopeLabel}}",
+ "useCodex": "Use Codex rate-limit reset",
+ "resettingCodex": "Resetting Codex rate limits",
+ "earned": "Earned Codex rate-limit reset"
+ },
+ "customKeyModal": {
+ "addShortcut": "Add Shortcut",
+ "press": "Press Enter",
+ "command": "Command",
+ "label": "Label",
+ "add": "Add",
+ "more": "More keys — Tab, arrows, F1–F12…",
+ "key": "Key",
+ "modifiers": "Modifiers",
+ "show": "Show, hide, or reorder shortcut keys",
+ "manage": "Manage Shortcuts",
+ "send": "Send custom text command",
+ "text": "Text Macro",
+ "build": "Build Ctrl, Alt, and Shift key chords",
+ "shortcut": "Shortcut Combo",
+ "back": "Back",
+ "function": "Function",
+ "navigation": "Navigation",
+ "editing": "Editing",
+ "eGPnpm": "e.g. pnpm build",
+ "eGBuild": "e.g. Build",
+ "pick": "Pick a key"
+ },
+ "dragReorderList": {
+ "moveDown": "Move down",
+ "moveUp": "Move up",
+ "use": "Use the move up and move down actions to reorder without dragging",
+ "drag": "Drag to reorder"
+ },
+ "hostProtocolGate": {
+ "checking": "Checking host compatibility",
+ "use": "useHostProtocolGates must be used inside "
+ },
+ "mobileDictationSetupSheet": {
+ "download": "Download",
+ "useMessage": "Use",
+ "use": "In use",
+ "setUpDesktop": "Set up on desktop",
+ "api": "API key set",
+ "extracting": "· extracting…",
+ "open": "OpenAI API",
+ "recommended": "Recommended",
+ "dictation": "Dictation enabled",
+ "setupInstructions": "Download a model and enable dictation on your desktop — all from here.",
+ "setUpVoice": "Set up voice dictation",
+ "couldNotUpdate": "Could not update",
+ "couldNotSelect": "Could not select model",
+ "downloadFailed": "Download failed",
+ "failed": "Failed to load"
+ },
+ "mobileDiffReviewBody": {
+ "retry": "Retry",
+ "retryLoading": "Retry loading review",
+ "diffTruncated": "Diff truncated for mobile preview.",
+ "loadingDiff": "Loading diff...",
+ "try": "Try a different review filter.",
+ "no": "No Reviewable Changes",
+ "unable": "Unable to Load Review",
+ "review": "Review Unavailable",
+ "loadingReview": "Loading review...",
+ "diffUnavailable": "Diff Unavailable",
+ "deleted": "Deleted File",
+ "diffTooLarge": "Diff Too Large",
+ "binary": "Binary Diff",
+ "select": "Select a file to review.",
+ "fileDeleted": "This file was deleted. Add a file note or mark it reviewed.",
+ "diffTooLargeMobile": "This diff is too large for the mobile preview.",
+ "fileCannot": "This file cannot be rendered as text on mobile."
+ },
+ "mobileDiffReviewDrawers": {
+ "sendNotes": "Send Notes",
+ "sendNotesAgent": "Send notes to agent",
+ "stageReviewed": "Stage Reviewed",
+ "stageReviewedFilesAccessibility": "Stage reviewed files",
+ "reviewComplete": "Review Complete",
+ "save": "Save",
+ "delete": "Delete",
+ "deleteNote": "Delete note",
+ "reviewNote": "Review note",
+ "cancel": "Cancel note",
+ "file": "File note",
+ "line": "Line {{lineNumber}}",
+ "add": "Add Note",
+ "edit": "Edit Note",
+ "open": "Open in Session",
+ "mark": "Mark Unreviewed",
+ "stageReviewedFiles": "Stage Reviewed Files",
+ "clear": "Clear Sent Notes",
+ "sendUnsent": "Send Unsent Notes",
+ "copy": "Copy Notes",
+ "new": "New Agent Session",
+ "discardChanges": "Discard changes to \"{{filePath}}\"? This cannot be undone.",
+ "discardFile": "Discard File",
+ "reviewedFileCountReviewed": "{{reviewedFileCount}} reviewed unstaged files can be staged",
+ "reviewActions": "Review Actions",
+ "saveNote": "Save note on line {{lineNumber}}",
+ "unsent": "{{unsentCommentCount}} unsent notes",
+ "loading": "Loading agent sessions...",
+ "reviewedFileCountFileReviewedNoteCountNote": "{{reviewedFileCount}} file reviewed, {{noteCount}} note",
+ "reviewedFileCountFileReviewedNoteCountNotes": "{{reviewedFileCount}} file reviewed, {{noteCount}} notes",
+ "reviewedFileCountFilesReviewedNoteCountNote": "{{reviewedFileCount}} files reviewed, {{noteCount}} note",
+ "reviewedFileCountFilesReviewedNoteCountNotes": "{{reviewedFileCount}} files reviewed, {{noteCount}} notes",
+ "terminal": "Terminal",
+ "discard": "Discard"
+ },
+ "mobileDiffReviewFileSummary": {
+ "hunk": "Hunk",
+ "next": "Next hunk",
+ "previous": "Previous hunk",
+ "stale": "Stale",
+ "edit": "Edit file note",
+ "changed": "Changed",
+ "reviewed": "Reviewed",
+ "old": " from {{oldPath}}",
+ "staleNote": "{{staleNoteCount}} stale"
+ },
+ "mobileDiffReviewFooter": {
+ "next": "Next file",
+ "markReviewed": "Mark Reviewed",
+ "reviewed": "Reviewed",
+ "markFile": "Mark file reviewed",
+ "note": "Note",
+ "add": "Add file note",
+ "previous": "Previous file",
+ "discard": "Discard",
+ "discardFile": "Discard file",
+ "unstage": "Unstage",
+ "unstageFile": "Unstage file",
+ "stage": "Stage",
+ "stageFile": "Stage file"
+ },
+ "mobileDiffReviewHeader": {
+ "show": "Show {{mobileReviewFilterLabel}} review files",
+ "openReview": "Open review actions",
+ "openPull": "Open pull request sidebar",
+ "changes": "Changes",
+ "back": "Back",
+ "reviewed": "{{reviewedCount}}/{{queueLength}} reviewed"
+ },
+ "mobileDiffReviewLine": {
+ "edit": "Edit note on line {{lineNumber}}",
+ "add": "Add note on line {{newLineNumber}}",
+ "context": "Context",
+ "deleted": "Deleted",
+ "added": "Added",
+ "lineLabelLineLine": "{{lineLabel}} line {{lineNumber}}",
+ "lineLabelLine": "{{lineLabel}} line"
+ },
+ "mobileHostCard": {
+ "update": "Update desktop Orca and sign in to connect from anywhere",
+ "worktreeCountWorktree": "{{worktreeCount}} worktree",
+ "worktreeCountWorktrees": "{{worktreeCount}} worktrees",
+ "active": "{{activeWorktreeCount}} active"
+ },
+ "mobileHtmlPreview": {
+ "source": "Source",
+ "view": "View HTML source",
+ "preview": "Preview",
+ "previewRendered": "Preview rendered HTML"
+ },
+ "mobileMarkdown": {
+ "x": "[x]",
+ "hiddenColumn": "{{hiddenColumnCount}} more columns",
+ "hiddenRow": "{{hiddenRowCount}} more rows",
+ "open": "Open image",
+ "image": "image"
+ },
+ "mobilePrsidebar": {
+ "retry": "Retry",
+ "retryLoading": "Retry loading pull request",
+ "loading": "Loading pull request…",
+ "not": "Not permitted — your GitHub account is not connected.",
+ "something": "Something went wrong."
+ },
+ "mobilePrBasePicker": {
+ "main": "main"
+ },
+ "mobileRichMarkdownEditor": {
+ "code": "Code block",
+ "inline": "Inline code",
+ "image": "Image",
+ "link": "Link",
+ "quote": "Quote",
+ "checklist": "Checklist",
+ "numbered": "Numbered list",
+ "bullet": "Bullet list",
+ "strike": "Strike",
+ "italic": "Italic",
+ "bold": "Bold",
+ "h3": "H3",
+ "h2": "H2",
+ "h1": "H1",
+ "body": "Body"
+ },
+ "mobileWorkspaceNameInput": {
+ "workspace": "Workspace name"
+ },
+ "newWorkspaceFab": {
+ "new": "New workspace"
+ },
+ "newWorktreeModal": {
+ "agent": "Agent",
+ "repository": "Repository",
+ "create": "Create Workspace",
+ "connectRepository": "Connect Repository",
+ "runSetup": "Run setup command",
+ "skip": "Skip",
+ "run": "Run",
+ "setup": "Setup script",
+ "note": "Note",
+ "advanced": "Advanced",
+ "connectRepositoryFirst": "Connect repository first",
+ "connect": "Connect",
+ "connecting": "Connecting...",
+ "ssh": "SSH Connection",
+ "workspace": "Workspace name",
+ "name": "Name or 'Create From'",
+ "no": "No repositories found",
+ "pick": "Pick a repository and agent to spin up a new workspace.",
+ "failedTrust": "Failed to trust setup script.",
+ "failedCreate": "Failed to create workspace",
+ "choose": "Choose whether to run the setup script.",
+ "selected": "Selected agent is disabled. Choose an enabled agent before creating.",
+ "hooks": "HOOKS",
+ "orca": "ORCA.YAML",
+ "write": "Write a note",
+ "remote": "Remote repository",
+ "select": "Select a repository",
+ "failedConnect": "Failed to connect to SSH repository.",
+ "failedRead": "Failed to read SSH connection state.",
+ "connectDisplay": "Connect {{displayName}} before creating a workspace."
+ },
+ "protocolBlockScreen": {
+ "back": "Back to hosts",
+ "openGit": "Open GitHub Releases",
+ "openApp": "Open App Store",
+ "updateOrcaYour": "Update Orca on your computer",
+ "updateOrcaMobile": "Update Orca Mobile"
+ },
+ "setupHookTrustDrawer": {
+ "do": "Don't run",
+ "always": "Always trust and run",
+ "runHooks": "Run hooks",
+ "setup": "Setup script",
+ "new": "New setup script",
+ "repositorys": "This repository's orca.yaml runs before the workspace starts. Only run it if you trust this repository.",
+ "runSetup": "Run setup from {{repoName}}?",
+ "repo": "{{repoName}}'s setup script changed"
+ },
+ "smartWorkspaceAdvancedFields": {
+ "derived": "Derived from name",
+ "branch": "Branch name",
+ "workspace": "Workspace name",
+ "name": "Name",
+ "reuse": "Reuse branch “{{reuseEligibleBranch}}”"
+ },
+ "smartWorkspaceSourceDrawer": {
+ "typeName": "Type a name or search a source",
+ "typeWorkspace": "Type a workspace name in the field below.",
+ "ssh": "This SSH repo needs a GitHub remote to list issues and PRs.",
+ "connect": "Connect the repository to search sources.",
+ "cancel": "Cancel",
+ "done": "Done",
+ "name": "Name or 'Create From'",
+ "item": "This item lives in {{owner}}/ {{repo}}.",
+ "switch": "Switch to {{displayName}}",
+ "no": "No results found."
+ },
+ "smartWorkspaceSourceField": {
+ "type": "Type a name or search a source",
+ "optional": "[Optional]"
+ },
+ "smartWorkspaceSourceRow": {
+ "new": "New branch",
+ "create": "Create branch \"{{rowName}}\"",
+ "name": "Name this workspace",
+ "use": "Use \"{{rowName}}\"",
+ "linear": "Linear",
+ "issue": "Issue #",
+ "mr": "MR !",
+ "pr": "PR #"
+ },
+ "terminalShortcutSettings": {
+ "create": "Create key combo or text macro",
+ "add": "Add Custom Shortcut…",
+ "no": "No custom shortcuts defined yet.",
+ "custom": "CUSTOM SHORTCUTS",
+ "show": "Show every built-in shortcut key in the original order",
+ "reset": "Reset Defaults",
+ "toggle": "Toggle keys to show or hide them, and hold the grip to drag a key into the order you want on the terminal shortcut bar.",
+ "shortcut": "SHORTCUT BAR"
+ },
+ "textInputModal": {
+ "cancel": "Cancel",
+ "save": "Save"
+ },
+ "workspaceDetailPlaceholder": {
+ "pick": "Pick a workspace from the sidebar to open its terminal here.",
+ "no": "No workspace open"
+ },
+ "worktreeListRow": {
+ "child": "Child",
+ "folder": "Folder"
+ },
+ "accountsSnapshot": {
+ "inactiveCodex": "Inactive Codex limits use the wrong provider identity",
+ "inactiveClaude": "Inactive Claude limits use the wrong provider identity",
+ "codex": "Codex limits use the wrong provider identity",
+ "claude": "Claude limits use the wrong provider identity",
+ "wslCodex": "WSL Codex accounts require an exact distro",
+ "hostCodex": "Host Codex accounts cannot name a WSL distro",
+ "wslRate": "WSL rate-limit targets require an exact distro",
+ "hostRate": "Host rate-limit targets cannot name a WSL distro",
+ "invalid": "Invalid accounts snapshot from host"
+ },
+ "codexResetCredit": {
+ "account": "This account has no earned reset credits available.",
+ "noReset": "No reset available",
+ "noEligible": "No eligible Codex rate-limit window is exhausted.",
+ "nothing": "Nothing to reset",
+ "codex": "Codex usage has been refreshed.",
+ "resetAlready": "Reset already applied",
+ "rate": "Rate limits reset",
+ "resetCountResets": "{{resetCount}} resets available",
+ "resetCountReset": "{{resetCount}} reset available",
+ "expiresNow": "Expires now",
+ "expiresDuration": "Expires in {{duration}}",
+ "nextExpiresNow": "Next expires now",
+ "nextExpiresDuration": "Next expires in {{duration}}",
+ "invalid": "Invalid reset response from host"
+ },
+ "mountedBottomDrawer": {
+ "dismiss": "Dismiss drawer"
+ },
+ "newWorktreeAgentSelection": {
+ "blank": "Blank Terminal"
+ },
+ "useCodexResetCreditAction": {
+ "spends": "This spends one earned reset for {{confirmedLabel}} and immediately resets eligible rate-limit windows.",
+ "useRate": "Use a rate-limit reset?",
+ "could": "Could not reset rate limits",
+ "account": "The account or reset offer changed before the host contacted Codex. Review the updated details, then confirm again.{{cleanupWarning}}",
+ "reset": "Reset details changed",
+ "useReset": "Use reset",
+ "cancel": "Cancel",
+ "host": "The host confirmed this attempt, but this phone could not clear its retry record. A later retry will reuse the same safe operation ID.",
+ "phone": "This phone could not clear the discarded retry record. Retrying it is safe, but the record must be cleared before a new reset can be confirmed for this account.",
+ "identityWsl": "{{identity}} on WSL {{wslDistro}}",
+ "identityHost": "{{identity}} on the host"
+ },
+ "mermaidDiagram": {
+ "mermaid": "mermaid"
+ },
+ "mobileLinkPrForm": {
+ "linkPull": "Link pull request",
+ "linkLinked": "Link #{{linkedItemNumber}}",
+ "pull": "#123 or https://github.com/owner/repo/pull/123",
+ "pr": "PR number or GitHub URL",
+ "cancel": "Cancel",
+ "linkExisting": "Link existing pull request"
+ },
+ "mobilePrComposeForm": {
+ "createReview": "Create {{reviewType}}",
+ "createDraftReview": "Create draft {{reviewType}}",
+ "pushCreateReview": "Push & create {{reviewType}}",
+ "pushCreateDraft": "Push & create draft {{reviewType}}",
+ "createDraft": "Create as draft",
+ "base": "Base",
+ "generatingTitle": "Generating title and description…",
+ "reviewTypeDescription": "{{reviewType}} description",
+ "description": "Description (optional)",
+ "reviewTypeTitle": "{{reviewType}} title",
+ "title": "Title",
+ "cancel": "Cancel",
+ "generate": "Generate",
+ "generating": "Generating…",
+ "failed": "Failed to generate PR fields",
+ "new": "New {{reviewType}}",
+ "generateReview": "Generate {{reviewType}} details with AI"
+ },
+ "mobilePrViewPanel": {
+ "current": "Current branch unavailable.",
+ "hosted": "Hosted review panel unavailable for this provider."
+ },
+ "practionsSection": {
+ "unlink": "Unlink",
+ "unlinkPull": "Unlink pull request",
+ "reopenPullRequestAccessibility": "Reopen pull request",
+ "closePullRequestAccessibility": "Close pull request",
+ "off": "Off",
+ "on": "On",
+ "toggle": "Toggle auto-merge",
+ "auto": "Auto-merge when ready",
+ "mergePullRequestAccessibility": "Merge pull request",
+ "pullRequestNumberWillReopened": "#{{pullRequestNumber}} will be reopened.",
+ "reopenPullRequest": "Reopen pull request?",
+ "pullRequestNumberWillClosed": "#{{pullRequestNumber}} will be closed without merging.",
+ "closePullRequest": "Close pull request?",
+ "will": "This will merge #{{pullRequestNumber}} into its base branch.",
+ "mergePullRequest": "Merge pull request?",
+ "failed": "Failed to unlink pull request.",
+ "merge": "Merge"
+ },
+ "prcheckDetail": {
+ "showingFirst100": "Showing first 100 jobs",
+ "showingFirst20": "Showing first 20 annotations",
+ "annotations": "Annotations",
+ "no": "No details available."
+ },
+ "prchecksSection": {
+ "open": "Open {{checkName}} on the web",
+ "check": "{{checkName}} check details",
+ "fix": "Fix",
+ "fixFailing": "Fix failing checks with AI",
+ "inspect": "Inspect details or start an AI fix pass.",
+ "rerun": "Rerun failing checks",
+ "checks": "Checks",
+ "failingCheckCountFailingCheck": "{{failingCheckCount}} failing check",
+ "failingCheckCountFailingChecks": "{{failingCheckCount}} failing checks",
+ "failed": "Failed to load check details"
+ },
+ "prcommentCard": {
+ "permanently": "This permanently deletes the comment on GitHub.",
+ "deleteCommentTitle": "Delete comment?",
+ "write": "Write a reply…",
+ "resolve": "Resolve",
+ "unresolve": "Unresolve",
+ "resolveThread": "Resolve thread",
+ "unresolveThread": "Unresolve thread",
+ "delete": "Delete",
+ "deleteComment": "Delete comment",
+ "edit": "Edit",
+ "editCommentAccessibility": "Edit comment",
+ "reply": "Reply",
+ "replyComment": "Reply to comment",
+ "editComment": "Edit comment…",
+ "resolved": "resolved",
+ "save": "Save"
+ },
+ "prcommentComposer": {
+ "cancel": "Cancel"
+ },
+ "prcommentsSection": {
+ "add": "Add a comment…",
+ "noComments": "No comments yet.",
+ "couldNotLoadComments": "Could not load comments. Tap refresh to try again.",
+ "comments": "Comments",
+ "noDescription": "No description provided.",
+ "couldNotLoadDescription": "Could not load description. Tap refresh to try again.",
+ "description": "Description",
+ "showVisible": "Show {{visibleCommentCount}} more of {{remaining}}",
+ "showRemaining": "Show {{remainingCommentCount}} more",
+ "resolvedThreadAuthor": "Resolved thread by {{author}}",
+ "resolvedThreadAuthorReply": "Resolved thread by {{author}} ({{replyCount}})",
+ "resolvedCommentAuthor": "Resolved comment by {{author}}",
+ "resolvedCommentAuthorReply": "Resolved comment by {{author}} ({{replyCount}})",
+ "comment": "Comment"
+ },
+ "prconflictingFilesSection": {
+ "resolve": "Resolve conflicts with AI",
+ "conflicting": "Conflicting files",
+ "copyCommands": "Copy commands",
+ "copied": "Copied",
+ "copyMergeability": "Copy mergeability refresh commands",
+ "run": "Run from this worktree",
+ "branch": "This branch has conflicts that must be resolved",
+ "commitsBehindCommits": "{{commitsBehind}} commits behind (base commit:",
+ "commitsBehindCommit": "{{commitsBehind}} commit behind (base commit:",
+ "conflicts": "Conflicts"
+ },
+ "prreviewersSection": {
+ "remove": "Remove {{login}}",
+ "no": "No reviewers requested",
+ "could": "Could not load reviewers. Tap refresh to try again.",
+ "loading": "Loading reviewers…",
+ "reviewers": "Reviewers",
+ "add": "Add or remove reviewers"
+ },
+ "prsidebarHeader": {
+ "edit": "Edit pull request title",
+ "save": "Save",
+ "saveTitle": "Save title",
+ "cancel": "Cancel",
+ "cancelEditing": "Cancel editing title",
+ "open": "Open pull request #{{pullRequestNumber}} on the web"
+ },
+ "prSidebarCreateEmptyState": {
+ "linkExistingPr": "Link an existing PR",
+ "linkExistingPull": "Link an existing pull request",
+ "current": "The current branch is not linked to an open PR.",
+ "git": "{{gitBranch}} is not linked to an open PR.",
+ "refreshCheck": "Refresh to check again, or create a new PR for this branch.",
+ "no": "No open pull request",
+ "linked": "Linked PR #{{pullRequestNumber}} unavailable",
+ "createPr": "Create PR",
+ "createPull": "Create pull request",
+ "refreshPull": "Refresh pull request",
+ "pull": "Pull request",
+ "failed": "Failed to create pull request.",
+ "check": "Check out a branch before creating a pull request."
+ },
+ "reviewerPickerDrawer": {
+ "no": "No matching people",
+ "search": "Search people",
+ "reviewers": "Reviewers",
+ "failed": "Failed to load people"
+ },
+ "prChecksPresentation": {
+ "reviewed": "Reviewed",
+ "pending": "Pending",
+ "dismissed": "Dismissed",
+ "commented": "Commented",
+ "changes": "Changes requested",
+ "approved": "Approved",
+ "no": "No checks",
+ "skipped": "Skipped",
+ "neutral": "Neutral",
+ "timed": "Timed out",
+ "cancelled": "Cancelled",
+ "failed": "Failed",
+ "successful": "Successful",
+ "progress": "In progress",
+ "requested": "Requested",
+ "closed": "Closed",
+ "draft": "Draft",
+ "merged": "Merged",
+ "open": "Open"
+ },
+ "prCommentAudience": {
+ "bots": "Bots",
+ "humans": "Humans",
+ "all": "All",
+ "noComments": "No comments yet.",
+ "noHuman": "No human comments.",
+ "noBot": "No bot comments."
+ },
+ "markdownBlocks": {
+ "details": "Details"
+ },
+ "prCheckDetailContent": {
+ "jobs": "Jobs",
+ "failed": "Failed jobs"
+ },
+ "prCommentTime": {
+ "years": "{{years}}y ago",
+ "months": "{{months}}mo ago",
+ "days": "{{days}}d ago",
+ "hours": "{{hours}}h ago",
+ "minutes": "{{minutes}}m ago",
+ "just": "just now"
+ },
+ "confirmModal": {
+ "cancel": "Cancel",
+ "confirm": "Confirm"
+ },
+ "mobileSearchField": {
+ "clear": "Clear search"
+ },
+ "mobileOnboardingPage": {
+ "skip": "Skip notifications for now",
+ "not": "Not now",
+ "enableAgent": "Enable agent notifications",
+ "enableNotifications": "Enable notifications",
+ "openSessionsTerminal": "Open sessions in the terminal",
+ "keep": "Keep terminal",
+ "openSessionsChat": "Open sessions in Chat UI",
+ "use": "Use Chat UI",
+ "get": "Get notified on this device when an agent needs your input or finishes a task.",
+ "choose": "Choose whether supported agent sessions open in the terminal or Chat UI on this device. Press and hold a session tab to switch its view, or change the default later in Settings.",
+ "stay": "Stay updated while away",
+ "how": "How should sessions open?"
+ },
+ "mobileFileExplorerPanel": {
+ "no": "No files found",
+ "retry": "Retry",
+ "showing": "- Showing first 5000",
+ "files": "Files",
+ "back": "Back to session",
+ "close": "Close files",
+ "unable": "Unable to load files",
+ "waiting": "Waiting for desktop...",
+ "connecting": "Connecting to desktop..."
+ },
+ "mobileFileMarkdownPreview": {
+ "viewRendered": "View rendered Markdown preview",
+ "viewMarkdown": "View Markdown source"
+ },
+ "mobileFilePreviewBody": {
+ "title": "{{title}} image",
+ "empty": "Empty file",
+ "retry": "Retry"
+ },
+ "mobileFilePreviewEditableSource": {
+ "title": "{{title}} editor"
+ },
+ "mobileFilePreviewScreen": {
+ "unableLoad": "Unable to load preview",
+ "save": "Save terminal artifact",
+ "back": "Back to files",
+ "unsaved": "Unsaved edits will be lost.",
+ "discardChanges": "Discard changes?",
+ "loading": "Loading preview...",
+ "waiting": "Waiting for desktop...",
+ "file": "File",
+ "preview": "Preview",
+ "discard": "Discard",
+ "stay": "Stay",
+ "unableSave": "Unable to save file"
+ },
+ "mobileFilePreviewSourceText": {
+ "file": "File preview",
+ "preview": "Preview truncated. File size: {{formatPreviewByteLength}}."
+ },
+ "mobileFileExplorerRow": {
+ "unavailable": "Unavailable on mobile",
+ "preview": "Preview file {{itemName}}",
+ "item": "{{itemName}} unavailable on mobile",
+ "open": "Open folder {{itemName}}",
+ "retry": "Retry",
+ "retryLoading": "Retry loading {{relativePath}}",
+ "loading": "Loading...",
+ "unable": "Unable to load folder"
+ },
+ "mobileFilePreviewRequest": {
+ "file": "File changed on desktop. Reload preview before saving"
+ },
+ "mobileFilePreviewResponse": {
+ "unableLoad": "Unable to load preview",
+ "fileNot": "File not found",
+ "unableReach": "Unable to reach the desktop filesystem",
+ "reload": "Reload preview before saving",
+ "fileToo": "File too large for mobile preview",
+ "binary": "Binary preview unavailable"
+ },
+ "mobileFilePreviewRoute": {
+ "unable": "Unable to load preview"
+ },
+ "mobileFileMutationOwnership": {
+ "could": "Couldn't verify the SSH connection. Reconnect the host and try again."
+ },
+ "troubleshootCommonIssues": {
+ "other": "Other VPN Interference",
+ "tailscale": "Tailscale Host Unreachable",
+ "connection": "Connection Timeout",
+ "desktop": "Desktop App Not Running",
+ "firewall": "Firewall Blocking Port 6768",
+ "different": "Different WiFi Networks",
+ "disable": "Disable that VPN or enable split tunneling / \"Allow LAN\".",
+ "non": "Non-Tailscale VPNs can route local traffic through a remote server.",
+ "update": "Update the Tailscale app — recent releases fix reconnect bugs.",
+ "checkDesktop": "Check the desktop is awake and shows as connected in your tailnet.",
+ "i": "iOS/Android can silently wedge the tunnel: toggle Tailscale off and back on in the Tailscale app.",
+ "host": "Host addresses like 100.x.x.x or *.ts.net connect through Tailscale — keep it ON.",
+ "restart": "Restart both apps if timeouts persist.",
+ "go": "Go back to the host list and tap your host to retry.",
+ "checkWi": "Check WiFi signal strength on your phone.",
+ "after": "After an update, you may need to re-pair via QR code.",
+ "tryRestarting": "Try restarting Orca — the companion server starts on launch.",
+ "orca": "Orca must be open on your desktop to accept connections.",
+ "corporate": "Corporate/school networks may block P2P — try a personal hotspot.",
+ "linux": "Linux: sudo ufw allow 6768",
+ "windows": "Windows: Defender Firewall → Allow app — enable Orca for Private networks.",
+ "mac": "macOS: System Settings → Network → Firewall — allow Orca.",
+ "tryReconnecting": "Try reconnecting WiFi on both devices.",
+ "ethernet": "Ethernet and WiFi must share the same subnet.",
+ "both": "Both devices must be on the same LAN (unless connected through Tailscale)."
+ },
+ "mobileBrowserKeyRow": {
+ "esc": "Esc"
+ },
+ "mobileBrowserPane": {
+ "send": "Send text to browser",
+ "type": "Type on page…",
+ "ok": "OK",
+ "cancel": "Cancel",
+ "browserDialogMessage": "Browser Dialog",
+ "url": "URL",
+ "reload": "Reload",
+ "forward": "Forward",
+ "back": "Back",
+ "enter": "Enter a valid URL.",
+ "browserStreamTimed": "Browser stream timed out.",
+ "browserPage": "Browser page is not available yet.",
+ "checking": "Checking desktop browser streaming support.",
+ "update": "Update desktop Orca to stream browser tabs on mobile.",
+ "browserStreamFailed": "Browser stream failed.",
+ "browserDialog": "Browser dialog",
+ "sent": "Sent",
+ "browserPointerUp": "Browser pointer up failed",
+ "browserPointerDown": "Browser pointer down failed",
+ "browserPointerMove": "Browser pointer move failed",
+ "browserScroll": "Browser scroll failed",
+ "browserCommand": "Browser command failed",
+ "right": "Right click"
+ },
+ "mobileBrowserPointerModifiers": {
+ "modifier": "{{modifierLabel}} click modifier",
+ "shift": "Shift",
+ "alt": "Alt",
+ "ctrl": "Ctrl",
+ "cmd": "Cmd"
+ },
+ "mobileBrowserViewModeSwitch": {
+ "show": "Show {{browserLabel}} website view",
+ "mobile": "Mobile",
+ "web": "Web"
+ },
+ "mobileAgentSessionHistoryList": {
+ "resume": "Resume agent session",
+ "current": "current worktree",
+ "messages": "messages",
+ "message": "message"
+ },
+ "agentHistory": {
+ "noPast": "No past agent sessions in this scope.",
+ "noSessions": "No sessions match your search.",
+ "noAgent": "No agent sessions",
+ "search": "Search sessions, repo:, path:",
+ "retry": "Retry",
+ "unableLoad": "Unable to Load",
+ "update": "Update Orca on this host to browse agent session history.",
+ "agentSessionHistoryUnavailable": "Agent Session History Unavailable",
+ "refresh": "Refresh agent sessions",
+ "agentSessionHistory": "Agent Session History",
+ "back": "Back",
+ "failed": "Failed to resume session.",
+ "agentSessionQueued": "Agent session queued.",
+ "unableDetermine": "Unable to determine host platform.",
+ "session": "This session is missing a resume id.",
+ "waiting": "Waiting for host...",
+ "all": "All",
+ "project": "Project",
+ "workspace": "Workspace",
+ "issueCountTranscript": "{{issueCount}} transcript skipped",
+ "issueCountTranscripts": "{{issueCount}} transcripts skipped",
+ "unableLoadWorkspace": "Unable to load workspace metadata."
+ },
+ "useMobileAgentHistoryState": {
+ "waiting": "Waiting for host…",
+ "unableLoad": "Unable to load agent sessions",
+ "unableReach": "Unable to reach host"
+ },
+ "worktreeNavigationActions": {
+ "agent": "Agent Session History",
+ "source": "Source Control"
+ },
+ "agentHistoryResumeTarget": {
+ "open": "Open a local workspace before resuming a session.",
+ "session": "This session is stored on the host machine, so it cannot be resumed in an SSH workspace. Open a local workspace for this project.",
+ "resume": "Resume from history is not available in runtime-hosted workspaces."
+ },
+ "agentHistorySessionCard": {
+ "untitled": "Untitled session"
+ },
+ "about": {
+ "orcaBuild": "@orca_build",
+ "stablyai": "stablyai/orca",
+ "orcaDev": "onOrca.dev",
+ "open": "Open-source agent IDE for 100x builders",
+ "orca": "Orca",
+ "about": "About"
+ },
+ "browserSettings": {
+ "openTerminal": "Open terminal links",
+ "choose": "Choose where HTTP(S) links tapped in terminal output open.",
+ "links": "LINKS",
+ "browser": "Browser",
+ "openSafari": "Open in Safari, Chrome, or another browser on this phone.",
+ "phone": "Phone browser",
+ "openStreamed": "Open in the streamed browser from your paired desktop.",
+ "orca": "Orca browser on desktop"
+ },
+ "connectionLog": {
+ "noPaired": "No paired hosts.",
+ "noConnection": "No connection events yet this session. Events appear as the app dials this host.",
+ "copy": "Copy diagnostics",
+ "copied": "Copied",
+ "attempt": " · attempt {{reconnectAttempts}}",
+ "connection": "Connection log"
+ },
+ "home": {
+ "youre": "You're connected",
+ "scan": "Scan the code",
+ "openOrca": "Open Orca desktop",
+ "removeConfirm": "Remove \"{{confirmRemoveName}}\"? You can re-pair later.",
+ "removeHost": "Remove Host",
+ "remove": "Remove",
+ "edit": "Edit host",
+ "disconnect": "Disconnect",
+ "seven": "7d",
+ "five": "5h",
+ "account": "Account usage",
+ "new": "New Workspace",
+ "pair": "Pair Desktop",
+ "quick": "Quick Actions",
+ "tasks": "Tasks",
+ "resume": "Resume",
+ "desktops": "Desktops",
+ "prs": "PRs created",
+ "agent": "Agent time",
+ "agents": "Agents spawned",
+ "welcome": "Welcome back",
+ "how": "How it works",
+ "pairingDescription": "Pair with Orca on your computer to check on your agents, jump into any terminal, and drive work from your phone.",
+ "connectYour": "Connect your desktop",
+ "orca": "Orca",
+ "please": "Please try again.",
+ "could": "Could not remove host",
+ "openTask": "Open {{taskProviderLabel}} tasks",
+ "no": "No task sources connected",
+ "system": "System default",
+ "your": "Your desktop will appear here. Everything is encrypted end-to-end.",
+ "tap": "Tap the button above to open the scanner. Point at the QR code on your screen.",
+ "go": "Go to Settings → Mobile and generate a pairing QR code.",
+ "connect": "Connect",
+ "reconnect": "Reconnect",
+ "linear": "Linear",
+ "gitLab": "GitLab",
+ "gitHub": "GitHub"
+ },
+ "mobileOnboarding": {
+ "onboarding": "Onboarding progress",
+ "orca": "Orca",
+ "notification": "Notification settings could not be updated. Try again.",
+ "your": "Your choice could not be saved. Try again."
+ },
+ "nativeChatSettings": {
+ "open": "Open sessions in Chat UI",
+ "off": "Off",
+ "on": "On",
+ "choose": "Choose how supported agent sessions (Claude, Codex, and other chat-capable agents) open on this device. Terminal shows the raw CLI; Chat UI shows a chat interface like the desktop app. You can still switch any individual session from its long-press menu.",
+ "default": "DEFAULT VIEW",
+ "chat": "Chat UI",
+ "back": "Back"
+ },
+ "notifications": {
+ "open": "Open Settings",
+ "agent": "Agent notifications",
+ "notifications": "Notifications",
+ "get": "Get notified on this device when an agent needs your input or finishes a task.",
+ "notificationsDisabled": "Notifications are disabled in system settings."
+ },
+ "pairConfirm": {
+ "back": "Back to home",
+ "connecting": "Connecting…",
+ "cancel": "Cancel",
+ "pair": "Pair",
+ "confirmDesktopPairingLink": "You opened a pairing link from your desktop. Confirm to add it to your hosts.",
+ "pairDesktop": "Pair with this desktop?",
+ "pairingFailed": "Pairing failed: {{errorMessage}}",
+ "could": "Couldn't connect within {{pairingOverallTimeoutSeconds}}s — see log below for where it stalled",
+ "pairingLog": "Pairing log"
+ },
+ "pairScan": {
+ "orca": "orca://pair?code=... or paste the code",
+ "copy": "Copy the code shown under the QR on your computer.",
+ "pastePairingCode": "Paste pairing code",
+ "pasteCode": "Paste code instead",
+ "try": "Try Again",
+ "connecting": "Connecting…",
+ "pastePairingCodeMessage": "Or paste pairing code",
+ "scan": "Scan the QR code",
+ "go": "Go to Settings → Mobile",
+ "openOrca": "Open Orca on your computer",
+ "openSettings": "Open Settings",
+ "continue": "Continue",
+ "enable": "Enable camera access in Settings, or paste the pairing code instead.",
+ "scanOrPastePairingCode": "Scan the QR code from Orca on your desktop, or paste the pairing code instead.",
+ "camera": "Camera Access Disabled",
+ "pair": "Pair with desktop",
+ "pairingFailed": "Pairing failed: {{errorMessage}}",
+ "could": "Couldn't connect within {{pairingOverallTimeoutSeconds}}s — see log below for where it stalled",
+ "notValidPairing": "Not a valid pairing code — copy it from your computer and paste again",
+ "notValidOrca": "Not a valid Orca QR code",
+ "pairingLog": "Pairing log"
+ },
+ "pair": {
+ "back": "Back to home",
+ "missing": "Missing pairing code"
+ },
+ "settings": {
+ "support": "Support",
+ "privacy": "Privacy Policy",
+ "retry": "Retry",
+ "retryClearing": "Retry clearing pairing credentials",
+ "couldNotCheck": "Couldn't check cleanup status on this device. Retry to be safe.",
+ "cleanup": "Cleanup still couldn't be confirmed. Try again later.",
+ "pairing": "Pairing credential cleanup",
+ "about": "About",
+ "troubleshooting": "Troubleshooting",
+ "notifications": "Notifications",
+ "voice": "Voice",
+ "browser": "Browser",
+ "chat": "Chat UI",
+ "terminal": "Terminal",
+ "settings": "Settings",
+ "couldNotConfirmCleanupPendingCredentialCountCredential": "Couldn't confirm cleanup for {{pendingCredentialCount}} credential on this device.",
+ "couldNotConfirmCleanupPendingCredentialCountCredentials": "Couldn't confirm cleanup for {{pendingCredentialCount}} credentials on this device."
+ },
+ "terminalSettings": {
+ "terminalText": "Terminal text size",
+ "restore": "Restore {{pickerHostName}}",
+ "off": "Off",
+ "on": "On",
+ "autocomplete": "Autocomplete & autocorrect",
+ "autocompleteDescription": "Enable phone-style autocomplete, autocorrect, and spelling suggestions in the terminal command bar. Off by default so the keyboard never rewrites commands, flags, or paths. Direct keyboard input (when keys go straight to the terminal) always sends raw keystrokes, so suggestions don't apply there.",
+ "keyboard": "KEYBOARD INPUT",
+ "textSizeMessage": "Text size",
+ "textScaleDescription": "Scale the terminal text. Smaller sizes fit more columns with side margins; larger sizes show fewer columns — drag sideways to pan. You can also pinch to zoom in the terminal itself, which updates this setting. Per-device display only; doesn't change the desktop terminal.",
+ "textSize": "TEXT SIZE",
+ "no": "No paired desktops yet. Pair one to control terminal behavior.",
+ "resizeBehaviorDescription": "While you're using a terminal on your phone, Orca shrinks it to fit your screen. When you close the app or switch away, this controls whether it stays at phone size (so interactive CLI tools don't reflow) or resizes back to your desktop. You can always use Restore this terminal or Restore all terminals on the banner to resize manually.",
+ "when": "WHEN YOU LEAVE THE APP",
+ "terminal": "Terminal",
+ "after30": "After 30 minutes",
+ "after5": "After 5 minutes",
+ "after1": "After 1 minute",
+ "keep": "Keep at phone size (default)",
+ "largest": "Largest (200%)",
+ "larger": "Larger (150%)",
+ "large": "Large (125%)",
+ "default": "Default (100%)",
+ "smaller": "Smaller (75%)",
+ "smallest": "Smallest (50%)",
+ "afterDuration": "After {{durationSeconds}}s"
+ },
+ "troubleshoot": {
+ "common": "Common issues",
+ "view": "View connection log",
+ "runDiagnostics": "Run diagnostics",
+ "runAgain": "Run again",
+ "running": "Running…",
+ "troubleshooting": "Troubleshooting",
+ "platform": "Platform",
+ "hosts": "Hosts",
+ "internet": "Internet",
+ "paired": "Paired hosts",
+ "couldNotTest": "Could not test",
+ "no": "No connection",
+ "unexpected": "Unexpected response",
+ "connected": "Connected",
+ "couldNotRead": "Could not read host data",
+ "none": "None — scan a QR to pair",
+ "host": "{{hostCount}} paired",
+ "reachable": "Reachable at {{endpoint}}"
+ },
+ "voiceSettings": {
+ "speechModelMessage": "Speech Model",
+ "speechModel": "SPEECH MODEL",
+ "togglePress": "Toggle: press once to start, again to stop. Hold: dictate while held.",
+ "dictationMode": "Dictation Mode",
+ "dictate": "Dictate text into any focused pane on your desktop.",
+ "enable": "Enable Voice Dictation",
+ "dictation": "DICTATION",
+ "connect": "Connect to a desktop to manage voice settings.",
+ "voice": "Voice",
+ "delete": "Delete failed",
+ "download": "Download failed",
+ "couldNotSelect": "Could not select model",
+ "couldNotUpdate": "Could not update",
+ "failedLoadVoiceSettings": "Failed to load voice settings",
+ "hold": "Hold",
+ "toggle": "Toggle",
+ "failedLoadVoiceSettingsMessage": "Failed to load voice settings.",
+ "none": "None selected"
+ },
+ "mobileDictationPendingAudioBudget": {
+ "connection": "Connection is too slow for voice dictation. Try again when the connection improves."
+ },
+ "mobileDictationDesktopStart": {
+ "failed": "Failed to start microphone recording"
+ },
+ "mobileDictationKeepAwake": {
+ "keep": "Keep-awake native call timed out"
+ },
+ "useMobileDictation": {
+ "no": "No speech detected.",
+ "failed": "Failed to initialize microphone",
+ "microphone": "Microphone permission denied"
+ },
+ "mobileDictationSetup": {
+ "update": "Update the paired desktop Orca app to use mobile voice settings.",
+ "failedUpdate": "Failed to update dictation settings",
+ "failedDelete": "Failed to delete model",
+ "failedStart": "Failed to start download",
+ "failedLoad": "Failed to load dictation models"
},
"prChecks": {
"status": {
@@ -2243,9 +2671,6 @@
"noCommitMessage": "(no commit message)"
}
},
- "accounts": {
- "selectedManagedAccount": "the selected managed account"
- },
"onboarding": {
"progress": "Step {{currentStep}} of {{totalSteps}}"
},
diff --git a/mobile/src/i18n/locales/es.json b/mobile/src/i18n/locales/es.json
index bd4baf802a7..4e5c5537c59 100644
--- a/mobile/src/i18n/locales/es.json
+++ b/mobile/src/i18n/locales/es.json
@@ -1,2180 +1,2420 @@
{
- "m": {
- "zWwi3-o": "Por hacer",
- "hWeTdOM": "En curso",
- "mg8ozqs": "En revisión",
- "EleEi2Q": "Hecho",
- "1Bc_S64": "Estado de PR",
- "BX2Np3Y": "Repositorio",
- "oBZu0_c": "Estado",
- "Iq3a5so": "Sin agrupación",
- "y1TvQWs": "Orden del servidor",
- "FyGSYV4": "Manual",
- "yH1bPxU": "Repositorio, luego nombre del espacio de trabajo",
- "v5H1mJY": "Repo",
- "egkm8qI": "La producción más reciente primero",
- "2xJ96AA": "Reciente",
- "BaGIgrE": "Alfabéticamente por nombre",
- "tQqkyxI": "Nombre",
- "RcmL46Y": "Agents que necesitan atención, luego actividad reciente",
- "6gEQgs0": "Actividad de Agents",
- "KbmpcZs": "Reconectando…",
- "6_SeqME": "no puedo conectarme",
- "YAPgxBM": "No puedo acceder al escritorio",
- "G6a1Jqk": "Desconectado",
- "I-waJyg": "Conectando…",
- "jgGsba4": "Conectado",
- "0BvjSKA": "Emparejamiento no válido: vuelva a emparejarlo con su computadora de escritorio",
- "HguWCpQ": "El puerto debe ser 1–65535.",
- "dRmw4EQ": "Falta el nombre de host.",
- "CshxztM": "No es una dirección válida.",
- "6lctDfQ": "No es un nombre de host válido.",
- "fX92Peg": "El host no debe incluir una ruta o consulta.",
- "HQMAFdE": "Utilice ws:// o wss:// (o host:puerto).",
- "z85IfPo": "Introduzca una dirección de host.",
- "lxKZMMw": "Se esperaba exactamente un punto final para los metadatos de retransmisión configurados",
- "e-zCiAo": "La identidad del host de retransmisión no coincide",
- "CjbcG3A": "La identidad de retransmisión y el punto final deben coexistir",
- "HrWsdDM": "Borrar línea antes del cursor",
- "sL5fKGQ": "Ctrl+U",
- "Bd9qfdk": "Eliminar palabra al revés",
- "jVVj75Y": "Ctrl+W",
- "0VWtVO8": "Fin de linea",
- "5m_ucwE": "Ctrl+E",
- "CKFp_QM": "inicio de linea",
- "u9q9lPQ": "Ctrl+A",
- "mcvHf4o": "búsqueda inversa",
- "a2Cb3GE": "Ctrl+R",
- "hqWfNmA": "Suspender proceso",
- "NIdsbYo": "Ctrl+Z",
- "Eqaj8oY": "Borrar pantalla",
- "R6ZcIz8": "Ctrl+L",
- "PBPnPeQ": "Enviar EOF",
- "vFYSo0s": "Ctrl+D",
- "AzHoQzM": "Terminal de interrupción",
- "ke03J5M": "Ctrl+C",
- "v5WSGO0": "Flecha derecha",
- "RiGIavM": "Flecha izquierda",
- "vVsy7qk": "Flecha hacia abajo",
- "IwJi8TY": "Flecha arriba",
- "fNgDk9o": "Eliminar hacia adelante",
- "gmy3A7M": "Del",
- "6TRPiic": "Retroceso",
- "l6KJT3M": "Espacio",
- "p7_d2FU": "Pestaña Mayús",
- "S9DH8y4": "Mayús+Tab",
- "9KFo5zM": "Enter",
- "hM5KUAw": "Tab",
- "jHe6UUU": "Escapar",
- "bNejRmQ": "Esc",
- "UnBBA1A": "Recargar",
- "p2soPzg": "La terminal no pudo cargarse",
- "IwMISoQ": "Todo",
- "J54idHw": "Cerrado",
- "sKFSmrM": "Mergeado",
- "dGRdl38": "Abrir",
- "_NhxpRw": "Nombre",
- "efmLHxE": "Rama",
- "JEQaLyM": "GitLab",
- "j6H-ZB8": "Linear",
- "fLijFJI": "GitHub",
- "0GQcyjg": "Inteligente",
- "TgLMnDc": "Usa directorios relativos al repo, no la raíz, rutas absolutas ni segmentos padre.",
- "M0WKvoE": "Agrega al menos un directorio.",
- "fCVCUqw": "Los alcances de reinicio de WSL requieren una distribución exacta",
- "TJPBpxE": "Los ámbitos de reinicio del host no pueden nombrar una distribución WSL",
- "CgVIb2E": "Diferencia truncada para vista previa móvil.",
- "mZj5XBY": "No se puede cargar la diferencia",
- "v6-Hc8I": "Cerrar vista previa de diferencias comprometidas",
- "I6GjQO8": "Comprometidos en sucursal",
- "6lym-WQ": "{{value0}}..HEAD",
- "P2fbbug": "Mostrar detalles",
- "eysP-fI": "Ocultar detalles",
- "6Pb0W84": "Mostrar detalles del error de commit",
- "7eT5oiE": "Ocultar detalles del error de commit",
- "-RbEI6M": "Arreglar",
- "3iqxoCY": "Solucionar error de commit con IA",
- "Hol4rtI": "La Commit falló",
- "fcDHZ1U": "Sin commits.",
- "Qb3CogY": "Reintentar",
- "kylGvPU": "Esperando el escritorio...",
- "y0bB4-s": "Sin cambios de archivos",
- "c_4jbTI": "No se pudo cargar el historial",
- "O_0cF4M": "{{value0}} cambió",
- "cLOWzDM": "En staging: {{value0}}",
- "Dysvcf0": "{{value0}} en rama",
- "8tFmU9A": "Generar mensaje de commit con IA",
- "PTohtCY": "Cancelar la generación del mensaje de commit",
- "uTRYt2U": "Mensaje de commit",
- "2X52pxU": "Sin archivos preparados",
- "ELJU7AQ": "Mensaje de Commit deshabilitado. Sin archivos preparados.",
- "yKqTr9E": "El árbol de trabajo está limpio.",
- "89qgAps": "Sin cambios locales",
- "8E6deJU": "Acciones de control de código abierto",
- "DHXoi2A": "Fuera del escenario todo",
- "9pCKA8U": "Hacer stage de todo",
- "o_TTJDk": "Reconectándose al escritorio...",
- "PW__oVI": "Abrir cambio comprometido {{value0}}",
- "tZHFwCg": "Cargando cambios confirmados...",
- "m_C8jkI": "Commits en la rama",
- "IET9hpI": "Descartar {{value0}}",
- "WTkbKTE": "Etapa {{value0}}",
- "9OoD7rs": "Fuera del escenario {{value0}}",
- "av_Mh7U": "Conflicto no resuelto",
- "4a6Yo9s": "Abrir archivo modificado {{value0}}",
- "SrSDY0M": "de {{value0}}",
- "Pt1enm0": "Actualizar control de fuente",
- "5lXW9sQ": "Abrir solicitud de extracción en la web",
- "HUC1SZA": "Abrir solicitud de extracción #{{value0}} en la web",
- "PjA8ztc": "Control de código fuente",
- "OtpFc0w": "Volver a la sesión",
- "MDlHRa0": "Cerrar control de código fuente",
- "84pwQsY": "¿Abrirlo en tu navegador?",
- "4E80Be4": "Solicitud de extracción creada",
- "n9UDFoo": "Cambiar rama",
- "Oh7cEhY": "¿Descartar cambios a \"{{value0}}\"? Esto no se puede deshacer.",
- "7IMotMA": "Descartar cambio",
- "7p6X0C0": "Control de código fuente",
- "dggV318": "Reintentar",
- "SlcSA9A": "No se puede cargar",
- "UgUD08U": "Control de fuente no disponible",
- "Q1mHSX4": "Crear solicitud de extracción",
- "xoN_ZQM": "Cargando solicitud de extracción...",
- "jrzi7yY": "Commits en la rama",
- "cU7VGGA": "No se pudo generar el mensaje de commit",
- "6N6POoY": "Crear pull request",
- "8fhgeQQ": "La rama cambió mientras se preparaba la solicitud de extracción.",
- "zAg6hUc": "No se pudo generar un mensaje de commit. Agregue uno en Control de código fuente y luego vuelva a intentarlo.",
- "x1skfkY": "Resuelva o organice cambios antes de crear una solicitud de extracción.",
- "695pbL4": "Resuelva los conflictos antes de crear una solicitud de extracción.",
- "QeyCTxE": "El empujón falló. Resuelva el error de inserción y vuelva a intentarlo.",
- "hjs2AB4": "Commits",
- "bOc3nUM": "Cambiar rama",
- "ntik19Q": "Rebase sobre la base",
- "r_MPRhE": "Publicar rama",
- "3blspe8": "Fetch",
- "_Pq5EEw": "Impulsar y crear PR",
- "IgtghkE": "Crear PR",
- "ZFwznUg": "Commit y sincronizar",
- "4pU4zTo": "Commit y presionar",
- "_Srm4Jk": "Commit",
- "s7LT0Wk": "No se pudo iniciar el agent",
- "Ngsl81c": "Esperando el escritorio...",
- "h4RNhQ0": "No se pudo generar el mensaje de commit",
- "IhhRQcI": "Consulte una sucursal antes de crear una solicitud de extracción.",
- "8lyq50g": "Actualice el escritorio de Orca para usar Source Control en dispositivos móviles.",
- "v0PMFRE": "No se puede resolver la rama base para comparar.",
- "xLlZko0": "Esperando el escritorio...",
- "0MDy3xU": "No se puede abrir la diferencia",
- "iO0cooo": "Error en la acción de control de código fuente",
- "0EPx-aA": "El Agent esta trabajando",
- "vCnFzKQ": "Cerrar",
- "8xevGic": "Recargar",
- "m4hO2RY": "Reenviar",
- "SKku3yE": "Atrás",
- "GZwtZCE": "Navegador",
- "EwbB5VI": "Siguiente",
- "ZEWq5OM": "Enviar respuesta",
- "yxcaJwo": "Cancelar",
- "7nef7b0": "Escribe tu respuesta",
- "biG4V5Q": "Otro…",
- "imHMT2Y": "enviar mensaje",
- "0JFch-U": "Dictar",
- "r9MfglU": "Detener dictado",
- "o_uvOaw": "Adjuntar imagen",
- "8VDRuNk": "Quitar imagen",
- "lHpfBcs": "Queued",
- "85E7hns": "Desplazar este mensaje hacia arriba",
- "m5GqFPc": "Copiar mensaje",
- "0bAYawM": "{{value0}}×",
- "0mLnbZ0": "… {{value0}} más llamadas a herramientas",
- "O8aNMg0": "Enviar respuesta",
- "psOJLjQ": "Escribe tu respuesta…",
- "bSeVb4U": "O escribe una respuesta...",
- "NR7KpaA": "Enviar opciones seleccionadas",
- "BcZ8-jY": "Enviar{{value0}}",
- "55yDVNk": "Mensaje, @archivos, /comandos",
- "AXyDPsE": "Esperando terminal...",
- "gFSApKE": "Reconectando…",
- "X8_vuao": "Detener",
- "1oeCDU8": "Detener el agent",
- "J3nTi3Q": "Herramientas",
- "HgMEzFE": "Contraer",
- "MWJZkOQ": "Desplácese hasta lo último",
- "AexlW6I": "Cargar mensajes anteriores",
- "u8wilUo": "Checks",
- "6R8BWsw": "Historial del Agent",
- "a4FTXPM": "Iniciar dictado de voz",
- "4Bofttg": "Iniciar dictado de voz",
- "467WHFs": "Cancelar dictado de voz",
- "lmt1VYs": "Detener el dictado por voz",
- "diKZlw8": "Mantenga presionado para adjuntar un archivo",
- "THy0254": "Adjuntar una foto",
- "Vl7Dj48": "Enviando imagen",
- "mr8N0cA": "Agregar comando rápido",
- "SZAlJoE": "Guardar",
- "z9Me_JI": "Cancelar",
- "nB0fh-Q": "Proyecto",
- "spBXyhw": "Global",
- "JVmE8Lo": "Alcance",
- "iAdHX2w": "Enviar inmediatamente en lugar de solo insertar texto.",
- "S9UUSi8": "Agregar Enter",
- "MsJOHDg": "Avanzado",
- "WFigoqY": "Admite habilidades, rutas de archivos y comandos integrados.",
- "YGxS8ck": "npm run dev",
- "j_uWjuQ": "Pide al agent que investigue este espacio de trabajo",
- "2WUowpg": "Texto de comando",
- "v512Bqc": "Prompt",
- "9D9oj64": "Elige agent",
- "th44i2A": "Agent",
- "AQ41agY": "Acción",
- "pcq4xtU": "Iniciar el servidor de desarrollo",
- "GXMFUnA": "Etiqueta",
- "CQKw8CA": "Prompt de Agent",
- "9xkz8HQ": "Comando de terminal",
- "r6942Dw": "Eliminar {{value0}}",
- "N8k0x7U": "Editar {{value0}}",
- "VrXVT_A": "Ejecute {{value0}}",
- "Jqxtf0c": "Se alcanzó el límite de comando rápido",
- "LmWWV94": "Nuevo comando rápido",
- "YWp9eI8": "Global",
- "0ye1crk": "este proyecto",
- "stjjcN4": "No hay comandos rápidos coincidentes.",
- "WGZgVlw": "Aún no hay comandos rápidos.",
- "Mlzs2q8": "Buscar comandos rápidos...",
- "c7kUeNA": "Guarda comandos de terminal o prompts de agent para acceso rápido.",
- "XUyBgA4": "Atrás",
- "8mDod7I": "Este comando rápido se eliminará de tu lista guardada.",
- "y7ppLrs": "¿Eliminar \"{{value0}}\"?",
- "gz_v97k": "No se pudo actualizar el hilo de revisión.",
- "ssoDq0g": "No se pudo actualizar el título.",
- "fZbxiK0": "Cerrar",
- "9OSp60k": "Actualice el escritorio de Orca para revisar los cambios en el móvil.",
- "RSAKe4M": "La respuesta de cambios confirmados no era válida",
- "hKX4q6A": "Comprometidos en sucursal",
- "LHMnD5o": "Permiso solicitado",
- "zqu69ik": "Permitir siempre",
- "3EBdICM": "Denegar",
- "sjphObI": "Permitir",
- "QX9RTgc": "Cerrar pestañas a la derecha",
- "_ijK2wo": "Cerrar pestañas a la izquierda",
- "XxfyMlc": "Cerrar otras pestañas",
- "k32XW6w": "Cerrar",
- "5s4VNsw": "Borrar terminal",
- "2wFDKaY": "Renombrar",
- "umfRNkc": "No se pudo fusionar la solicitud de extracción.",
- "vXd8YYA": "No se pudo actualizar la solicitud de extracción.",
- "Lq5nqds": "Error en la conexión (reconectando)",
- "kOr-gVg": "No se pudo guardar la reseña",
- "AtE6oQA": "Esperando el escritorio...",
- "HkX9h2s": "Árbol de trabajo faltante",
- "-k-F-P0": "En staging: {{value0}}",
- "tyXkf4g": "En staging: {{value0}}; fallidos: {{value1}}",
- "L-xz6vw": "Esperando el escritorio...",
- "MOtwYRI": "Error en la acción de control de código fuente",
- "x0Dr_H8": "Esperando el escritorio...",
- "U2LqmGk": "Revisar notas enviadas",
- "LtedJAM": "Revisar notas copiadas",
- "NSS4Or0": "Error al adjuntar",
- "hJYA7AQ": "Imagen demasiado grande para adjuntar",
- "JdGd1Ic": "Permiso de fotografía denegado",
- "tu-qlN0": "Error al adjuntar (desconectado)",
- "JlNqDLA": "Error al adjuntar",
- "-YjNIcU": "Imagen demasiado grande para adjuntar",
- "jdkmIaw": "Permiso de fotografía denegado",
- "Kc1O9hE": "Error al adjuntar (desconectado)",
- "AandnA4": "No conectado",
- "62Wqvcg": "No se pudo iniciar el agent",
- "WXv-mcQ": "Esperando el escritorio...",
- "zchh0X0": "La acción del comentario falló",
- "6VPjkF8": "No se pudo actualizar el título.",
- "RqzbvDE": "No conectado al escritorio.",
- "weTQMew": "Error al pegar",
- "5dhlsXo": "Imagen demasiado grande para pegar",
- "gG0saX0": "Error al pegar (desconectado)",
- "Ezj8Uog": "Pegar demasiado grande (máximo 256 KiB)",
- "e1BO4eM": "No se pudieron cargar comandos rápidos",
- "K20RdWM": "Saltar notificaciones por ahora",
- "KP3UPPY": "Ahora no",
- "sSrQIeg": "Habilitar notificaciones de agents",
- "QM9B4lA": "Habilitar notificaciones",
- "B5cl_6I": "Sesiones abiertas en la terminal",
- "9bF2iuQ": "mantener terminal",
- "tYyQCnY": "Sesiones abiertas en la interfaz de usuario de Chat",
- "KogvSYY": "Usar la interfaz de usuario del chat",
- "3vHqv6U": "Reciba notificaciones en este dispositivo cuando un agent necesite su opinión o finalice una tarea.",
- "dV8UVHg": "Elija si las sesiones de agent admitidas se abren en la terminal o en la interfaz de usuario de Chat en este dispositivo. Mantenga presionada la pestaña de una sesión para cambiar su vista o cambie la configuración predeterminada más adelante en Configuración.",
- "OmdgGNs": "Manténgase actualizado mientras está fuera",
- "o9LxHPg": "¿Cómo deben abrirse las sesiones?",
- "CaZB1fk": "No se encontraron archivos",
- "LS0hOug": "Reintentar",
- "UomXr8g": "- Mostrando los primeros 5000",
- "8ojoNLo": "Archivos",
- "vT-EgZw": "Volver a la sesión",
- "A053H2s": "Cerrar archivos",
- "ujEE5Aw": "Ver vista previa renderizada de Markdown",
- "12QKL8A": "Ver fuente de Markdown",
- "cDZy2i8": "{{value0}} imagen",
- "0U_34Zg": "Archivo vacío",
- "zqZaJJo": "Reintentar",
- "yc-xh3U": "editor {{value0}}",
- "uLXt2Qs": "No se puede cargar la vista previa",
- "BnjL5Ho": "Guardar artefacto terminal",
- "nxnMGkU": "Volver a archivos",
- "vXalblI": "Las ediciones no guardadas se perderán.",
- "k969DeE": "¿Descartar cambios?",
- "Iqn4mt4": "Cargando vista previa…",
- "MCFjuu8": "Esperando el escritorio...",
- "1_VaWXc": "Vista previa del archivo",
- "mGhZjxw": "Vista previa truncada. Tamaño de archivo: {{value0}}.",
- "m0QdE2U": "No disponible en dispositivos móviles",
- "F2AHmFI": "Vista previa del archivo {{value0}}",
- "AnmS3ZU": "{{value0}} no disponible en dispositivos móviles",
- "LuU4lSE": "Abrir carpeta {{value0}}",
- "CGYoYAY": "Reintentar",
- "v4sDG-8": "Reintentar cargar {{value0}}",
- "t2QYxhU": "Cargando...",
- "kYWeCgo": "Archivo cambiado en el escritorio. Vuelva a cargar la vista previa antes de guardar",
- "nbgr4H0": "No se puede cargar la vista previa",
- "Jj_IDwY": "Archivo no encontrado",
- "X-whfMo": "No se puede acceder al sistema de archivos del escritorio",
- "ktGDvZE": "Vuelva a cargar la vista previa antes de guardar",
- "UFAFIP0": "Archivo demasiado grande para la vista previa móvil",
- "UfU4CAU": "Vista previa binaria no disponible",
- "2t0lh6U": "No se puede cargar la vista previa",
- "jLhPXXQ": "Otra interferencia de VPN",
- "ngjn4tY": "Host de Tailscale inaccesible",
- "AE3mc7A": "Tiempo de espera de conexión",
- "MED_8yU": "La aplicación de escritorio no se ejecuta",
- "amY3iCs": "Puerto de bloqueo de firewall 6768",
- "vuZn-_E": "Diferentes redes WiFi",
- "q-MNnd4": "Eliminar",
- "KuqR8FY": "Reparar",
- "ujiecek": "Reintentar",
- "IrfKQh8": "Error de autenticación: intente volver a conectarse primero; Si sigue fallando, vuelva a emparejarlo desde el escritorio.",
- "2LrOLw8": "Usar reinicio",
- "LN50bQ0": "Restableciendo…",
- "8CLIWuE": "Utiliza un reinicio obtenido para la cuenta activa del Codex",
- "Y2o7mgc": "Utiliza un reinicio obtenido para {{value0}}",
- "7uEIrNQ": "Utilice el restablecimiento del límite de velocidad del Codex",
- "fNZPjTQ": "Restablecimiento de los límites de tasas del Codex",
- "_g9qkig": "Agregar acceso directo",
- "N7UodPY": "Presione Entrar",
- "YZWk8R4": "Comando",
- "zkM-vYk": "Etiqueta",
- "ndVygIU": "Agregar",
- "GSrBito": "Más teclas: tabulador, flechas, F1–F12…",
- "QlB11DI": "Clave",
- "9jQVv-8": "Modificadores",
- "w7YJ0Kw": "Mostrar, ocultar o reordenar las teclas de método abreviado",
- "BFsLjpc": "Administrar atajos",
- "I-Rlhvc": "Enviar comando de texto personalizado",
- "fNBP1Us": "Macro de texto",
- "Y7zDQOM": "Crea acordes de las teclas Ctrl, Alt y Shift",
- "Lr_GVFQ": "Combinación de atajos",
- "v1Nn-IY": "Atrás",
- "WwKbTEk": "Función",
- "ClgDZUM": "Navegación",
- "1RunS2Y": "Edición",
- "Dl9mAnI": "Cambio",
- "Mz-qIO4": "Alt.",
- "OZLCEBo": "Control",
- "uGHhnC0": "Bajar",
- "ee4D14o": "Subir",
- "T-H1CUQ": "Utilice las acciones de subir y bajar para reordenar sin arrastrar",
- "-lwE4Q0": "Arrastra para reordenar",
- "qvnQ47I": "Comprobando la compatibilidad del host",
- "oJ3sUM4": "Descargar",
- "N18umz0": "Usar",
- "ri8swSc": "En uso",
- "qf7IWvA": "Configurar en el escritorio",
- "D90AZhs": "Conjunto de claves API",
- "PG_Pfbo": "· extrayendo…",
- "bh_QQps": "API abierta de IA",
- "TJd8_nE": "Recomendado",
- "6WwF0_8": "Dictado habilitado",
- "D5YFHLU": "Descargue un modelo y habilite el dictado en su escritorio, todo desde aquí.",
- "13hFHO4": "Configurar el dictado de voz",
- "kocNlo8": "No se pudo actualizar",
- "jX7Yn3E": "No se pudo seleccionar el modelo",
- "0rsS1Dw": "Falló la descarga",
- "lUsptPY": "No se pudo cargar",
- "GWwDGTE": "Reintentar",
- "RF7UWwo": "Reintentar cargar revisión",
- "W6MLNo0": "Diferencia truncada para vista previa móvil.",
- "e6R_IPM": "Cargando diff…",
- "Ku2wK-g": "Pruebe con un filtro de reseña diferente.",
- "3-RMeIo": "Sin cambios revisables",
- "e5sIbV0": "No se puede cargar la reseña",
- "r-dK9lI": "Revisión no disponible",
- "On0H_JY": "Cargando reseña...",
- "voLBMwU": "Enviar notas",
- "XNffV5A": "Enviar notas al agent",
- "a1hiCFE": "Etapa revisada",
- "XhmaYgY": "Archivos revisados en etapa",
- "du7kB18": "Revisión completa",
- "ls_e0g8": "Guardar",
- "-bToH9I": "Eliminar",
- "7BEb-8o": "Eliminar nota",
- "2lwuEDc": "Nota de revisión",
- "cy6hF-c": "Cancelar nota",
- "K4ExXj0": "Nota de archivo",
- "YlMekyY": "Línea {{value0}}",
- "SqSZ_D4": "Agregar nota",
- "vX8hCPw": "Editar nota",
- "QyPs23A": "Abierto en sesión",
- "lDOi4xI": "Marcar como no revisado",
- "9YSL2XY": "Archivos revisados por etapas",
- "AMn9p6c": "Borrar notas enviadas",
- "bboDcz4": "Enviar notas no enviadas",
- "SGgu3t8": "Copiar notas",
- "qljZwNc": "Nueva sesión de Agent",
- "ajcWpiI": "¿Descartar cambios a \"{{value0}}\"? Esto no se puede deshacer.",
- "1V8B5pc": "Descartar archivo",
- "_TCuNKQ": "{{value0}} archivos no preparados revisados se pueden preparar",
- "oCVOA0w": "Revisar acciones",
- "cq6J0Qk": "{{value0}} revisado, {{value1}}",
- "N0W7j-Y": "Pedazo",
- "-v8Njek": "Siguiente trozo",
- "co1PXQY": "trozo anterior",
- "PpqbMu4": "Duro",
- "6NQSDSg": "Editar nota de archivo",
- "cV_5zt0": "Cambió",
- "TGeBFA8": "Revisado",
- "Tqe6zfQ": "de {{value0}}",
- "OAIsqbU": "{{value0}} obsoleto",
- "n5_ZJMM": "Siguiente archivo",
- "gLGElnY": "Marca revisada",
- "gUbQPjk": "Revisado",
- "a2xZWo8": "Marcar archivo revisado",
- "vRhESp0": "Nota",
- "e_IyR5Y": "Agregar nota de archivo",
- "0CC3Pjk": "Archivo anterior",
- "lL_q8JA": "Descartar",
- "TpLj1K8": "Descartar archivo",
- "v58oW_E": "Quitar del stage",
- "VZPK0FM": "Archivo sin etapa",
- "JiM1DAU": "Agregar al stage",
- "SzcIpKs": "Añadir archivo al staging",
- "r-agX-k": "Todo",
- "qcWQKWI": "Mostrar archivos de revisión {{value0}}",
- "LU8BxDQ": "Abrir acciones de revisión",
- "GAXIVbU": "Abrir barra lateral de solicitud de extracción",
- "1lIaLfU": "Cambios",
- "Xot6WdE": "Atrás",
- "fEoGCmQ": "{{value0}}/{{value1}} revisado",
- "mIZ0_V0": "Editar nota en la línea {{value0}}",
- "mCd0V4A": "Agregar nota en la línea {{value0}}",
- "4bPe4Ao": "Actualice Orca de escritorio e inicie sesión para conectarse desde cualquier lugar",
- "HdJ9GVY": "Source",
- "BE93iOI": "Ver fuente HTML",
- "bvUfBWI": "Vista previa",
- "-FhPMsI": "Vista previa de HTML renderizado",
- "ywMqsWY": "[incógnita]",
- "kijMg1M": "{{value0}} más columnas",
- "Jmh-3ik": "{{value0}} más filas",
- "viizK3M": "Reintentar",
- "Re9yZkw": "Reintentar cargar la solicitud de extracción",
- "-ZCN2f0": "Cargando solicitud de extracción...",
- "O3OecWo": "main",
- "sLMnsJA": "bloque de código",
- "h1ikg-I": "Código inline",
- "fT3N_UQ": "Imagen",
- "eLAtZAk": "Enlace",
- "dQOT7tM": "Cita",
- "jPlQhig": "Lista de verificación",
- "_79TK6I": "Lista numerada",
- "hKyID9A": "Lista con viñetas",
- "wwdkeIc": "Tachado",
- "zwoUjcU": "Cursiva",
- "TcUIfHg": "Negrita",
- "qpILEoE": "H3",
- "T0-0mLw": "H2",
- "Tkw-XG4": "H1",
- "3Ph2vuM": "Cuerpo",
- "UIMZetU": "Nombre del espacio de trabajo",
- "ybPEhxk": "Nuevo espacio de trabajo",
- "VEK8Z7E": "Agent",
- "38lAWJQ": "Repositorio",
- "ZK7Il8w": "Crear espacio de trabajo",
- "g5YUeP0": "Conectar repositorio",
- "obLmzkw": "Ejecutar comando de configuración",
- "sZHa-TU": "Omitir",
- "0qYyICI": "Ejecutar",
- "0cbkbTE": "Script de configuración",
- "LMAqKNQ": "Nota",
- "ATo76K0": "Avanzado",
- "M2A4pJA": "Conecte el repositorio primero",
- "O93svfk": "Conectar",
- "oroOvnM": "Conectando...",
- "JNDDz3c": "Conexión SSH",
- "EFTSrpI": "Nombre del espacio de trabajo",
- "yymZMiQ": "Nombre o 'Crear desde'",
- "osrkufA": "No se encontraron repositorios",
- "sMWTBAA": "Elija un repositorio y un agent para crear un nuevo espacio de trabajo.",
- "C8UjQk0": "No se pudo confiar en el script de configuración.",
- "jSxyaws": "No se pudo crear el espacio de trabajo",
- "rwQDraY": "Elija si desea ejecutar el script de instalación.",
- "F1iAV4A": "El agent seleccionado está deshabilitado. Elige un agent habilitado antes de crear.",
- "kA_OuTE": "Volver a anfitriones",
- "h3ZwGv0": "Abrir versiones de GitHub",
- "oxg5VTs": "Abrir tienda de aplicaciones",
- "Pe9Dmhc": "No ejecutar",
- "hUSRq7I": "Confía siempre y corre",
- "wOCs5LA": "Ejecutar hooks",
- "m7jxYm8": "Script de configuración",
- "gxXtGpI": "Nuevo script de configuración",
- "JU7DVfY": "El orca.yaml de este repositorio se ejecuta antes de que comience el espacio de trabajo. Ejecútelo solo si confía en este repositorio.",
- "SSMlLr8": "¿Ejecutar la configuración desde {{value0}}?",
- "egQ-qgQ": "El script de configuración de {{value0}} cambió",
- "Lkm1Ms4": "Derivado del nombre",
- "CATZTEM": "Nombre de rama",
- "MJ_zXUU": "Nombre del espacio de trabajo",
- "jueQw6Q": "Nombre",
- "Yz166iM": "Reutilizar rama “{{value0}}”",
- "qOsqJv0": "Escribe un nombre o busca una fuente",
- "qNPX_ws": "Escriba el nombre de un espacio de trabajo en el campo siguiente.",
- "LbOI-wE": "Este repo SSH necesita un control remoto de GitHub para enumerar problemas y PR.",
- "2sNZWLI": "Conecte el repositorio para buscar fuentes.",
- "h8XKauY": "Cancelar",
- "A6zs-7I": "Hecho",
- "J6XOFqM": "Nombre o 'Crear desde'",
- "WDddFyg": "Este artículo se encuentra en {{value0}}/ {{value1}}.",
- "FLDQvbE": "Cambiar a {{value0}}",
- "HHq8Y80": "Escribe un nombre o busca una fuente",
- "eMl2uLM": "[Opcional]",
- "zTK803o": "Nueva sucursal",
- "dDSXnKk": "Crear rama \"{{value0}}\"",
- "Z7csSYQ": "Nombra este espacio de trabajo",
- "uK2T1OQ": "Utilice \"{{value0}}\"",
- "CgJBkqk": "Crear combinación de teclas o macro de texto",
- "d-64Q0E": "Agregar acceso directo personalizado...",
- "AwkMohI": "Aún no se han definido atajos personalizados.",
- "EGxWrwk": "ATAJOS PERSONALIZADOS",
- "_YyvrjM": "Muestra cada tecla de acceso directo incorporada en el orden original",
- "P0qiUsA": "Restablecer valores predeterminados",
- "Odmd4jg": "Alterne las teclas para mostrarlas u ocultarlas y mantenga presionada la tecla para arrastrar una tecla en el orden que desee en la barra de acceso directo del terminal.",
- "u1ZHouk": "BARRA DE ATAJOS",
- "NOYO7QE": "Cancelar",
- "8Zue0js": "Descargar",
- "jCov6Mc": "Eliminar",
- "EorN5mI": "Usar",
- "kg-vs7o": "En uso",
- "j2yOGiA": "Configurar en el escritorio",
- "JnTRemk": "Conjunto de claves API",
- "B45mQIQ": "Recomendado",
- "6qylM4Q": "Elija un espacio de trabajo de la barra lateral para abrir su terminal aquí.",
- "qe5Mx6E": "No hay espacio de trabajo abierto",
- "JLc6yd4": "hijos",
- "ugLQfPg": "hijo",
- "lCIVZpI": "Niño",
- "uQ24VuE": "Carpeta",
- "CkCg0Xk": "Los límites inactivos del Codex utilizan la identidad del proveedor incorrecta",
- "4NLLG4A": "Los límites de Claude inactivos utilizan la identidad del proveedor incorrecta",
- "N8kYEP4": "Los límites del Codex utilizan la identidad del proveedor incorrecta",
- "OWfo7Qc": "Los límites de Claude utilizan la identidad del proveedor incorrecta",
- "95Xks08": "Las cuentas WSL Codex requieren una distribución exacta",
- "OZiafyo": "Las cuentas de Host Codex no pueden nombrar una distribución WSL",
- "ZlNO6fQ": "Los objetivos de límite de velocidad de WSL requieren una distribución exacta",
- "EIhMdN0": "Los objetivos de límite de velocidad de host no pueden nombrar una distribución WSL",
- "zFyydp8": "Esta cuenta no tiene créditos de restablecimiento obtenidos disponibles.",
- "_-grAdc": "No hay reinicio disponible",
- "Um-XfOo": "No se ha agotado ningún período de límite de tasas del Codex elegible.",
- "JMEauuw": "Nada que restablecer",
- "3qHVa1w": "Se ha actualizado el uso del Codex.",
- "9b3h0Pg": "Restablecer ya aplicado",
- "QiJiFeQ": "Restablecimiento de límites de tarifas",
- "V9XaZZ8": "Descartar cajón",
- "84CVutM": "Terminal en blanco",
- "5hDxS58": "Esto gasta un reinicio obtenido por {{value0}} y restablece inmediatamente los períodos de límite de tasa elegibles.",
- "EzPa9ek": "¿Utilizar un restablecimiento del límite de velocidad?",
- "TKIeXbw": "No se pudieron restablecer los límites de tarifas",
- "rii7ZAs": "La cuenta o la oferta de restablecimiento cambiaron antes de que el anfitrión se comunicara con Codex. Revise los detalles actualizados y luego confirme nuevamente.{{value0}}",
- "4DQGAog": "Restablecer detalles cambiados",
- "W6bmrY4": "mermaid",
- "kPLcd1A": "Solicitud de extracción de enlace",
- "UzLJy8Q": "Enlace #{{value0}}",
- "5tB7Tdg": "#123 o https://github.com/owner/repo/pull/123",
- "D2wJo3U": "Número de PR o URL de GitHub",
- "ZLWuIYo": "Cancelar",
- "f8ZsL9k": "Vincular solicitud de extracción existente",
- "T0kbQLc": "Crear {{value0}}",
- "zouGGt0": "Crear borrador {{value0}}",
- "YpkfCr0": "Empujar y crear {{value0}}",
- "aUTTsqg": "Enviar y crear borrador {{value0}}",
- "3Yb2tD4": "Crear como borrador",
- "oPjbjuk": "Base",
- "UsM_A3E": "Generando título y descripción…",
- "-QF2aQc": "{{value0}} descripción",
- "-uhp5Eo": "Descripción (opcional)",
- "CYW43ss": "{{value0}} título",
- "JnixruY": "Título",
- "56ar5ss": "Cancelar",
- "w4jN8ic": "Generar",
- "E5u75yA": "Generando…",
- "Tf6JzYM": "No se pudieron generar campos de PR",
- "gTT3Qik": "Nuevo {{value0}}",
- "LINjP1k": "Sucursal actual no disponible.",
- "_svp6us": "El panel de revisión alojado no está disponible para este proveedor.",
- "nO4i6C8": "Desconectar",
- "ZqSwRWA": "Desvincular solicitud de extracción",
- "zRLzboM": "Reabrir",
- "gL1buuY": "Cerrar",
- "2xdqaDc": "Reabrir solicitud de extracción",
- "Pz82S8w": "Cerrar pull request",
- "Al6-RQA": "Desactivado",
- "oSg4C5A": "Activado",
- "X0q7qvA": "Alternar fusión automática",
- "0J91CIk": "Fusionar automáticamente cuando esté listo",
- "8xiSsiA": "Fusionar solicitud de extracción",
- "3XhqaKU": "#{{value0}} se reabrirá.",
- "oCXRjL8": "¿Reabrir la solicitud de extracción?",
- "b_7nPgo": "#{{value0}} se cerrará sin fusionarse.",
- "02Qj2V4": "¿Cerrar solicitud de extracción?",
- "zNuHY-c": "Esto fusionará #{{value0}} en su rama base.",
- "_0lAHWg": "¿Fusionar solicitud de extracción?",
- "uLhV2xU": "No se pudo desvincular la solicitud de extracción.",
- "q6iGz3o": "Mostrando los primeros 100 jobs",
- "HW_qZBo": "Mostrando las primeras 20 anotaciones",
- "x1QqPYg": "Anotaciones",
- "xJbH0vA": "No hay detalles disponibles.",
- "WPX7hnI": "Abra {{value0}} en la web",
- "wKKGPQ8": "{{value0}} verificar detalles",
- "QiC7wz8": "Arreglar",
- "O95nvcA": "Solucionar controles fallidos con IA",
- "t67jzCk": "Inspecciona los detalles o inicia una pasada de corrección con IA.",
- "TkRK-a4": "Volver a ejecutar comprobaciones fallidas",
- "hyZyn8M": "Checks",
- "XfucVi0": "{{value0}} verificación fallida{{value1}}",
- "W8A4HvA": "Esto elimina permanentemente el comentario en GitHub.",
- "xGeFr98": "¿Eliminar comentario?",
- "p4p6sek": "Escribe una respuesta…",
- "7oybC2M": "Resolver",
- "A6XXe-4": "Marcar como no resuelto",
- "2PITe20": "Resolver hilo",
- "mkEkYMY": "Hilo sin resolver",
- "4idOoK8": "Eliminar",
- "u9hUgiY": "Eliminar comentario",
- "wS1VT0I": "Editar",
- "Fs36PXM": "Editar comentario",
- "Ragn9hY": "Responder",
- "s3o5DeE": "Responder al comentario",
- "Bnwan2Q": "Editar comentario…",
- "FKCKtAo": "Abrir comentario en GitHub",
- "C_gXfCo": "resuelto",
- "EXMnl_4": "Cancelar",
- "2Mrfqx0": "Añade un comentario…",
- "xX8eZhc": "Aún no hay comentarios.",
- "FVdefgc": "No se pudieron cargar los comentarios. Toca actualizar para volver a intentarlo.",
- "_l0TaO0": "Comentarios",
- "vdfQtbs": "No se proporcionó descripción.",
- "hO2eecI": "No se pudo cargar la descripción. Toca actualizar para volver a intentarlo.",
- "6VkqcQk": "Descripción",
- "vV46Tns": "Mostrar {{value0}} más de {{value1}}",
- "cHoCGwY": "Mostrar {{value0}} más",
- "wAwFDJY": "Resuelto {{value0}} por {{value1}} {{value2}}",
- "zrerXGc": "Resolver conflictos con IA",
- "w2WcFns": "Archivos con conflictos",
- "KuLUlYc": "Copiar comandos",
- "7E56l1g": "Copiado",
- "6TXtA4Q": "Copiar comandos para actualizar la capacidad de merge",
- "39Nl8mw": "Ejecutar desde este worktree",
- "7Qv5eYo": "Esta rama tiene conflictos que deben resolverse",
- "93sCYQo": "{{value0}} commits por detrás (commit base:",
- "ngn4NjA": "{{value0}} commit por detrás (commit base:",
- "mTbAh0Q": "commit",
- "DnSMHG0": "Conflictos",
- "8Est-xI": "Quitar {{value0}}",
- "jBToX-I": "No se solicitaron revisores",
- "T5Uc4Ao": "No se pudieron cargar revisores. Toca actualizar para volver a intentarlo.",
- "Ryr3DCQ": "Cargando revisores…",
- "fX2uAEU": "Revisores",
- "E5rQqRQ": "Agregar o eliminar revisores",
- "E2VHius": "Editar título de solicitud de extracción",
- "oBmCrB8": "Guardar",
- "xOwofss": "Guardar título",
- "UgBLL4w": "Cancelar",
- "D-7jM08": "Cancelar edición del título",
- "nbfmLgg": "Abrir solicitud de extracción #{{value0}} en la web",
- "eNX9Nmo": "Vincular un PR existente",
- "_mT5R7M": "Vincular una solicitud de extracción existente",
- "SRr0o4U": "La sucursal actual no está vinculada a un PR abierto.",
- "CmpszXU": "{{value0}} no está vinculado a un PR abierto.",
- "maf-eds": "Actualice para verificar nuevamente o cree un nuevo PR para esta sucursal.",
- "G2BaE-Y": "No hay solicitud de extracción abierta",
- "I3xSuPA": "PR vinculado #{{value0}} no disponible",
- "5kE-iVM": "Crear PR",
- "Y_NnJ9M": "Crear solicitud de extracción",
- "YZFe3Qg": "Actualizar solicitud de extracción",
- "TSDVcKU": "Pull request",
- "tca0V2E": "No se pudo crear la solicitud de extracción.",
- "EMFMGnw": "Consulte una sucursal antes de crear una solicitud de extracción.",
- "6OYLM7w": "No hay personas que coincidan",
- "Ne-d-yA": "buscar personas",
- "K34xo24": "Revisores",
- "dVs-M9I": "No se pudieron cargar personas",
- "_IeDTL8": "Revisado",
- "NEg29tM": "Pendiente",
- "dmAcep8": "Despedido",
- "bF0aphw": "Comentado",
- "rjj84-Y": "Cambios solicitados",
- "IloG18k": "Aprobado",
- "hCKjn9A": "Sin comprobaciones",
- "_RfDeuw": "Bots",
- "4fGywsA": "Humanos",
- "rkpE-Mg": "Todo",
- "u8NH0Xk": "Esc",
- "rfYWlSA": "Enviar texto al navegador",
- "g3GvsOs": "Escribe en la página…",
- "48esWoc": "DE ACUERDO",
- "RXEfHVA": "Cancelar",
- "z1nkBLw": "Diálogo del navegador",
- "-00MlTU": "URL",
- "GVCAd00": "Recargar",
- "-YMBg9U": "Reenviar",
- "a_PEZW8": "Atrás",
- "5dQ6Hbc": "Introduzca una URL válida.",
- "ZoS2fOc": "Se agotó el tiempo de espera de la transmisión del navegador.",
- "YmwDAcU": "La página del navegador aún no está disponible.",
- "lBu6FGw": "Comprobando la compatibilidad con la transmisión por secuencias del navegador de escritorio.",
- "X2WJPN4": "Actualice Orca de escritorio para transmitir las pestañas del navegador en el móvil.",
- "gZUBadw": "{{value0}} modificador de clic",
- "GTbLYFM": "Cambio",
- "fP87QIY": "Alt.",
- "EqW8StQ": "Control",
- "IW8xp4k": "comando",
- "lV607bI": "Mostrar vista del sitio web {{value0}}",
- "eJJUzYE": "Móvil",
- "3TuUR-s": "Web",
- "p7fz5tw": "Reanudar sesión del agent",
- "f1-v-HM": "worktree actual",
- "tL7Cy3c": "mensajes",
- "fZXkGhQ": "mensaje",
- "L_8qprI": "No hay sesiones de agents anteriores en este ámbito.",
- "X8748Hs": "Ninguna sesión coincide con tu búsqueda.",
- "KkgSO8k": "Sin sesiones de agent",
- "Uc72mxE": "Sesiones de búsqueda, repo:, ruta:",
- "7OL03t8": "Reintentar",
- "IFh38kk": "No se puede cargar",
- "D1lHtt4": "Actualice Orca en este host para explorar el historial de sesiones del agent.",
- "yRlsHYk": "Historial de sesiones del Agent no disponible",
- "Qvd5WD0": "Actualizar sesiones de agents",
- "z2KOXZE": "Historial de sesiones de Agents",
- "bGNaHw8": "Atrás",
- "HsI5rsc": "No se pudo reanudar la sesión.",
- "sibM7yE": "Sesión del Agent en cola.",
- "ADvyKkM": "No se puede determinar la plataforma de alojamiento.",
- "8fvhHmw": "A esta sesión le falta una identificación de currículum.",
- "BLr07Ao": "Esperando al anfitrión...",
- "rcPfxtE": "Todo",
- "dhgeP_o": "Proyecto",
- "0k6Zchk": "Espacio de trabajo",
- "E5PTzrk": "{{value0}} {{value1}} omitido",
- "nSh69OQ": "Esperando al anfitrión…",
- "Au06U2c": "Historial de sesiones de Agents",
- "XjyxBLA": "Control de código fuente",
- "pBOdX2k": "@orca_build",
- "qfIlnqY": "stablyai/orca",
- "1sjQKuE": "onOrca.dev",
- "wRf8z4A": "IDE de agent de código abierto para constructores 100x",
- "o1zkACA": "Orca",
- "qBqOdtg": "Acerca de",
- "wdyLCXU": "Abrir enlaces de terminales",
- "K6VU-6c": "Elija dónde se abren los enlaces HTTP(S) seleccionados en la salida del terminal.",
- "gh7VaTc": "ENLACES",
- "GJwMNak": "Navegador",
- "Wj6QRnE": "Ábralo en Safari, Chrome u otro navegador en este teléfono.",
- "hIo6XgE": "Navegador de teléfono",
- "Z49nZqQ": "Ábralo en el navegador transmitido desde su escritorio emparejado.",
- "OcnHGtE": "Navegador Orca en el escritorio",
- "POUjxlM": "No hay hosts emparejados.",
- "FX9lUwo": "Aún no hay eventos de conexión en esta sesión. Los eventos aparecen cuando la aplicación llama a este host.",
- "GiZXYb8": "Copiar diagnóstico",
- "DYy9eRs": "Copiado",
- "mu5iayg": "· intento {{value0}}",
- "x43FzPs": "Registro de conexión",
- "rqAbU9s": "estas conectado",
- "bKwbnYs": "escanea el código",
- "N1Ra8Og": "Abrir el escritorio de Orca",
- "o8-uNXo": "¿Quitar \"{{value0}}\"? Puedes volver a emparejarlo más tarde.",
- "yOJT3HY": "Quitar anfitrión",
- "t1m0jcA": "Eliminar",
- "dqjXxV8": "Editar anfitrión",
- "RwT781U": "Desconectar",
- "JnIDr0Y": "7d",
- "_KqkyAU": "5h",
- "VXpHvL4": "Uso de la cuenta",
- "8CNCPA8": "Nuevo espacio de trabajo",
- "lWqrsbM": "Emparejar escritorio",
- "1St5QBU": "Acciones rápidas",
- "y7w0hIs": "Tareas",
- "ROZQW2U": "Reanudar",
- "81Qrbno": "Escritorios",
- "TPknwrs": "PRs creados",
- "4uJ9yUY": "Tiempo de Agents",
- "qFFbXcQ": "Agents iniciados",
- "9i5ZhFo": "Bienvenido de nuevo",
- "9HldFAc": "como funciona",
- "QT_H7rk": "Emparéjese con Orca en su computadora para controlar a sus agents, acceder a cualquier terminal y realizar el trabajo desde su teléfono.",
- "8vieqXE": "Conecta tu escritorio",
- "VjaDNq0": "Orca",
- "GLgoz1s": "Por favor inténtalo de nuevo.",
- "U7WlIpo": "No se pudo eliminar el host",
- "tNj4XnM": "Abrir {{value0}} tareas",
- "1_sz9cs": "No hay fuentes de tareas conectadas",
- "aOm3VN4": "Progreso de incorporación",
- "mB8kw4M": "Orca",
- "6vGSxlM": "La configuración de notificaciones no se pudo actualizar. Intentar otra vez.",
- "Dl9ttFI": "Su elección no se pudo guardar. Intentar otra vez.",
- "LutlQWg": "Sesiones abiertas en la interfaz de usuario de Chat",
- "p0ydSMw": "Desactivado",
- "OXcAS68": "Activado",
- "sW_6PG4": "Elija cómo se abren en este dispositivo las sesiones de agents compatibles (Claude, Codex y otros agents con capacidad de chat). La terminal muestra la CLI sin formato; La interfaz de usuario de chat muestra una interfaz de chat como la aplicación de escritorio. Aún puedes cambiar cualquier sesión individual desde su menú de pulsación larga.",
- "R7mksio": "VISTA PREDETERMINADA",
- "ao09T48": "Chat UI",
- "yTJLwao": "Atrás",
- "x7lqDGA": "Abrir configuración",
- "aXWuT8I": "Notificaciones de Agents",
- "GIjQvDw": "Notificaciones",
- "sKiKFEI": "De vuelta a casa",
- "zDZEMlw": "Conectando…",
- "gZ1SfD8": "Cancelar",
- "V-NORJA": "Par",
- "3LfZ8xU": "Abriste un enlace de emparejamiento desde tu escritorio. Confirma para agregarlo a tus hosts.",
- "ymuJ-Uc": "¿Emparejar con este escritorio?",
- "AHFOidY": "Error de emparejamiento: {{value0}}",
- "uZiEDJ8": "No se pudo conectar dentro de {{value0}}s; consulte el registro a continuación para saber dónde se detuvo",
- "-jAAi0E": "orca://pair?code=... or paste the code",
- "G-MJBZU": "Copie el código que se muestra debajo del QR en su computadora.",
- "klFU7hQ": "Pegar código de emparejamiento",
- "Q_qrUNw": "Pegar el código en su lugar",
- "_C6l3j4": "Intentar de nuevo",
- "T3HZLEU": "Conectando…",
- "U_fkYz4": "O pegue el código de emparejamiento",
- "dTFolus": "Escanea el código QR",
- "mPdpsdo": "Vaya a Configuración → Móvil",
- "dFxLHEw": "Abre Orca en tu computadora",
- "wvDgXHk": "Abrir configuración",
- "Scz67W0": "Continuar",
- "b6n4c_8": "Habilite el acceso a la cámara en Configuración o pegue el código de emparejamiento.",
- "InfekMg": "Escanee el código QR de Orca en su escritorio o pegue el código de emparejamiento.",
- "sBkGoYA": "Acceso a la cámara deshabilitado",
- "0VOtRkg": "Emparejar con escritorio",
- "HVl7cpc": "Error de emparejamiento: {{value0}}",
- "zyTFKp4": "No se pudo conectar dentro de {{value0}}s; consulte el registro a continuación para saber dónde se detuvo",
- "feaDGg4": "No es un código de emparejamiento válido: cópielo desde su computadora y péguelo nuevamente",
- "iHaWj50": "No es un código QR de Orca válido",
- "AIhB-fM": "De vuelta a casa",
- "eQE_ziw": "Falta el código de emparejamiento",
- "cFPanOU": "Apoyo",
- "7jufUfc": "política de privacidad",
- "EJmGYjM": "Reintentar",
- "ks7el1o": "Vuelva a intentar borrar las credenciales de emparejamiento",
- "kiQMppk": "No se pudo verificar el estado de limpieza en este dispositivo. Vuelva a intentar estar seguro.",
- "Wh-JD8U": "No se pudo confirmar la limpieza de {{value0}} credencial{{value1}} en este dispositivo.",
- "K-uhruk": "Aún no se ha podido confirmar la limpieza. Vuelve a intentarlo más tarde.",
- "BFrWnfA": "Limpieza de credenciales de emparejamiento",
- "EELdtVU": "Acerca de",
- "0aipMZQ": "Solución de problemas",
- "i8QR0SY": "Notificaciones",
- "rm30Zkg": "Voz",
- "ttAM7Ds": "Navegador",
- "-aB74WM": "Chat UI",
- "QlyWJyY": "Terminal",
- "0cOgjik": "Ajustes",
- "lfAeAOI": "Tamaño del texto del terminal",
- "nN25Xmo": "Restaurar {{value0}}",
- "rE4IiF8": "Desactivado",
- "qR5mpHo": "Activado",
- "AsTLd6A": "Autocompletar y autocorrección",
- "mK_kCfI": "Habilite las sugerencias de autocompletar, autocorrección y ortografía al estilo del teléfono en la barra de comandos del terminal. Está desactivado de forma predeterminada para que el teclado nunca reescriba comandos, indicadores o rutas. La entrada directa del teclado (cuando las teclas van directamente al terminal) siempre envía pulsaciones de teclas sin formato, por lo que las sugerencias no se aplican allí.",
- "18J3yr0": "ENTRADA DE TECLADO",
- "QcL6LT4": "Tamaño del texto",
- "nzfG92c": "Escale el texto del terminal. Los tamaños más pequeños se ajustan a más columnas con márgenes laterales; los tamaños más grandes muestran menos columnas: arrastre hacia los lados para realizar una panorámica. También puedes pellizcar para hacer zoom en el propio terminal, lo que actualiza esta configuración. Solo visualización por dispositivo; no cambia el terminal de escritorio.",
- "OS-rNTI": "TAMAÑO DEL TEXTO",
- "U2mtyZg": "Aún no hay escritorios emparejados. Empareje uno para controlar el comportamiento del terminal.",
- "-fV3Ce8": "Mientras usas una terminal en tu teléfono, Orca la reduce para que se ajuste a tu pantalla. Cuando cierra la aplicación o la abandona, esto controla si permanece en el tamaño del teléfono (para que las herramientas CLI interactivas no vuelvan a fluir) o cambia de tamaño a su escritorio. Siempre puedes usar Restaurar este terminal o Restaurar todos los terminales en el banner para cambiar el tamaño manualmente.",
- "f9vgUHc": "CUANDO DEJAS LA APLICACIÓN",
- "kJj5Z2g": "Terminal",
- "rU9qdt0": "Después de 30 minutos",
- "p2EWmRg": "Después de 5 minutos",
- "gBGOsCI": "Después de 1 minuto",
- "q6VQcZE": "Mantener en tamaño de teléfono (predeterminado)",
- "75Kr_24": "Más grande (200%)",
- "tAn81tY": "Más grande (150%)",
- "HqP6IBw": "Grande (125%)",
- "0OKOsKY": "Predeterminado (100%)",
- "CAs8oUM": "Más pequeño (75%)",
- "hiouM1M": "Más pequeño (50%)",
- "2J8vm70": "Problemas comunes",
- "bwJLtK4": "Ver registro de conexión",
- "5xQU6vw": "Ejecutar diagnóstico",
- "B5C2aso": "Corre de nuevo",
- "dQs8-jc": "Ejecutando…",
- "DIEmGuM": "Solución de problemas",
- "8sOFcoA": "Plataforma",
- "Ie918PM": "Hosts",
- "3gA9qeo": "Internet",
- "_IfUZ2s": "Anfitriones emparejados",
- "C-t7pm8": "Modelo de voz",
- "n-BJK-c": "MODELO DE DISCURSO",
- "uwVWBGE": "Alternar: presione una vez para comenzar y nuevamente para detener. Mantener: dictar mientras se mantiene presionado.",
- "Jh4zuEU": "Modo de dictado",
- "4g1gMYA": "Dicta texto en cualquier panel enfocado de tu escritorio.",
- "23v3WVE": "Habilitar dictado de voz",
- "L4c5Sxw": "DICTADO",
- "pJrwjt0": "Conéctese a un escritorio para administrar la configuración de voz.",
- "pSmQbNo": "Voz",
- "Wgx1aTY": "Error al eliminar",
- "O-GK4L4": "Falló la descarga",
- "cpL32fY": "No se pudo seleccionar el modelo",
- "PiXz3AQ": "No se pudo actualizar",
- "wFKD2Es": "No se pudo cargar la configuración de voz",
- "hYUl_w0": "Mantener",
- "yxHp0Uc": "Alternar",
- "fO2nz88": "Solicitud de extracción",
- "AcEIxcI": "Cambios",
- "atubgYk": "Historial de sesiones de Agents",
- "MZqxT8s": "Control de código fuente",
- "wtxV_i4": "Terminal",
- "YTfV9-o": "Tareas",
- "KVY3pfk": "Cuentas",
- "0zcPPW8": "Editar anfitrión",
- "esqB5TM": "Host",
- "lXRU_hQ": "Agregue o vuelva a autenticar cuentas desde Configuración de escritorio → Cuentas.",
- "z0N4v1Y": "Cargando cuentas…",
- "XheJ_p8": "Cuentas",
- "08ocQGs": "7d",
- "YmnN8fw": "5h",
- "rjJXJpg": "Utilice el inicio de sesión propio del agent",
- "uuo9M60": "Predeterminado del sistema",
- "5TVCgEg": "No se pudo cambiar de cuenta",
- "nnr0WpI": "Anfitrión no encontrado",
- "Cop_m2o": "Instantánea de cuentas no válidas del host",
- "sqHaM-Q": "Conectándose a {{value0}}…",
- "dYplni8": "Acepta IP, host:puerto o ws:// / wss://. El puerto que falta tiene como valor predeterminado el puerto actual (o 6768).",
- "kMmtf5E": "Dirección",
- "jHccG1s": "Nombre de host",
- "wLjwLQg": "Nombre",
- "KytWtss": "Cambie el nombre para mostrar o la dirección de conexión. Las ediciones de direcciones solo cambian el lugar donde se conecta este teléfono; no se vuelven a emparejar. Utilícelo cuando se pueda acceder al mismo escritorio en una IP diferente (por ejemplo, LAN doméstica o Tailscale).",
- "LS3NecQ": "Volver",
- "OOhGw28": "Guardar",
- "ugYhCr4": "Guardar host",
- "NKISHlY": "Editar anfitrión",
- "K8w9o8U": "Atrás",
- "sI26LXo": "No se pudo guardar el host.",
- "7UECNUc": "Introduzca un nombre.",
- "koyS6Oc": "No se pudo cargar el host.",
- "T_ULLfI": "Este host fue eliminado de este teléfono.",
- "yLNjPPk": "Anfitrión desaparecido.",
- "eB5hKE4": "Se conecta a {{value0}}",
- "HbMqJ5k": "¿Quitar \"{{value0}}\"? Puedes volver a emparejarlo más tarde.",
- "tndsmJE": "Quitar anfitrión",
- "PCaw7X8": "Eliminar",
- "7b05QJE": "Dormir",
- "jQgIadE": "Cancelar",
- "sCHpXNI": "Eliminar worktree",
- "aCNuYPE": "Repositorios",
- "MFWDh4g": "Ocultar rama predeterminada",
- "1w-t3vQ": "Ocultar en reposo",
- "bd8B2ME": "Espacios de trabajo",
- "5IYckMg": "Limpiar filtros",
- "S8jJ9v4": "Filtrar",
- "fVWdjBk": "Agrupar por",
- "hFsVshM": "Ordenar por",
- "sUx-id0": "PR",
- "CzGUIP8": "Repo",
- "GAUYfWk": "Estado",
- "mZ5NlSU": "Agrupar",
- "LgVSSVY": "Buscar espacios de trabajo",
- "AYkrJs8": "Cerrar búsqueda",
- "LIEbwVI": "Nuevo espacio de trabajo",
- "qs3IfgE": "Espacio de trabajo flotante",
- "V5DOCOQ": "Tareas",
- "CVlu0tE": "Cuentas",
- "KYYIQO4": "Espacios de trabajo grupales",
- "jZR1hFw": "Ordenar por {{value0}}",
- "kz_Kdkw": "Filtrar espacios de trabajo",
- "6oNXq-k": "Filtrar espacios de trabajo, 1 filtro activo",
- "DxBfvEc": "Filtrar espacios de trabajo, {{value0}} filtros activos",
- "Iq0v42M": "Ocultar barra lateral",
- "2FFC6Og": "Reconectar",
- "IDkp2AI": "Volver a anfitriones",
- "QHBQ8yI": "Por favor inténtalo de nuevo.",
- "P_OTj14": "No se pudo eliminar el host",
- "2FRJWFs": "Anfitrión no encontrado",
- "2hirWvg": "Filtro{{value0}}",
- "asTmnrM": "¿Eliminar \"{{value0}}\" ({{value1}})?",
- "ZhTpuGQ": "Actualizar elemento",
- "sSNY3pg": "Solicitud de extracción de fusión",
- "cR4zEEM": "Solicitud de fusión",
- "l77C_aI": "Elija cómo se debe fusionar esta solicitud de extracción.",
- "AxbwZZ0": "Elija cómo se debe fusionar esta solicitud de combinación.",
- "ax5V10c": "método de fusión",
- "ZDweAzI": "Cambiar estado",
- "Fc7HS-c": "Solicitud de fusión de fusión",
- "QnAsBMo": "GitHub informa conflictos de fusión.",
- "MPMGVuk": "Fusionar solicitud de extracción",
- "vW7-nd4": "Copiar enlace de GitHub",
- "xD9cVOU": "Copiado",
- "tS4SSLM": "Copiar enlace Linear",
- "14O3-ys": "Crear espacio de trabajo",
- "ftImAuc": "Creando...",
- "D7U7kB4": "Sin comentarios.",
- "AXmMT_g": "Discusión",
- "z1ts1Vw": "Agregar subtema",
- "G6AAKyI": "Título del sub-issue",
- "czxJ7iQ": "Abrir",
- "8MKn4Lk": "Sin subproblemas.",
- "yIapPk8": "Subtemas",
- "-uupizo": "No hay ejecuciones de pipeline para este MR.",
- "pzBhZI4": "Ninguno",
- "re5Bmac": "{{value0}} empleos",
- "iaudYyQ": "Pipeline",
- "XLoI3kU": "Contenido del archivo no disponible.",
- "jh3_4KI": "Archivo binario.",
- "DtNbEWc": "Marcar visto",
- "11IaYcI": "Marcar como no visto",
- "PYs8iJY": "Vista",
- "_Qr_OQY": "Ocultar",
- "WhM0uCg": "Archivos modificados",
- "Ct4OwyY": "No se encontraron cheques.",
- "Hhu9oHM": "Vuelva a ejecutar todo",
- "jphAkJQ": "Error al volver a ejecutar",
- "ruk6BoQ": "Actualizar",
- "XlbT3Zg": "Comprobaciones",
- "KoPjVCY": "Solicitar revisión",
- "WTd49qc": "Solicitar revisores",
- "k2ppyKs": "No se encontraron sugerencias de revisores.",
- "Re-pmxo": "Cargando revisores...",
- "ifA4snA": "No se solicitaron revisores.",
- "hDVISbQ": "Revisores",
- "FQRH8fY": "Actualizar asignatarios",
- "X_A_K1Q": "Eliminar nombres de usuario, separados por comas",
- "K9otrEQ": "Agregar nombres de usuario, separados por comas",
- "--H0boQ": "No se encontraron usuarios asignables para este repositorio.",
- "gX4WIW4": "Cargando asignados...",
- "oL0nsd4": "Asignados",
- "K9OxCfg": "Actualizar etiquetas",
- "gyu0Q6w": "Quitar etiquetas, separadas por comas",
- "ByJ_aqM": "Agregar etiquetas, separadas por comas",
- "ySDu5JQ": "No hay etiquetas en este repositorio.",
- "vYfgNJ8": "Cargando etiquetas...",
- "GhHLbBA": "Etiquetas",
- "OOzqk6Q": "Guardar título",
- "6b2exyc": "Título",
- "bmXEQhk": "Guardar descripción",
- "xX2Cp7c": "Descripción",
- "iM5LG78": "Proyecto",
- "b3RSkG0": "Asignado",
- "Fa6K7yI": "Estado",
- "o2-QUvU": "Tipo",
- "mDTZEr4": "Actualizar detalles",
- "bS5_420": "Merge requiere este repositorio en Orca.",
- "9bffkjg": "Cerrar elemento",
- "vegmy2w": "Reabrir elemento",
- "jKf3DPI": "Abrir en GitHub",
- "fngWtc4": "Los espacios de trabajo solo se pueden crear a partir de propuestas de GitHub y solicitudes de extracción.",
- "MVHK0qg": "Eliminar",
- "BhSglbo": "Editar",
- "2MyR_iQ": "Responder",
- "Rjjl1iA": "Resolver hilo",
- "qEc1OYo": "Reabrir hilo",
- "Fv7ly30": "Cancelar",
- "xxWLKS8": "Guardar",
- "loMCIgM": "Editar comentario",
- "z1fMPAI": "Mostrar",
- "Uv1hPbA": "{{value0}} comentarios",
- "GKSPk20": "Borrar campo",
- "akD0kZQ": "Guardar campo",
- "5gzka0E": "Texto",
- "1jNZjFQ": "Número",
- "KulyzJY": "AAAA-MM-DD",
- "CXQp8Pw": "No hay iteraciones disponibles.",
- "6tQv41I": "Introduzca una fecha como AAAA-MM-DD.",
- "DqtxPEI": "Introduzca un número válido.",
- "JV1Xsds": "Campos de proyecto",
- "3p4QMPc": "Borrar tipo",
- "5DEGuK4": "No hay tipos de problemas configurados para este repositorio.",
- "w23rmTc": "Cargando tipos de problemas...",
- "1YuDgI8": "Tipo de issue",
- "NnYhRJs": "Elemento del proyecto",
- "jGZods8": "Borrador de tema",
- "xcg6mvE": "Issue",
- "Bawm-QY": "Pull request",
- "eGT8LNM": "Copiar repositorio",
- "p3aCd2Y": "Repositorio no está en Orca",
- "eNyNmbU": "No ejecutar",
- "llz-FzM": "Confía siempre y corre",
- "520CKU4": "No se pudo confiar en el script de configuración.",
- "m-fVevQ": "Ejecutar hooks",
- "XPutx64": "Script de configuración",
- "vtdIQWU": "Nuevo script de configuración",
- "Q3oUbk4": "El orca.yaml de este repositorio se ejecuta en su máquina antes de que comience el espacio de trabajo. Ejecútelo solo si confía en este repositorio.",
- "M_Pqsow": "¿Ejecutar la configuración desde {{value0}}?",
- "QetdCKc": "El script de configuración de {{value0}} cambió",
- "xd1VuYs": "Saltar configuración y crear",
- "b0Ah5tg": "Ejecute la configuración y cree",
- "N0pQdfg": "¿Ejecutar el script de configuración?",
- "g2mP3mE": "src/renderer packages/ui",
- "chkWwSI": "Directorios",
- "oh8k9MM": "UI del renderer",
- "7dCN6Lk": "Nombre",
- "al2hOTo": "Editar preajuste disperso",
- "m6fKanI": "Nuevo preajuste disperso",
- "6-gKCU8": "Nuevo preset",
- "m38OFiM": "Utilice todo el repositorio",
- "0fqNjoo": "Checkout completo",
- "6xj6dHo": "Pago escaso",
- "uwfc5JU": "Ninguna rama coincide.",
- "ajFYYlY": "Utilice la base configurada de este repositorio",
- "tJhJMIQ": "Rama predeterminada",
- "ww9236A": "Buscar ramas",
- "O0AHKnE": "Elija una sucursal existente o ref.",
- "vqofDcI": "Empezar desde",
- "wD7tyKU": "Agent",
- "RBS8OI4": "Repositorio",
- "SWOSFtY": "Conectar repositorio",
- "phVPn2Q": "Detectando agents...",
- "4F__ZBY": "Repositorio no encontrado.",
- "6kKiG2U": "Agregue un repositorio Git antes de crear un espacio de trabajo Linear.",
- "naggWL4": "Empezar desde",
- "8PDq1d4": "Avanzado",
- "SRP0mzk": "Conecte el repositorio primero",
- "5URSVzY": "[Opcional]",
- "nr-rmnA": "Nombre del espacio de trabajo",
- "eDrVQno": "Conectar",
- "HIci8AI": "Conectando...",
- "hcl0Sms": "Conexión SSH",
- "UHWW7sY": "Crear espacio de trabajo en",
- "8aaa0oM": "Su clave se cifra a través del llavero del sistema operativo host y se almacena localmente.",
- "KV_5X9g": "Configuración Linear/Seguridad/Nueva clave API",
- "CCoHJhM": "lin_api_...",
- "a4vIye8": "Clave API personal",
- "6EAEvD4": "Pegue una clave API personal para explorar problemas desde ese espacio de trabajo.",
- "jbMHil8": "Conectar espacio de trabajo Linear",
- "Xg1P3sw": "Equipo Linear",
- "wSJtlQc": "Crear problema",
- "cnRpEac": "Agregar contexto",
- "dxkQ090": "Título de la tarea",
- "GbFyuJM": "Origen",
- "CF9OlC4": "Upstream",
- "3U3WMlI": "Fuente de issues",
- "czBdX7w": "Equipo",
- "ZXVz3A4": "Cree una incidencia en el equipo Linear seleccionado.",
- "V9yDSos": "Cree un problema en el repositorio seleccionado.",
- "QoLelVI": "Ordenar tareas",
- "Jhimi1k": "Propiedades de visualización",
- "skslBcE": "Ordenar cuestiones Lineares",
- "4wjHjFU": "Problemas Lineares del grupo",
- "59_okJI": "Vista Linear",
- "GpSeJMA": "No hay estados disponibles",
- "_mQhK7g": "Cargando estados...",
- "xw1L5lQ": "Cambiar estado",
- "dEIGNBo": "Todos los equipos",
- "UL55j-A": "Elija qué equipos aparecen en Tareas.",
- "ZnNVwOs": "Equipos Lineares",
- "nLSftbc": "No se pudo cambiar el espacio de trabajo",
- "3Nokros": "Espacio de trabajo Linear",
- "jnRj_2I": "Filtro Linear",
- "k98CNAU": "Filtro GitLab",
- "roI3I5g": "Vista de GitLab",
- "EQxa0Qk": "Oculto de las tarjetas",
- "p0Rtsu4": "Mostrado en tarjetas",
- "nOtNSyE": "Esta vista no tiene campos adicionales para mostrar.",
- "3YhoII8": "Elija qué campos de proyecto aparecen en las tarjetas de artículos.",
- "kqKUAww": "Campos del proyecto",
- "TcKUEto": "Ordenar proyecto",
- "pTwUfTs": "Orca aún no admite este diseño del Proyecto GitHub.",
- "E_vNSwU": "Vista del proyecto",
- "4KsU0uw": "Elija la vista del proyecto",
- "RzP96Tg": "No más proyectos.",
- "HH8i3aE": "No hay proyectos coincidentes.",
- "yJYA52k": "Explorar todo",
- "2BAkBs4": "Explorar todo (cargando...)",
- "70mLMDk": "Fijar",
- "d2YMdrw": "Reciente",
- "6WVhiZM": "Eliminar",
- "Rn74bFA": "Fijado",
- "0Dc-Ym0": "Toca para volver a intentarlo.",
- "dbO6elU": "No hay proyectos cargados",
- "wpUutIo": "No se pudieron cargar los proyectos",
- "9srv5vA": "Utilice Agregar por URL para llegar a los proyectos faltantes.",
- "x8yvGR0": "Algunas organizaciones no cargaron ({{value0}}).",
- "rTimB6Y": "No se pudieron cargar proyectos desde {{value0}}.",
- "25-g19E": "Agregar",
- "i7LVjnE": "Agregando...",
- "Qyb0AbI": "Agregar por URL u owner/number",
- "gBglOLc": "Buscar proyectos",
- "6e87BT8": "Elija una vista de proyecto para la página Tareas.",
- "4pG_Id0": "Proyectos GitHub",
- "5kq0ekc": "Carga resultados anteriores",
- "cR6luW0": "Cargado",
- "K80V7xk": "Salta a una página de resultados cargada o disponible.",
- "Zpsg1Hk": "Páginas de GitHub",
- "41d4YcM": "Issues",
- "sQ-iS-M": "Solicitudes de extracción",
- "LkEKGa8": "Vista de GitHub",
- "a5ldOMU": "No hay fuentes de emisión alternativas disponibles.",
- "LGWybvE": "Elija si cada repositorio consulta y crea trabajo desde el origen o desde el origen.",
- "aqrdcoU": "Fuentes de problemas de GitHub",
- "FohFTKc": "Todos los repositorios",
- "ec9l6fo": "Elija qué repositorios consultar.",
- "pMWEK5w": "Repositorios",
- "JAnflBU": "Origen de tareas",
- "7L6hVV8": "Página siguiente",
- "7aV6RlU": "Página {{value0}}",
- "mDUXZ5M": "Seleccionar página, Página {{value0}}",
- "eLSyiVk": "Página anterior",
- "SlWRC8A": "Cambiar estado de {{value0}}",
- "XHZQUAc": "Sin elementos de proyecto",
- "F7DoZNU": "Browse projects",
- "UqRLwDk": "Elija un proyecto de GitHub",
- "IQp4SP8": "Conectar Linear",
- "42DYBxM": "Explore y comience a trabajar en sus problemas Lineares asignados directamente desde Tareas.",
- "L9oPTag": "Conecta tu cuenta Linear",
- "J73iv2w": "Esta vista de Tareas móvil necesita un tiempo de ejecución de escritorio más nuevo.",
- "iUDJtXI": "Actualizar el escritorio de Orca",
- "KQkXL08": "Los datos de sub-issues no están disponibles para tu token.",
- "yF0bGcQ": "Reintentar",
- "aCzhUtY": "Reintentando...",
- "QU-Uflw": "Reintente cargar problemas desde {{value0}}/{{value1}}",
- "91ACsJY": "No se pudieron cargar los issues de",
- "7WH7i2M": "Buscar {{value0}} tareas...",
- "RzsrKAc": "Buscar vista de proyecto...",
- "niMSGwc": "Mostrar",
- "_TeSdI8": "Tareas",
- "-Qqso-0": "Todos los espacios de trabajo",
- "Hs-i62I": "Ver pedido",
- "UhoT2i4": "Enviar comentario",
- "_I4A15k": "Agregar un comentario",
- "piHodso": "No se pudo actualizar la fuente del problema",
- "XuKemqY": "No se pudo crear la tarea",
- "Sni1IDk": "No se pudo crear el subproblema Linear",
- "GdZdv18": "No se pudo cargar el subproblema Linear",
- "YpcHVvo": "No se pudo agregar el comentario Linear",
- "gNpYapQ": "No se pudo actualizar el problema Linear",
- "_t92UNY": "No se pudo fusionar",
- "wPJymlU": "GitHub informa conflictos de fusión. Open in GitHub to continue.",
- "k4ojp0Y": "No se pudo responder",
- "jRm4RmA": "No se pudo agregar el comentario de revisión",
- "4Si7jXY": "No se puede comentar sin el SHA del head del PR.",
- "b6obzk0": "No se pudo cargar el contenido del archivo",
- "7sESNDQ": "No se puede cargar el contenido del archivo para esta solicitud de extracción.",
- "Akq8bGo": "No se pudo actualizar el hilo de revisión",
- "3JBRDbM": "No se pudo actualizar el estado visto",
- "HCcPUIo": "No se puede sincronizar el estado visto de este pull request.",
- "ppWaFdk": "No se pudieron volver a ejecutar los checks",
- "_sMIbrI": "No se pudieron actualizar los checks",
- "eYVZBag": "No se han podido solicitar revisores",
- "4-krOeE": "No se pudo copiar el texto",
- "Y45YlXw": "No se pudo copiar el enlace",
- "-bXRzXk": "No se pudo agregar el comentario",
- "nOlVFQ0": "No se pudo actualizar el elemento de GitLab",
- "PA_I94w": "No se pudo actualizar la solicitud de extracción de GitHub",
- "aulxiV4": "No se pudo actualizar el problema de GitHub",
- "BvA66yA": "No se pudo actualizar el estado",
- "qVRnj6M": "No se pudo hacer merge del pull request",
- "QKHONdI": "No se pudo actualizar el tipo de problema",
- "Z7UA1fA": "Este tipo de problema de proyecto no se puede editar desde el móvil.",
- "QbIagpk": "No se pudo actualizar el campo del proyecto",
- "TE3rsP8": "No se pudo actualizar el elemento",
- "2lpu738": "Este elemento del proyecto no se puede editar desde el móvil.",
- "UbvF6N4": "No se pudo eliminar el comentario",
- "22DpbZo": "Este comentario de proyecto no se puede eliminar del móvil.",
- "Lw1c31w": "No se pudo editar el comentario",
- "fToZEE4": "Este comentario de proyecto no se puede editar desde el móvil.",
- "aCTe1aA": "Agregue el repositorio de elementos del proyecto a Orca antes de crear un espacio de trabajo.",
- "8r702TY": "No se pudo crear el espacio de trabajo",
- "xWmoUM8": "No se pudo guardar el ajuste preestablecido disperso.",
- "MNvx1_M": "No se pudo buscar sucursales.",
- "f8dRWFk": "No se pudieron cargar ajustes preestablecidos escasos.",
- "WG-yXgM": "abrir un caparazón",
- "0uj422Y": "No se pudieron cargar los tipos de problemas",
- "quO-aRc": "No se pudieron cargar los asignados",
- "661kq0E": "No se pudieron cargar las etiquetas",
- "BRtGSdQ": "No se pudieron cargar los detalles",
- "us3-SEs": "No se pudo cargar el contexto Linear",
- "-QPTwEw": "No se pudo agregar el proyecto.",
- "W2b7E0I": "Se esperaba una URL del proyecto o propietario/número.",
- "6aqSQa0": "No se pudo seleccionar el proyecto",
- "XhuO-88": "No se pudo cargar la vista del proyecto",
- "y6brnh8": "No se pudieron cargar más tareas de GitHub",
- "bMml9Hw": "La conexión falló",
- "eVVS8u4": "No se pudieron cargar las tareas",
- "jxeDUBI": "No se pudo cargar la configuración de Tareas",
- "AmP4Z_A": "Actualice el escritorio de Orca para usar Tasks en dispositivos móviles.",
- "_SIoB4k": "Agregar comentario de revisión",
- "T2C3fss": "No se encontraron cambios de texto.",
- "_96Solc": "Agrupar por repositorio, luego actividad más reciente",
- "45bce5E": "Actividad más reciente primero",
- "43utnp4": "Actualizado",
- "ncl7fEY": "Pendiente GitLab todos",
- "uLI9QAU": "mis todos",
- "CNrYYPU": "Fusionar solicitudes y problemas por repositorio",
- "fxhXe98": "Proyecto MR",
- "Vejw8iE": "Revisar las solicitudes que se le asignaron",
- "ox2Q3X4": "Necesita revisión",
- "Qcb2h_k": "Solicitudes de extracción creadas por usted",
- "DitaVA4": "Mío",
- "4q-Iqts": "Abrir solicitudes de extracción",
- "90lx_rw": "Problemas abiertos asignados a usted",
- "NeeUliY": "Asignado a mí",
- "4HZ7SXw": "Abrir problemas de GitHub",
- "QNj7rUo": "Vistas de proyectos de GitHub",
- "LB-QyhM": "Proyectos",
- "RU009FY": "Solicitudes de extracción de GitHub",
- "Xj-3fdg": "PRs",
- "PAK8mwc": "Issues de GitHub",
- "ISISlFo": "Prioridad",
- "kpxCp5s": "Identificador",
- "Dd-TzXA": "Sin agrupación",
- "JKx6Gd0": "Columnas agrupadas",
- "uoATjeA": "Tablero",
- "6GAUUa8": "Filas de problemas compactas",
- "tIgX1ak": "Lista",
- "CW8el5g": "Problemas completados recientemente",
- "HauqL5Y": "Completado",
- "kRDldqg": "Problemas creados por ti",
- "o_j-FoE": "Creado",
- "eNsBySI": "Problemas asignados a usted",
- "pP-07nE": "Mis problemas",
- "_kT7uQE": "Problemas abiertos en espacios de trabajo conectados",
- "gIF8518": "Todo",
- "Svu67QM": "Cualquier estado de GitLab",
- "m5Y69Pc": "Problemas cerrados y solicitudes de fusión",
- "BpviSSw": "Cerrado",
- "fM4vagY": "Solicitudes de fusión fusionadas",
- "GtruncU": "Mergeado",
- "Dm3BEDs": "Problemas abiertos y solicitudes de fusión",
- "L9I1oLA": "Problemas asignados y de equipo",
- "R_7ye6M": "Linear",
- "cBPoyj8": "Problemas y solicitudes de fusión",
- "BaXOO9M": "GitLab",
- "monYp5Q": "Problemas y solicitudes de extracción",
- "gcczsRA": "GitHub",
- "fCKRINY": "Mostrando el primer {{value0}} de {{value1}} líneas de diferencias.",
- "0WWDhS8": "Comentar en la línea {{value0}}",
- "LJbwLTk": "Resuelto {{value0}} por {{value1}}",
- "3fJQdKo": "Fuente: {{value0}}",
- "F0yrwZ0": "Ordenar: {{value0}}",
- "ntCXZ5E": "Campos: {{value0}}",
- "rkPw0BI": "Grupo: {{value0}}",
- "KPrnw08": "Orden: {{value0}}",
- "p08Gdhs": "La fuente de problemas preferida en sentido ascendente no está disponible para {{value0}}. Usando origen.",
- "3-41cjc": "+{{value0}} campos",
- "g8lrpKM": "en {{value0}}",
- "2x3FfB8": "Consultando {{value0}}",
- "T-_RK2o": "Página {{value0}}",
- "AHMKHtc": "{{value0}} equipos",
- "GRCIny0": "Nuevo problema {{value0}}",
- "z7RLmIM": "Archivo en {{value0}}",
- "Cb83OoQ": "Crear desde {{value0}}",
- "Fg7BUfE": "Nombre de la sucursal: {{value0}}",
- "Cx8BTNg": "{{value0}} requiere una opción de configuración antes de crear este espacio de trabajo.",
- "-1cVb10": "{{value0}}/{{value1}} no se agrega a Orca. Agregue este repositorio desde la aplicación de escritorio y luego actualice las Tareas móviles.",
- "TLa90Qg": "Proyecto GitHub · {{value0}} {{value1}}",
- "sNIGIT0": "{{value0}} · {{value1}} · {{value2}}d",
- "Y1upIE8": "Comandos rápidos",
- "j34FFK4": "Eliminar",
- "RLWvqn8": "¿Eliminar este acceso directo personalizado?",
- "PKSYVds": "https://example.com",
- "ZabOoVw": "Ingrese una URL o déjela en blanco para abrir una nueva pestaña.",
- "tKOmSkM": "Nuevo navegador",
- "pg8WJ-k": "Nombre del terminal",
- "gKi8D7w": "Cambiar nombre de terminal",
- "gahpqR8": "¿Reemplazar el borrador del teléfono con el último archivo de escritorio?",
- "tMSSoFA": "Descartar cambios",
- "psn3klQ": "Descartar y dejar",
- "IytTrKE": "Copiar todo y salir",
- "knjkJaM": "Copie o descarte los borradores del teléfono antes de irse.",
- "28Q3TbY": "Cambios de markdowns no guardados",
- "a6FBCvM": "Actualizar",
- "a79zJAw": "Copiar ruta",
- "_VDitck": "Copiar notas",
- "-So6IQg": "Elija una sesión de agent para las notas actuales.",
- "eBYSC7A": "Enviar notas de revisión",
- "c_XP7YM": "Nota de Markdowns",
- "vL8HgZo": "Navegador",
- "1ELofI0": "Terminal",
- "-95LQlw": "Nueva pestaña",
- "UDf4wts": "Pegar",
- "IdjCS0U": "Crear pestaña",
- "S2Yv1rU": "Creando...",
- "Xb4fMs0": "No hay pestañas en esta sesión",
- "jBv9pDk": "Descartar advertencia de creación de espacio de trabajo",
- "uDcv4AM": "Más acciones de sesión",
- "zUxrlPw": "Volver a conectarse al escritorio",
- "z6d7HxM": "Volver a los árboles de trabajo",
- "m6V9ozk": "Presets de Agent no disponibles",
- "yBLhh9Y": "No hay Agents habilitados",
- "pUeIX0M": "Agents de detección",
- "Ggr0PGg": "La página del navegador aún no está disponible.",
- "xdJzAj8": "Se requiere actualización de escritorio para la transmisión del navegador móvil",
- "6kcq1T8": "Edite este comando rápido antes de ejecutarlo",
- "BYmvBAo": "Selección borrada (desplazada fuera del búfer)",
- "_0rBKLA": "no se pudo copiar",
- "A6mZ2G0": "Copiado",
- "m332RRE": "No se pudo borrar la terminal",
- "8hc6lac": "Terminal despejada",
- "528pc28": "Entrada demasiado grande (máximo 256 KiB)",
- "RJlcmtM": "Abre Orca en el host para despertar a los agents durmientes.",
- "JnDupXg": "Guardado",
- "XIoxeds": "No se pudieron copiar notas",
- "dl26MWM": "notas copiadas",
- "TDYOpzk": "No se pudo eliminar la nota",
- "ya3rgTk": "No se pudo guardar la nota",
- "TX0YgPk": "Nota agregada",
- "ElSO0Bs": "No se pudo cargar la markdown",
- "eIqJOeA": "Vista previa de {{value0}}",
- "GF9YPY8": "{{value0}} imagen",
- "yHsoXLM": "Enviar",
- "Kvcps20": "Enviar notas de revisión a AI",
- "i7mE8Wc": "Copiar",
- "G46090U": "Copiar notas de revisión",
- "o0woxZM": "{{value0}} revisión {{value1}}",
- "bjh73HM": "Sin notas de revisión",
- "bNrgw7Q": "guardar nota",
- "AJOY4oY": "Cancelar",
- "vCc2hyw": "Agregar nota de revisión",
- "AMX0qpI": "Eliminar nota en la línea {{value0}}",
- "XjRhzvI": "Agregar nota en la línea {{value0}}",
- "7su6EMM": "{{value0}} línea diferencial {{value1}}",
- "fAJsFIg": "Guardar",
- "Hy2xmeg": "Descartar",
- "8Uro2f0": "Reintentar",
- "HtCuTmQ": "Línea {{value0}}",
- "qrdoHLM": "La Commit falló.",
- "Qpl1k5o": "Los cambios confirmados no están disponibles.",
- "aqSqtLI": "Paso {{value0}}",
- "XfBogi0": "{{value0}} herramienta {{value1}}",
- "WL3i_AY": "imagen",
- "tSzSq0U": "Imagen adjunta",
- "9kO5k1s": "Archivo",
- "76ELAmA": "Vista previa",
- "dZsgG-M": "No se puede cargar la carpeta",
- "wA_0d2E": "Restablecimiento del límite de velocidad del Codex obtenido",
- "CiFc9DQ": "p. ej. pnpm build",
- "d0JpJz4": "p.ej. Construir",
- "rMV0BMU": "Elige una llave",
- "fTbhbgg": "Abrir imagen",
- "oitC92A": "imagen",
- "8ckUTUg": "MANOS",
- "hiRz7rE": "ORCA.YAML",
- "by8gktU": "Escribe una nota",
- "AmkPWYA": "repositorio remoto",
- "2Kl8BY4": "Seleccione un repositorio",
- "QjSzvc4": "No se encontraron resultados.",
- "RIaVSo8": "base",
- "IOLibYw": "Predeterminado del sistema",
- "2r4Wqzo": "Registro de emparejamiento",
- "G_n7Zxg": "Registro de emparejamiento",
- "Fbnf310": "No se pudo cargar la configuración de voz.",
- "4HGax2g": "Sin árboles de trabajo",
- "oRXGJpo": "Ningún árbol de trabajo coincide con los filtros",
- "d-FojRM": "No hay árboles de trabajo coincidentes",
- "Y4yzly8": "Buscar árboles de trabajo",
- "ThGUKR8": "Buscar árboles de trabajo…",
- "3GdsXVQ": "Host",
- "I0vv7aw": "Ningún tipo",
- "pjrxOkU": "{{value0}} directorios",
- "DvuAE90": "1 directorio",
- "EmJ0ZpA": "repositorio remoto",
- "mDtuNkA": "Seleccione un repositorio",
- "kbZvL2g": "Issue de Linear",
- "Wg2C-lo": "Elementos",
- "ybs6rJE": "Abrir vista en GitHub",
- "KVqCyig": "Atajo",
- "WaegjuQ": "Archivo",
- "Dy-chOU": "Markdown",
- "ps5grWg": "enviar comando",
- "XNw0eg0": "Escribe un comando…",
- "Rddk0Io": "El texto escrito se envía directamente al terminal activo",
- "JQAVlGc": "Mostrar teclado para entrada de terminal en vivo",
- "WbNNU2M": "Agregar acceso directo personalizado",
- "UjbgRFg": "Pegar desde el portapapeles",
- "g0S-mpY": "Cambiar a entrada de terminal en vivo",
- "LNjU0eA": "Cambiar a entrada de comando almacenada en búfer",
- "CAFCbk0": "Cambiar al modo teléfono",
- "QB6eVqs": "Cambiar al modo de escritorio",
- "jbJql9k": "Oculta el teclado del software y mantiene abierta la sesión actual del terminal.",
- "O4uFjyM": "Descartar teclado",
- "1Ef6jA8": "terminal de carga",
- "5g1_I7Y": "Comprobando las capacidades del escritorio: inténtalo de nuevo en un momento",
- "UoNS0D4": "Se requiere actualización de escritorio para comandos rápidos",
- "7IGdkR0": "Nueva pestaña",
- "Td8lqm0": "Control de código abierto",
- "8NqLc0E": "Abrir explorador de archivos",
- "OcU2d6s": "No se pudieron enviar notas",
- "4BJ8B0k": "Notas enviadas",
- "SM7vigo": "Archivo {{value0}}",
- "Dwq_r1o": "Archivos {{value0}}",
- "mLbULQw": "{{value0}} commit",
- "TWTFkY0": "{{value0}} se compromete",
- "t2Awy1s": "frente a {{value0}}",
- "B2yGeak": "Conexión interrumpida",
- "TI9qKn0": "Error de terminal desconocido",
- "R0VwXOs": "No se generó ningún mensaje de commit",
- "-CpqM4g": "Esta rama aún no está lista para un {{value0}}.",
- "aDtTv18": "Crear {{value0}}",
- "8TO561E": "Las solicitudes de extracción no están disponibles para este repo",
- "Xh63VTo": "Comprobando el estado de la sucursal...",
- "o8ul7Iw": "Publicar rama primero",
- "9tlos5E": "Ingrese un mensaje de commit",
- "jzI4z6s": "Preparar al menos un archivo",
- "Pej4iSQ": "Error en la acción de control de código fuente",
- "67FHeO0": "No se puede cargar el control de fuente",
- "Z4IRqv4": "No se pueden cargar los cambios confirmados",
- "GXYBPqk": "Sin aguas arriba",
- "1YRKLD4": "{{value0}} adelante, {{value1}} detrás",
- "kbozpKo": "Entrada en vivo",
- "_MGGD5E": "Micrófono inicial",
- "Q7SP9fo": "Tratamiento",
- "y6GQnVA": "Escuchando",
- "vXUuukQ": "Comandos rápidos",
- "1rvpPn4": "Elija Agent",
- "SbxgQXc": "Agregar comando rápido",
- "gaaVrjY": "Editar comando rápido",
- "uVgCcno": "Eliminar",
- "jmIvPBQ": "Cancelar",
- "0dIGtV8": "Línea: {{value0}}",
- "ZueS87g": "Líneas: {{value0}}-{{value1}}",
- "hLNcWyo": "Alcance: archivo",
- "57DUHqU": "un agente",
- "0hhZYns": "No se puede abrir en sesión",
- "1Z6vya0": "No se pueden cargar archivos",
- "FuhqCI4": "Esperando el escritorio...",
- "vu5sSQI": "Conectándose al escritorio...",
- "MpjZorw": "Descartar",
- "5cnTshE": "Permanecer",
- "jogAQ98": "No se puede guardar el archivo",
- "Rajm1co": "Diferencia no disponible",
- "9Sv7Jb4": "Archivo eliminado",
- "BrE_aCg": "Diferencia demasiado grande",
- "Cku_aRM": "Diferencia binaria",
- "9FhY-Sk": "Contexto",
- "0l1OykU": "Eliminado",
- "bnfXRLU": "Añadida",
- "eiEI8yY": "· {{value0}} activo",
- "qNgdEE0": "{{value0}} árbol de trabajo{{value1}}{{value2}}",
- "UL6zDWw": "No permitido: su cuenta de GitHub no está conectada.",
- "nfDKqg4": "Algo salió mal.",
- "amP19yQ": "Actualiza Orca en tu computadora",
- "NkNSfjQ": "Actualizar Orca Móvil",
- "VWnR13E": "Usar reinicio",
- "_nuDzHY": "Cancelar",
- "rXScUPU": "El anfitrión confirmó este intento, pero este teléfono no pudo borrar su registro de reintento. Un reintento posterior reutilizará el mismo ID de operación segura.",
- "d5V00qM": "Este teléfono no pudo borrar el registro de reintento descartado. Reintentarlo es seguro, pero se debe borrar el registro antes de poder confirmar un nuevo reinicio para esta cuenta.",
- "B0fOGkI": "Detalles",
- "21rrqn0": "Error en la transmisión del navegador.",
- "ukxwfJ8": "No se pueden cargar sesiones de agent",
- "dVAzjOs": "Reciba notificaciones en este dispositivo cuando un agent necesite su opinión o finalice una tarea.",
- "uzWRFSg": "Las notificaciones están deshabilitadas en la configuración del sistema.",
- "J055vls": "Ninguno seleccionado",
- "qVCBvFg": "Reciente",
- "uGLg5VY": "Sin tareas Lineares",
- "ifuEhog": "Sin tareas de GitLab",
- "haGU2eY": "Sin tareas de GitHub",
- "OCkeuqU": "No hay tareas coincidentes",
- "Q9YN3Hk": "Conéctese a un host para cargar tareas",
- "inyDHB0": "Elige proyecto",
- "73-jDqg": "{{value0}} equipos",
- "rqyU6Yo": "1 equipo",
- "5U1KC3A": "Espacio de trabajo",
- "DiuXQZo": "Campos",
- "BJUllKs": "Campos {{value0}}/{{value1}}",
- "qzEC9yM": "ascendente",
- "2IFEfeA": "descendente",
- "zrhQGaA": "{{value0}} repositorios",
- "nt1k3hc": "{{value0}} repositorio",
- "qzhASv0": "{{value0}} repositorios",
- "dBmZ43Q": "Todos los repos",
- "yX2I5Qc": "{{value0}} fuentes",
- "x8ioLCA": "Seleccionar objetivo",
- "OR0Rh2U": "\"{{value0}}\" ya existe.",
- "jBhX2v4": "El nombre debe tener 80 caracteres o menos.",
- "RT1HPds": "El nombre es obligatorio.",
- "TxiIlg0": "No se pudieron copiar borradores",
- "HimYt6k": "Ruta copiada",
- "S6RbGW8": "{{value0}} — toca para volver a intentarlo",
- "-4K4pmw": "{{value0}} pestañas",
- "KRxO3Ug": "1 pestaña",
- "vFcOLlo": "Cargando pestañas",
- "6P8BtkA": "El comando del navegador falló",
- "sYGlLWQ": "No se pudo crear el navegador",
- "HyIWUac": "Introduce una URL válida",
- "6oL3kaQ": "No se pudo crear la nota de markdowns",
- "sgQvHe0": "comando rápido",
- "BphZ5Gw": "No se pudo crear la terminal",
- "DKTAFXw": "Error al guardar",
- "qIT8ceU": "No se pudo cargar la vista previa del archivo",
- "XD1EPRc": "No se pudo cargar la vista previa de diferencias",
- "sJ7CwDw": "Archivo demasiado grande para la vista previa móvil",
- "8Ho6nkA": "Vista previa binaria no disponible",
- "X1e46P4": "Dictado insertado",
- "V4EVATY": "Cambiado en el escritorio",
- "RwIU_9I": "Solo lectura",
- "hPnnpWc": "Directo · LAN",
- "f3Si3vU": "Directo · Tailscale",
- "Lo_8ioI": "Orca Relay",
- "QNvTsRo": "Sin {{value0}}",
- "nDyX2e8": "Terminal en blanco",
- "7wOLCCY": "Desconectado",
- "FZM-PD0": "La conexión falló",
- "wOY1nLM": "Error al volver a conectar",
- "55lbvEs": "Error de autenticación",
- "uEprraQ": "Reconectando",
- "XpcB6Lk": "Implementación de retransmisión",
- "Y4pY3mY": "Conectando",
- "GyhUU1I": "Conectado",
- "VtNQIUo": "El push se realizó correctamente, pero falló la creación de {{value0}}: {{value1}}",
- "3fVn1VI": "Abortar fusión",
- "S5cNB0c": "Abortar rebase",
- "wFxT3pM": "Abortando…",
- "wL23gbE": "Sin sucursal",
- "EiCMRDA": "Sin preparar",
- "YcfLGog": "Preparado",
- "ZnNoGOU": "Rama",
- "ubcC1kU": "Terminal",
- "nMoq2GI": "Archivo",
- "oS6AL4Y": "Markdown",
- "YHLAtbk": "Navegador",
- "tgyhT8Q": "Nuevo navegador",
- "bdYtRH8": "Worktree",
- "972Qfrg": "Guardar nota en la línea {{value0}}",
- "5Rc0T-w": "{{value0}} notas no enviadas",
- "VuvuQv0": "{{value0}} nota no enviada",
- "2KfV5_M": "{{value0}} nota",
- "87GezVA": "{{value0}} notas",
- "ZGxcUL4": "Sin revisar",
- "08Yk1Go": "Notas",
- "ycKwNOI": "Cargando sesiones de agent...",
- "FjJb7Lo": "{{value0}} línea {{value1}}",
- "sDDLSuM": "{{value0}} en WSL {{value1}}",
- "TUCQXxI": "{{value0}} en el anfitrión",
- "mWMZ-dk": "Abre un espacio de trabajo local antes de reanudar una sesión.",
- "eTFpmzo": "Esta sesión se almacena en la máquina host, por lo que no se puede reanudar en un espacio de trabajo SSH. Abra un espacio de trabajo local para este proyecto.",
- "GLFjyPk": "La reanudación desde el historial no está disponible en espacios de trabajo alojados en tiempo de ejecución.",
- "WVNYnak": "Después de {{value0}}s",
- "xYaQ41Y": "ganchos de repositorio",
- "EJg7NQU": "ganchos locales",
- "BeBymFk": "orca.yaml",
- "px-yCeQ": "{{value0}} comentario",
- "24Kgyy4": "Aún no hay comentarios",
- "PAtCwbU": "Comentario de nivel superior",
- "br73014": "Hilo de revisión",
- "Ak34AMw": "Hilo de revisión resuelto",
- "oj0ltFk": "Revisar",
- "BWgU598": "Revisión resuelta",
- "6rtcg5s": "Abrir en Linear",
- "N_IsXzY": "Abrir en GitLab",
- "SpAtwKU": "billete Linear",
- "MKTNAHg": "{{value0}} todo",
- "mYLUh0s": "Solicitud de fusión",
- "PoPA1vA": "Vacío",
- "cAXZUp4": "¿Fusionar PR #{{value0}}?",
- "X5VvyPQ": "¿Rebasear y fusionar PR #{{value0}}?",
- "LCOEY5w": "¿Aplastar y fusionar PR #{{value0}}?",
- "1Shau08": "Squash y merge",
- "psZ6Lys": "PR",
- "xLFr_Co": "merge request",
- "PAnLDcM": "Crear commit de fusión",
- "b9yLdBs": "Rebase y fusionar",
- "6MEByr4": "Desconocido",
- "cbIMuqY": "Se puede hacer merge",
- "YEiNYxU": "Bloqueado",
- "OXTehpM": "Por detrás",
- "hIW5XEU": "Conflictos",
- "AXgAxVM": "Merge",
- "Sos7PxI": "{{value0}}/{{value1}} pasó",
- "Uc3hFHs": "{{value0}} pendiente",
- "L37iq1E": "{{value0}} fallando",
- "X9M1AcA": "Sin comprobaciones",
- "pmjWIDk": "GitLab todo",
- "kjZMz_U": "bloqueado",
- "1WEmdBA": "Borrador",
- "BbDPGbM": "Redactado",
- "qJU9f5Q": "{{value0}} nota de revisión",
- "QGcvPOc": "{{value0}} notas de revisión",
- "kYCT6qM": "Hilo resuelto por {{value0}}",
- "ahIRbHk": "Comentario resuelto por {{value0}}",
- "qcFeMQM": "Actual y próximos",
- "DCkRqC8": "No se pudo confirmar la limpieza de la credencial {{value0}} en este dispositivo.",
- "XStfhOk": "No se pudo confirmar la limpieza de las credenciales {{value0}} en este dispositivo.",
- "xnvhKbA": "{{value0}} transcripción omitida",
- "UXXYuws": "{{value0}} transcripciones omitidas",
- "QlrZNys": "{{value0}} archivo revisado, {{value1}} nota",
- "J7M3gnY": "{{value0}} archivo revisado, {{value1}} notas",
- "uM2_gxc": "{{value0}} archivos revisados, {{value1}} nota",
- "JrNt3Dk": "{{value0}} archivos revisados, {{value1}} notas",
- "Id8zorY": "{{value0}} árbol de trabajo",
- "t4PccRo": "{{value0}} worktrees",
- "AYqemqw": "{{value0}} activo",
- "lXLSjWw": "{{value0}} cheque fallido",
- "N7XOlnE": "{{value0}} controles fallidos",
- "dG4O1e4": "Hilo resuelto por {{value0}}",
- "lXnGpvs": "Hilo resuelto por {{value0}} ({{value1}})",
- "njd-pFg": "Comentario resuelto por {{value0}}",
- "tQONwOQ": "Comentario resuelto por {{value0}} ({{value1}})",
- "uxZVTz8": "{{value0}} llamada de herramienta",
- "IlwwqQs": "{{value0}} llamadas a herramientas",
- "OLmV45U": "Sin título",
- "S-avV-Y": "{{value0}} archivo revisado añadido al staging",
- "IPu47z8": "{{value0}} archivos revisados añadidos al staging",
- "TxG95wU": "Comprobar Tailscale",
- "oBMMuM8": "Los elementos de trabajo de GitHub requieren un control remoto de GitHub para repositorios SSH",
- "m4LECc4": "Espacio de trabajo flotante",
- "ueRRwRg": "La conexión es demasiado lenta para el dictado por voz. Inténtalo de nuevo cuando la conexión mejore.",
- "hf0yXVE": "No se pudo verificar la conexión SSH. Vuelva a conectar el host e inténtelo de nuevo.",
- "XOHYcMw": "Actualice la aplicación Orca de escritorio emparejada para usar la configuración de voz móvil.",
- "cuSNE9k": "Idle",
- "cfFE9JM": "Hecho",
- "eSniHCo": "interrumpido",
- "clLXJRk": "Esperando entrada",
- "CeMk5QY": "Bloqueado",
- "xLtCpIk": "Working",
- "RvLuxao": "Solicitud de extracción n.º {{value0}}, {{value1}}, {{value2}}{{value3}}. Abrir solicitud de extracción.",
- "oDQaC0g": "Solicitud de extracción no disponible: {{value0}}",
- "MkY5xK4": "Cargando solicitud de extracción",
- "qE1-68U": "Creando reseña...",
- "JokOS5o": "Fuerza empujando con arrendamiento...",
- "0BMXLfE": "Impulsando commits...",
- "PnL-W2o": "Publicando rama...",
- "uN9IaYI": "Confirmando cambios...",
- "us6yszU": "Generando mensaje de commit...",
- "eCa7Me8": "Añadiendo cambios al staging...",
- "Kdbzhtg": "Esta rama aún no está lista para un {{value0}}.",
- "eeoaUzE": "Empuje la rama base antes de crear un {{value0}}.",
- "dhReg-4": "No se admite la creación de un {{value0}} desde esta bifurcación.",
- "UNrSqqU": "Ya existe un {{value0}} para esta rama.",
- "CMzOREY": "La creación de {{value0}} no es compatible con este repo.",
- "i65iwXo": "Autentícate antes de crear un {{value0}}.",
- "h5c6qGM": "Sincroniza esta rama antes de crear un {{value0}}.",
- "aDj0ISs": "Publica los commits antes de crear un {{value0}}.",
- "J6J02jo": "Cambie a una rama de función antes de crear un {{value0}}.",
- "eL3YqZQ": "Haz checkout de una rama antes de crear un {{value0}}.",
- "fS2uz3k": "Haz commit de los cambios antes de crear un {{value0}}.",
- "YnkDu_A": "Orca no pudo confirmar si esta sucursal ya tiene un {{value0}}. Inténtalo de nuevo en un momento.",
- "nUw7_cE": "{{value0}} creado, pero Orca no pudo actualizarlo todavía.",
- "89Qhlf4": "{{value0}} #{{value1}} ya está abierto.",
- "G0fuKJo": "No hay nada para hacer commit. La rama está actualizada.",
- "qgmf_L8": "Push",
- "0OsPYDw": "Pull",
- "gSinyKw": "Fuerce el envío con arrendamiento para actualizar la rama remota.",
- "5MUJYGA": "Publicar esta rama en origen.",
- "5OKMsK4": "Haz checkout de una rama antes de publicar commits.",
- "eSJfk9k": "Prepare al menos un archivo para commit.",
- "MM3ixxY": "Organiza todos los cambios.",
- "YnDfQwA": "Ingrese un mensaje de commit para commit.",
- "sJ8R-8c": "Realizar cambios por etapas.",
- "lBQzq_8": "Resolver conflictos antes de comprometerse.",
- "aIqyvoY": "Inténtelo nuevamente una vez que finalice la operación remota.",
- "YkxQqGg": "Operación remota en progreso.",
- "cOOTv9E": "Empuje forzado en curso.",
- "GqPiXjg": "Compromiso en progreso.",
- "6Z1Zr78": "Publicar rama",
- "gqhNZGI": "Sincronizar",
- "AvE0E2k": "Hacer stage de todo",
- "7HjRY3c": "Commit",
- "koj5rtA": "Force Push",
- "63siVQ8": "Solicitud fallida: {{value0}}",
- "8I2nZuQ": "Omitido",
- "Ba1jOdE": "Neutral",
- "lyHptRM": "Tiempo agotado",
- "thrHxG4": "Cancelado",
- "NO0ZjtQ": "Fallido",
- "6lXfNVk": "Exitoso",
- "9XDJxdU": "En curso",
- "AXw1J4E": "Aún no hay comentarios.",
- "znwGBr8": "Sin comentarios humanos.",
- "BvW_4OE": "Sin comentarios de robots.",
- "jG05lVM": "{{value0}} de {{value1}} no se pudo cargar.",
- "zrt1n24": "Sin revisores",
- "yMw_C-k": "Cambios solicitados",
- "O3Knlx4": "Aprobado",
- "ziWbd9A": "Abrir comprobaciones de solicitud de extracción",
- "z4-dCLM": "Explorar y reanudar sesiones de agent",
- "td40qOY": "Su escritorio aparecerá aquí. Todo está cifrado de extremo a extremo.",
- "-SigWBo": "Toque el botón de arriba para abrir el escáner. Apunte al código QR en su pantalla.",
- "aCJTiqw": "Vaya a Configuración → Móvil y genere un código QR de emparejamiento.",
- "_wFCKE8": "No se pudo probar",
- "gdHptko": "Sin conexión",
- "DxL3QsM": "Respuesta inesperada",
- "O1SHffI": "Conectado",
- "uJRC49k": "No se pudieron leer los datos del host",
- "AtwKjZ4": "Ninguno: escanea un QR para emparejar",
- "OCWSDG0": "{{value0}} emparejado",
- "s5C2oPk": "Sin descripción.",
- "AnvMzjI": "Copie notas en su lugar",
- "0IFqHX0": "Nueva sesión de agent",
- "k5E-6Qo": "Verifique la conexión del host",
- "AXVCL9g": "Iteración",
- "G_aoVj8": "No se pudo crear el espacio de trabajo",
- "2t3siE4": "actual",
- "X4spS84": "La Commit falló",
- "Cqqzv8U": "No se puede actualizar el control de fuente",
- "8Tx_eZw": "No se pudo crear la solicitud de extracción",
- "DIh5pvA": "No se pudo actualizar la reseña vinculada",
- "D8-XyhU": "No se pudo actualizar la solicitud de extracción vinculada",
- "GaTugx8": "Los commits locales se perderían; haz pull en su lugar",
- "qajmB_0": "Nada que adelantar",
- "fp_5pjo": "avance rápido",
- "UWyesQ8": "Avance rápido ({{value0}})",
- "qq_p9K0": "La sucursal ya esta publicada",
- "5Vkd48o": "La sucursal está actualizada.",
- "N0HpMMg": "Sincronizar",
- "26SoVIw": "Sincronización (↓{{value0}} ↑{{value1}})",
- "Ia0aBfU": "Nada que tirar",
- "0pGBpyQ": "Pull",
- "oCECucM": "Tirar ({{value0}})",
- "zgbzIDs": "Nada que empujar",
- "eBZzWkw": "Push",
- "9Xtk0Pg": "Empujar ({{value0}})",
- "cBrXr-8": "La Commit falló",
- "5jVDzOo": "Esperando el escritorio...",
- "cIZvHNg": "Conectándose al escritorio...",
- "zniLwck": "No se puede cargar la diferencia comprometida",
- "NJJe3ZA": "Solicitud fallida: github.resolveReviewThread",
- "xWj8WHk": "Solicitud fallida: github.updatePRTitle",
- "o-JIJFg": "Solicitud fallida: {{value0}}",
- "jdt98Vo": "Solicitud fallida: {{value0}}",
- "aLzpW3w": "Los cambios confirmados fallaron",
- "nKp2Mj0": "Los cambios confirmados no están disponibles",
- "FJnzL9Y": "Sin preparar",
- "senOKG4": "En staging",
- "OtjVKog": "Terminal",
- "tod-ra0": "Error en la secuencia de transcripción",
- "GmBjriA": "Cambiar a vista de chat",
- "dqKsMqY": "Cambiar a la vista de terminal",
- "502R_mE": "Cambiar a teléfono",
- "0XbzIAs": "Cambiar a escritorio",
- "BGT_JFw": "Terminal",
- "MOOmRCc": "No se puede cargar la diferencia",
- "1ymIBpg": "No se puede cargar la reseña",
- "vMHt0l8": "No se pueden cargar sesiones de agent",
- "4GOORsg": "Terminal",
- "FYj9qCM": "No se pudo conectar al repositorio SSH.",
- "Gli-J-E": "No se pudo leer el estado de la conexión SSH.",
- "17Ky5K0": "Linear",
- "kWDpsSU": "Asunto #",
- "G_t8Rjg": "MR !",
- "Jq988q0": "PR #",
- "a6UgDc8": "Diálogo del navegador",
- "VgO3m0E": "Sesión sin título",
- "X0HdEQ0": "Conectar",
- "Ho177Ac": "Reconectar",
- "ImyX3J0": "Accesible en {{value0}}",
- "JwcgRbU": "Fijar",
- "dgZsiv8": "Desanclar",
- "TNd6PjA": "Predeterminado",
- "dXnxHU4": "{{value0}} · Predeterminado",
- "dMUK4L8": "Diseño no compatible en dispositivos móviles",
- "hy_B4J8": "Ver #{{value0}}",
- "yvbNVZo": "Orden ascendente",
- "YKWIedk": "Actualmente {{value0}} · toque para {{value1}}",
- "P-ZWamw": "Utiliza el orden de clasificación de GitHub",
- "fERYVNg": "Utiliza {{value0}} {{value1}}",
- "iD-UhpY": "No se pudo crear un problema Linear",
- "T_YfEh0": "Seleccione primero un equipo Linear.",
- "ffJZE1A": "No se pudo crear el problema {{value0}}",
- "C3TiEsc": "Agregue un repositorio Git antes de crear una incidencia {{value0}}.",
- "2cHUFuY": "No se pudo crear el sub-issue",
- "KcjImC4": "Subproblema no encontrado",
- "ct__F0Q": "No se pudo reabrir el hilo",
- "LVc8Fk0": "No se pudo resolver el hilo",
- "fpX38uo": "No se pudo sincronizar el estado visto con GitHub.",
- "lanbga8": "Respuesta de cheques no válidos",
- "lSNLJ4s": "No se pudo actualizar el estado de GitHub",
- "8U28lt8": "No se pudo actualizar el elemento de GitHub",
- "QI7iJCw": "El agent seleccionado está deshabilitado. Elige un agent habilitado antes de crear.",
- "AGIjbJU": "Conecte {{value0}} antes de crear un espacio de trabajo.",
- "eCcpIL4": "No se pudo conectar al repositorio SSH.",
- "CyTKwng": "No se pudo leer el estado de la conexión SSH.",
- "cTL2xfk": "en blanco",
- "-JNPw2M": "Detalles no encontrados",
- "s_tAbdk": "Este proyecto no tiene vistas admitidas.",
- "caw13Gk": "No se pudo conectar Linear",
- "bNtRw1Q": "No se pudieron cargar las tareas de GitLab",
- "Bt_rGOI": "No se pudieron cargar las tareas de GitHub",
- "ObzOf3Y": "Iteración",
- "7wx0uDo": "No asignado",
- "14_Cpwk": "No se puede crear una nota de markdowns sin título",
- "1s8dFXg": "La entrada del terminal está bloqueada por otro cliente.",
- "v-nMJVc": "No se pudieron enviar notas",
- "5GHrSsw": "No se pudieron guardar las notas de revisión",
- "-0DsFBU": "Esperando el escritorio...",
- "I4VlaAs": "No se puede leer la markdown",
- "65j23gQ": "Enviar {{value0}}",
- "3ivaga8": "Editar {{value0}}",
- "9ZRI2cs": "Conecte {{value0}} antes de crear un espacio de trabajo.",
- "h8LEFjY": "Generar detalles de {{value0}} con IA",
- "rOYT-0U": "¿Permitir {{value0}}?",
- "671hHtA": "¿Abrirlo en tu navegador?\n\n{{value0}}",
- "dTuoCp0": "¿Aplastar y fusionar {{value0}} #{{value1}}?",
- "M2j9mpc": "{{value0}} comentarios",
- "xZ4TQL8": "Seleccionar página, Página {{value0}} de {{value1}}",
- "7LorW8k": "Página {{value0}} de {{value1}}",
- "CKtsHVY": "Línea {{value0}}",
- "ACQh2cM": "{{value0}} ya está abierto.",
- "al8M9-M": "Tire de {{value0}}, presione {{value1}}.",
- "UIMnif0": "Tire del commit {{value0}}.",
- "35baKac": "Extraiga las commits de {{value0}}.",
- "y7z5WcU": "Empuje el commit {{value0}}.",
- "0yFIngw": "Empuje {{value0}} commits.",
- "gx2zC4w": "No es un código de emparejamiento válido",
- "WABgCvg": "Falta el código de emparejamiento",
- "_c5oKe0": "Abrir",
- "aalP-X8": "Descartar",
- "cTkYeR8": "Solicitud de fusión",
- "OpWJNnA": "merge request",
- "BWWtnQM": "MR",
- "GqNlrAs": "Solicitud de extracción",
- "rUwwMh4": "pull request",
- "Qic_Aa4": "PR",
- "-YeAYjI": "Descartar",
- "myZTLv0": "{{value0}} restablecimientos disponibles",
- "CfvCAaE": "{{value0}} restablecimiento disponible",
- "aaZ_2qE": "Caduca ahora",
- "1neVPtc": "Caduca en {{value0}}",
- "nH5aDJ4": "El próximo caduca ahora",
- "fA_ezvI": "El próximo caduca en {{value0}}",
- "4DTdO1w": "Merge",
- "pZ3OPxE": "Guardar",
- "eVLkMyE": "Comentario",
- "g0JLO88": "Jobs",
- "OJSrr6g": "Trabajos fallidos",
- "RfH2kOg": "Solicitado",
- "EaX2_X8": "Eliminar",
- "y2BBXrA": "Confirmar",
- "7RncVJk": "Solicitado",
- "6BZSEjI": "Abrir",
- "3OzvpCE": "ahora mismo",
- "sC5iGOA": "Cerrado",
- "epStUOc": "En curso",
- "sMpsrkY": "En revisión",
- "LEXdDEk": "Hecho",
- "QESpnhs": "El proceso de renderizado de Terminal WebView finalizó",
- "9IP25z8": "Error HTTP de terminal WebView",
- "GY53tDU": "La carga de Terminal WebView falló",
- "_dDm4ic": "F12",
- "T7RTOC4": "F11",
- "d6orzBg": "F10",
- "rI3MEx0": "F9",
- "DR9i7SU": "F8",
- "EbNp-x4": "F7",
- "xOj4ngY": "F6",
- "MmdqLFU": "F5",
- "dMpOhHI": "F4",
- "fNbslzw": "F3",
- "5OQeDMc": "F2",
- "wPNSaMQ": "F1",
- "Z-W6Rzg": "Página abajo",
- "1n1QZYk": "Página arriba",
- "6UajMWQ": "Fin",
- "r2L-IvQ": "Inicio",
- "EvEE7WE": "Flecha derecha",
- "1TJf6c4": "Flecha izquierda",
- "jB50jh8": "Flecha hacia abajo",
- "S_D2PxQ": "flecha arriba",
- "JAhWIZE": "Insertar",
- "Wt9qvqo": "AvPág",
- "1qkhXPI": "Re Pág",
- "bh9E9Gk": "Ins",
- "lCZrWn4": "Cambio",
- "zN_6g9g": "Alt.",
- "mthhwXw": "Control",
- "fpKzlOM": "OpenClaw",
- "rZEdz3o": "Devin",
- "Lrz_Jb8": "Hermes",
- "tNRBWNU": "Rovo Dev",
- "X7ZF7JI": "Qwen Code",
- "yUpY07s": "Mistral Vibe",
- "HG6jBAg": "Kimi",
- "uvSF6-U": "Droid",
- "Vly29R0": "Cursor",
- "dSfrwic": "Continue",
- "WeGqDrY": "Command Code",
- "fm231VU": "Codebuff",
- "Vqp3lvY": "Cline",
- "RCPC-L0": "Autohand Code",
- "ufugQXE": "Auggie",
- "6Y3GKfY": "Charm",
- "kej-9Lc": "Kiro",
- "FYcf7kI": "Kilocode",
- "njg39j4": "Amp",
- "Gqznj90": "Goose",
- "FWr_S8c": "Aider",
- "tkhwBEU": "Antigravity",
- "qcMaCQk": "Gemini",
- "GovXMeA": "OMP",
- "BWhYVOA": "Pi",
- "STuGb5Q": "Trae",
- "Y9bn4gA": "Ante",
- "imGLJZs": "MiMo Code",
- "qar2VvQ": "OpenCode",
- "7u-Lga4": "GitHub Copilot",
- "58N2Zh8": "Grok",
- "Tvbh_c4": "Codex",
- "4os-vWc": "OpenClaude",
- "cUAuG8c": "Claude Agent Teams",
- "OZJxvKQ": "Claude",
- "x04i9ik": "No se pudo resolver la rama base.",
- "vuFM3_E": "{{value0}}mes",
- "m8V_LQQ": "ahora mismo",
- "-DRFeFw": "Cambios preparados",
- "cdicUlU": "Archivos sin seguimiento",
- "cbaJlCE": "Cambios",
- "knjcZG0": "No se han podido realizar cambios en la etapa",
- "2m5o9w0": "No se pudo forzar el envío con el contrato de arrendamiento",
- "I8tYYd4": "No se pudieron enviar commits",
- "HtBxXOI": "No se pudo publicar la rama",
- "r9Wy-Q8": "Commits",
- "Xawq6ME": "Solicitud de extracción",
- "TMv0RaY": "Cambios",
- "tKcJoxk": "La rama base debe ser distinta de la rama HEAD.",
- "yBuJIFU": "Elige una rama base.",
- "b89N2ws": "Ingresa un título para {{value0}}.",
- "E7yK5NU": "Espere a que termine la generación.",
- "DAVoau0": "Mensaje, @archivos, /comandos",
- "zGX7CcI": "Respuesta no enviada",
- "v7vfn5Q": "Respuesta no confirmada: revisa el chat antes de volver a intentarlo",
- "6dxPsys": "Respuesta no enviada (desconectada)",
- "sxVCOxI": "Elige una opción",
- "-D7_HMY": "No se puede cargar la solicitud de extracción",
- "xEMYAIw": "Emparejamiento no válido",
- "G1BrrUQ": "Reconectando",
- "7mbOxzE": "Desconectado",
- "Fr9Rdq8": "Conectado",
- "yqEocVY": "Asegurar",
- "S_1cAME": "Conectando",
- "eOcfBcE": "Respuesta no enviada",
- "ukuLb_A": "Respuesta no confirmada: revisa el chat antes de volver a intentarlo",
- "UnHHxag": "Respuesta parcialmente enviada: revisa el chat antes de volver a intentarlo.",
- "O2gcQk0": "Respuesta no enviada (desconectada)",
- "htcCRsA": "Cancelar no enviado",
- "chT2Z44": "Cancelar sin confirmar: revisa el chat antes de volver a intentarlo",
- "Z_x_TcE": "Cancelar no enviado (desconectado)",
- "c6Kd_Ps": "Mensaje no enviado",
- "4Xgw97k": "Mensaje no enviado (desconectado)",
- "ZkABdzg": "Mensaje no enviado",
- "klTsRAk": "Entrega no confirmada: consulta el chat antes de volver a intentarlo",
- "t_qfHRA": "Mensaje no enviado (desconectado)",
- "S9MYUPk": "Detener no enviado",
- "i8UxPTM": "Detener sin confirmar: revisa el chat antes de volver a intentarlo",
- "ZhefrDE": "Detener no enviado (terminal no listo)",
- "QVUePYc": "Cancelar",
- "OxB9eF0": "Confirmar",
- "PpZpLWw": "Seleccione un archivo para revisar.",
- "Em5nLwQ": "Este archivo fue eliminado. Agregue una nota de archivo o márquelo como revisado.",
- "YeQabYs": "Esta diferencia es demasiado grande para la vista previa móvil.",
- "FdOHIhk": "Este archivo no se puede representar como texto en dispositivos móviles.",
- "5GRCze0": "Borrar búsqueda",
- "GbS1Gw0": "Guardar",
- "tNw1xEA": "Cerrado",
- "QYCFjQw": "Borrador",
- "AF7gJFU": "Mergeado",
- "sbQ_yBw": "Abrir",
- "rBMjMUM": "hace {{value0}}a",
- "5mTslyc": "hace {{value0}}mo",
- "3u9-Kuw": "hace {{value0}}d",
- "J9EQWOE": "hace {{value0}}h",
- "XG7ieU0": "hace {{value0}}m",
- "xbjFHYU": "ahora mismo",
- "aJGSaVI": "Enviado",
- "_ax72Jw": "Error al subir el puntero del navegador",
- "oaarOD4": "Error al bajar el puntero del navegador",
- "A-4DgN0": "Error al mover el puntero del navegador",
- "yrjs9M0": "Error al desplazarse por el navegador",
- "9E99YI8": "El comando del navegador falló",
- "kZGbeC4": "Linear",
- "fvIr9H8": "GitLab",
- "TH4OaOM": "GitHub",
- "xPjEgDM": "Bajo",
- "7LgwgJM": "Medio",
- "_pcc0Zw": "Alto",
- "e3kayEE": "Urgente",
- "X1FYz1o": "clic derecho",
- "AX4IXS0": "Respuesta inesperada de tareas Lineares",
- "SX56B0U": "No se puede resolver la base de la sucursal",
- "f-93Rxs": "No se pudo cargar el historial de confirmaciones",
- "O6Amqhs": "Estado de la sucursal no disponible",
- "9AhI4NI": "La Commit falló",
- "D2XJD5Q": "Error en la acción de control de código fuente",
- "1yTzUoY": "Esperando el escritorio...",
- "aNYrFtc": "No hay rama base para rebase",
- "rF-O-TA": "Esperando el escritorio...",
- "q53ZKds": "Vista previa de diferencias de rama binaria no disponible en dispositivos móviles",
- "AAVqwEI": "La entrada del terminal está bloqueada",
- "kiGJQl0": "No se pudo enviar el comando de reanudación",
- "n6zBfFc": "La respuesta del terminal creada no era válida",
- "GWephQg": "No se pudo crear la terminal",
- "KEeLFyA": "No se pudo preparar esta sesión del Codex heredado. Reintentar reanudar.",
- "64b63WI": "El contenido de la imagen del portapapeles debe ser base64.",
- "Oht8bkc": "La imagen del portapapeles es demasiado grande",
- "u_SAyGc": "La diferencia confirmada no está disponible",
- "qK2AOt0": "La respuesta diferencial no era válida",
- "47q1BdE": "No se puede cargar la diferencia",
- "1eue8fY": "No se pueden cargar notas de revisión",
- "EgST0cw": "La respuesta del control de fuente no era válida",
- "9Z6xNzo": "No se pueden cargar los cambios",
- "kyy8tNA": "La entrada del terminal está bloqueada",
- "-j2Yzyc": "No se pudo enviar el mensaje",
- "8WPx578": "La respuesta del terminal creada no era válida",
- "p20YlWo": "No se pudo crear la terminal",
- "dzoAXdg": "No se pudo guardar el estado de revisión",
- "a3rNaLA": "Esperando el escritorio...",
- "LYAe0FE": "La respuesta del terminal creada no era válida",
- "NhC30K0": "No se pudo crear la terminal",
- "-NMYOgc": "La entrada del terminal está bloqueada",
- "tpf9SfA": "No se pudieron enviar notas",
- "eH92OqQ": "No se pudo codificar la imagen del portapapeles redimensionada",
- "qYK5Ouo": "No se pudo guardar el comando rápido",
- "LuqBIhs": "No se pudo iniciar la grabación del micrófono",
- "oQrz0NI": "Se agotó el tiempo de espera de la llamada nativa para mantenerse despierto",
- "qiXFVWc": "No se detectó ninguna voz.",
- "Pwq6G9w": "No se pudo inicializar el micrófono",
- "InUuqhA": "Permiso de micrófono denegado",
- "CdTon5s": "No se pudo actualizar la configuración de dictado",
- "9VJGb2s": "No se pudo eliminar el modelo",
- "hkwxfd0": "No se pudo iniciar la descarga",
- "jcVunZ4": "No se pudieron cargar los modelos de dictado",
- "3cWf_os": "useHostProtocolGates debe usarse dentro de ",
- "l0xDyns": "Instantánea de cuentas no válidas del host",
- "dWotxRU": "Respuesta de reinicio no válida del host",
- "hIvuhiQ": "No se pudieron cargar los detalles del cheque",
- "hRiZhQg": "No se pueden cargar los metadatos del espacio de trabajo.",
- "THbZzp4": "No se puede contactar con el anfitrión",
- "MJ1SglY": "Deshabilite esa VPN o habilite el túnel dividido / \"Permitir LAN\".",
- "n-WXtiA": "Las VPN que no son de Tailscale pueden enrutar el tráfico local a través de un servidor remoto.",
- "PxeuBQc": "Actualice la aplicación Tailscale: las versiones recientes corrigen errores de reconexión.",
- "j0KeldQ": "Verifique que el escritorio esté activo y se muestre como conectado en su tailnet.",
- "rmMn9Xc": "iOS/Android puede bloquear silenciosamente el túnel: desactive y vuelva a activar Tailscale en la aplicación Tailscale.",
- "T6EL0oM": "Direcciones de host como 100.x.x.x o *.ts.net se conectan a través de Tailscale; manténgalo activado.",
- "S9tNuKw": "Reinicie ambas aplicaciones si persisten los tiempos de espera.",
- "gvS1F3o": "Vuelva a la lista de hosts y toque su host para volver a intentarlo.",
- "uGWzUrE": "Verifique la intensidad de la señal WiFi en su teléfono.",
- "neP0TKg": "Después de una actualización, es posible que tengas que volver a realizar el emparejamiento mediante un código QR.",
- "WkJ-I-g": "Intente reiniciar Orca: el servidor complementario se inicia al iniciarse.",
- "i4fV_jk": "Orca debe estar abierto en su escritorio para aceptar conexiones.",
- "rtC8ngI": "Las redes corporativas/escolares pueden bloquear el P2P; pruebe con un punto de acceso personal.",
- "401zg0M": "Linux: sudo ufw allow 6768",
- "ayekp1A": "Windows: Defender Firewall → Permitir aplicación: habilite Orca para redes privadas.",
- "REilmMs": "macOS: Configuración del sistema → Red → Firewall: permitir Orca.",
- "jEL8NQc": "Intente volver a conectar WiFi en ambos dispositivos.",
- "h6u3Ajc": "Ethernet y WiFi deben compartir la misma subred.",
- "DFWK1QU": "Ambos dispositivos deben estar en la misma LAN (a menos que estén conectados a través de Tailscale).",
- "q1Pbqtk": "Seleccionado",
- "p2fnv7c": "{{value0}} {{value1}}",
- "nEDriRI": "El terminal no se inicializó: no hay señal de listo desde la vista del terminal",
- "7IfxObc": "Toca para mostrar el teclado",
- "quM4RwQ": "Subiendo imagen al host",
- "ha7j7qM": "Preparando el micrófono",
- "_-dmI2A": "Transcribir en el escritorio",
- "GGXoono": "Toca el micrófono para detener",
- "97h575A": "Revisión requerida",
- "39Q08OU": "{{value0}} revisor",
- "d8cyKVY": "{{value0}} revisores",
- "UMqLjMs": "Comprobaciones sin resolver"
+ "mobileWorkspaceStatuses": {
+ "todo": "Por hacer",
+ "progress": "En curso",
+ "review": "En revisión",
+ "done": "Hecho"
+ },
+ "workspaceListPickerOptions": {
+ "pr": "Estado de PR",
+ "status": "Estado",
+ "no": "Sin agrupación",
+ "server": "Orden del servidor",
+ "repository": "Repositorio, luego nombre del espacio de trabajo",
+ "most": "La producción más reciente primero",
+ "recent": "Reciente",
+ "alphabetical": "Alfabéticamente por nombre",
+ "name": "Nombre",
+ "agents": "Agents que necesitan atención, luego actividad reciente",
+ "agent": "Actividad de Agents"
+ },
+ "agentRowDisplay": {
+ "done": "Hecho",
+ "interrupted": "interrumpido",
+ "waiting": "Esperando entrada",
+ "blocked": "Bloqueado",
+ "just": "ahora mismo"
+ },
+ "workspacePrStatusGroups": {
+ "closed": "Cerrado",
+ "progress": "En curso",
+ "review": "En revisión",
+ "done": "Hecho"
+ },
+ "task": {
+ "repository": "Repositorio",
+ "close": "Cerrar",
+ "reopen": "Reabrir",
+ "pullRequest": "Solicitud de extracción",
+ "updateItem": "Actualizar elemento",
+ "mergePullRequestTitle": "Solicitud de extracción de fusión",
+ "mergeRequestTitle": "Solicitud de fusión",
+ "chooseHowPull": "Elija cómo se debe fusionar esta solicitud de extracción.",
+ "chooseHowMerge": "Elija cómo se debe fusionar esta solicitud de combinación.",
+ "mergeMethod": "método de fusión",
+ "changeStatusMessage": "Cambiar estado",
+ "mergeMerge": "Solicitud de fusión de fusión",
+ "gitHubReportsMergeConflicts": "GitHub informa conflictos de fusión.",
+ "mergePullRequest": "Fusionar solicitud de extracción",
+ "copyGit": "Copiar enlace de GitHub",
+ "copied": "Copiado",
+ "copyLinear": "Copiar enlace Linear",
+ "createWorkspaceMessage": "Crear espacio de trabajo",
+ "creating": "Creando...",
+ "noComments": "Sin comentarios.",
+ "discussion": "Discusión",
+ "addSub": "Agregar subtema",
+ "subIssueTitle": "Título del sub-issue",
+ "open": "Abrir",
+ "noSub": "Sin subproblemas.",
+ "subIssues": "Subtemas",
+ "noPipeline": "No hay ejecuciones de pipeline para este MR.",
+ "none": "Ninguno",
+ "pipelineJob": "{{pipelineJobCount}} empleos",
+ "fileContents": "Contenido del archivo no disponible.",
+ "binary": "Archivo binario.",
+ "markViewed": "Marcar visto",
+ "markUnviewed": "Marcar como no visto",
+ "view": "Vista",
+ "hide": "Ocultar",
+ "changed": "Archivos modificados",
+ "noChecks": "No se encontraron cheques.",
+ "rerunAll": "Vuelva a ejecutar todo",
+ "rerunFailed": "Error al volver a ejecutar",
+ "refresh": "Actualizar",
+ "checks": "Comprobaciones",
+ "requestReview": "Solicitar revisión",
+ "requestReviewers": "Solicitar revisores",
+ "noReviewer": "No se encontraron sugerencias de revisores.",
+ "loadingReviewers": "Cargando revisores...",
+ "noReviewersRequested": "No se solicitaron revisores.",
+ "reviewers": "Revisores",
+ "updateAssignees": "Actualizar asignatarios",
+ "removeUsernames": "Eliminar nombres de usuario, separados por comas",
+ "addUsernames": "Agregar nombres de usuario, separados por comas",
+ "noAssignable": "No se encontraron usuarios asignables para este repositorio.",
+ "loadingAssignees": "Cargando asignados...",
+ "assignees": "Asignados",
+ "updateLabels": "Actualizar etiquetas",
+ "removeLabels": "Quitar etiquetas, separadas por comas",
+ "addLabels": "Agregar etiquetas, separadas por comas",
+ "noLabels": "No hay etiquetas en este repositorio.",
+ "loadingLabels": "Cargando etiquetas...",
+ "labels": "Etiquetas",
+ "saveTitle": "Guardar título",
+ "title": "Título",
+ "saveDescription": "Guardar descripción",
+ "description": "Descripción",
+ "project": "Proyecto",
+ "assignee": "Asignado",
+ "status": "Estado",
+ "type": "Tipo",
+ "refreshDetails": "Actualizar detalles",
+ "mergeRequires": "Merge requiere este repositorio en Orca.",
+ "closeItem": "Cerrar elemento",
+ "reopenItem": "Reabrir elemento",
+ "openGitHub": "Abrir en GitHub",
+ "workspaces": "Los espacios de trabajo solo se pueden crear a partir de propuestas de GitHub y solicitudes de extracción.",
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "reply": "Responder",
+ "resolve": "Resolver hilo",
+ "reopenThread": "Reabrir hilo",
+ "cancel": "Cancelar",
+ "save": "Guardar",
+ "editComment": "Editar comentario",
+ "show": "Mostrar",
+ "commentCountComments": "{{commentCount}} comentarios",
+ "clearField": "Borrar campo",
+ "saveField": "Guardar campo",
+ "text": "Texto",
+ "number": "Número",
+ "yyyy": "AAAA-MM-DD",
+ "noIterations": "No hay iteraciones disponibles.",
+ "enterDate": "Introduzca una fecha como AAAA-MM-DD.",
+ "enterValid": "Introduzca un número válido.",
+ "projectFieldsMessage": "Campos de proyecto",
+ "clearType": "Borrar tipo",
+ "noIssue": "No hay tipos de problemas configurados para este repositorio.",
+ "loadingIssue": "Cargando tipos de problemas...",
+ "issueType": "Tipo de issue",
+ "projectItem": "Elemento del proyecto",
+ "draftIssue": "Borrador de tema",
+ "copyRepository": "Copiar repositorio",
+ "repositoryNotOrca": "Repositorio no está en Orca",
+ "do": "No ejecutar",
+ "always": "Confía siempre y corre",
+ "failedTrust": "No se pudo confiar en el script de configuración.",
+ "runHooks": "Ejecutar hooks",
+ "setup": "Script de configuración",
+ "newSetup": "Nuevo script de configuración",
+ "orcaYamlTrustWarning": "El orca.yaml de este repositorio se ejecuta en su máquina antes de que comience el espacio de trabajo. Ejecútelo solo si confía en este repositorio.",
+ "runSetupRepo": "¿Ejecutar la configuración desde {{repoName}}?",
+ "repoNameS": "El script de configuración de {{repoName}} cambió",
+ "skip": "Saltar configuración y crear",
+ "runSetupCreate": "Ejecute la configuración y cree",
+ "runSetupScript": "¿Ejecutar el script de configuración?",
+ "directories": "Directorios",
+ "renderer": "UI del renderer",
+ "name": "Nombre",
+ "editSparse": "Editar preajuste disperso",
+ "newSparse": "Nuevo preajuste disperso",
+ "newPreset": "Nuevo preset",
+ "useWhole": "Utilice todo el repositorio",
+ "full": "Checkout completo",
+ "sparse": "Pago escaso",
+ "noBranches": "Ninguna rama coincide.",
+ "useRepositorys": "Utilice la base configurada de este repositorio",
+ "defaultBranch": "Rama predeterminada",
+ "searchBranches": "Buscar ramas",
+ "pick": "Elija una rama existente o referencia.",
+ "startMessage": "Empezar desde",
+ "connectRepository": "Conectar repositorio",
+ "detecting": "Detectando agents...",
+ "repositoryNotFound": "Repositorio no encontrado.",
+ "addGitRepositoryBeforeCreatingLinear": "Agregue un repositorio Git antes de crear un espacio de trabajo Linear.",
+ "start": "Empezar desde",
+ "advanced": "Avanzado",
+ "connectRepositoryFirst": "Conecte el repositorio primero",
+ "optional": "[Opcional]",
+ "workspaceName": "Nombre del espacio de trabajo",
+ "connect": "Conectar",
+ "connecting": "Conectando...",
+ "ssh": "Conexión SSH",
+ "createWorkspace": "Crear espacio de trabajo en",
+ "your": "Su clave se cifra a través del llavero del sistema operativo host y se almacena localmente.",
+ "linearSettings": "Configuración Linear/Seguridad/Nueva clave API",
+ "personal": "Clave API personal",
+ "paste": "Pegue una clave API personal para explorar problemas desde ese espacio de trabajo.",
+ "connectLinearWorkspace": "Conectar espacio de trabajo Linear",
+ "linearTeam": "Equipo Linear",
+ "createIssue": "Crear problema",
+ "addContext": "Agregar contexto",
+ "taskTitle": "Título de la tarea",
+ "origin": "Origen",
+ "issueSource": "Fuente de issues",
+ "team": "Equipo",
+ "createIssueSelectedLinear": "Cree una incidencia en el equipo Linear seleccionado.",
+ "createIssueSelectedRepository": "Cree un problema en el repositorio seleccionado.",
+ "sortTasks": "Ordenar tareas",
+ "displayProperties": "Propiedades de visualización",
+ "orderLinearIssues": "Ordenar cuestiones Lineares",
+ "groupLinearIssues": "Problemas Lineares del grupo",
+ "linearView": "Vista Linear",
+ "noStates": "No hay estados disponibles",
+ "loadingStates": "Cargando estados...",
+ "changeStatus": "Cambiar estado",
+ "allTeams": "Todos los equipos",
+ "chooseWhichTeams": "Elija qué equipos aparecen en Tareas.",
+ "linearTeams": "Equipos Lineares",
+ "failedSwitch": "No se pudo cambiar el espacio de trabajo",
+ "linearWorkspace": "Espacio de trabajo Linear",
+ "linearFilter": "Filtro Linear",
+ "gitLabFilter": "Filtro GitLab",
+ "gitLabView": "Vista de GitLab",
+ "hidden": "Oculto de las tarjetas",
+ "shown": "Mostrado en tarjetas",
+ "viewHas": "Esta vista no tiene campos adicionales para mostrar.",
+ "chooseWhichProject": "Elija qué campos de proyecto aparecen en las tarjetas de artículos.",
+ "projectFields": "Campos del proyecto",
+ "projectSort": "Ordenar proyecto",
+ "orcaDoes": "Orca aún no admite este diseño del Proyecto GitHub.",
+ "projectView": "Vista del proyecto",
+ "chooseProjectView": "Elija la vista del proyecto",
+ "noMore": "No más proyectos.",
+ "noMatchingProjects": "No hay proyectos coincidentes.",
+ "browseAll": "Explorar todo",
+ "browseAllLoading": "Explorar todo (cargando...)",
+ "pin": "Fijar",
+ "recent": "Reciente",
+ "remove": "Eliminar",
+ "pinned": "Fijado",
+ "tap": "Toca para volver a intentarlo.",
+ "noProjects": "No hay proyectos cargados",
+ "failedLoadProjects": "No se pudieron cargar los proyectos",
+ "useAdd": "Utilice Agregar por URL para llegar a los proyectos faltantes.",
+ "some": "Algunas organizaciones no cargaron ({{githubProjectPartialFailureCount}}).",
+ "couldNotLoadProjects": "No se pudieron cargar proyectos desde {{owner}}.",
+ "add": "Agregar",
+ "adding": "Agregando...",
+ "addUrl": "Agregar por URL u owner/number",
+ "searchProjects": "Buscar proyectos",
+ "chooseProjectViewTasks": "Elija una vista de proyecto para la página Tareas.",
+ "gitHubProjects": "Proyectos GitHub",
+ "loads": "Carga resultados anteriores",
+ "loaded": "Cargado",
+ "jump": "Salta a una página de resultados cargada o disponible.",
+ "gitHubPages": "Páginas de GitHub",
+ "pullRequests": "Solicitudes de extracción",
+ "gitHubView": "Vista de GitHub",
+ "noAlternate": "No hay fuentes de emisión alternativas disponibles.",
+ "chooseWhether": "Elija si cada repositorio consulta y crea trabajo desde el origen o desde el origen.",
+ "gitHubIssue": "Fuentes de problemas de GitHub",
+ "allRepositories": "Todos los repositorios",
+ "chooseWhichRepositories": "Elija qué repositorios consultar.",
+ "repositories": "Repositorios",
+ "taskSource": "Origen de tareas",
+ "next": "Página siguiente",
+ "pagePage": "Página {{pageNumber}}",
+ "selectPagePageGithubCurrentPage": "Seleccionar página, Página {{githubCurrentPage}}",
+ "previous": "Página anterior",
+ "changeStatusName": "Cambiar estado de {{fromName}}",
+ "noProject": "Sin elementos de proyecto",
+ "chooseGit": "Elija un proyecto de GitHub",
+ "connectLinear": "Conectar Linear",
+ "browseStart": "Explore y comience a trabajar en sus problemas Lineares asignados directamente desde Tareas.",
+ "connectYour": "Conecta tu cuenta Linear",
+ "mobile": "Esta vista de Tareas móvil necesita un tiempo de ejecución de escritorio más nuevo.",
+ "updateOrcaDesktop": "Actualizar el escritorio de Orca",
+ "subIssueData": "Los datos de sub-issues no están disponibles para tu token.",
+ "retry": "Reintentar",
+ "retrying": "Reintentando...",
+ "retryLoading": "Reintente cargar problemas desde {{owner}}/{{repo}}",
+ "couldNotLoadIssues": "No se pudieron cargar los issues de",
+ "searchProvider": "Buscar {{providerLabel}} tareas...",
+ "searchProject": "Buscar vista de proyecto...",
+ "display": "Mostrar",
+ "tasks": "Tareas",
+ "allWorkspaces": "Todos los espacios de trabajo",
+ "viewOrder": "Ver pedido",
+ "send": "Enviar comentario",
+ "addComment": "Agregar un comentario",
+ "failedUpdateIssueSource": "No se pudo actualizar la fuente del problema",
+ "failedCreateTask": "No se pudo crear la tarea",
+ "failedCreateLinearSub": "No se pudo crear el subproblema Linear",
+ "failedLoadLinearSub": "No se pudo cargar el subproblema Linear",
+ "failedAddLinear": "No se pudo agregar el comentario Linear",
+ "failedUpdateLinear": "No se pudo actualizar el problema Linear",
+ "failedMerge": "No se pudo fusionar",
+ "gitHubReportsMergeConflictsOpen": "GitHub informa conflictos de fusión. Open in GitHub to continue.",
+ "failedReply": "No se pudo responder",
+ "failedAddReview": "No se pudo agregar el comentario de revisión",
+ "unableComment": "No se puede comentar sin el SHA del head del PR.",
+ "failedLoadFile": "No se pudo cargar el contenido del archivo",
+ "unableLoad": "No se puede cargar el contenido del archivo para esta solicitud de extracción.",
+ "failedUpdateReview": "No se pudo actualizar el hilo de revisión",
+ "failedUpdateViewed": "No se pudo actualizar el estado visto",
+ "unableSync": "No se puede sincronizar el estado visto de este pull request.",
+ "failedRerun": "No se pudieron volver a ejecutar los checks",
+ "failedRefresh": "No se pudieron actualizar los checks",
+ "failedRequest": "No se han podido solicitar revisores",
+ "failedCopyText": "No se pudo copiar el texto",
+ "failedCopyLink": "No se pudo copiar el enlace",
+ "failedAddComment": "No se pudo agregar el comentario",
+ "failedUpdateGitLab": "No se pudo actualizar el elemento de GitLab",
+ "failedUpdateGitHubPull": "No se pudo actualizar la solicitud de extracción de GitHub",
+ "failedUpdateGitHubIssue": "No se pudo actualizar el problema de GitHub",
+ "failedUpdateStatus": "No se pudo actualizar el estado",
+ "failedMergePull": "No se pudo hacer merge del pull request",
+ "failedUpdateIssueType": "No se pudo actualizar el tipo de problema",
+ "projectIssue": "Este tipo de problema de proyecto no se puede editar desde el móvil.",
+ "failedUpdateProject": "No se pudo actualizar el campo del proyecto",
+ "failedUpdateItem": "No se pudo actualizar el elemento",
+ "projectItemCannot": "Este elemento del proyecto no se puede editar desde el móvil.",
+ "failedDelete": "No se pudo eliminar el comentario",
+ "projectCommentCannotDeleted": "Este comentario de proyecto no se puede eliminar del móvil.",
+ "failedEdit": "No se pudo editar el comentario",
+ "projectCommentCannotEdited": "Este comentario de proyecto no se puede editar desde el móvil.",
+ "addProject": "Agregue el repositorio de elementos del proyecto a Orca antes de crear un espacio de trabajo.",
+ "failedCreateWorkspace": "No se pudo crear el espacio de trabajo",
+ "failedSave": "No se pudo guardar el ajuste preestablecido disperso.",
+ "failedSearch": "No se pudieron buscar ramas.",
+ "failedLoadSparse": "No se pudieron cargar ajustes preestablecidos escasos.",
+ "openShell": "abrir un caparazón",
+ "failedLoadIssue": "No se pudieron cargar los tipos de problemas",
+ "failedLoadAssignees": "No se pudieron cargar los asignados",
+ "failedLoadLabels": "No se pudieron cargar las etiquetas",
+ "failedLoadDetails": "No se pudieron cargar los detalles",
+ "failedLoadLinearContext": "No se pudo cargar el contexto Linear",
+ "failedAddProject": "No se pudo agregar el proyecto.",
+ "expected": "Se esperaba una URL del proyecto o propietario/número.",
+ "failedSelect": "No se pudo seleccionar el proyecto",
+ "failedLoadProject": "No se pudo cargar la vista del proyecto",
+ "failedLoadMore": "No se pudieron cargar más tareas de GitHub",
+ "connection": "La conexión falló",
+ "failedLoadTasks": "No se pudieron cargar las tareas",
+ "failedLoadTasksSettings": "No se pudo cargar la configuración de Tareas",
+ "updateOrcaDesktopUse": "Actualice el escritorio de Orca para usar Tasks en dispositivos móviles.",
+ "addReview": "Agregar comentario de revisión",
+ "noText": "No se encontraron cambios de texto.",
+ "groupRepository": "Agrupar por repositorio, luego actividad más reciente",
+ "newest": "Actividad más reciente primero",
+ "updated": "Actualizado",
+ "pending": "Pendiente GitLab todos",
+ "myTodos": "mis todos",
+ "mergeRequests": "Fusionar solicitudes y problemas por repositorio",
+ "projectMrs": "Proyecto MR",
+ "reviewRequests": "Revisar las solicitudes que se le asignaron",
+ "needs": "Necesita revisión",
+ "pullRequestsAuthored": "Solicitudes de extracción creadas por usted",
+ "mine": "Mío",
+ "openPull": "Abrir solicitudes de extracción",
+ "openIssuesAssigned": "Problemas abiertos asignados a usted",
+ "assignedMe": "Asignado a mí",
+ "openGitHubIssues": "Abrir problemas de GitHub",
+ "gitHubProjectsViews": "Vistas de proyectos de GitHub",
+ "projects": "Proyectos",
+ "gitHubPull": "Solicitudes de extracción de GitHub",
+ "gitHubIssues": "Issues de GitHub",
+ "priority": "Prioridad",
+ "identifier": "Identificador",
+ "noGrouping": "Sin agrupación",
+ "grouped": "Columnas agrupadas",
+ "board": "Tablero",
+ "compact": "Filas de problemas compactas",
+ "list": "Lista",
+ "recently": "Problemas completados recientemente",
+ "completed": "Completado",
+ "issuesCreated": "Problemas creados por ti",
+ "created": "Creado",
+ "issuesAssigned": "Problemas asignados a usted",
+ "myIssues": "Mis problemas",
+ "openIssuesAcross": "Problemas abiertos en espacios de trabajo conectados",
+ "all": "Todo",
+ "any": "Cualquier estado de GitLab",
+ "closedIssues": "Problemas cerrados y solicitudes de fusión",
+ "closed": "Cerrado",
+ "mergedMerge": "Solicitudes de fusión fusionadas",
+ "merged": "Mergeado",
+ "openIssuesMerge": "Problemas abiertos y solicitudes de fusión",
+ "assignedTeam": "Problemas asignados y de equipo",
+ "issuesMerge": "Problemas y solicitudes de fusión",
+ "issuesPull": "Problemas y solicitudes de extracción",
+ "diffPreviewTruncated": "Mostrando el primer {{maxRenderedPrDiffLines}} de {{totalLineCount}} líneas de diferencias.",
+ "commentLine": "Comentar en la línea {{commentLine}}",
+ "source": "Fuente: {{githubIssueSourceLabel}}",
+ "sortGithub": "Ordenar: {{githubProjectSortLabel}}",
+ "fieldsGithub": "Campos: {{githubProjectFieldsLabel}}",
+ "groupLinearGroup": "Grupo: {{linearGroupLabel}}",
+ "orderLinearOrder": "Orden: {{linearOrderLabel}}",
+ "preferred": "La fuente de problemas preferida en sentido ascendente no está disponible para {{repoName}}. Usando origen.",
+ "plus": "+{{githubProjectSummaryFieldCount}} campos",
+ "baseBranch": "en {{baseBranch}}",
+ "querying": "Consultando {{prs}}",
+ "teamCount": "{{teamCount}} equipos",
+ "newProvider": "Nuevo problema {{providerLabel}}",
+ "fileIssue": "Archivo en {{issueSource}}",
+ "createRef": "Crear desde {{refName}}",
+ "branch": "Nombre de la rama: {{localBranchName}}",
+ "repoNameRequires": "{{repoName}} requiere una opción de configuración antes de crear este espacio de trabajo.",
+ "owner": "{{owner}}/{{repo}} no se agrega a Orca. Agregue este repositorio desde la aplicación de escritorio y luego actualice las Tareas móviles.",
+ "gitHubProject": "Proyecto GitHub · {{repository}} {{projectNumber}}",
+ "noType": "Ningún tipo",
+ "directory": "{{directoryCount}} directorios",
+ "oneDirectory": "1 directorio",
+ "remote": "repositorio remoto",
+ "selectRepository": "Seleccione un repositorio",
+ "linearIssue": "Issue de Linear",
+ "items": "Elementos",
+ "openView": "Abrir vista en GitHub",
+ "noLinear": "Sin tareas Lineares",
+ "noGitLab": "Sin tareas de GitLab",
+ "noGitHub": "Sin tareas de GitHub",
+ "noMatchingTasks": "No hay tareas coincidentes",
+ "connectHost": "Conéctese a un host para cargar tareas",
+ "chooseProject": "Elige proyecto",
+ "oneTeam": "1 equipo",
+ "workspace": "Espacio de trabajo",
+ "fields": "Campos",
+ "githubProject": "Campos {{githubProjectSummaryFieldCount}}/{{githubProjectAvailableSummaryFieldCount}}",
+ "ascending": "ascendente",
+ "descending": "descendente",
+ "selectedHosted": "{{selectedHostedRepoCount}} repositorios",
+ "repositoryCountRepository": "{{repositoryCount}} repositorio",
+ "repositoryCountRepositories": "{{repositoryCount}} repositorios",
+ "allRepos": "Todos los repos",
+ "githubIssue": "{{githubIssueSourceRowCount}} fuentes",
+ "selectTarget": "Seleccionar objetivo",
+ "workspaceSparse": "\"{{workspaceSparseDraftNameCollisionName}}\" ya existe.",
+ "nameMust": "El nombre debe tener 80 caracteres o menos.",
+ "nameRequired": "El nombre es obligatorio.",
+ "repositoryHooks": "ganchos de repositorio",
+ "local": "ganchos locales",
+ "commentCountComment": "{{commentCount}} comentario",
+ "noCommentsYet": "Aún no hay comentarios",
+ "top": "Comentario de nivel superior",
+ "reviewThread": "Hilo de revisión",
+ "resolvedReviewThread": "Hilo de revisión resuelto",
+ "review": "Revisar",
+ "resolvedReview": "Revisión resuelta",
+ "openLinear": "Abrir en Linear",
+ "openGitLab": "Abrir en GitLab",
+ "linearTicket": "billete Linear",
+ "mergeRequest": "Solicitud de fusión",
+ "empty": "Vacío",
+ "mergePr": "¿Fusionar PR #{{pullRequestNumber}}?",
+ "rebaseMergePr": "¿Rebasear y fusionar PR #{{pullRequestNumber}}?",
+ "squashMergePr": "¿Aplastar y fusionar PR #{{pullRequestNumber}}?",
+ "squashMerge": "Squash y merge",
+ "createMerge": "Crear commit de fusión",
+ "rebaseMerge": "Rebase y fusionar",
+ "unknown": "Desconocido",
+ "able": "Se puede hacer merge",
+ "blocked": "Bloqueado",
+ "behind": "Por detrás",
+ "conflicts": "Conflictos",
+ "locked": "bloqueado",
+ "draft": "Borrador",
+ "redacted": "Redactado",
+ "resolvedThread": "Hilo resuelto por {{commentAuthor}}",
+ "resolvedComment": "Comentario resuelto por {{commentAuthor}}",
+ "current": "Actual y próximos",
+ "failedCount": "{{failedCount}} de {{repositoryCount}} no se pudo cargar.",
+ "noReviewers": "Sin revisores",
+ "changes": "Cambios solicitados",
+ "approved": "Aprobado",
+ "noDescription": "Sin descripción.",
+ "default": "Predeterminado",
+ "subtitle": "{{subtitle}} · Predeterminado",
+ "unsupported": "Diseño no compatible en dispositivos móviles",
+ "viewProject": "Ver #{{projectViewNumber}}",
+ "sortAscending": "Orden ascendente",
+ "currently": "Actualmente {{currentSortDirection}} · toque para {{nextSortDirection}}",
+ "usesGit": "Utiliza el orden de clasificación de GitHub",
+ "usesSort": "Utiliza {{sortFieldName}} {{sortDirection}}",
+ "failedCreateLinearIssue": "No se pudo crear un problema Linear",
+ "selectLinear": "Seleccione primero un equipo Linear.",
+ "failedCreateProvider": "No se pudo crear el problema {{provider}}",
+ "addGitRepositoryBeforeCreatingProvider": "Agregue un repositorio Git antes de crear una incidencia {{provider}}.",
+ "failedCreateSub": "No se pudo crear el sub-issue",
+ "subIssueNot": "Subproblema no encontrado",
+ "failedReopen": "No se pudo reabrir el hilo",
+ "failedResolve": "No se pudo resolver el hilo",
+ "failedSync": "No se pudo sincronizar el estado visto con GitHub.",
+ "invalid": "Respuesta de cheques no válidos",
+ "failedUpdateGitHubStatus": "No se pudo actualizar el estado de GitHub",
+ "failedUpdateGitHubItem": "No se pudo actualizar el elemento de GitHub",
+ "selectedAgent": "El agent seleccionado está deshabilitado. Elige un agent habilitado antes de crear.",
+ "connectDisplay": "Conecte {{displayName}} antes de crear un espacio de trabajo.",
+ "failedConnectSsh": "No se pudo conectar al repositorio SSH.",
+ "failedRead": "No se pudo leer el estado de la conexión SSH.",
+ "details": "Detalles no encontrados",
+ "projectHas": "Este proyecto no tiene vistas admitidas.",
+ "failedConnectLinear": "No se pudo conectar Linear",
+ "failedLoadGitLab": "No se pudieron cargar las tareas de GitLab",
+ "failedLoadGitHub": "No se pudieron cargar las tareas de GitHub",
+ "iteration": "Iteración",
+ "unassigned": "No asignado",
+ "editPreset": "Editar {{presetName}}",
+ "squashMergeConfirmation": "¿Aplastar y fusionar {{reviewType}} #{{pullRequestNumber}}?",
+ "discussionComment": "{{commentCount}} comentarios",
+ "selectPagePageGithubCurrentPageGithub": "Seleccionar página, Página {{githubCurrentPage}} de {{githubTotalPages}}",
+ "pageGithub": "Página {{githubCurrentPage}} de {{githubTotalPages}}",
+ "confirm": "Confirmar",
+ "requested": "Solicitado",
+ "low": "Bajo",
+ "medium": "Medio",
+ "high": "Alto",
+ "urgent": "Urgente",
+ "selected": "Seleccionado"
+ },
+ "accounts": {
+ "add": "Agregue o vuelva a autenticar cuentas desde Configuración de escritorio → Cuentas.",
+ "loading": "Cargando cuentas…",
+ "accounts": "Cuentas",
+ "use": "Utilice el inicio de sesión propio del agent",
+ "system": "Predeterminado del sistema",
+ "could": "No se pudo cambiar de cuenta",
+ "hostNot": "Anfitrión no encontrado",
+ "invalid": "Instantánea de cuentas no válidas del host",
+ "connecting": "Conectándose a {{hostName}}…"
+ },
+ "edit": {
+ "accepts": "Acepta IP, host:puerto o ws:// / wss://. El puerto que falta tiene como valor predeterminado el puerto actual (o 6768).",
+ "address": "Dirección",
+ "hostName": "Nombre de host",
+ "name": "Nombre",
+ "connectionAddressDescription": "Cambie el nombre para mostrar o la dirección de conexión. Las ediciones de direcciones solo cambian el lugar donde se conecta este teléfono; no se vuelven a emparejar. Utilícelo cuando se pueda acceder al mismo escritorio en una IP diferente (por ejemplo, LAN doméstica o Tailscale).",
+ "go": "Volver",
+ "save": "Guardar",
+ "saveHost": "Guardar host",
+ "edit": "Editar anfitrión",
+ "back": "Atrás",
+ "failedSave": "No se pudo guardar el host.",
+ "enter": "Introduzca un nombre.",
+ "failedLoad": "No se pudo cargar el host.",
+ "hostRemoved": "Este host fue eliminado de este teléfono.",
+ "missing": "Anfitrión desaparecido.",
+ "connects": "Se conecta a {{endpoint}}"
+ },
+ "host": {
+ "removeHostName": "¿Quitar \"{{hostName}}\"? Puedes volver a emparejarlo más tarde.",
+ "removeHost": "Quitar anfitrión",
+ "delete": "Eliminar",
+ "sleep": "Dormir",
+ "cancel": "Cancelar",
+ "deleteWorktree": "Eliminar worktree",
+ "repositories": "Repositorios",
+ "hideDefault": "Ocultar rama predeterminada",
+ "hideSleeping": "Ocultar en reposo",
+ "workspaces": "Espacios de trabajo",
+ "clear": "Limpiar filtros",
+ "filter": "Filtrar",
+ "groupTitle": "Agrupar por",
+ "sort": "Ordenar por",
+ "status": "Estado",
+ "group": "Agrupar",
+ "searchWorkspaces": "Buscar espacios de trabajo",
+ "close": "Cerrar búsqueda",
+ "new": "Nuevo espacio de trabajo",
+ "floating": "Espacio de trabajo flotante",
+ "tasks": "Tareas",
+ "accounts": "Cuentas",
+ "groupWorkspaces": "Espacios de trabajo grupales",
+ "sortSelected": "Ordenar por {{selectedSortLabel}}",
+ "filterWorkspaces": "Filtrar espacios de trabajo",
+ "filterWorkspaces1": "Filtrar espacios de trabajo, 1 filtro activo",
+ "filterWorkspacesActive": "Filtrar espacios de trabajo, {{activeFilterCount}} filtros activos",
+ "hideSidebar": "Ocultar barra lateral",
+ "reconnect": "Reconectar",
+ "back": "Volver a anfitriones",
+ "please": "Por favor inténtalo de nuevo.",
+ "could": "No se pudo eliminar el host",
+ "hostNot": "Anfitrión no encontrado",
+ "filterActive": "Filtro{{activeFilterCount}}",
+ "deleteDisplay": "¿Eliminar \"{{displayName}}\" ({{branch}})?",
+ "noWorktrees": "Sin árboles de trabajo",
+ "noWorktreesMatch": "Ningún árbol de trabajo coincide con los filtros",
+ "noMatching": "No hay árboles de trabajo coincidentes",
+ "searchWorktreesAccessibility": "Buscar árboles de trabajo",
+ "searchWorktrees": "Buscar árboles de trabajo…",
+ "recent": "Reciente",
+ "pin": "Fijar",
+ "unpin": "Desanclar",
+ "remove": "Eliminar"
+ },
+ "quickCommandsTabButton": {
+ "quick": "Comandos rápidos"
+ },
+ "worktreeId": {
+ "remove": "Eliminar",
+ "removeCustom": "¿Eliminar este acceso directo personalizado?",
+ "enterUrl": "Ingrese una URL o déjela en blanco para abrir una nueva pestaña.",
+ "newBrowser": "Nuevo navegador",
+ "terminalName": "Nombre del terminal",
+ "rename": "Cambiar nombre de terminal",
+ "replace": "¿Reemplazar el borrador del teléfono con el último archivo de escritorio?",
+ "discardChanges": "Descartar cambios",
+ "discardLeave": "Descartar y dejar",
+ "copyAll": "Copiar todo y salir",
+ "copyDiscard": "Copie o descarte los borradores del teléfono antes de irse.",
+ "unsaved": "Cambios de markdowns no guardados",
+ "refresh": "Actualizar",
+ "copyPath": "Copiar ruta",
+ "copyNotes": "Copiar notas",
+ "choose": "Elija una sesión de agent para las notas actuales.",
+ "sendReviewNotes": "Enviar notas de revisión",
+ "markdownNote": "Nota de Markdowns",
+ "browser": "Navegador",
+ "newTabTitle": "Nueva pestaña",
+ "paste": "Pegar",
+ "create": "Crear pestaña",
+ "creating": "Creando...",
+ "noTabs": "No hay pestañas en esta sesión",
+ "dismissWorkspace": "Descartar advertencia de creación de espacio de trabajo",
+ "more": "Más acciones de sesión",
+ "reconnect": "Volver a conectarse al escritorio",
+ "back": "Volver a los árboles de trabajo",
+ "agent": "Presets de Agent no disponibles",
+ "noEnabled": "No hay Agents habilitados",
+ "detecting": "Agents de detección",
+ "browserPage": "La página del navegador aún no está disponible.",
+ "desktopUpdateRequiredMobile": "Se requiere actualización de escritorio para la transmisión del navegador móvil",
+ "edit": "Edite este comando rápido antes de ejecutarlo",
+ "selection": "Selección borrada (desplazada fuera del búfer)",
+ "couldNotCopy": "no se pudo copiar",
+ "copied": "Copiado",
+ "couldNotClear": "No se pudo borrar la terminal",
+ "terminalCleared": "Terminal despejada",
+ "input": "Entrada demasiado grande (máximo 256 KiB)",
+ "openOrca": "Abre Orca en el host para despertar a los agents durmientes.",
+ "saved": "Guardado",
+ "couldNotCopyNotes": "No se pudieron copiar notas",
+ "notesCopied": "notas copiadas",
+ "failedDelete": "No se pudo eliminar la nota",
+ "failedSaveNote": "No se pudo guardar la nota",
+ "note": "Nota agregada",
+ "couldNotLoadMarkdown": "No se pudo cargar la markdown",
+ "titlePreview": "Vista previa de {{title}}",
+ "titleImage": "{{title}} imagen",
+ "send": "Enviar",
+ "sendReviewNotesAi": "Enviar notas de revisión a AI",
+ "copy": "Copiar",
+ "copyReview": "Copiar notas de revisión",
+ "noReview": "Sin notas de revisión",
+ "saveNote": "guardar nota",
+ "cancel": "Cancelar",
+ "addReview": "Agregar nota de revisión",
+ "delete": "Eliminar nota en la línea {{lineNumber}}",
+ "addNote": "Agregar nota en la línea {{commentLine}}",
+ "titleDiff": "{{title}} línea diferencial {{lineNumber}}",
+ "save": "Guardar",
+ "discard": "Descartar",
+ "retry": "Reintentar",
+ "line": "Línea {{lineNumber}}",
+ "shortcut": "Atajo",
+ "file": "Archivo",
+ "sendCommand": "enviar comando",
+ "type": "Escribe un comando…",
+ "typed": "El texto escrito se envía directamente al terminal activo",
+ "show": "Mostrar teclado para entrada de terminal en vivo",
+ "addCustom": "Agregar acceso directo personalizado",
+ "pasteClipboard": "Pegar desde el portapapeles",
+ "switchLive": "Cambiar a entrada de terminal en vivo",
+ "switchBuffered": "Cambiar a entrada de comando almacenada en búfer",
+ "switchPhone": "Cambiar al modo teléfono",
+ "switchDesktop": "Cambiar al modo de escritorio",
+ "hides": "Oculta el teclado del software y mantiene abierta la sesión actual del terminal.",
+ "dismissKeyboard": "Descartar teclado",
+ "loadingTerminal": "terminal de carga",
+ "checking": "Comprobando las capacidades del escritorio: inténtalo de nuevo en un momento",
+ "desktopUpdateRequiredQuick": "Se requiere actualización de escritorio para comandos rápidos",
+ "newTab": "Nueva pestaña",
+ "openSource": "Control de código abierto",
+ "openFile": "Abrir explorador de archivos",
+ "couldNotSend": "No se pudieron enviar notas",
+ "notesSent": "Notas enviadas",
+ "couldNotCopyDrafts": "No se pudieron copiar borradores",
+ "path": "Ruta copiada",
+ "verdict": "{{verdictDisplayLabel}} — toca para volver a intentarlo",
+ "visible": "{{visibleTabCount}} pestañas",
+ "one": "1 pestaña",
+ "loadingTabs": "Cargando pestañas",
+ "browserCommand": "El comando del navegador falló",
+ "failedCreateBrowser": "No se pudo crear el navegador",
+ "enterValid": "Introduce una URL válida",
+ "failedCreateMarkdown": "No se pudo crear la nota de markdowns",
+ "quick": "comando rápido",
+ "failedCreateTerminal": "No se pudo crear la terminal",
+ "saveFailed": "Error al guardar",
+ "couldNotLoadFile": "No se pudo cargar la vista previa del archivo",
+ "couldNotLoadDiff": "No se pudo cargar la vista previa de diferencias",
+ "fileToo": "Archivo demasiado grande para la vista previa móvil",
+ "binary": "Vista previa binaria no disponible",
+ "dictation": "Dictado insertado",
+ "changed": "Cambiado en el escritorio",
+ "read": "Solo lectura",
+ "commentCountReviewNote": "{{commentCount}} nota de revisión",
+ "commentCountReviewNotes": "{{commentCount}} notas de revisión",
+ "copyNotesInstead": "Copie notas en su lugar",
+ "newAgent": "Nueva sesión de agent",
+ "check": "Verifique la conexión del host",
+ "unableCreate": "No se puede crear una nota de markdowns sin título",
+ "terminalInput": "La entrada del terminal está bloqueada por otro cliente.",
+ "failedSend": "No se pudieron enviar notas",
+ "failedSaveReview": "No se pudieron guardar las notas de revisión",
+ "waiting": "Esperando el escritorio...",
+ "unableRead": "No se puede leer la markdown",
+ "sendKey": "Enviar {{keyLabel}}",
+ "open": "Abrir"
+ },
+ "layout": {
+ "changes": "Cambios",
+ "agent": "Historial de sesiones de Agents",
+ "source": "Control de código fuente",
+ "tasks": "Tareas",
+ "accounts": "Cuentas",
+ "edit": "Editar anfitrión"
+ },
+ "connectionHealth": {
+ "reconnecting": "Reconectando…",
+ "cannotConnect": "no puedo conectarme",
+ "cannotReach": "No puedo acceder al escritorio",
+ "disconnected": "Desconectado",
+ "connecting": "Conectando…",
+ "connected": "Conectado",
+ "pairing": "Emparejamiento no válido: vuelva a emparejarlo con su computadora de escritorio",
+ "check": "Comprobar Tailscale"
+ },
+ "hostEndpoint": {
+ "port": "El puerto debe ser 1–65535.",
+ "missing": "Falta el nombre de host.",
+ "notValidAddress": "No es una dirección válida.",
+ "notValidHostname": "No es un nombre de host válido.",
+ "host": "El host no debe incluir una ruta o consulta.",
+ "use": "Utilice ws:// o wss:// (o host:puerto).",
+ "enter": "Introduzca una dirección de host."
+ },
+ "mobileRelayHostOverlay": {
+ "expected": "Se esperaba exactamente un punto final para los metadatos de retransmisión configurados",
+ "relayHost": "La identidad del host de retransmisión no coincide",
+ "relayIdentity": "La identidad de retransmisión y el punto final deben coexistir"
+ },
+ "mobileRelayRpcStreams": {
+ "connection": "Conexión interrumpida"
+ },
+ "mobileConnectionPathLabel": {
+ "directLan": "Directo · LAN",
+ "directTailscale": "Directo · Tailscale"
+ },
+ "pairConfirmState": {
+ "not": "No es un código de emparejamiento válido",
+ "missing": "Falta el código de emparejamiento"
+ },
+ "terminalAccessoryKeyCatalog": {
+ "clearLine": "Borrar línea antes del cursor",
+ "delete": "Eliminar palabra al revés",
+ "end": "Fin de linea",
+ "start": "inicio de linea",
+ "reverse": "búsqueda inversa",
+ "suspend": "Suspender proceso",
+ "clearScreen": "Borrar pantalla",
+ "send": "Enviar EOF",
+ "interrupt": "Terminal de interrupción",
+ "arrowRight": "Flecha derecha",
+ "arrowLeft": "Flecha izquierda",
+ "arrowDown": "Flecha hacia abajo",
+ "arrowUp": "Flecha arriba",
+ "forward": "Eliminar hacia adelante",
+ "backspace": "Retroceso",
+ "space": "Espacio",
+ "shiftTab": "Pestaña Mayús",
+ "shiftPlus": "Mayús+Tab",
+ "escape": "Escapar"
+ },
+ "terminalWebviewEngineErrorState": {
+ "reload": "Recargar",
+ "terminal": "La terminal no pudo cargarse"
+ },
+ "terminalWebviewNotificationDispatch": {
+ "unknown": "Error de terminal desconocido"
+ },
+ "terminalWebView": {
+ "terminalWebViewRender": "El proceso de renderizado de Terminal WebView finalizó",
+ "terminalWebViewHttp": "Error HTTP de terminal WebView",
+ "terminalWebViewLoad": "La carga de Terminal WebView falló"
+ },
+ "terminalAccessoryKeys": {
+ "pageDown": "Página abajo",
+ "pageUp": "Página arriba",
+ "end": "Fin",
+ "home": "Inicio",
+ "arrowRight": "Flecha derecha",
+ "arrowLeft": "Flecha izquierda",
+ "arrowDown": "Flecha hacia abajo",
+ "arrowUp": "flecha arriba",
+ "insert": "Insertar",
+ "pgDn": "AvPág",
+ "pgUp": "Re Pág",
+ "shift": "Cambio",
+ "alt": "Alt.",
+ "ctrl": "Control"
+ },
+ "terminalWebviewReadyWatchdog": {
+ "terminal": "El terminal no se inicializó: no hay señal de listo desde la vista del terminal"
+ },
+ "mobileSmartSourceModes": {
+ "all": "Todo",
+ "closed": "Cerrado",
+ "merged": "Mergeado",
+ "open": "Abrir",
+ "name": "Nombre",
+ "branch": "Rama",
+ "smart": "Inteligente"
+ },
+ "sparsePresetDraft": {
+ "use": "Usa directorios relativos al repo, no la raíz, rutas absolutas ni segmentos padre.",
+ "add": "Agrega al menos un directorio."
+ },
+ "mobileGithubProjectGroupSort": {
+ "no": "Sin {{fieldName}}",
+ "iteration": "Iteración"
+ },
+ "workspaceAgentSelection": {
+ "blank": "Terminal en blanco"
+ },
+ "workspaceSshGate": {
+ "disconnected": "Desconectado",
+ "connection": "La conexión falló",
+ "reconnect": "Error al volver a conectar",
+ "authentication": "Error de autenticación",
+ "reconnecting": "Reconectando",
+ "deploying": "Implementación de retransmisión",
+ "connecting": "Conectando",
+ "connected": "Conectado"
+ },
+ "mobileHostedCheckStatus": {
+ "passed": "{{passedCheckCount}}/{{totalCheckCount}} pasó",
+ "pending": "{{pendingCheckCount}} pendiente",
+ "review": "Revisión requerida",
+ "reviewerCountReviewer": "{{reviewerCount}} revisor",
+ "reviewerCountReviewers": "{{reviewerCount}} revisores"
+ },
+ "worktreeCreateRetry": {
+ "failed": "No se pudo crear el espacio de trabajo"
+ },
+ "useMobileComposerSource": {
+ "failed": "No se pudo resolver la rama base."
+ },
+ "linearMobileIssueRead": {
+ "unexpected": "Respuesta inesperada de tareas Lineares"
+ },
+ "codexResetAttemptJournal": {
+ "wsl": "Los alcances de reinicio de WSL requieren una distribución exacta",
+ "host": "Los ámbitos de reinicio del host no pueden nombrar una distribución WSL"
+ },
+ "mobileBranchDiffPreviewDrawer": {
+ "diff": "Diferencia truncada para vista previa móvil.",
+ "unable": "No se puede cargar la diferencia",
+ "close": "Cerrar vista previa de diferencias comprometidas",
+ "committed": "Commit en la rama"
+ },
+ "mobileCommitFailurePanel": {
+ "showDetails": "Mostrar detalles",
+ "hideDetails": "Ocultar detalles",
+ "showCommit": "Mostrar detalles del error de commit",
+ "hideCommit": "Ocultar detalles del error de commit",
+ "fix": "Arreglar",
+ "fixCommit": "Solucionar error de commit con IA",
+ "commitFailed": "La Commit falló",
+ "commitFailedMessage": "La Commit falló."
+ },
+ "mobileGitHistoryList": {
+ "noCommits": "Sin commits.",
+ "retry": "Reintentar",
+ "waiting": "Esperando el escritorio...",
+ "noFile": "Sin cambios de archivos",
+ "failed": "No se pudo cargar el historial"
+ },
+ "mobileSourceControlBranchCard": {
+ "unstaged": "{{unstagedCount}} cambió",
+ "staged": "En staging: {{stagedCount}}",
+ "branch": "{{branchCount}} en rama"
+ },
+ "mobileSourceControlContent": {
+ "generate": "Generar mensaje de commit con IA",
+ "cancel": "Cancelar la generación del mensaje de commit",
+ "commitMessage": "Mensaje de commit",
+ "noStaged": "Sin archivos preparados",
+ "commitMessageDisabled": "Mensaje de Commit deshabilitado. Sin archivos preparados.",
+ "working": "El árbol de trabajo está limpio.",
+ "noLocal": "Sin cambios locales",
+ "open": "Acciones de control de código abierto",
+ "unstage": "Fuera del escenario todo",
+ "stage": "Hacer stage de todo",
+ "reconnecting": "Reconectándose al escritorio..."
+ },
+ "mobileSourceControlFileRows": {
+ "openCommitted": "Abrir cambio comprometido {{filePath}}",
+ "loading": "Cargando cambios confirmados...",
+ "committedBranch": "Commits en la rama",
+ "discard": "Descartar {{path}}",
+ "stage": "Etapa {{path}}",
+ "unstage": "Fuera del escenario {{path}}",
+ "unresolved": "Conflicto no resuelto",
+ "openChanged": "Abrir archivo modificado {{path}}",
+ "old": "de {{oldPath}}",
+ "committedChanges": "Los cambios confirmados no están disponibles."
+ },
+ "mobileSourceControlHeader": {
+ "refresh": "Actualizar control de fuente",
+ "openPullRequestWeb": "Abrir solicitud de extracción en la web",
+ "openPullRequestPull": "Abrir solicitud de extracción #{{pullRequestNumber}} en la web",
+ "source": "Control de código fuente",
+ "back": "Volver a la sesión",
+ "close": "Cerrar control de código fuente"
+ },
+ "mobileSourceControlModals": {
+ "openYourBrowser": "¿Abrirlo en tu navegador?",
+ "pull": "Solicitud de extracción creada",
+ "switch": "Cambiar rama",
+ "discardChanges": "¿Descartar cambios a \"{{path}}\"? Esto no se puede deshacer.",
+ "discardChange": "Descartar cambio",
+ "source": "Control de código fuente",
+ "current": "actual",
+ "openYourBrowserCreated": "¿Abrirlo en tu navegador?\n\n{{createdPrWarning}}",
+ "open": "Abrir",
+ "discard": "Descartar"
+ },
+ "mobileSourceControlPanel": {
+ "retry": "Reintentar",
+ "unable": "No se puede cargar",
+ "source": "Control de fuente no disponible"
+ },
+ "mobileSourceControlPrChip": {
+ "create": "Crear solicitud de extracción",
+ "loadingPullRequest": "Cargando solicitud de extracción...",
+ "pullRequestPull": "Solicitud de extracción n.º {{pullRequestNumber}}, {{stateLabel}}, {{checkSummary}}{{commentSummary}}. Abrir solicitud de extracción.",
+ "pullRequestUnavailable": "Solicitud de extracción no disponible: {{summaryMessage}}",
+ "loadingPullRequestMessage": "Cargando solicitud de extracción"
+ },
+ "mobileBranchCompare": {
+ "committed": "Commits en la rama",
+ "changedFileCountFile": "Archivo {{changedFileCount}}",
+ "changedFileCountFiles": "Archivos {{changedFileCount}}",
+ "commitCountCommits": "{{commitCount}} se compromete",
+ "vs": "frente a {{baseRef}}"
+ },
+ "mobileCommitMessageAi": {
+ "failed": "No se pudo generar el mensaje de commit",
+ "no": "No se generó ningún mensaje de commit"
+ },
+ "mobileCreatePrAction": {
+ "createPull": "Crear pull request",
+ "branch": "Esta rama aún no está lista para un {{reviewType}}.",
+ "createReview": "Crear {{reviewType}}"
+ },
+ "mobileHostedReviewCreateIntent": {
+ "branch": "La rama cambió mientras se preparaba la solicitud de extracción.",
+ "could": "No se pudo generar un mensaje de commit. Agregue uno en Control de código fuente y luego vuelva a intentarlo.",
+ "resolveStage": "Resuelva o organice cambios antes de crear una solicitud de extracción.",
+ "resolveConflicts": "Resuelva los conflictos antes de crear una solicitud de extracción.",
+ "creating": "Creando reseña...",
+ "force": "Fuerza empujando con arrendamiento...",
+ "pushing": "Impulsando commits...",
+ "publishing": "Publicando rama...",
+ "committing": "Confirmando cambios...",
+ "generating": "Generando mensaje de commit...",
+ "staging": "Añadiendo cambios al staging...",
+ "failed": "No se han podido realizar cambios en la etapa"
+ },
+ "mobileHostedReviewService": {
+ "pushFailed": "El empujón falló. Resuelva el error de inserción y vuelva a intentarlo.",
+ "pushSucceeded": "El push se realizó correctamente, pero falló la creación de {{reviewType}}: {{errorMessage}}",
+ "failed": "No se pudo crear la solicitud de extracción"
+ },
+ "mobileSourceControlActions": {
+ "switch": "Cambiar rama",
+ "rebase": "Rebase sobre la base",
+ "publishBranch": "Publicar rama",
+ "pushCreate": "Impulsar y crear PR",
+ "create": "Crear PR",
+ "commitSync": "Commit y sincronizar",
+ "commitPush": "Commit y presionar",
+ "pullRequests": "Las solicitudes de extracción no están disponibles para este repo",
+ "checking": "Comprobando el estado de la rama...",
+ "publishBranchFirst": "Publicar rama primero",
+ "enter": "Ingrese un mensaje de commit",
+ "stage": "Preparar al menos un archivo",
+ "local": "Los commits locales se perderían; haz pull en su lugar",
+ "nothingFast": "Nada que adelantar",
+ "fastForward": "avance rápido",
+ "fastForwardBehind": "Avance rápido ({{behindCommitCount}})",
+ "branchAlready": "La rama ya está publicada",
+ "branchUp": "La rama está actualizada.",
+ "sync": "Sincronizar",
+ "syncBehind": "Sincronización (↓{{behindCommitCount}} ↑{{aheadCommitCount}})",
+ "nothingPull": "Nada que tirar",
+ "pullBehind": "Tirar ({{behindCommitCount}})",
+ "nothingPush": "Nada que empujar",
+ "pushAhead": "Empujar ({{aheadCommitCount}})"
+ },
+ "useMobileCommitFailureRecovery": {
+ "failed": "No se pudo iniciar el agent",
+ "waiting": "Esperando el escritorio..."
+ },
+ "useMobileCommitMessageGeneration": {
+ "failed": "No se pudo generar el mensaje de commit"
+ },
+ "useMobileCreatePrRunner": {
+ "check": "Haga checkout de una rama antes de crear una solicitud de extracción."
+ },
+ "useMobileSourceControlLoaders": {
+ "update": "Actualice el escritorio de Orca para usar Source Control en dispositivos móviles.",
+ "unableResolve": "No se puede resolver la rama base para comparar.",
+ "unableLoadSource": "No se puede cargar el control de fuente",
+ "unableLoadCommitted": "No se pueden cargar los cambios confirmados",
+ "waiting": "Esperando el escritorio...",
+ "connecting": "Conectándose al escritorio..."
+ },
+ "useMobileSourceControlOpeners": {
+ "waiting": "Esperando el escritorio...",
+ "unableOpen": "No se puede abrir la diferencia",
+ "unableLoad": "No se puede cargar la diferencia comprometida",
+ "binary": "Vista previa de diferencias de rama binaria no disponible en dispositivos móviles"
+ },
+ "useMobileSourceControlRunners": {
+ "source": "Error en la acción de control de código fuente"
+ },
+ "useMobileSourceControlCommitRunners": {
+ "source": "Error en la acción de control de código fuente",
+ "commit": "La Commit falló"
+ },
+ "mobileSourceControlScreenState": {
+ "noUpstream": "Sin aguas arriba",
+ "ahead": "{{aheadCommitCount}} adelante, {{behindCommitCount}} detrás",
+ "noBranch": "Sin rama"
+ },
+ "mobileSourceControlConflictAbort": {
+ "abortMerge": "Abortar fusión",
+ "abortRebase": "Abortar rebase",
+ "aborting": "Abortando…"
+ },
+ "mobilePrChipSummary": {
+ "failing": "{{failingCheckCount}} fallando",
+ "no": "Sin comprobaciones",
+ "unresolved": "Comprobaciones sin resolver"
+ },
+ "mobilePrCreate": {
+ "branch": "Esta rama aún no está lista para un {{reviewType}}.",
+ "push": "Empuje la rama base antes de crear un {{reviewType}}.",
+ "creatingReviewTypeFork": "No se admite la creación de un {{reviewType}} desde esta bifurcación.",
+ "reviewTypeAlreadyExists": "Ya existe un {{reviewType}} para esta rama.",
+ "creatingReviewTypeS": "La creación de {{reviewType}} no es compatible con este repo.",
+ "authenticate": "Autentícate antes de crear un {{reviewType}}.",
+ "sync": "Sincroniza esta rama antes de crear un {{reviewType}}.",
+ "publish": "Publica los commits antes de crear un {{reviewType}}.",
+ "switch": "Cambie a una rama de función antes de crear un {{reviewType}}.",
+ "check": "Haz checkout de una rama antes de crear un {{reviewType}}.",
+ "commit": "Haz commit de los cambios antes de crear un {{reviewType}}.",
+ "orca": "Orca no pudo confirmar si esta rama ya tiene un {{reviewType}}. Inténtalo de nuevo en un momento.",
+ "reviewTypeCreated": "{{reviewType}} creado, pero Orca no pudo actualizarlo todavía.",
+ "reviewTypePull": "{{reviewType}} #{{pullRequestNumber}} ya está abierto.",
+ "reviewTypeAlreadyOpen": "{{reviewType}} ya está abierto."
+ },
+ "mobileSourceControlPrimaryAction": {
+ "nothing": "No hay nada para hacer commit. La rama está actualizada.",
+ "forcePushLease": "Fuerce el envío con arrendamiento para actualizar la rama remota.",
+ "publishBranchOrigin": "Publicar esta rama en origen.",
+ "check": "Haz checkout de una rama antes de publicar commits.",
+ "stageLeast": "Prepare al menos un archivo para commit.",
+ "stageAllChanges": "Organiza todos los cambios.",
+ "enter": "Ingrese un mensaje de commit para commit.",
+ "commitStaged": "Realizar cambios por etapas.",
+ "resolve": "Resolver conflictos antes de comprometerse.",
+ "try": "Inténtelo nuevamente una vez que finalice la operación remota.",
+ "remote": "Operación remota en progreso.",
+ "forcePushProgress": "Empuje forzado en curso.",
+ "commitProgress": "Compromiso en progreso.",
+ "publishBranch": "Publicar rama",
+ "sync": "Sincronizar",
+ "stageAll": "Hacer stage de todo",
+ "pullBehind": "Tire de {{behindCommitCount}}, presione {{aheadCommitCount}}.",
+ "pullCommitCountCommit": "Tire del commit {{commitCount}}.",
+ "pullCommitCountCommits": "Extraiga las commits de {{commitCount}}.",
+ "pushCommitCountCommit": "Empuje el commit {{commitCount}}.",
+ "pushCommitCountCommits": "Empuje {{commitCount}} commits."
+ },
+ "mobileHostedReviewGitPreparation": {
+ "commit": "La Commit falló",
+ "unable": "No se puede actualizar el control de fuente"
+ },
+ "mobilePrLink": {
+ "failedUpdateLinkedReview": "No se pudo actualizar la reseña vinculada",
+ "failedUpdateLinkedPull": "No se pudo actualizar la solicitud de extracción vinculada"
+ },
+ "hostedReviewCopy": {
+ "mergeRequestTitle": "Solicitud de fusión",
+ "pullRequestTitle": "Solicitud de extracción"
+ },
+ "mobileGitHistory": {
+ "months": "{{months}}mes",
+ "just": "ahora mismo",
+ "failed": "No se pudo cargar el historial de confirmaciones"
+ },
+ "mobileGitStatus": {
+ "staged": "Cambios preparados",
+ "untracked": "Archivos sin seguimiento",
+ "changes": "Cambios"
+ },
+ "mobileHostedReviewRemotePrerequisite": {
+ "failedForce": "No se pudo forzar el envío con el contrato de arrendamiento",
+ "failedPush": "No se pudieron enviar commits",
+ "failedPublish": "No se pudo publicar la rama"
+ },
+ "mobileSourceControlHubTab": {
+ "pull": "Solicitud de extracción",
+ "changes": "Cambios"
+ },
+ "prComposeValidation": {
+ "base": "La rama base debe ser distinta de la rama HEAD.",
+ "choose": "Elige una rama base.",
+ "enter": "Ingresa un título para {{reviewType}}.",
+ "wait": "Espere a que termine la generación."
+ },
+ "mobileBranchBaseRef": {
+ "unable": "No se puede resolver la base de la rama"
+ },
+ "useMobileGitRequests": {
+ "branch": "Estado de la rama no disponible",
+ "commit": "La Commit falló",
+ "source": "Error en la acción de control de código fuente",
+ "waiting": "Esperando el escritorio..."
+ },
+ "useMobileSourceControlActionSheetRunners": {
+ "no": "No hay rama base para rebase",
+ "waiting": "Esperando el escritorio..."
+ },
+ "mobileAgentWorkingIndicator": {
+ "agent": "El Agent esta trabajando"
+ },
+ "mobileBrowserTabActionSheet": {
+ "reload": "Recargar",
+ "forward": "Reenviar",
+ "back": "Atrás",
+ "browser": "Navegador"
+ },
+ "mobileNativeChatAsk": {
+ "next": "Siguiente",
+ "send": "Enviar respuesta",
+ "cancel": "Cancelar",
+ "type": "Escribe tu respuesta",
+ "other": "Otro…",
+ "step": "Paso {{stepNumber}}"
+ },
+ "mobileNativeChatComposer": {
+ "send": "enviar mensaje",
+ "dictate": "Dictar",
+ "stop": "Detener dictado",
+ "attach": "Adjuntar imagen",
+ "remove": "Quitar imagen",
+ "message": "Mensaje, @archivos, /comandos"
+ },
+ "mobileNativeChatMessage": {
+ "scroll": "Desplazar este mensaje hacia arriba",
+ "copy": "Copiar mensaje",
+ "remaining": "… {{remainingToolCallCount}} más llamadas a herramientas",
+ "image": "imagen",
+ "attached": "Imagen adjunta",
+ "callCountToolCall": "{{callCount}} llamada de herramienta",
+ "callCountToolCalls": "{{callCount}} llamadas a herramientas"
+ },
+ "mobileNativeChatQuestion": {
+ "send": "Enviar respuesta",
+ "typeYour": "Escribe tu respuesta…",
+ "typeReply": "O escribe una respuesta...",
+ "submitSelectedOptions": "Enviar opciones seleccionadas",
+ "submitSelectedCommand": "Enviar{{selectedCommandCount}}",
+ "choose": "Elige una opción"
+ },
+ "mobileNativeChatView": {
+ "message": "Mensaje, @archivos, /comandos",
+ "waiting": "Esperando terminal...",
+ "reconnecting": "Reconectando…",
+ "stop": "Detener",
+ "stopAgent": "Detener el agent",
+ "tools": "Herramientas",
+ "collapse": "Contraer",
+ "scroll": "Desplácese hasta lo último",
+ "load": "Cargar mensajes anteriores"
+ },
+ "mobileSessionHeaderMoreActionsSheet": {
+ "agent": "Historial del Agent",
+ "open": "Abrir comprobaciones de solicitud de extracción",
+ "browse": "Explorar y reanudar sesiones de agent"
+ },
+ "mobileTerminalInputActions": {
+ "start": "Iniciar dictado de voz",
+ "starting": "Iniciar dictado de voz",
+ "cancel": "Cancelar dictado de voz",
+ "stop": "Detener el dictado por voz",
+ "long": "Mantenga presionado para adjuntar un archivo",
+ "attach": "Adjuntar una foto",
+ "sending": "Enviando imagen"
+ },
+ "quickCommandEditorForm": {
+ "add": "Agregar comando rápido",
+ "save": "Guardar",
+ "cancel": "Cancelar",
+ "project": "Proyecto",
+ "scope": "Alcance",
+ "submit": "Enviar inmediatamente en lugar de solo insertar texto.",
+ "append": "Agregar Enter",
+ "advanced": "Avanzado",
+ "supports": "Admite habilidades, rutas de archivos y comandos integrados.",
+ "ask": "Pide al agent que investigue este espacio de trabajo",
+ "command": "Texto de comando",
+ "choose": "Elige agent",
+ "action": "Acción",
+ "start": "Iniciar el servidor de desarrollo",
+ "label": "Etiqueta",
+ "agentPrompt": "Prompt de Agent",
+ "terminal": "Comando de terminal"
+ },
+ "quickCommandsList": {
+ "edit": "Editar {{commandLabel}}",
+ "run": "Ejecute {{commandLabel}}",
+ "quick": "Se alcanzó el límite de comando rápido",
+ "new": "Nuevo comando rápido",
+ "project": "este proyecto",
+ "noMatching": "No hay comandos rápidos coincidentes.",
+ "noQuick": "Aún no hay comandos rápidos.",
+ "search": "Buscar comandos rápidos..."
+ },
+ "quickCommandsSheet": {
+ "save": "Guarda comandos de terminal o prompts de agent para acceso rápido.",
+ "back": "Atrás",
+ "quickCommand": "Este comando rápido se eliminará de tu lista guardada.",
+ "deleteDelete": "¿Eliminar \"{{deleteLabel}}\"?",
+ "quickCommands": "Comandos rápidos",
+ "choose": "Elija Agent",
+ "add": "Agregar comando rápido",
+ "edit": "Editar comando rápido",
+ "delete": "Eliminar",
+ "cancel": "Cancelar",
+ "untitled": "Sin título"
+ },
+ "githubPr": {
+ "failedUpdateReview": "No se pudo actualizar el hilo de revisión.",
+ "failedUpdateTitle": "No se pudo actualizar el título.",
+ "requestFailedRequest": "Solicitud fallida: {{requestMethod}}",
+ "requestFailedGithubResolve": "Solicitud fallida: github.resolveReviewThread",
+ "requestFailedGithubUpdate": "Solicitud fallida: github.updatePRTitle"
+ },
+ "mobileBulkCloseSheetActions": {
+ "close": "Cerrar"
+ },
+ "mobileDiffReviewLoaders": {
+ "update": "Actualice el escritorio de Orca para revisar los cambios en el móvil.",
+ "committedChangesResponse": "La respuesta de cambios confirmados no era válida",
+ "committedChangesFailed": "Los cambios confirmados fallaron",
+ "committedChangesUnavailable": "Los cambios confirmados no están disponibles",
+ "committedDiff": "La diferencia confirmada no está disponible",
+ "diff": "La respuesta diferencial no era válida",
+ "unableLoadDiff": "No se puede cargar la diferencia",
+ "unableLoadReview": "No se pueden cargar notas de revisión",
+ "source": "La respuesta del control de fuente no era válida",
+ "unableLoadChanges": "No se pueden cargar los cambios"
+ },
+ "mobileDiffReviewQueue": {
+ "committed": "Commit en la rama",
+ "unstaged": "Sin preparar",
+ "staged": "En staging"
+ },
+ "mobileNativeChatPermission": {
+ "permission": "Permiso solicitado",
+ "allowAlways": "Permitir siempre",
+ "deny": "Denegar",
+ "allow": "Permitir",
+ "allowPermission": "¿Permitir {{permissionName}}?"
+ },
+ "mobileTabCloseSelection": {
+ "closeTabsRight": "Cerrar pestañas a la derecha",
+ "closeTabsLeft": "Cerrar pestañas a la izquierda",
+ "closeOther": "Cerrar otras pestañas"
+ },
+ "mobileTerminalActionSheetActions": {
+ "close": "Cerrar",
+ "clear": "Borrar terminal",
+ "rename": "Renombrar",
+ "switchPhone": "Cambiar a teléfono",
+ "switchDesktop": "Cambiar a escritorio"
+ },
+ "prActionsEngine": {
+ "failedMerge": "No se pudo fusionar la solicitud de extracción.",
+ "failedRefresh": "No se pudo actualizar la solicitud de extracción."
+ },
+ "useMobileAttachmentInputLeaseGate": {
+ "attach": "Error en la conexión (reconectando)"
+ },
+ "useMobileDiffReviewCommentActions": {
+ "failedSaveReview": "No se pudo guardar la reseña",
+ "failedSaveReviewState": "No se pudo guardar el estado de revisión",
+ "waiting": "Esperando el escritorio..."
+ },
+ "diffReview": {
+ "waiting": "Esperando el escritorio...",
+ "missing": "Árbol de trabajo faltante",
+ "unableLoadDiff": "No se puede cargar la diferencia",
+ "unableLoadReview": "No se puede cargar la reseña"
+ },
+ "useMobileDiffReviewGitActions": {
+ "stagedFile": "En staging: {{stagedFileCount}}; fallidos: {{failedFileCount}}",
+ "waiting": "Esperando el escritorio...",
+ "source": "Error en la acción de control de código fuente",
+ "stagedReviewedFile": "{{staged}} archivo revisado añadido al staging",
+ "stagedReviewedFiles": "{{staged}} archivos revisados añadidos al staging"
+ },
+ "useMobileDiffReviewSendActions": {
+ "waiting": "Esperando el escritorio...",
+ "reviewNotesSent": "Revisar notas enviadas",
+ "reviewNotesCopied": "Revisar notas copiadas",
+ "unable": "No se pueden cargar sesiones de agent",
+ "created": "La respuesta del terminal creada no era válida",
+ "failedCreate": "No se pudo crear la terminal",
+ "terminal": "La entrada del terminal está bloqueada",
+ "failedSend": "No se pudieron enviar notas"
+ },
+ "useMobileImageAttachment": {
+ "attachFailed": "Error al adjuntar",
+ "image": "Imagen demasiado grande para adjuntar",
+ "photo": "Permiso de fotografía denegado",
+ "attachFailedDisconnected": "Error al adjuntar (desconectado)"
+ },
+ "useMobileNativeChatImageAttachments": {
+ "attachFailed": "Error al adjuntar",
+ "image": "Imagen demasiado grande para adjuntar",
+ "photo": "Permiso de fotografía denegado",
+ "attachFailedDisconnected": "Error al adjuntar (desconectado)",
+ "messageNotSent": "Mensaje no enviado",
+ "messageNotSentDisconnected": "Mensaje no enviado (desconectado)"
+ },
+ "useMobilePrActions": {
+ "not": "No conectado"
+ },
+ "useMobilePrAiTriage": {
+ "failed": "No se pudo iniciar el agent",
+ "waiting": "Esperando el escritorio..."
+ },
+ "useMobilePrCommentActions": {
+ "comment": "La acción del comentario falló"
+ },
+ "useMobilePrTitleAction": {
+ "failed": "No se pudo actualizar el título.",
+ "not": "No conectado al escritorio."
+ },
+ "useMobileTerminalPaste": {
+ "pasteFailed": "Error al pegar",
+ "image": "Imagen demasiado grande para pegar",
+ "pasteFailedDisconnected": "Error al pegar (desconectado)",
+ "pasteToo": "Pegar demasiado grande (máximo 256 KiB)",
+ "failed": "No se pudo codificar la imagen del portapapeles redimensionada"
+ },
+ "useQuickCommands": {
+ "failedLoad": "No se pudieron cargar comandos rápidos",
+ "failedSave": "No se pudo guardar el comando rápido"
+ },
+ "mobileDiffReviewScreenModel": {
+ "all": "Todo",
+ "unstaged": "Sin preparar",
+ "staged": "Preparado",
+ "branch": "Rama",
+ "unsent": "{{unsentCount}} nota no enviada",
+ "noteCountNote": "{{noteCount}} nota",
+ "noteCountNotes": "{{noteCount}} notas",
+ "unreviewed": "Sin revisar",
+ "notes": "Notas"
+ },
+ "mobileTerminalLiveInputStatus": {
+ "live": "Entrada en vivo",
+ "starting": "Micrófono inicial",
+ "processing": "Tratamiento",
+ "listening": "Escuchando",
+ "tapShow": "Toca para mostrar el teclado",
+ "uploading": "Subiendo imagen al host",
+ "preparing": "Preparando el micrófono",
+ "transcribing": "Transcribir en el escritorio",
+ "tapMic": "Toca el micrófono para detener"
+ },
+ "mobileNativeChatRenderData": {
+ "agent": "un agente"
+ },
+ "useMobileDiffReviewInteractions": {
+ "unable": "No se puede abrir en sesión"
+ },
+ "mobileTerminalTabAgent": {
+ "file": "Archivo",
+ "browser": "Navegador",
+ "new": "Nuevo navegador"
+ },
+ "floatingWorkspace": {
+ "floating": "Espacio de trabajo flotante"
+ },
+ "githubPrRpc": {
+ "request": "Solicitud fallida: {{requestMethod}}"
+ },
+ "mobileNativeChatStreamFrame": {
+ "transcript": "Error en la secuencia de transcripción"
+ },
+ "mobileNativeChatToggleAction": {
+ "switchChat": "Cambiar a vista de chat",
+ "switchTerminal": "Cambiar a la vista de terminal"
+ },
+ "mobileNativeChatPermissionSend": {
+ "responseNotSent": "Respuesta no enviada",
+ "responseUnconfirmed": "Respuesta no confirmada: revisa el chat antes de volver a intentarlo",
+ "responseNotSentDisconnected": "Respuesta no enviada (desconectada)"
+ },
+ "mobilePrSidebarState": {
+ "unable": "No se puede cargar la solicitud de extracción"
+ },
+ "mobileSessionRouteHelpers": {
+ "pairing": "Emparejamiento no válido",
+ "reconnecting": "Reconectando",
+ "disconnected": "Desconectado",
+ "connected": "Conectado",
+ "securing": "Asegurar",
+ "connecting": "Conectando"
+ },
+ "useMobileNativeChatAnswerSend": {
+ "answerNotSent": "Respuesta no enviada",
+ "answerUnconfirmed": "Respuesta no confirmada: revisa el chat antes de volver a intentarlo",
+ "answerPartly": "Respuesta parcialmente enviada: revisa el chat antes de volver a intentarlo.",
+ "answerNotSentDisconnected": "Respuesta no enviada (desconectada)"
+ },
+ "useMobileNativeChatCancelAsk": {
+ "cancelNotSent": "Cancelar no enviado",
+ "cancelUnconfirmed": "Cancelar sin confirmar: revisa el chat antes de volver a intentarlo",
+ "cancelNotSentDisconnected": "Cancelar no enviado (desconectado)"
+ },
+ "useMobileNativeChatMessageSend": {
+ "messageNotSent": "Mensaje no enviado",
+ "delivery": "Entrega no confirmada: consulta el chat antes de volver a intentarlo",
+ "messageNotSentDisconnected": "Mensaje no enviado (desconectado)"
+ },
+ "useMobileNativeChatStop": {
+ "stopNotSent": "Detener no enviado",
+ "stopUnconfirmed": "Detener sin confirmar: revisa el chat antes de volver a intentarlo",
+ "stopNotSentTerminal": "Detener no enviado (terminal no listo)"
+ },
+ "aiVaultResumeLaunch": {
+ "terminal": "La entrada del terminal está bloqueada",
+ "failedSend": "No se pudo enviar el comando de reanudación",
+ "created": "La respuesta del terminal creada no era válida",
+ "failedCreate": "No se pudo crear la terminal"
+ },
+ "aiVaultResumePreparation": {
+ "could": "No se pudo preparar esta sesión del Codex heredado. Reintentar reanudar."
+ },
+ "mobileClipboardImage": {
+ "clipboard": "El contenido de la imagen del portapapeles debe ser base64."
+ },
+ "prAiTriageLaunch": {
+ "terminal": "La entrada del terminal está bloqueada",
+ "failedSend": "No se pudo enviar el mensaje",
+ "created": "La respuesta del terminal creada no era válida",
+ "failedCreate": "No se pudo crear la terminal"
+ },
+ "voiceModelList": {
+ "delete": "Eliminar {{commandLabel}}",
+ "useMessage": "Usar",
+ "use": "En uso",
+ "set": "Configurar en el escritorio",
+ "api": "Conjunto de claves API",
+ "recommended": "Recomendado"
+ },
+ "authFailedBanner": {
+ "remove": "Eliminar",
+ "re": "Reparar",
+ "retry": "Reintentar",
+ "authentication": "Error de autenticación: intente volver a conectarse primero; Si sigue fallando, vuelva a emparejarlo desde el escritorio."
+ },
+ "codexResetCreditAction": {
+ "useReset": "Usar reinicio",
+ "resetting": "Restableciendo…",
+ "usesOneEarnedResetActive": "Utiliza un reinicio obtenido para la cuenta activa del Codex",
+ "usesOneEarnedResetScope": "Utiliza un reinicio obtenido para {{scopeLabel}}",
+ "useCodex": "Utilice el restablecimiento del límite de velocidad del Codex",
+ "resettingCodex": "Restablecimiento de los límites de tasas del Codex",
+ "earned": "Restablecimiento del límite de velocidad del Codex obtenido"
+ },
+ "customKeyModal": {
+ "addShortcut": "Agregar acceso directo",
+ "press": "Presione Entrar",
+ "command": "Comando",
+ "label": "Etiqueta",
+ "add": "Agregar",
+ "more": "Más teclas: tabulador, flechas, F1–F12…",
+ "key": "Clave",
+ "modifiers": "Modificadores",
+ "show": "Mostrar, ocultar o reordenar las teclas de método abreviado",
+ "manage": "Administrar atajos",
+ "send": "Enviar comando de texto personalizado",
+ "text": "Macro de texto",
+ "build": "Crea acordes de las teclas Ctrl, Alt y Shift",
+ "shortcut": "Combinación de atajos",
+ "back": "Atrás",
+ "function": "Función",
+ "navigation": "Navegación",
+ "editing": "Edición",
+ "eGPnpm": "p. ej. pnpm build",
+ "eGBuild": "p.ej. Construir",
+ "pick": "Elige una llave"
+ },
+ "dragReorderList": {
+ "moveDown": "Bajar",
+ "moveUp": "Subir",
+ "use": "Utilice las acciones de subir y bajar para reordenar sin arrastrar",
+ "drag": "Arrastra para reordenar"
+ },
+ "hostProtocolGate": {
+ "checking": "Comprobando la compatibilidad del host",
+ "use": "useHostProtocolGates debe usarse dentro de "
+ },
+ "mobileDictationSetupSheet": {
+ "download": "Descargar",
+ "useMessage": "Usar",
+ "use": "En uso",
+ "setUpDesktop": "Configurar en el escritorio",
+ "api": "Conjunto de claves API",
+ "extracting": "· extrayendo…",
+ "open": "API abierta de IA",
+ "recommended": "Recomendado",
+ "dictation": "Dictado habilitado",
+ "setupInstructions": "Descargue un modelo y habilite el dictado en su escritorio, todo desde aquí.",
+ "setUpVoice": "Configurar el dictado de voz",
+ "couldNotUpdate": "No se pudo actualizar",
+ "couldNotSelect": "No se pudo seleccionar el modelo",
+ "downloadFailed": "Falló la descarga",
+ "failed": "No se pudo cargar"
+ },
+ "mobileDiffReviewBody": {
+ "retry": "Reintentar",
+ "retryLoading": "Reintentar cargar revisión",
+ "diffTruncated": "Diferencia truncada para vista previa móvil.",
+ "loadingDiff": "Cargando diff…",
+ "try": "Pruebe con un filtro de reseña diferente.",
+ "no": "Sin cambios revisables",
+ "unable": "No se puede cargar la reseña",
+ "review": "Revisión no disponible",
+ "loadingReview": "Cargando reseña...",
+ "diffUnavailable": "Diferencia no disponible",
+ "deleted": "Archivo eliminado",
+ "diffTooLarge": "Diferencia demasiado grande",
+ "binary": "Diferencia binaria",
+ "select": "Seleccione un archivo para revisar.",
+ "fileDeleted": "Este archivo fue eliminado. Agregue una nota de archivo o márquelo como revisado.",
+ "diffTooLargeMobile": "Esta diferencia es demasiado grande para la vista previa móvil.",
+ "fileCannot": "Este archivo no se puede representar como texto en dispositivos móviles."
+ },
+ "mobileDiffReviewDrawers": {
+ "sendNotes": "Enviar notas",
+ "sendNotesAgent": "Enviar notas al agent",
+ "stageReviewed": "Etapa revisada",
+ "stageReviewedFilesAccessibility": "Archivos revisados en etapa",
+ "reviewComplete": "Revisión completa",
+ "save": "Guardar",
+ "delete": "Eliminar",
+ "deleteNote": "Eliminar nota",
+ "reviewNote": "Nota de revisión",
+ "cancel": "Cancelar nota",
+ "file": "Nota de archivo",
+ "line": "Línea {{lineNumber}}",
+ "add": "Agregar nota",
+ "edit": "Editar nota",
+ "open": "Abierto en sesión",
+ "mark": "Marcar como no revisado",
+ "stageReviewedFiles": "Archivos revisados por etapas",
+ "clear": "Borrar notas enviadas",
+ "sendUnsent": "Enviar notas no enviadas",
+ "copy": "Copiar notas",
+ "new": "Nueva sesión de Agent",
+ "discardChanges": "¿Descartar cambios a \"{{filePath}}\"? Esto no se puede deshacer.",
+ "discardFile": "Descartar archivo",
+ "reviewedFileCountReviewed": "{{reviewedFileCount}} archivos no preparados revisados se pueden preparar",
+ "reviewActions": "Revisar acciones",
+ "saveNote": "Guardar nota en la línea {{lineNumber}}",
+ "unsent": "{{unsentCommentCount}} notas no enviadas",
+ "loading": "Cargando sesiones de agent...",
+ "reviewedFileCountFileReviewedNoteCountNote": "{{reviewedFileCount}} archivo revisado, {{noteCount}} nota",
+ "reviewedFileCountFileReviewedNoteCountNotes": "{{reviewedFileCount}} archivo revisado, {{noteCount}} notas",
+ "reviewedFileCountFilesReviewedNoteCountNote": "{{reviewedFileCount}} archivos revisados, {{noteCount}} nota",
+ "reviewedFileCountFilesReviewedNoteCountNotes": "{{reviewedFileCount}} archivos revisados, {{noteCount}} notas",
+ "discard": "Descartar"
+ },
+ "mobileDiffReviewFileSummary": {
+ "hunk": "Pedazo",
+ "next": "Siguiente trozo",
+ "previous": "trozo anterior",
+ "stale": "Duro",
+ "edit": "Editar nota de archivo",
+ "changed": "Cambió",
+ "reviewed": "Revisado",
+ "old": "de {{oldPath}}",
+ "staleNote": "{{staleNoteCount}} obsoleto"
+ },
+ "mobileDiffReviewFooter": {
+ "next": "Siguiente archivo",
+ "markReviewed": "Marca revisada",
+ "reviewed": "Revisado",
+ "markFile": "Marcar archivo revisado",
+ "note": "Nota",
+ "add": "Agregar nota de archivo",
+ "previous": "Archivo anterior",
+ "discard": "Descartar",
+ "discardFile": "Descartar archivo",
+ "unstage": "Quitar del stage",
+ "unstageFile": "Archivo sin etapa",
+ "stage": "Agregar al stage",
+ "stageFile": "Añadir archivo al staging"
+ },
+ "mobileDiffReviewHeader": {
+ "show": "Mostrar archivos de revisión {{mobileReviewFilterLabel}}",
+ "openReview": "Abrir acciones de revisión",
+ "openPull": "Abrir barra lateral de solicitud de extracción",
+ "changes": "Cambios",
+ "back": "Atrás",
+ "reviewed": "{{reviewedCount}}/{{queueLength}} revisado"
+ },
+ "mobileDiffReviewLine": {
+ "edit": "Editar nota en la línea {{lineNumber}}",
+ "add": "Agregar nota en la línea {{newLineNumber}}",
+ "context": "Contexto",
+ "deleted": "Eliminado",
+ "added": "Añadida",
+ "lineLabelLineLine": "{{lineLabel}} línea {{lineNumber}}",
+ "lineLabelLine": "Línea {{lineLabel}}"
+ },
+ "mobileHostCard": {
+ "update": "Actualice Orca de escritorio e inicie sesión para conectarse desde cualquier lugar",
+ "worktreeCountWorktree": "{{worktreeCount}} árbol de trabajo",
+ "active": "{{activeWorktreeCount}} activo"
+ },
+ "mobileHtmlPreview": {
+ "view": "Ver fuente HTML",
+ "preview": "Vista previa",
+ "previewRendered": "Vista previa de HTML renderizado"
+ },
+ "mobileMarkdown": {
+ "x": "[incógnita]",
+ "hiddenColumn": "{{hiddenColumnCount}} más columnas",
+ "hiddenRow": "{{hiddenRowCount}} más filas",
+ "open": "Abrir imagen",
+ "image": "imagen"
+ },
+ "mobilePrsidebar": {
+ "retry": "Reintentar",
+ "retryLoading": "Reintentar cargar la solicitud de extracción",
+ "loading": "Cargando solicitud de extracción...",
+ "not": "No permitido: su cuenta de GitHub no está conectada.",
+ "something": "Algo salió mal."
+ },
+ "mobileRichMarkdownEditor": {
+ "code": "bloque de código",
+ "inline": "Código inline",
+ "image": "Imagen",
+ "link": "Enlace",
+ "quote": "Cita",
+ "checklist": "Lista de verificación",
+ "numbered": "Lista numerada",
+ "bullet": "Lista con viñetas",
+ "strike": "Tachado",
+ "italic": "Cursiva",
+ "bold": "Negrita",
+ "body": "Cuerpo"
+ },
+ "mobileWorkspaceNameInput": {
+ "workspace": "Nombre del espacio de trabajo"
+ },
+ "newWorkspaceFab": {
+ "new": "Nuevo espacio de trabajo"
+ },
+ "newWorktreeModal": {
+ "repository": "Repositorio",
+ "create": "Crear espacio de trabajo",
+ "connectRepository": "Conectar repositorio",
+ "runSetup": "Ejecutar comando de configuración",
+ "skip": "Omitir",
+ "run": "Ejecutar",
+ "setup": "Script de configuración",
+ "note": "Nota",
+ "advanced": "Avanzado",
+ "connectRepositoryFirst": "Conecte el repositorio primero",
+ "connect": "Conectar",
+ "connecting": "Conectando...",
+ "ssh": "Conexión SSH",
+ "workspace": "Nombre del espacio de trabajo",
+ "name": "Nombre o 'Crear desde'",
+ "no": "No se encontraron repositorios",
+ "pick": "Elija un repositorio y un agent para crear un nuevo espacio de trabajo.",
+ "failedTrust": "No se pudo confiar en el script de configuración.",
+ "failedCreate": "No se pudo crear el espacio de trabajo",
+ "choose": "Elija si desea ejecutar el script de instalación.",
+ "selected": "El agent seleccionado está deshabilitado. Elige un agent habilitado antes de crear.",
+ "write": "Escribe una nota",
+ "remote": "repositorio remoto",
+ "select": "Seleccione un repositorio",
+ "failedConnect": "No se pudo conectar al repositorio SSH.",
+ "failedRead": "No se pudo leer el estado de la conexión SSH.",
+ "connectDisplay": "Conecte {{displayName}} antes de crear un espacio de trabajo."
+ },
+ "protocolBlockScreen": {
+ "back": "Volver a anfitriones",
+ "openGit": "Abrir versiones de GitHub",
+ "openApp": "Abrir tienda de aplicaciones",
+ "updateOrcaYour": "Actualiza Orca en tu computadora",
+ "updateOrcaMobile": "Actualizar Orca Móvil"
+ },
+ "setupHookTrustDrawer": {
+ "do": "No ejecutar",
+ "always": "Confía siempre y corre",
+ "runHooks": "Ejecutar hooks",
+ "setup": "Script de configuración",
+ "new": "Nuevo script de configuración",
+ "repositorys": "El orca.yaml de este repositorio se ejecuta antes de que comience el espacio de trabajo. Ejecútelo solo si confía en este repositorio.",
+ "runSetup": "¿Ejecutar la configuración desde {{repoName}}?",
+ "repo": "El script de configuración de {{repoName}} cambió"
+ },
+ "smartWorkspaceAdvancedFields": {
+ "derived": "Derivado del nombre",
+ "branch": "Nombre de rama",
+ "workspace": "Nombre del espacio de trabajo",
+ "name": "Nombre",
+ "reuse": "Reutilizar rama “{{reuseEligibleBranch}}”"
+ },
+ "smartWorkspaceSourceDrawer": {
+ "typeName": "Escribe un nombre o busca una fuente",
+ "typeWorkspace": "Escriba el nombre de un espacio de trabajo en el campo siguiente.",
+ "ssh": "Este repo SSH necesita un control remoto de GitHub para enumerar problemas y PR.",
+ "connect": "Conecte el repositorio para buscar fuentes.",
+ "cancel": "Cancelar",
+ "done": "Hecho",
+ "name": "Nombre o 'Crear desde'",
+ "item": "Este artículo se encuentra en {{owner}}/ {{repo}}.",
+ "switch": "Cambiar a {{displayName}}",
+ "no": "No se encontraron resultados."
+ },
+ "smartWorkspaceSourceField": {
+ "type": "Escribe un nombre o busca una fuente",
+ "optional": "[Opcional]"
+ },
+ "smartWorkspaceSourceRow": {
+ "new": "Nueva rama",
+ "create": "Crear rama \"{{rowName}}\"",
+ "name": "Nombra este espacio de trabajo",
+ "use": "Utilice \"{{rowName}}\"",
+ "issue": "Asunto #"
+ },
+ "terminalShortcutSettings": {
+ "create": "Crear combinación de teclas o macro de texto",
+ "add": "Agregar acceso directo personalizado...",
+ "no": "Aún no se han definido atajos personalizados.",
+ "custom": "ATAJOS PERSONALIZADOS",
+ "show": "Muestra cada tecla de acceso directo incorporada en el orden original",
+ "reset": "Restablecer valores predeterminados",
+ "toggle": "Alterne las teclas para mostrarlas u ocultarlas y mantenga presionada la tecla para arrastrar una tecla en el orden que desee en la barra de acceso directo del terminal.",
+ "shortcut": "BARRA DE ATAJOS"
+ },
+ "textInputModal": {
+ "cancel": "Cancelar",
+ "save": "Guardar"
+ },
+ "workspaceDetailPlaceholder": {
+ "pick": "Elija un espacio de trabajo de la barra lateral para abrir su terminal aquí.",
+ "no": "No hay espacio de trabajo abierto"
+ },
+ "worktreeListRow": {
+ "child": "Niño",
+ "folder": "Carpeta"
+ },
+ "accountsSnapshot": {
+ "inactiveCodex": "Los límites inactivos del Codex utilizan la identidad del proveedor incorrecta",
+ "inactiveClaude": "Los límites de Claude inactivos utilizan la identidad del proveedor incorrecta",
+ "codex": "Los límites del Codex utilizan la identidad del proveedor incorrecta",
+ "claude": "Los límites de Claude utilizan la identidad del proveedor incorrecta",
+ "wslCodex": "Las cuentas WSL Codex requieren una distribución exacta",
+ "hostCodex": "Las cuentas de Host Codex no pueden nombrar una distribución WSL",
+ "wslRate": "Los objetivos de límite de velocidad de WSL requieren una distribución exacta",
+ "hostRate": "Los objetivos de límite de velocidad de host no pueden nombrar una distribución WSL",
+ "invalid": "Instantánea de cuentas no válidas del host"
+ },
+ "codexResetCredit": {
+ "account": "Esta cuenta no tiene créditos de restablecimiento obtenidos disponibles.",
+ "noReset": "No hay reinicio disponible",
+ "noEligible": "No se ha agotado ningún período de límite de tasas del Codex elegible.",
+ "nothing": "Nada que restablecer",
+ "codex": "Se ha actualizado el uso del Codex.",
+ "resetAlready": "Restablecer ya aplicado",
+ "rate": "Restablecimiento de límites de tarifas",
+ "resetCountResets": "{{resetCount}} restablecimientos disponibles",
+ "resetCountReset": "{{resetCount}} restablecimiento disponible",
+ "expiresNow": "Caduca ahora",
+ "expiresDuration": "Caduca en {{duration}}",
+ "nextExpiresNow": "El próximo caduca ahora",
+ "nextExpiresDuration": "El próximo caduca en {{duration}}",
+ "invalid": "Respuesta de reinicio no válida del host"
+ },
+ "mountedBottomDrawer": {
+ "dismiss": "Descartar cajón"
+ },
+ "newWorktreeAgentSelection": {
+ "blank": "Terminal en blanco"
+ },
+ "useCodexResetCreditAction": {
+ "spends": "Esto gasta un reinicio obtenido por {{confirmedLabel}} y restablece inmediatamente los períodos de límite de tasa elegibles.",
+ "useRate": "¿Utilizar un restablecimiento del límite de velocidad?",
+ "could": "No se pudieron restablecer los límites de tarifas",
+ "account": "La cuenta o la oferta de restablecimiento cambiaron antes de que el anfitrión se comunicara con Codex. Revise los detalles actualizados y luego confirme nuevamente.{{cleanupWarning}}",
+ "reset": "Restablecer detalles cambiados",
+ "useReset": "Usar reinicio",
+ "cancel": "Cancelar",
+ "host": "El anfitrión confirmó este intento, pero este teléfono no pudo borrar su registro de reintento. Un reintento posterior reutilizará el mismo ID de operación segura.",
+ "phone": "Este teléfono no pudo borrar el registro de reintento descartado. Reintentarlo es seguro, pero se debe borrar el registro antes de poder confirmar un nuevo reinicio para esta cuenta.",
+ "identityWsl": "{{identity}} en WSL {{wslDistro}}",
+ "identityHost": "{{identity}} en el anfitrión"
+ },
+ "mobileLinkPrForm": {
+ "linkPull": "Solicitud de extracción de enlace",
+ "linkLinked": "Enlace #{{linkedItemNumber}}",
+ "pull": "#123 o https://github.com/owner/repo/pull/123",
+ "pr": "Número de PR o URL de GitHub",
+ "cancel": "Cancelar",
+ "linkExisting": "Vincular solicitud de extracción existente"
+ },
+ "mobilePrComposeForm": {
+ "createReview": "Crear {{reviewType}}",
+ "createDraftReview": "Crear borrador {{reviewType}}",
+ "pushCreateReview": "Empujar y crear {{reviewType}}",
+ "pushCreateDraft": "Enviar y crear borrador {{reviewType}}",
+ "createDraft": "Crear como borrador",
+ "generatingTitle": "Generando título y descripción…",
+ "reviewTypeDescription": "{{reviewType}} descripción",
+ "description": "Descripción (opcional)",
+ "reviewTypeTitle": "{{reviewType}} título",
+ "title": "Título",
+ "cancel": "Cancelar",
+ "generate": "Generar",
+ "generating": "Generando…",
+ "failed": "No se pudieron generar campos de PR",
+ "new": "Nuevo {{reviewType}}",
+ "generateReview": "Generar detalles de {{reviewType}} con IA"
+ },
+ "mobilePrViewPanel": {
+ "current": "La rama actual no está disponible.",
+ "hosted": "El panel de revisión alojado no está disponible para este proveedor."
+ },
+ "practionsSection": {
+ "unlink": "Desconectar",
+ "unlinkPull": "Desvincular solicitud de extracción",
+ "reopenPullRequestAccessibility": "Reabrir solicitud de extracción",
+ "closePullRequestAccessibility": "Cerrar pull request",
+ "off": "Desactivado",
+ "on": "Activado",
+ "toggle": "Alternar fusión automática",
+ "auto": "Fusionar automáticamente cuando esté listo",
+ "mergePullRequestAccessibility": "Fusionar solicitud de extracción",
+ "pullRequestNumberWillReopened": "#{{pullRequestNumber}} se reabrirá.",
+ "reopenPullRequest": "¿Reabrir la solicitud de extracción?",
+ "pullRequestNumberWillClosed": "#{{pullRequestNumber}} se cerrará sin fusionarse.",
+ "closePullRequest": "¿Cerrar solicitud de extracción?",
+ "will": "Esto fusionará #{{pullRequestNumber}} en su rama base.",
+ "mergePullRequest": "¿Fusionar solicitud de extracción?",
+ "failed": "No se pudo desvincular la solicitud de extracción."
+ },
+ "prcheckDetail": {
+ "showingFirst100": "Mostrando los primeros 100 jobs",
+ "showingFirst20": "Mostrando las primeras 20 anotaciones",
+ "annotations": "Anotaciones",
+ "no": "No hay detalles disponibles."
+ },
+ "prchecksSection": {
+ "open": "Abra {{checkName}} en la web",
+ "check": "{{checkName}} verificar detalles",
+ "fix": "Arreglar",
+ "fixFailing": "Solucionar controles fallidos con IA",
+ "inspect": "Inspecciona los detalles o inicia una pasada de corrección con IA.",
+ "rerun": "Volver a ejecutar comprobaciones fallidas",
+ "failingCheckCountFailingCheck": "{{failingCheckCount}} cheque fallido",
+ "failingCheckCountFailingChecks": "{{failingCheckCount}} controles fallidos",
+ "failed": "No se pudieron cargar los detalles del cheque"
+ },
+ "prcommentCard": {
+ "permanently": "Esto elimina permanentemente el comentario en GitHub.",
+ "deleteCommentTitle": "¿Eliminar comentario?",
+ "write": "Escribe una respuesta…",
+ "resolve": "Resolver",
+ "unresolve": "Marcar como no resuelto",
+ "resolveThread": "Resolver hilo",
+ "unresolveThread": "Hilo sin resolver",
+ "delete": "Eliminar",
+ "deleteComment": "Eliminar comentario",
+ "edit": "Editar",
+ "editCommentAccessibility": "Editar comentario",
+ "reply": "Responder",
+ "replyComment": "Responder al comentario",
+ "editComment": "Editar comentario…",
+ "resolved": "resuelto",
+ "save": "Guardar"
+ },
+ "prcommentComposer": {
+ "cancel": "Cancelar"
+ },
+ "prcommentsSection": {
+ "add": "Añade un comentario…",
+ "noComments": "Aún no hay comentarios.",
+ "couldNotLoadComments": "No se pudieron cargar los comentarios. Toca actualizar para volver a intentarlo.",
+ "comments": "Comentarios",
+ "noDescription": "No se proporcionó descripción.",
+ "couldNotLoadDescription": "No se pudo cargar la descripción. Toca actualizar para volver a intentarlo.",
+ "description": "Descripción",
+ "showVisible": "Mostrar {{visibleCommentCount}} más de {{remaining}}",
+ "showRemaining": "Mostrar {{remainingCommentCount}} más",
+ "resolvedThreadAuthor": "Hilo resuelto por {{author}}",
+ "resolvedThreadAuthorReply": "Hilo resuelto por {{author}} ({{replyCount}})",
+ "resolvedCommentAuthor": "Comentario resuelto por {{author}}",
+ "resolvedCommentAuthorReply": "Comentario resuelto por {{author}} ({{replyCount}})",
+ "comment": "Comentario"
+ },
+ "prconflictingFilesSection": {
+ "resolve": "Resolver conflictos con IA",
+ "conflicting": "Archivos con conflictos",
+ "copyCommands": "Copiar comandos",
+ "copied": "Copiado",
+ "copyMergeability": "Copiar comandos para actualizar la capacidad de merge",
+ "run": "Ejecutar desde este worktree",
+ "branch": "Esta rama tiene conflictos que deben resolverse",
+ "commitsBehindCommits": "{{commitsBehind}} commits por detrás (commit base:",
+ "commitsBehindCommit": "{{commitsBehind}} commit por detrás (commit base:",
+ "conflicts": "Conflictos"
+ },
+ "prreviewersSection": {
+ "remove": "Quitar {{login}}",
+ "no": "No se solicitaron revisores",
+ "could": "No se pudieron cargar revisores. Toca actualizar para volver a intentarlo.",
+ "loading": "Cargando revisores…",
+ "reviewers": "Revisores",
+ "add": "Agregar o eliminar revisores"
+ },
+ "prsidebarHeader": {
+ "edit": "Editar título de solicitud de extracción",
+ "save": "Guardar",
+ "saveTitle": "Guardar título",
+ "cancel": "Cancelar",
+ "cancelEditing": "Cancelar edición del título",
+ "open": "Abrir solicitud de extracción #{{pullRequestNumber}} en la web"
+ },
+ "prSidebarCreateEmptyState": {
+ "linkExistingPr": "Vincular un PR existente",
+ "linkExistingPull": "Vincular una solicitud de extracción existente",
+ "current": "La rama actual no está vinculada a un PR abierto.",
+ "git": "{{gitBranch}} no está vinculado a un PR abierto.",
+ "refreshCheck": "Actualice para verificar nuevamente o cree un nuevo PR para esta rama.",
+ "no": "No hay solicitud de extracción abierta",
+ "linked": "PR vinculado #{{pullRequestNumber}} no disponible",
+ "createPr": "Crear PR",
+ "createPull": "Crear solicitud de extracción",
+ "refreshPull": "Actualizar solicitud de extracción",
+ "failed": "No se pudo crear la solicitud de extracción.",
+ "check": "Haga checkout de una rama antes de crear una solicitud de extracción."
+ },
+ "reviewerPickerDrawer": {
+ "no": "No hay personas que coincidan",
+ "search": "buscar personas",
+ "reviewers": "Revisores",
+ "failed": "No se pudieron cargar personas"
+ },
+ "prChecksPresentation": {
+ "reviewed": "Revisado",
+ "pending": "Pendiente",
+ "dismissed": "Despedido",
+ "commented": "Comentado",
+ "changes": "Cambios solicitados",
+ "approved": "Aprobado",
+ "no": "Sin comprobaciones",
+ "skipped": "Omitido",
+ "timed": "Tiempo agotado",
+ "cancelled": "Cancelado",
+ "failed": "Fallido",
+ "successful": "Exitoso",
+ "progress": "En curso",
+ "requested": "Solicitado",
+ "closed": "Cerrado",
+ "draft": "Borrador",
+ "merged": "Mergeado",
+ "open": "Abrir"
+ },
+ "prCommentAudience": {
+ "humans": "Humanos",
+ "all": "Todo",
+ "noComments": "Aún no hay comentarios.",
+ "noHuman": "Sin comentarios humanos.",
+ "noBot": "Sin comentarios de robots."
+ },
+ "markdownBlocks": {
+ "details": "Detalles"
+ },
+ "prCheckDetailContent": {
+ "failed": "Trabajos fallidos"
+ },
+ "prCommentTime": {
+ "years": "hace {{years}}a",
+ "months": "hace {{months}}mo",
+ "days": "hace {{days}}d",
+ "hours": "hace {{hours}}h",
+ "minutes": "hace {{minutes}}m",
+ "just": "ahora mismo"
+ },
+ "confirmModal": {
+ "cancel": "Cancelar",
+ "confirm": "Confirmar"
+ },
+ "mobileSearchField": {
+ "clear": "Borrar búsqueda"
+ },
+ "mobileOnboardingPage": {
+ "skip": "Saltar notificaciones por ahora",
+ "not": "Ahora no",
+ "enableAgent": "Habilitar notificaciones de agents",
+ "enableNotifications": "Habilitar notificaciones",
+ "openSessionsTerminal": "Sesiones abiertas en la terminal",
+ "keep": "mantener terminal",
+ "openSessionsChat": "Sesiones abiertas en la interfaz de usuario de Chat",
+ "use": "Usar la interfaz de usuario del chat",
+ "get": "Reciba notificaciones en este dispositivo cuando un agent necesite su opinión o finalice una tarea.",
+ "choose": "Elija si las sesiones de agent admitidas se abren en la terminal o en la interfaz de usuario de Chat en este dispositivo. Mantenga presionada la pestaña de una sesión para cambiar su vista o cambie la configuración predeterminada más adelante en Configuración.",
+ "stay": "Manténgase actualizado mientras está fuera",
+ "how": "¿Cómo deben abrirse las sesiones?"
+ },
+ "mobileFileExplorerPanel": {
+ "no": "No se encontraron archivos",
+ "retry": "Reintentar",
+ "showing": "- Mostrando los primeros 5000",
+ "files": "Archivos",
+ "back": "Volver a la sesión",
+ "close": "Cerrar archivos",
+ "unable": "No se pueden cargar archivos",
+ "waiting": "Esperando el escritorio...",
+ "connecting": "Conectándose al escritorio..."
+ },
+ "mobileFileMarkdownPreview": {
+ "viewRendered": "Ver vista previa renderizada de Markdown",
+ "viewMarkdown": "Ver fuente de Markdown"
+ },
+ "mobileFilePreviewBody": {
+ "title": "{{title}} imagen",
+ "empty": "Archivo vacío",
+ "retry": "Reintentar"
+ },
+ "mobileFilePreviewEditableSource": {
+ "title": "editor {{title}}"
+ },
+ "mobileFilePreviewScreen": {
+ "unableLoad": "No se puede cargar la vista previa",
+ "save": "Guardar artefacto terminal",
+ "back": "Volver a archivos",
+ "unsaved": "Las ediciones no guardadas se perderán.",
+ "discardChanges": "¿Descartar cambios?",
+ "loading": "Cargando vista previa…",
+ "waiting": "Esperando el escritorio...",
+ "file": "Archivo",
+ "preview": "Vista previa",
+ "discard": "Descartar",
+ "stay": "Permanecer",
+ "unableSave": "No se puede guardar el archivo"
+ },
+ "mobileFilePreviewSourceText": {
+ "file": "Vista previa del archivo",
+ "preview": "Vista previa truncada. Tamaño de archivo: {{formatPreviewByteLength}}."
+ },
+ "mobileFileExplorerRow": {
+ "unavailable": "No disponible en dispositivos móviles",
+ "preview": "Vista previa del archivo {{itemName}}",
+ "item": "{{itemName}} no disponible en dispositivos móviles",
+ "open": "Abrir carpeta {{itemName}}",
+ "retry": "Reintentar",
+ "retryLoading": "Reintentar cargar {{relativePath}}",
+ "loading": "Cargando...",
+ "unable": "No se puede cargar la carpeta"
+ },
+ "mobileFilePreviewRequest": {
+ "file": "Archivo cambiado en el escritorio. Vuelva a cargar la vista previa antes de guardar"
+ },
+ "mobileFilePreviewResponse": {
+ "unableLoad": "No se puede cargar la vista previa",
+ "fileNot": "Archivo no encontrado",
+ "unableReach": "No se puede acceder al sistema de archivos del escritorio",
+ "reload": "Vuelva a cargar la vista previa antes de guardar",
+ "fileToo": "Archivo demasiado grande para la vista previa móvil",
+ "binary": "Vista previa binaria no disponible"
+ },
+ "mobileFilePreviewRoute": {
+ "unable": "No se puede cargar la vista previa"
+ },
+ "mobileFileMutationOwnership": {
+ "could": "No se pudo verificar la conexión SSH. Vuelva a conectar el host e inténtelo de nuevo."
+ },
+ "troubleshootCommonIssues": {
+ "other": "Otra interferencia de VPN",
+ "tailscale": "Host de Tailscale inaccesible",
+ "connection": "Tiempo de espera de conexión",
+ "desktop": "La aplicación de escritorio no se ejecuta",
+ "firewall": "Puerto de bloqueo de firewall 6768",
+ "different": "Diferentes redes WiFi",
+ "disable": "Deshabilite esa VPN o habilite el túnel dividido / \"Permitir LAN\".",
+ "non": "Las VPN que no son de Tailscale pueden enrutar el tráfico local a través de un servidor remoto.",
+ "update": "Actualice la aplicación Tailscale: las versiones recientes corrigen errores de reconexión.",
+ "checkDesktop": "Verifique que el escritorio esté activo y se muestre como conectado en su tailnet.",
+ "i": "iOS/Android puede bloquear silenciosamente el túnel: desactive y vuelva a activar Tailscale en la aplicación Tailscale.",
+ "host": "Direcciones de host como 100.x.x.x o *.ts.net se conectan a través de Tailscale; manténgalo activado.",
+ "restart": "Reinicie ambas aplicaciones si persisten los tiempos de espera.",
+ "go": "Vuelva a la lista de hosts y toque su host para volver a intentarlo.",
+ "checkWi": "Verifique la intensidad de la señal WiFi en su teléfono.",
+ "after": "Después de una actualización, es posible que tengas que volver a realizar el emparejamiento mediante un código QR.",
+ "tryRestarting": "Intente reiniciar Orca: el servidor complementario se inicia al iniciarse.",
+ "orca": "Orca debe estar abierto en su escritorio para aceptar conexiones.",
+ "corporate": "Las redes corporativas/escolares pueden bloquear el P2P; pruebe con un punto de acceso personal.",
+ "windows": "Windows: Defender Firewall → Permitir aplicación: habilite Orca para redes privadas.",
+ "mac": "macOS: Configuración del sistema → Red → Firewall: permitir Orca.",
+ "tryReconnecting": "Intente volver a conectar WiFi en ambos dispositivos.",
+ "ethernet": "Ethernet y WiFi deben compartir la misma subred.",
+ "both": "Ambos dispositivos deben estar en la misma LAN (a menos que estén conectados a través de Tailscale)."
+ },
+ "mobileBrowserPane": {
+ "send": "Enviar texto al navegador",
+ "type": "Escribe en la página…",
+ "ok": "DE ACUERDO",
+ "cancel": "Cancelar",
+ "browserDialogMessage": "Diálogo del navegador",
+ "reload": "Recargar",
+ "forward": "Reenviar",
+ "back": "Atrás",
+ "enter": "Introduzca una URL válida.",
+ "browserStreamTimed": "Se agotó el tiempo de espera de la transmisión del navegador.",
+ "browserPage": "La página del navegador aún no está disponible.",
+ "checking": "Comprobando la compatibilidad con la transmisión por secuencias del navegador de escritorio.",
+ "update": "Actualice Orca de escritorio para transmitir las pestañas del navegador en el móvil.",
+ "browserStreamFailed": "Error en la transmisión del navegador.",
+ "browserDialog": "Diálogo del navegador",
+ "sent": "Enviado",
+ "browserPointerUp": "Error al subir el puntero del navegador",
+ "browserPointerDown": "Error al bajar el puntero del navegador",
+ "browserPointerMove": "Error al mover el puntero del navegador",
+ "browserScroll": "Error al desplazarse por el navegador",
+ "browserCommand": "El comando del navegador falló",
+ "right": "clic derecho"
+ },
+ "mobileBrowserPointerModifiers": {
+ "modifier": "{{modifierLabel}} modificador de clic",
+ "shift": "Cambio",
+ "alt": "Alt.",
+ "ctrl": "Control",
+ "cmd": "comando"
+ },
+ "mobileBrowserViewModeSwitch": {
+ "show": "Mostrar vista del sitio web {{browserLabel}}",
+ "mobile": "Móvil"
+ },
+ "mobileAgentSessionHistoryList": {
+ "resume": "Reanudar sesión del agent",
+ "current": "worktree actual",
+ "messages": "mensajes",
+ "message": "mensaje"
+ },
+ "agentHistory": {
+ "noPast": "No hay sesiones de agents anteriores en este ámbito.",
+ "noSessions": "Ninguna sesión coincide con tu búsqueda.",
+ "noAgent": "Sin sesiones de agent",
+ "search": "Sesiones de búsqueda, repo:, ruta:",
+ "retry": "Reintentar",
+ "unableLoad": "No se puede cargar",
+ "update": "Actualice Orca en este host para explorar el historial de sesiones del agent.",
+ "agentSessionHistoryUnavailable": "Historial de sesiones del Agent no disponible",
+ "refresh": "Actualizar sesiones de agents",
+ "agentSessionHistory": "Historial de sesiones de Agents",
+ "back": "Atrás",
+ "failed": "No se pudo reanudar la sesión.",
+ "agentSessionQueued": "Sesión del Agent en cola.",
+ "unableDetermine": "No se puede determinar la plataforma de alojamiento.",
+ "session": "A esta sesión le falta una identificación de currículum.",
+ "waiting": "Esperando al anfitrión...",
+ "all": "Todo",
+ "project": "Proyecto",
+ "workspace": "Espacio de trabajo",
+ "issueCountTranscript": "{{issueCount}} transcripción omitida",
+ "issueCountTranscripts": "{{issueCount}} transcripciones omitidas",
+ "unableLoadWorkspace": "No se pueden cargar los metadatos del espacio de trabajo."
+ },
+ "useMobileAgentHistoryState": {
+ "waiting": "Esperando al anfitrión…",
+ "unableLoad": "No se pueden cargar sesiones de agent",
+ "unableReach": "No se puede contactar con el anfitrión"
+ },
+ "worktreeNavigationActions": {
+ "agent": "Historial de sesiones de Agents",
+ "source": "Control de código fuente"
+ },
+ "agentHistoryResumeTarget": {
+ "open": "Abre un espacio de trabajo local antes de reanudar una sesión.",
+ "session": "Esta sesión se almacena en la máquina host, por lo que no se puede reanudar en un espacio de trabajo SSH. Abra un espacio de trabajo local para este proyecto.",
+ "resume": "La reanudación desde el historial no está disponible en espacios de trabajo alojados en tiempo de ejecución."
+ },
+ "agentHistorySessionCard": {
+ "untitled": "Sesión sin título"
+ },
+ "about": {
+ "open": "IDE de agent de código abierto para constructores 100x",
+ "about": "Acerca de"
+ },
+ "browserSettings": {
+ "openTerminal": "Abrir enlaces de terminales",
+ "choose": "Elija dónde se abren los enlaces HTTP(S) seleccionados en la salida del terminal.",
+ "links": "ENLACES",
+ "browser": "Navegador",
+ "openSafari": "Ábralo en Safari, Chrome u otro navegador en este teléfono.",
+ "phone": "Navegador de teléfono",
+ "openStreamed": "Ábralo en el navegador transmitido desde su escritorio emparejado.",
+ "orca": "Navegador Orca en el escritorio"
+ },
+ "connectionLog": {
+ "noPaired": "No hay hosts emparejados.",
+ "noConnection": "Aún no hay eventos de conexión en esta sesión. Los eventos aparecen cuando la aplicación llama a este host.",
+ "copy": "Copiar diagnóstico",
+ "copied": "Copiado",
+ "attempt": "· intento {{reconnectAttempts}}",
+ "connection": "Registro de conexión"
+ },
+ "home": {
+ "youre": "estas conectado",
+ "scan": "escanea el código",
+ "openOrca": "Abrir el escritorio de Orca",
+ "removeConfirm": "¿Quitar \"{{confirmRemoveName}}\"? Puedes volver a emparejarlo más tarde.",
+ "removeHost": "Quitar anfitrión",
+ "remove": "Eliminar",
+ "edit": "Editar anfitrión",
+ "disconnect": "Desconectar",
+ "account": "Uso de la cuenta",
+ "new": "Nuevo espacio de trabajo",
+ "pair": "Emparejar escritorio",
+ "quick": "Acciones rápidas",
+ "tasks": "Tareas",
+ "resume": "Reanudar",
+ "desktops": "Escritorios",
+ "prs": "PRs creados",
+ "agent": "Tiempo de Agents",
+ "agents": "Agents iniciados",
+ "welcome": "Bienvenido de nuevo",
+ "how": "como funciona",
+ "pairingDescription": "Emparéjese con Orca en su computadora para controlar a sus agents, acceder a cualquier terminal y realizar el trabajo desde su teléfono.",
+ "connectYour": "Conecta tu escritorio",
+ "please": "Por favor inténtalo de nuevo.",
+ "could": "No se pudo eliminar el host",
+ "openTask": "Abrir {{taskProviderLabel}} tareas",
+ "no": "No hay fuentes de tareas conectadas",
+ "system": "Predeterminado del sistema",
+ "your": "Su escritorio aparecerá aquí. Todo está cifrado de extremo a extremo.",
+ "tap": "Toque el botón de arriba para abrir el escáner. Apunte al código QR en su pantalla.",
+ "go": "Vaya a Configuración → Móvil y genere un código QR de emparejamiento.",
+ "connect": "Conectar",
+ "reconnect": "Reconectar"
+ },
+ "mobileOnboarding": {
+ "onboarding": "Progreso de incorporación",
+ "notification": "La configuración de notificaciones no se pudo actualizar. Intentar otra vez.",
+ "your": "Su elección no se pudo guardar. Intentar otra vez."
+ },
+ "nativeChatSettings": {
+ "open": "Sesiones abiertas en la interfaz de usuario de Chat",
+ "off": "Desactivado",
+ "on": "Activado",
+ "choose": "Elija cómo se abren en este dispositivo las sesiones de agents compatibles (Claude, Codex y otros agents con capacidad de chat). La terminal muestra la CLI sin formato; La interfaz de usuario de chat muestra una interfaz de chat como la aplicación de escritorio. Aún puedes cambiar cualquier sesión individual desde su menú de pulsación larga.",
+ "default": "VISTA PREDETERMINADA",
+ "back": "Atrás"
+ },
+ "notifications": {
+ "open": "Abrir configuración",
+ "agent": "Notificaciones de Agents",
+ "notifications": "Notificaciones",
+ "get": "Reciba notificaciones en este dispositivo cuando un agent necesite su opinión o finalice una tarea.",
+ "notificationsDisabled": "Las notificaciones están deshabilitadas en la configuración del sistema."
+ },
+ "pairConfirm": {
+ "back": "De vuelta a casa",
+ "connecting": "Conectando…",
+ "cancel": "Cancelar",
+ "pair": "Par",
+ "confirmDesktopPairingLink": "Abriste un enlace de emparejamiento desde tu escritorio. Confirma para agregarlo a tus hosts.",
+ "pairDesktop": "¿Emparejar con este escritorio?",
+ "pairingFailed": "Error de emparejamiento: {{errorMessage}}",
+ "could": "No se pudo conectar dentro de {{pairingOverallTimeoutSeconds}}s; consulte el registro a continuación para saber dónde se detuvo",
+ "pairingLog": "Registro de emparejamiento"
+ },
+ "pairScan": {
+ "copy": "Copie el código que se muestra debajo del QR en su computadora.",
+ "pastePairingCode": "Pegar código de emparejamiento",
+ "pasteCode": "Pegar el código en su lugar",
+ "try": "Intentar de nuevo",
+ "connecting": "Conectando…",
+ "pastePairingCodeMessage": "O pegue el código de emparejamiento",
+ "scan": "Escanea el código QR",
+ "go": "Vaya a Configuración → Móvil",
+ "openOrca": "Abre Orca en tu computadora",
+ "openSettings": "Abrir configuración",
+ "continue": "Continuar",
+ "enable": "Habilite el acceso a la cámara en Configuración o pegue el código de emparejamiento.",
+ "scanOrPastePairingCode": "Escanee el código QR de Orca en su escritorio o pegue el código de emparejamiento.",
+ "camera": "Acceso a la cámara deshabilitado",
+ "pair": "Emparejar con escritorio",
+ "pairingFailed": "Error de emparejamiento: {{errorMessage}}",
+ "could": "No se pudo conectar dentro de {{pairingOverallTimeoutSeconds}}s; consulte el registro a continuación para saber dónde se detuvo",
+ "notValidPairing": "No es un código de emparejamiento válido: cópielo desde su computadora y péguelo nuevamente",
+ "notValidOrca": "No es un código QR de Orca válido",
+ "pairingLog": "Registro de emparejamiento"
+ },
+ "pair": {
+ "back": "De vuelta a casa",
+ "missing": "Falta el código de emparejamiento"
+ },
+ "settings": {
+ "support": "Apoyo",
+ "privacy": "política de privacidad",
+ "retry": "Reintentar",
+ "retryClearing": "Vuelva a intentar borrar las credenciales de emparejamiento",
+ "couldNotCheck": "No se pudo verificar el estado de limpieza en este dispositivo. Vuelva a intentar estar seguro.",
+ "cleanup": "Aún no se ha podido confirmar la limpieza. Vuelve a intentarlo más tarde.",
+ "pairing": "Limpieza de credenciales de emparejamiento",
+ "about": "Acerca de",
+ "troubleshooting": "Solución de problemas",
+ "notifications": "Notificaciones",
+ "voice": "Voz",
+ "browser": "Navegador",
+ "settings": "Ajustes",
+ "couldNotConfirmCleanupPendingCredentialCountCredential": "No se pudo confirmar la limpieza de la credencial {{pendingCredentialCount}} en este dispositivo.",
+ "couldNotConfirmCleanupPendingCredentialCountCredentials": "No se pudo confirmar la limpieza de las credenciales {{pendingCredentialCount}} en este dispositivo."
+ },
+ "terminalSettings": {
+ "terminalText": "Tamaño del texto del terminal",
+ "restore": "Restaurar {{pickerHostName}}",
+ "off": "Desactivado",
+ "on": "Activado",
+ "autocomplete": "Autocompletar y autocorrección",
+ "autocompleteDescription": "Habilite las sugerencias de autocompletar, autocorrección y ortografía al estilo del teléfono en la barra de comandos del terminal. Está desactivado de forma predeterminada para que el teclado nunca reescriba comandos, indicadores o rutas. La entrada directa del teclado (cuando las teclas van directamente al terminal) siempre envía pulsaciones de teclas sin formato, por lo que las sugerencias no se aplican allí.",
+ "keyboard": "ENTRADA DE TECLADO",
+ "textSizeMessage": "Tamaño del texto",
+ "textScaleDescription": "Escale el texto del terminal. Los tamaños más pequeños se ajustan a más columnas con márgenes laterales; los tamaños más grandes muestran menos columnas: arrastre hacia los lados para realizar una panorámica. También puedes pellizcar para hacer zoom en el propio terminal, lo que actualiza esta configuración. Solo visualización por dispositivo; no cambia el terminal de escritorio.",
+ "textSize": "TAMAÑO DEL TEXTO",
+ "no": "Aún no hay escritorios emparejados. Empareje uno para controlar el comportamiento del terminal.",
+ "resizeBehaviorDescription": "Mientras usas una terminal en tu teléfono, Orca la reduce para que se ajuste a tu pantalla. Cuando cierra la aplicación o la abandona, esto controla si permanece en el tamaño del teléfono (para que las herramientas CLI interactivas no vuelvan a fluir) o cambia de tamaño a su escritorio. Siempre puedes usar Restaurar este terminal o Restaurar todos los terminales en el banner para cambiar el tamaño manualmente.",
+ "when": "CUANDO DEJAS LA APLICACIÓN",
+ "after30": "Después de 30 minutos",
+ "after5": "Después de 5 minutos",
+ "after1": "Después de 1 minuto",
+ "keep": "Mantener en tamaño de teléfono (predeterminado)",
+ "largest": "Más grande (200%)",
+ "larger": "Más grande (150%)",
+ "large": "Grande (125%)",
+ "default": "Predeterminado (100%)",
+ "smaller": "Más pequeño (75%)",
+ "smallest": "Más pequeño (50%)",
+ "afterDuration": "Después de {{durationSeconds}}s"
+ },
+ "troubleshoot": {
+ "common": "Problemas comunes",
+ "view": "Ver registro de conexión",
+ "runDiagnostics": "Ejecutar diagnóstico",
+ "runAgain": "Corre de nuevo",
+ "running": "Ejecutando…",
+ "troubleshooting": "Solución de problemas",
+ "platform": "Plataforma",
+ "paired": "Anfitriones emparejados",
+ "couldNotTest": "No se pudo probar",
+ "no": "Sin conexión",
+ "unexpected": "Respuesta inesperada",
+ "connected": "Conectado",
+ "couldNotRead": "No se pudieron leer los datos del host",
+ "none": "Ninguno: escanea un QR para emparejar",
+ "host": "{{hostCount}} emparejado",
+ "reachable": "Accesible en {{endpoint}}"
+ },
+ "voiceSettings": {
+ "speechModelMessage": "Modelo de voz",
+ "speechModel": "MODELO DE DISCURSO",
+ "togglePress": "Alternar: presione una vez para comenzar y nuevamente para detener. Mantener: dictar mientras se mantiene presionado.",
+ "dictationMode": "Modo de dictado",
+ "dictate": "Dicta texto en cualquier panel enfocado de tu escritorio.",
+ "enable": "Habilitar dictado de voz",
+ "dictation": "DICTADO",
+ "connect": "Conéctese a un escritorio para administrar la configuración de voz.",
+ "voice": "Voz",
+ "delete": "Error al eliminar",
+ "download": "Falló la descarga",
+ "couldNotSelect": "No se pudo seleccionar el modelo",
+ "couldNotUpdate": "No se pudo actualizar",
+ "failedLoadVoiceSettings": "No se pudo cargar la configuración de voz",
+ "hold": "Mantener",
+ "toggle": "Alternar",
+ "failedLoadVoiceSettingsMessage": "No se pudo cargar la configuración de voz.",
+ "none": "Ninguno seleccionado"
+ },
+ "mobileDictationPendingAudioBudget": {
+ "connection": "La conexión es demasiado lenta para el dictado por voz. Inténtalo de nuevo cuando la conexión mejore."
+ },
+ "mobileDictationDesktopStart": {
+ "failed": "No se pudo iniciar la grabación del micrófono"
+ },
+ "mobileDictationKeepAwake": {
+ "keep": "Se agotó el tiempo de espera de la llamada nativa para mantenerse despierto"
+ },
+ "useMobileDictation": {
+ "no": "No se detectó ninguna voz.",
+ "failed": "No se pudo inicializar el micrófono",
+ "microphone": "Permiso de micrófono denegado"
+ },
+ "mobileDictationSetup": {
+ "update": "Actualice la aplicación Orca de escritorio emparejada para usar la configuración de voz móvil.",
+ "failedUpdate": "No se pudo actualizar la configuración de dictado",
+ "failedDelete": "No se pudo eliminar el modelo",
+ "failedStart": "No se pudo iniciar la descarga",
+ "failedLoad": "No se pudieron cargar los modelos de dictado"
},
"prChecks": {
"summary": {
@@ -2191,7 +2431,6 @@
"other": "{{count}} aprobadas"
},
"neutral": {
- "one": "{{count}} neutral",
"other": "{{count}} neutrales"
}
}
diff --git a/mobile/src/i18n/locales/ja.json b/mobile/src/i18n/locales/ja.json
index c3a89c3868b..88ad1d535c5 100644
--- a/mobile/src/i18n/locales/ja.json
+++ b/mobile/src/i18n/locales/ja.json
@@ -1,2180 +1,2460 @@
{
- "m": {
- "zWwi3-o": "未着手",
- "hWeTdOM": "進行中",
- "mg8ozqs": "レビュー中",
- "EleEi2Q": "完了",
- "1Bc_S64": "PR 状況",
- "BX2Np3Y": "リポジトリ",
- "oBZu0_c": "状態",
- "Iq3a5so": "グループ化なし",
- "y1TvQWs": "サーバーの順序",
- "FyGSYV4": "マニュアル",
- "yH1bPxU": "リポジトリ、ワークスペース名",
- "v5H1mJY": "Repo",
- "egkm8qI": "最新の出力が最初に表示されます",
- "2xJ96AA": "最近の",
- "BaGIgrE": "名前のアルファベット順",
- "tQqkyxI": "名前",
- "RcmL46Y": "注意が必要な Agents、その後の最近のアクティビティ",
- "6gEQgs0": "Agent のアクティビティ",
- "KbmpcZs": "再接続中…",
- "6_SeqME": "接続できません",
- "YAPgxBM": "デスクトップにアクセスできません",
- "G6a1Jqk": "切断済み",
- "I-waJyg": "接続中…",
- "jgGsba4": "接続済み",
- "0BvjSKA": "ペアリングが無効です - デスクトップと再ペアリングします",
- "HguWCpQ": "ポートは 1 ~ 65535 である必要があります。",
- "dRmw4EQ": "ホスト名がありません。",
- "CshxztM": "有効な住所ではありません。",
- "6lctDfQ": "有効なホスト名ではありません。",
- "fX92Peg": "ホストにはパスやクエリを含めることはできません。",
- "HQMAFdE": "ws:// または wss:// (または host:port) を使用します。",
- "z85IfPo": "ホストアドレスを入力します。",
- "lxKZMMw": "構成されたリレー メタデータには 1 つのエンドポイントが必要です",
- "e-zCiAo": "リレーホスト ID の不一致",
- "CjbcG3A": "リレー ID とエンドポイントは共存する必要があります",
- "HrWsdDM": "カーソル前の行をクリア",
- "sL5fKGQ": "Ctrl+U",
- "Bd9qfdk": "単語を後方に削除",
- "jVVj75Y": "Ctrl+W",
- "0VWtVO8": "行末",
- "5m_ucwE": "Ctrl+E",
- "CKFp_QM": "行の始まり",
- "u9q9lPQ": "Ctrl+A",
- "mcvHf4o": "逆引き検索",
- "a2Cb3GE": "Ctrl+R",
- "hqWfNmA": "プロセスを一時停止する",
- "NIdsbYo": "Ctrl+Z",
- "Eqaj8oY": "画面をクリアする",
- "R6ZcIz8": "Ctrl+L",
- "PBPnPeQ": "EOFを送信",
- "vFYSo0s": "Ctrl+D",
- "AzHoQzM": "割り込み terminal",
- "ke03J5M": "Ctrl+C",
- "v5WSGO0": "右矢印",
- "RiGIavM": "左矢印",
- "vVsy7qk": "下矢印",
- "IwJi8TY": "上矢印",
- "fNgDk9o": "前方削除",
- "gmy3A7M": "デル",
- "6TRPiic": "バックスペース",
- "l6KJT3M": "スペース",
- "p7_d2FU": "シフトタブ",
- "S9DH8y4": "Shift+Tab",
- "9KFo5zM": "入力",
- "hM5KUAw": "タブ",
- "jHe6UUU": "逃げる",
- "bNejRmQ": "ESC",
- "UnBBA1A": "リロード",
- "p2soPzg": "Terminal のロードに失敗しました",
- "IwMISoQ": "全て",
- "J54idHw": "クローズ",
- "sKFSmrM": "マージ済み",
- "dGRdl38": "オープン",
- "_NhxpRw": "名前",
- "efmLHxE": "ブランチ",
- "JEQaLyM": "GitLab",
- "j6H-ZB8": "Linear",
- "fLijFJI": "GitHub",
- "0GQcyjg": "スマート",
- "TgLMnDc": "ルート、絶対パス、親セグメントではなく、repo 相対ディレクトリを使用してください。",
- "M0WKvoE": "少なくとも 1 つのディレクトリを追加します。",
- "fCVCUqw": "WSL リセット スコープには正確なディストリビューションが必要です",
- "TJPBpxE": "ホスト リセット スコープでは WSL ディストリビューションに名前を付けることができません",
- "CgVIb2E": "モバイル プレビュー用に差分が切り詰められています。",
- "mZj5XBY": "差分をロードできません",
- "v6-Hc8I": "コミットされた差分プレビューを閉じる",
- "I6GjQO8": "ブランチにコミット",
- "6lym-WQ": "{{value0}}..HEAD",
- "P2fbbug": "詳細を表示",
- "eysP-fI": "詳細を非表示",
- "6Pb0W84": "commit 失敗の詳細を表示する",
- "7eT5oiE": "commit 失敗の詳細を非表示にする",
- "-RbEI6M": "修正",
- "3iqxoCY": "AI による commit 失敗の修正",
- "Hol4rtI": "Commit に失敗しました",
- "fcDHZ1U": "commits はありません。",
- "Qb3CogY": "再試行",
- "kylGvPU": "デスクトップを待っています...",
- "y0bB4-s": "ファイルの変更はありません",
- "c_4jbTI": "履歴のロードに失敗しました",
- "O_0cF4M": "{{value0}} が変更されました",
- "cLOWzDM": "{{value0}} 件をステージしました",
- "Dysvcf0": "ブランチ上の{{value0}}",
- "8tFmU9A": "AIで commit メッセージを生成",
- "PTohtCY": "commit メッセージ生成のキャンセル",
- "uTRYt2U": "Commit メッセージ",
- "2X52pxU": "ステージングされたファイルはありません",
- "ELJU7AQ": "Commit メッセージが無効になりました。ステージングされたファイルはありません。",
- "yKqTr9E": "ワーキングツリーはきれいです。",
- "89qgAps": "ローカルの変更はありません",
- "8E6deJU": "オープンソース管理操作",
- "DHXoi2A": "すべてのステージを解除",
- "9pCKA8U": "ステージオール",
- "o_TTJDk": "デスクトップに再接続しています...",
- "PW__oVI": "コミットされた変更 {{value0}} を開く",
- "tZHFwCg": "コミットされた変更をロードしています...",
- "m_C8jkI": "ブランチに Commit",
- "IET9hpI": "{{value0}} を破棄",
- "WTkbKTE": "ステージ{{value0}}",
- "9OoD7rs": "{{value0}} のステージを解除",
- "av_Mh7U": "未解決の競合",
- "4a6Yo9s": "変更されたファイル {{value0}} を開く",
- "SrSDY0M": "{{value0}}から",
- "Pt1enm0": "ソース管理を更新する",
- "5lXW9sQ": "Web 上で PR を開く",
- "HUC1SZA": "ウェブ上で PR #{{value0}} を開く",
- "PjA8ztc": "ソース管理",
- "OtpFc0w": "セッションに戻る",
- "MDlHRa0": "ソース管理を閉じる",
- "84pwQsY": "ブラウザで開きますか?",
- "4E80Be4": "PR が作成されました",
- "n9UDFoo": "スイッチブランチ",
- "Oh7cEhY": "「{{value0}}」への変更を破棄しますか?これを元に戻すことはできません。",
- "7IMotMA": "変更を破棄する",
- "7p6X0C0": "ソース管理",
- "dggV318": "再試行",
- "SlcSA9A": "ロードできません",
- "UgUD08U": "ソース管理が利用できません",
- "Q1mHSX4": "PR を作成する",
- "xoN_ZQM": "PR を読み込んでいます…",
- "jrzi7yY": "ブランチに Commit",
- "cU7VGGA": "commit メッセージの生成に失敗しました",
- "6N6POoY": "PR の作成",
- "8fhgeQQ": "PR の準備中にブランチが変更されました。",
- "zAg6hUc": "commit メッセージを生成できませんでした。ソース管理に追加して、再試行してください。",
- "x1skfkY": "PR を作成する前に、変更を解決するかステージングしてください。",
- "695pbL4": "PR を作成する前に競合を解決してください。",
- "QeyCTxE": "プッシュに失敗しました。プッシュエラーを解決してから、再試行してください。",
- "hjs2AB4": "Commits",
- "bOc3nUM": "分岐を切り替える",
- "ntik19Q": "ベースにリベースする",
- "r_MPRhE": "ブランチを公開",
- "3blspe8": "フェッチ",
- "_Pq5EEw": "PR のプッシュと作成",
- "IgtghkE": "PR を作成",
- "ZFwznUg": "Commit と同期",
- "4pU4zTo": "Commit とプッシュ",
- "_Srm4Jk": "Commit",
- "s7LT0Wk": "agent の起動に失敗しました",
- "Ngsl81c": "デスクトップを待っています...",
- "h4RNhQ0": "commit メッセージの生成に失敗しました",
- "IhhRQcI": "PR を作成する前にブランチをチェックアウトしてください。",
- "8lyq50g": "モバイルでソース管理を使用できるように Orca デスクトップを更新します。",
- "v0PMFRE": "比較のためのベース ブランチを解決できません。",
- "xLlZko0": "デスクトップを待っています...",
- "0MDy3xU": "差分を開けません",
- "iO0cooo": "ソース管理操作が失敗しました",
- "0EPx-aA": "Agent は働いています",
- "vCnFzKQ": "閉じる",
- "8xevGic": "リロード",
- "m4hO2RY": "進む",
- "SKku3yE": "戻る",
- "GZwtZCE": "ブラウザ",
- "EwbB5VI": "次へ",
- "ZEWq5OM": "回答を送信する",
- "yxcaJwo": "キャンセル",
- "7nef7b0": "答えを入力してください",
- "biG4V5Q": "他の…",
- "imHMT2Y": "メッセージを送信する",
- "0JFch-U": "口述する",
- "r9MfglU": "ディクテーションを停止する",
- "o_uvOaw": "画像を添付",
- "8VDRuNk": "画像を削除する",
- "lHpfBcs": "キュー待ち",
- "85E7hns": "このメッセージを一番上までスクロールします",
- "m5GqFPc": "メッセージをコピーする",
- "0bAYawM": "{{value0}}×",
- "0mLnbZ0": "… {{value0}} 個以上のツール呼び出し",
- "O8aNMg0": "返信を送信",
- "psOJLjQ": "返信を入力してください…",
- "bSeVb4U": "または返信を入力してください…",
- "NR7KpaA": "選択したオプションを送信する",
- "BcZ8-jY": "送信{{value0}}",
- "55yDVNk": "メッセージ、@ファイル、/コマンド",
- "AXyDPsE": "terminal を待っています…",
- "gFSApKE": "再接続中…",
- "X8_vuao": "停止",
- "1oeCDU8": "agent を停止",
- "J3nTi3Q": "ツール",
- "HgMEzFE": "折りたたむ",
- "MWJZkOQ": "最新までスクロール",
- "AexlW6I": "以前のメッセージをロードする",
- "u8wilUo": "チェック",
- "6R8BWsw": "Agent 履歴",
- "a4FTXPM": "音声ディクテーションを開始する",
- "4Bofttg": "音声ディクテーションを開始する",
- "467WHFs": "音声ディクテーションをキャンセルする",
- "lmt1VYs": "音声ディクテーションを停止する",
- "diKZlw8": "長押しすると代わりにファイルを添付できます",
- "THy0254": "写真を添付する",
- "Vl7Dj48": "画像送信",
- "mr8N0cA": "クイックコマンドを追加",
- "SZAlJoE": "保存",
- "z9Me_JI": "キャンセル",
- "nB0fh-Q": "プロジェクト",
- "spBXyhw": "グローバル",
- "JVmE8Lo": "範囲",
- "iAdHX2w": "テキストを挿入するだけでなく、すぐに送信してください。",
- "S9UUSi8": "追加 Enter",
- "MsJOHDg": "詳細設定",
- "WFigoqY": "スキル、ファイル パス、組み込みコマンドをサポートします。",
- "YGxS8ck": "npm run dev",
- "j_uWjuQ": "agent にこのワークスペースを調査するよう依頼します",
- "2WUowpg": "コマンドテキスト",
- "v512Bqc": "プロンプト",
- "9D9oj64": "agent を選択",
- "th44i2A": "Agent",
- "AQ41agY": "操作",
- "pcq4xtU": "開発サーバーを起動する",
- "GXMFUnA": "ラベル",
- "CQKw8CA": "Agent プロンプト",
- "9xkz8HQ": "Terminal コマンド",
- "r6942Dw": "{{value0}} を削除",
- "N8k0x7U": "{{value0}}を編集",
- "VrXVT_A": "{{value0}} を実行します",
- "Jqxtf0c": "クイックコマンドの制限に達しました",
- "LmWWV94": "新規クイックコマンド",
- "YWp9eI8": "グローバル",
- "0ye1crk": "このプロジェクト",
- "stjjcN4": "一致するクイック コマンドはありません。",
- "WGZgVlw": "クイックコマンドはまだありません。",
- "Mlzs2q8": "クイックコマンドを検索...",
- "c7kUeNA": "terminal コマンドまたは agent プロンプトを保存して、すぐにアクセスできるようにします。",
- "XUyBgA4": "戻る",
- "8mDod7I": "このクイック コマンドは保存されたリストから削除されます。",
- "y7ppLrs": "「{{value0}}」を削除しますか?",
- "gz_v97k": "レビュー スレッドの更新に失敗しました。",
- "ssoDq0g": "タイトルの更新に失敗しました。",
- "fZbxiK0": "閉じる",
- "9OSp60k": "Orca デスクトップを更新して、モバイルでの変更を確認します。",
- "RSAKe4M": "コミットされた変更の応答が無効でした",
- "hKX4q6A": "ブランチにコミット",
- "LHMnD5o": "許可が要求されました",
- "zqu69ik": "常に許可する",
- "3EBdICM": "拒否",
- "sjphObI": "許可する",
- "QX9RTgc": "右側のタブを閉じる",
- "_ijK2wo": "左側のタブを閉じる",
- "XxfyMlc": "他のタブを閉じる",
- "k32XW6w": "閉じる",
- "5s4VNsw": "クリア Terminal",
- "2wFDKaY": "名前を変更する",
- "umfRNkc": "PR のマージに失敗しました。",
- "vXd8YYA": "PR の更新に失敗しました。",
- "Lq5nqds": "アタッチに失敗しました (再接続)",
- "kOr-gVg": "レビューの保存に失敗しました",
- "AtE6oQA": "デスクトップを待っています...",
- "HkX9h2s": "ワークツリーがありません",
- "-k-F-P0": "{{value0}} 件をステージしました",
- "tyXkf4g": "{{value0}} 件をステージ、{{value1}} 件失敗",
- "L-xz6vw": "デスクトップを待っています...",
- "MOtwYRI": "ソース管理操作が失敗しました",
- "x0Dr_H8": "デスクトップを待っています...",
- "U2LqmGk": "送信されたメモを確認する",
- "LtedJAM": "コピーしたメモを確認する",
- "NSS4Or0": "アタッチに失敗しました",
- "hJYA7AQ": "画像が大きすぎて添付できません",
- "JdGd1Ic": "写真の許可が拒否されました",
- "tu-qlN0": "アタッチ失敗(切断)",
- "JlNqDLA": "アタッチに失敗しました",
- "-YjNIcU": "画像が大きすぎて添付できません",
- "jdkmIaw": "写真の許可が拒否されました",
- "Kc1O9hE": "アタッチ失敗(切断)",
- "AandnA4": "未接続",
- "62Wqvcg": "agent の起動に失敗しました",
- "WXv-mcQ": "デスクトップを待っています…",
- "zchh0X0": "コメント操作が失敗しました",
- "6VPjkF8": "タイトルの更新に失敗しました。",
- "RqzbvDE": "デスクトップに接続されていません。",
- "weTQMew": "貼り付けに失敗しました",
- "5dhlsXo": "画像が大きすぎて貼り付けられません",
- "gG0saX0": "貼り付けに失敗しました (切断されました)",
- "Ezj8Uog": "ペーストが大きすぎます (最大 256 KiB)",
- "e1BO4eM": "クイックコマンドのロードに失敗しました",
- "K20RdWM": "今のところ通知をスキップする",
- "KP3UPPY": "後で",
- "sSrQIeg": "agent 通知を有効にする",
- "QM9B4lA": "通知を有効にする",
- "B5cl_6I": "terminal でセッションを開く",
- "9bF2iuQ": "terminal を維持する",
- "tYyQCnY": "チャット UI でセッションを開く",
- "KogvSYY": "チャット UI を使用する",
- "3vHqv6U": "agent が入力を必要とするとき、またはタスクを完了したときに、このデバイスで通知を受け取ります。",
- "dV8UVHg": "サポートされている agent セッションを terminal で開くか、このデバイスのチャット UI で開くかを選択します。セッション タブを長押ししてビューを切り替えるか、後で [設定] でデフォルトを変更します。",
- "OmdgGNs": "外出中でも最新情報を入手",
- "o9LxHPg": "セッションはどのように開くべきですか?",
- "CaZB1fk": "ファイルが見つかりません",
- "LS0hOug": "再試行",
- "UomXr8g": "- 最初の 5000 件を表示",
- "8ojoNLo": "ファイル",
- "vT-EgZw": "セッションに戻る",
- "A053H2s": "ファイルを閉じる",
- "ujEE5Aw": "レンダリングされた Markdown プレビューを表示する",
- "12QKL8A": "Markdown ソースを表示",
- "cDZy2i8": "{{value0}}画像",
- "0U_34Zg": "空のファイル",
- "zqZaJJo": "再試行",
- "yc-xh3U": "{{value0}} エディター",
- "uLXt2Qs": "プレビューを読み込めません",
- "BnjL5Ho": "terminal アーティファクトを保存する",
- "nxnMGkU": "ファイルに戻る",
- "vXalblI": "保存されていない編集内容は失われます。",
- "k969DeE": "変更を破棄しますか?",
- "Iqn4mt4": "プレビューを読み込んでいます...",
- "MCFjuu8": "デスクトップを待っています...",
- "1_VaWXc": "ファイルのプレビュー",
- "mGhZjxw": "プレビューが切り詰められました。ファイルサイズ: {{value0}}。",
- "m0QdE2U": "モバイルでは利用できません",
- "F2AHmFI": "プレビュー ファイル {{value0}}",
- "AnmS3ZU": "{{value0}} はモバイルでは利用できません",
- "LuU4lSE": "フォルダー {{value0}} を開く",
- "CGYoYAY": "再試行",
- "v4sDG-8": "{{value0}} のロードを再試行してください",
- "t2QYxhU": "読み込み中...",
- "kYWeCgo": "デスクトップ上のファイルが変更されました。保存する前にプレビューをリロードする",
- "nbgr4H0": "プレビューを読み込めません",
- "Jj_IDwY": "ファイルが見つかりません",
- "X-whfMo": "デスクトップのファイルシステムにアクセスできません",
- "ktGDvZE": "保存する前にプレビューをリロードする",
- "UFAFIP0": "ファイルが大きすぎてモバイルでプレビューできない",
- "UfU4CAU": "バイナリ プレビューは利用できません",
- "2t0lh6U": "プレビューを読み込めません",
- "jLhPXXQ": "その他の VPN 干渉",
- "ngjn4tY": "Tailscale ホストに到達できません",
- "AE3mc7A": "接続タイムアウト",
- "MED_8yU": "デスクトップアプリが実行されていない",
- "amY3iCs": "ファイアウォールがポート 6768 をブロックしている",
- "vuZn-_E": "さまざまな WiFi ネットワーク",
- "q-MNnd4": "削除",
- "KuqR8FY": "修理",
- "ujiecek": "再試行",
- "IrfKQh8": "認証に失敗しました — まず再接続してみてください。失敗し続ける場合は、デスクトップから再ペアリングします。",
- "2LrOLw8": "リセットを使用する",
- "LN50bQ0": "リセット中…",
- "8CLIWuE": "アクティブな Codex アカウントに対して 1 つの獲得リセットを使用します",
- "Y2o7mgc": "{{value0}} の獲得リセットを 1 つ使用します",
- "7uEIrNQ": "Codex レート制限リセットを使用する",
- "fNZPjTQ": "Codex のレート制限のリセット",
- "_g9qkig": "ショートカットを追加",
- "N7UodPY": "Enterを押してください",
- "YZWk8R4": "コマンド",
- "zkM-vYk": "ラベル",
- "ndVygIU": "追加",
- "GSrBito": "その他のキー — Tab、矢印、F1 ~ F12…",
- "QlB11DI": "鍵",
- "9jQVv-8": "修飾子",
- "w7YJ0Kw": "ショートカット キーの表示、非表示、または並べ替え",
- "BFsLjpc": "ショートカットの管理",
- "I-Rlhvc": "カスタム テキスト コマンドを送信する",
- "fNBP1Us": "テキストマクロ",
- "Y7zDQOM": "Ctrl、Alt、Shift キー コードを作成する",
- "Lr_GVFQ": "ショートカットコンボ",
- "v1Nn-IY": "戻る",
- "WwKbTEk": "関数",
- "ClgDZUM": "ナビゲーション",
- "1RunS2Y": "編集",
- "Dl9mAnI": "シフト",
- "Mz-qIO4": "代替",
- "OZLCEBo": "Ctrl",
- "uGHhnC0": "下に移動",
- "ee4D14o": "上に移動",
- "T-H1CUQ": "上に移動および下に移動操作を使用して、ドラッグせずに順序を変更します。",
- "-lwE4Q0": "ドラッグして並べ替えます",
- "qvnQ47I": "ホストの互換性を確認する",
- "oJ3sUM4": "ダウンロード",
- "N18umz0": "使用",
- "ri8swSc": "使用中",
- "qf7IWvA": "デスクトップにセットアップする",
- "D90AZhs": "APIキーセット",
- "PG_Pfbo": "· 抽出中…",
- "bh_QQps": "OpenAI API",
- "TJd8_nE": "推奨",
- "6WwF0_8": "ディクテーションが有効になっています",
- "D5YFHLU": "モデルをダウンロードし、デスクトップでディクテーションを有効にします。すべてここから行います。",
- "13hFHO4": "音声ディクテーションを設定する",
- "kocNlo8": "更新できませんでした",
- "jX7Yn3E": "モデルを選択できませんでした",
- "0rsS1Dw": "Download failed",
- "lUsptPY": "ロードに失敗しました",
- "GWwDGTE": "再試行",
- "RF7UWwo": "レビューの読み込みを再試行してください",
- "W6MLNo0": "モバイル プレビュー用に差分が切り詰められています。",
- "e6R_IPM": "差分を読み込み中...",
- "Ku2wK-g": "別のレビュー フィルターを試す。",
- "3-RMeIo": "レビュー可能な変更はありません",
- "e5sIbV0": "レビューを読み込めません",
- "r-dK9lI": "レビューは利用できません",
- "On0H_JY": "レビューを読み込み中...",
- "voLBMwU": "メモを送信する",
- "XNffV5A": "メモを agent に送信する",
- "a1hiCFE": "ステージレビュー",
- "XhmaYgY": "ステージレビューされたファイル",
- "du7kB18": "レビュー完了",
- "ls_e0g8": "保存",
- "-bToH9I": "削除",
- "7BEb-8o": "メモの削除",
- "2lwuEDc": "レビューメモ",
- "cy6hF-c": "メモをキャンセルする",
- "K4ExXj0": "ファイルメモ",
- "YlMekyY": "{{value0}} 行目",
- "SqSZ_D4": "メモを追加",
- "vX8hCPw": "メモの編集",
- "QyPs23A": "セッションで開く",
- "lDOi4xI": "未レビューとしてマークする",
- "9YSL2XY": "ステージレビューされたファイル",
- "AMn9p6c": "送信済みメモをクリアする",
- "bboDcz4": "未送信のメモを送信する",
- "SGgu3t8": "メモをコピーする",
- "qljZwNc": "新規 Agent セッション",
- "ajcWpiI": "「{{value0}}」への変更を破棄しますか?これを元に戻すことはできません。",
- "1V8B5pc": "ファイルを破棄する",
- "_TCuNKQ": "{{value0}} レビュー済みのステージングされていないファイルはステージング可能",
- "oCVOA0w": "レビュー操作",
- "cq6J0Qk": "{{value0}} レビュー済み、{{value1}}",
- "N0W7j-Y": "ハンク",
- "-v8Njek": "次のハンク",
- "co1PXQY": "前のハンク",
- "PpqbMu4": "古い",
- "6NQSDSg": "ファイルメモを編集する",
- "cV_5zt0": "変更されました",
- "TGeBFA8": "レビュー済み",
- "Tqe6zfQ": "{{value0}}から",
- "OAIsqbU": "{{value0}} は古いです",
- "n5_ZJMM": "次のファイル",
- "gLGElnY": "レビュー済みとしてマークする",
- "gUbQPjk": "レビュー済み",
- "a2xZWo8": "ファイルをレビュー済みとしてマークする",
- "vRhESp0": "注記",
- "e_IyR5Y": "ファイルメモを追加",
- "0CC3Pjk": "前のファイル",
- "lL_q8JA": "破棄",
- "TpLj1K8": "ファイルを破棄する",
- "v58oW_E": "アンステージ",
- "VZPK0FM": "ファイルのステージングを解除する",
- "JiM1DAU": "ステージ",
- "SzcIpKs": "ファイルをステージ",
- "r-agX-k": "全て",
- "qcWQKWI": "{{value0}} レビュー ファイルを表示",
- "LU8BxDQ": "オープンレビュー操作",
- "GAXIVbU": "PR のサイドバーを開く",
- "1lIaLfU": "変更点",
- "Xot6WdE": "戻る",
- "fEoGCmQ": "{{value0}}/{{value1}} をレビューしました",
- "mIZ0_V0": "{{value0}} 行目のメモを編集してください",
- "mCd0V4A": "{{value0}}行にメモを追加",
- "4bPe4Ao": "デスクトップ Orca を更新し、どこからでも接続できるようにサインインします",
- "HdJ9GVY": "Source",
- "BE93iOI": "HTMLソースを表示する",
- "bvUfBWI": "プレビュー",
- "-FhPMsI": "レンダリングされた HTML をプレビューする",
- "ywMqsWY": "[×]",
- "kijMg1M": "{{value0}} その他の列",
- "Jmh-3ik": "{{value0}} 行追加",
- "viizK3M": "再試行",
- "Re9yZkw": "PR の読み込みを再試行します",
- "-ZCN2f0": "PR を読み込んでいます…",
- "O3OecWo": "main",
- "sLMnsJA": "コードブロック",
- "h1ikg-I": "インラインコード",
- "fT3N_UQ": "画像",
- "eLAtZAk": "リンク",
- "dQOT7tM": "引用",
- "jPlQhig": "チェックリスト",
- "_79TK6I": "番号付きリスト",
- "hKyID9A": "箇条書きリスト",
- "wwdkeIc": "取り消し線",
- "zwoUjcU": "イタリック",
- "TcUIfHg": "太字",
- "qpILEoE": "H3",
- "T0-0mLw": "H2",
- "Tkw-XG4": "H1",
- "3Ph2vuM": "体",
- "UIMZetU": "ワークスペース名",
- "ybPEhxk": "新規ワークスペース",
- "VEK8Z7E": "Agent",
- "38lAWJQ": "リポジトリ",
- "ZK7Il8w": "ワークスペースの作成",
- "g5YUeP0": "リポジトリに接続する",
- "obLmzkw": "セットアップコマンドを実行する",
- "sZHa-TU": "スキップ",
- "0qYyICI": "走る",
- "0cbkbTE": "セットアップスクリプト",
- "LMAqKNQ": "注記",
- "ATo76K0": "詳細設定",
- "M2A4pJA": "最初にリポジトリに接続します",
- "O93svfk": "接続",
- "oroOvnM": "接続中...",
- "JNDDz3c": "SSH 接続",
- "EFTSrpI": "ワークスペース名",
- "yymZMiQ": "名前または「作成元」",
- "osrkufA": "リポジトリが見つかりません",
- "sMWTBAA": "リポジトリと agent を選択して、新規ワークスペースを起動します。",
- "C8UjQk0": "セットアップ スクリプトを信頼できませんでした。",
- "jSxyaws": "ワークスペースの作成に失敗しました",
- "rwQDraY": "セットアップ スクリプトを実行するかどうかを選択します。",
- "F1iAV4A": "選択した agent は無効になっています。作成する前に、有効な agent を選択。",
- "kA_OuTE": "ホストに戻る",
- "h3ZwGv0": "オープンな GitHub リリース",
- "oxg5VTs": "アプリストアを開く",
- "Pe9Dmhc": "走らないで",
- "hUSRq7I": "常に信じて走ってください",
- "wOCs5LA": "フックを実行する",
- "m7jxYm8": "セットアップスクリプト",
- "gxXtGpI": "新規セットアップ スクリプト",
- "JU7DVfY": "このリポジトリの orca.yaml は、ワークスペースが開始される前に実行されます。このリポジトリを信頼する場合にのみ実行してください。",
- "SSMlLr8": "{{value0}} からセットアップを実行しますか?",
- "egQ-qgQ": "{{value0}} のセットアップ スクリプトが変更されました",
- "Lkm1Ms4": "名前の由来",
- "CATZTEM": "ブランチ名",
- "MJ_zXUU": "ワークスペース名",
- "jueQw6Q": "名前",
- "Yz166iM": "ブランチ「{{value0}}」を再利用します",
- "qOsqJv0": "名前を入力するか、ソースを検索します",
- "qNPX_ws": "下のフィールドにワークスペース名を入力します。",
- "LbOI-wE": "この SSH repo には、問題と PR をリストするための GitHub リモートが必要です。",
- "2sNZWLI": "リポジトリを検索ソースに接続します。",
- "h8XKauY": "キャンセル",
- "A6zs-7I": "完了",
- "J6XOFqM": "名前または「作成元」",
- "WDddFyg": "このアイテムは {{value0}}/ {{value1}} にあります。",
- "FLDQvbE": "{{value0}} に切り替えます",
- "HHq8Y80": "名前を入力するか、ソースを検索します",
- "eMl2uLM": "[オプション]",
- "zTK803o": "新規ブランチ",
- "dDSXnKk": "ブランチ「{{value0}}」を作成します",
- "Z7csSYQ": "このワークスペースに名前を付けます",
- "uK2T1OQ": "「{{value0}}」を使用してください",
- "CgJBkqk": "キーコンボまたはテキストマクロを作成する",
- "d-64Q0E": "カスタムショートカットを追加…",
- "AwkMohI": "カスタム ショートカットはまだ定義されていません。",
- "EGxWrwk": "カスタムショートカット",
- "_YyvrjM": "すべての組み込みショートカット キーを元の順序で表示します",
- "P0qiUsA": "デフォルトにリセット",
- "Odmd4jg": "キーを切り替えて表示または非表示にし、グリップを押したままキーを terminal のショートカット バー上の希望の順序にドラッグします。",
- "u1ZHouk": "ショートカットバー",
- "NOYO7QE": "キャンセル",
- "8Zue0js": "ダウンロード",
- "jCov6Mc": "削除",
- "EorN5mI": "使用",
- "kg-vs7o": "使用中",
- "j2yOGiA": "デスクトップにセットアップする",
- "JnTRemk": "APIキーセット",
- "B45mQIQ": "推奨",
- "6qylM4Q": "サイドバーからワークスペースを選択して、ここでその terminal を開きます。",
- "qe5Mx6E": "開いているワークスペースがありません",
- "JLc6yd4": "子供たち",
- "ugLQfPg": "子供",
- "lCIVZpI": "子供",
- "uQ24VuE": "フォルダ",
- "CkCg0Xk": "非アクティブな Codex 制限で間違ったプロバイダー ID が使用される",
- "4NLLG4A": "非アクティブな Claude 制限は間違ったプロバイダー ID を使用します",
- "N8kYEP4": "Codex 制限で間違ったプロバイダー ID が使用される",
- "OWfo7Qc": "Claude 制限で間違ったプロバイダー ID が使用される",
- "95Xks08": "WSL Codex アカウントには正確なディストリビューションが必要です",
- "OZiafyo": "ホスト Codex アカウントでは WSL ディストリビューションに名前を付けることができません",
- "ZlNO6fQ": "WSL レート制限ターゲットには正確なディストリビューションが必要です",
- "EIhMdN0": "ホストのレート制限ターゲットは WSL ディストリビューションに名前を付けることができません",
- "zFyydp8": "このアカウントには獲得可能なリセット クレジットがありません。",
- "_-grAdc": "利用可能なリセットはありません",
- "Um-XfOo": "適格な Codex レート制限ウィンドウが使い果たされていません。",
- "JMEauuw": "リセットするものは何もありません",
- "3qHVa1w": "Codex の使用法が更新されました。",
- "9b3h0Pg": "リセットはすでに適用されています",
- "QiJiFeQ": "レート制限のリセット",
- "V9XaZZ8": "ドロワーを閉じる",
- "84CVutM": "ブランク Terminal",
- "5hDxS58": "これにより、{{value0}} の獲得リセットが 1 回消費され、対象となるレート制限ウィンドウがすぐにリセットされます。",
- "EzPa9ek": "レート制限のリセットを使用しますか?",
- "TKIeXbw": "レート制限をリセットできませんでした",
- "rii7ZAs": "ホストが Codex に連絡する前に、アカウントまたはリセット オファーが変更されました。更新された詳細を確認し、再度確認します。{{value0}}",
- "4DQGAog": "リセットの詳細が変更されました",
- "W6bmrY4": "mermaid",
- "kPLcd1A": "リンク PR",
- "UzLJy8Q": "リンク #{{value0}}",
- "5tB7Tdg": "#123 または https://github.com/owner/repo/pull/123",
- "D2wJo3U": "PR 番号または GitHub URL",
- "ZLWuIYo": "キャンセル",
- "f8ZsL9k": "既存の PR をリンクする",
- "T0kbQLc": "{{value0}} を作成する",
- "zouGGt0": "ドラフト {{value0}} を作成する",
- "YpkfCr0": "プッシュして{{value0}}を作成",
- "aUTTsqg": "プッシュしてドラフトを作成 {{value0}}",
- "3Yb2tD4": "下書きとして作成",
- "oPjbjuk": "ベース",
- "UsM_A3E": "タイトルと説明を生成しています…",
- "-QF2aQc": "{{value0}} の説明",
- "-uhp5Eo": "説明 (オプション)",
- "CYW43ss": "{{value0}} タイトル",
- "JnixruY": "タイトル",
- "56ar5ss": "キャンセル",
- "w4jN8ic": "生成",
- "E5u75yA": "生成中…",
- "Tf6JzYM": "PR フィールドの生成に失敗しました",
- "gTT3Qik": "新規 {{value0}}",
- "LINjP1k": "現在のブランチは利用できません。",
- "_svp6us": "このプロバイダーではホストされたレビュー パネルを利用できません。",
- "nO4i6C8": "リンクを解除する",
- "ZqSwRWA": "PR のリンクを解除する",
- "zRLzboM": "再度開く",
- "gL1buuY": "閉じる",
- "2xdqaDc": "PR を再開する",
- "Pz82S8w": "PR を閉じる",
- "Al6-RQA": "オフ",
- "oSg4C5A": "オン",
- "X0q7qvA": "自動マージの切り替え",
- "0J91CIk": "準備ができたら自動マージ",
- "8xiSsiA": "PR をマージする",
- "3XhqaKU": "#{{value0}} は再開されます。",
- "oCXRjL8": "PR を再開しますか?",
- "b_7nPgo": "#{{value0}} は結合せずに閉じられます。",
- "02Qj2V4": "PR を閉じますか?",
- "zNuHY-c": "これにより、#{{value0}} がそのベース ブランチにマージされます。",
- "_0lAHWg": "PR をマージしますか?",
- "uLhV2xU": "PR のリンクを解除できませんでした。",
- "q6iGz3o": "最初の 100 件のジョブを表示しています",
- "HW_qZBo": "最初の 20 個の注釈を表示",
- "x1QqPYg": "注釈",
- "xJbH0vA": "詳細はありません。",
- "WPX7hnI": "ウェブ上で{{value0}}を開く",
- "wKKGPQ8": "{{value0}} 詳細を確認する",
- "QiC7wz8": "修正",
- "O95nvcA": "失敗したチェックを AI で修正する",
- "t67jzCk": "詳細を検査するか、AI 修正パスを開始します。",
- "TkRK-a4": "失敗したチェックを再実行する",
- "hyZyn8M": "チェック",
- "XfucVi0": "{{value0}} チェックに失敗しました{{value1}}",
- "W8A4HvA": "これにより、GitHub 上のコメントが完全に削除されます。",
- "xGeFr98": "コメントを削除しますか?",
- "p4p6sek": "返信を書いてください…",
- "7oybC2M": "解決",
- "A6XXe-4": "未解決",
- "2PITe20": "スレッドを解決する",
- "mkEkYMY": "未解決のスレッド",
- "4idOoK8": "削除",
- "u9hUgiY": "コメントの削除",
- "wS1VT0I": "編集",
- "Fs36PXM": "コメントの編集",
- "Ragn9hY": "返事",
- "s3o5DeE": "コメントに返信",
- "Bnwan2Q": "コメントを編集…",
- "FKCKtAo": "GitHub でコメントを開く",
- "C_gXfCo": "解決済み",
- "EXMnl_4": "キャンセル",
- "2Mrfqx0": "コメントを追加…",
- "xX8eZhc": "コメントはまだありません。",
- "FVdefgc": "コメントを読み込めませんでした。再試行するには、「更新」をタップします。",
- "_l0TaO0": "コメント",
- "vdfQtbs": "説明はありません。",
- "hO2eecI": "説明を読み込めませんでした。再試行するには、「更新」をタップします。",
- "6VkqcQk": "説明",
- "vV46Tns": "全 {{value1}} 件中、さらに {{value0}} 件を表示",
- "cHoCGwY": "さらに {{value0}} 件を表示",
- "wAwFDJY": "{{value0}} を {{value1}} {{value2}} によって解決しました",
- "zrerXGc": "AI で競合を解決する",
- "w2WcFns": "競合するファイル",
- "KuLUlYc": "Copy commands",
- "7E56l1g": "コピーされました",
- "6TXtA4Q": "Copy mergeability refresh commands",
- "39Nl8mw": "Run from this worktree",
- "7Qv5eYo": "このブランチには解決する必要のある競合があります",
- "93sCYQo": "{{value0}} コミット遅れ (ベースコミット:",
- "ngn4NjA": "{{value0}} コミット遅れ (ベースコミット:",
- "mTbAh0Q": "commit",
- "DnSMHG0": "競合",
- "8Est-xI": "{{value0}} を削除",
- "jBToX-I": "レビュアーは要求されていません",
- "T5Uc4Ao": "レビュアーを読み込めませんでした。再試行するには、「更新」をタップします。",
- "Ryr3DCQ": "レビュアーを読み込み中…",
- "fX2uAEU": "レビュアー",
- "E5rQqRQ": "レビュアーを追加または削除する",
- "E2VHius": "PR のタイトルを編集する",
- "oBmCrB8": "保存",
- "xOwofss": "タイトルの保存",
- "UgBLL4w": "キャンセル",
- "D-7jM08": "タイトル編集をキャンセル",
- "nbfmLgg": "ウェブ上で PR #{{value0}} を開く",
- "eNX9Nmo": "既存の PR をリンクする",
- "_mT5R7M": "既存の PR をリンクする",
- "SRr0o4U": "現在のブランチはオープン PR にリンクされていません。",
- "CmpszXU": "{{value0}} はオープン PR にリンクされていません。",
- "maf-eds": "更新して再度確認するか、このブランチの新規 PR を作成します。",
- "G2BaE-Y": "オープンな PR はありません",
- "I3xSuPA": "リンクされた PR #{{value0}} は使用できません",
- "5kE-iVM": "PR を作成",
- "Y_NnJ9M": "PR を作成する",
- "YZFe3Qg": "PR を更新する",
- "TSDVcKU": "PR",
- "tca0V2E": "PR の作成に失敗しました。",
- "EMFMGnw": "PR を作成する前にブランチをチェックアウトします。",
- "6OYLM7w": "一致する人がいません",
- "Ne-d-yA": "人を検索する",
- "K34xo24": "レビュアー",
- "dVs-M9I": "人物の読み込みに失敗しました",
- "_IeDTL8": "レビュー済み",
- "NEg29tM": "保留中",
- "dmAcep8": "閉じるされた",
- "bF0aphw": "コメント付き",
- "rjj84-Y": "変更要求",
- "IloG18k": "承認された",
- "hCKjn9A": "チェックなし",
- "_RfDeuw": "ボット",
- "4fGywsA": "人間",
- "rkpE-Mg": "全て",
- "u8NH0Xk": "ESC",
- "rfYWlSA": "テキストをブラウザに送信する",
- "g3GvsOs": "ページに入力…",
- "48esWoc": "わかりました",
- "RXEfHVA": "キャンセル",
- "z1nkBLw": "ブラウザダイアログ",
- "-00MlTU": "URL",
- "GVCAd00": "リロード",
- "-YMBg9U": "進む",
- "a_PEZW8": "戻る",
- "5dQ6Hbc": "有効な URL を入力。",
- "ZoS2fOc": "ブラウザのストリームがタイムアウトしました。",
- "YmwDAcU": "ブラウザ ページはまだ利用できません。",
- "lBu6FGw": "デスクトップブラウザのストリーミングサポートを確認しています。",
- "X2WJPN4": "モバイルでブラウザ タブをストリーミングできるようにデスクトップ Orca を更新します。",
- "gZUBadw": "{{value0}} クリック修飾子",
- "GTbLYFM": "シフト",
- "fP87QIY": "代替",
- "EqW8StQ": "Ctrl",
- "IW8xp4k": "コマンド",
- "lV607bI": "{{value0}} Web サイトビューを表示",
- "eJJUzYE": "モバイル",
- "3TuUR-s": "ウェブ",
- "p7fz5tw": "agent セッションを再開する",
- "f1-v-HM": "current worktree",
- "tL7Cy3c": "メッセージ",
- "fZXkGhQ": "メッセージ",
- "L_8qprI": "この範囲には過去の agent セッションはありません。",
- "X8748Hs": "検索に一致するセッションはありません。",
- "KkgSO8k": "agent セッションなし",
- "Uc72mxE": "セッション、repo:、パス: を検索します。",
- "7OL03t8": "再試行",
- "IFh38kk": "ロードできません",
- "D1lHtt4": "agent セッション履歴を参照するには、このホスト上の Orca を更新します。",
- "yRlsHYk": "Agent セッション履歴は利用できません",
- "Qvd5WD0": "agent セッションを更新する",
- "z2KOXZE": "Agent セッション履歴",
- "bGNaHw8": "戻る",
- "HsI5rsc": "セッションの再開に失敗しました。",
- "sibM7yE": "Agent セッションがキューに入れられました。",
- "ADvyKkM": "ホスト プラットフォームを特定できません。",
- "8fvhHmw": "このセッションには再開 ID がありません。",
- "BLr07Ao": "ホストを待っています...",
- "rcPfxtE": "全て",
- "dhgeP_o": "プロジェクト",
- "0k6Zchk": "ワークスペース",
- "E5PTzrk": "{{value0}} {{value1}} はスキップされました",
- "nSh69OQ": "ホストを待っています…",
- "Au06U2c": "Agent セッション履歴",
- "XjyxBLA": "ソース管理",
- "pBOdX2k": "@orca_build",
- "qfIlnqY": "stablyai/orca",
- "1sjQKuE": "onOrca.dev",
- "wRf8z4A": "100x ビルダー向けのオープンソース agent IDE",
- "o1zkACA": "Orca",
- "qBqOdtg": "について",
- "wdyLCXU": "terminal リンクを開く",
- "K6VU-6c": "terminal 出力でタップされた HTTP(S) リンクが開く場所を選択します。",
- "gh7VaTc": "リンク",
- "GJwMNak": "ブラウザ",
- "Wj6QRnE": "このスマートフォンの Safari、Chrome、または別のブラウザで開きます。",
- "hIo6XgE": "電話ブラウザ",
- "Z49nZqQ": "ペアリングされたデスクトップからストリーミング ブラウザーで開きます。",
- "OcnHGtE": "デスクトップ上の Orca ブラウザ",
- "POUjxlM": "ペアリングされたホストがありません。",
- "FX9lUwo": "このセッションではまだ接続イベントがありません。アプリがこのホストにダイヤルすると、イベントが表示されます。",
- "GiZXYb8": "コピー診断",
- "DYy9eRs": "コピーされました",
- "mu5iayg": "· {{value0}}を試みます",
- "x43FzPs": "接続ログ",
- "rqAbU9s": "つながっています",
- "bKwbnYs": "コードをスキャンします",
- "N1Ra8Og": "Orca デスクトップを開く",
- "o8-uNXo": "「{{value0}}」を削除しますか?後で再ペアリングできます。",
- "yOJT3HY": "ホストの削除",
- "t1m0jcA": "削除",
- "dqjXxV8": "ホストの編集",
- "RwT781U": "切断",
- "JnIDr0Y": "7日",
- "_KqkyAU": "5時間",
- "VXpHvL4": "アカウントの使用状況",
- "8CNCPA8": "新規ワークスペース",
- "lWqrsbM": "デスクトップのペアリング",
- "1St5QBU": "クイック操作",
- "y7w0hIs": "タスク",
- "ROZQW2U": "再開する",
- "81Qrbno": "デスクトップ",
- "TPknwrs": "作成された PR",
- "4uJ9yUY": "Agent 時間",
- "qFFbXcQ": "Agents が生成されました",
- "9i5ZhFo": "おかえり",
- "9HldFAc": "仕組み",
- "QT_H7rk": "コンピュータ上で Orca とペアリングすると、agents の状態を確認し、任意の terminal にアクセスして、スマートフォンから作業を進めることができます。",
- "8vieqXE": "デスクトップを接続する",
- "VjaDNq0": "Orca",
- "GLgoz1s": "もう一度試す。",
- "U7WlIpo": "ホストを削除できませんでした",
- "tNj4XnM": "{{value0}} タスクを開く",
- "1_sz9cs": "タスクソースが接続されていません",
- "aOm3VN4": "オンボーディングの進捗状況",
- "mB8kw4M": "Orca",
- "6vGSxlM": "Notification settings could not be updated.再試行。",
- "Dl9ttFI": "Your choice could not be saved.再試行。",
- "LutlQWg": "チャット UI でセッションを開く",
- "p0ydSMw": "オフ",
- "OXcAS68": "オン",
- "sW_6PG4": "サポートされている agents セッション (Claude、Codex、その他のチャット対応 agents) をこのデバイスで開く方法を選択します。Terminal には生の CLI が表示されます。チャット UI は、デスクトップ アプリのようなチャット インターフェイスを表示します。長押しメニューから個々のセッションを切り替えることもできます。",
- "R7mksio": "デフォルトビュー",
- "ao09T48": "Chat UI",
- "yTJLwao": "戻る",
- "x7lqDGA": "設定を開く",
- "aXWuT8I": "Agent の通知",
- "GIjQvDw": "通知",
- "sKiKFEI": "家に戻る",
- "zDZEMlw": "接続中…",
- "gZ1SfD8": "キャンセル",
- "V-NORJA": "ペア",
- "3LfZ8xU": "デスクトップからペアリング リンクを開いた。ホストに追加することを確認します。",
- "ymuJ-Uc": "このデスクトップとペアリングしますか?",
- "AHFOidY": "ペアリングに失敗しました: {{value0}}",
- "uZiEDJ8": "{{value0}}s 以内に接続できませんでした — 停止した場所については以下のログを参照してください",
- "-jAAi0E": "orca://pair?code=... or paste the code",
- "G-MJBZU": "QR の下に表示されているコードをコンピューターにコピーします。",
- "klFU7hQ": "ペアリングコードを貼り付けます",
- "Q_qrUNw": "代わりにコードを貼り付けてください",
- "_C6l3j4": "再試行",
- "T3HZLEU": "接続中…",
- "U_fkYz4": "またはペアリングコードを貼り付けてください",
- "dTFolus": "QRコードをスキャンしてください",
- "mPdpsdo": "「設定」→「モバイル」に移動します",
- "dFxLHEw": "コンピューターで Orca を開きます",
- "wvDgXHk": "設定を開く",
- "Scz67W0": "続ける",
- "b6n4c_8": "[設定] でカメラへのアクセスを有効にするか、代わりにペアリング コードを貼り付けます。",
- "InfekMg": "デスクトップ上の Orca から QR コードをスキャンするか、代わりにペアリング コードを貼り付けます。",
- "sBkGoYA": "カメラアクセスが無効です",
- "0VOtRkg": "デスクトップとペアリングする",
- "HVl7cpc": "ペアリングに失敗しました: {{value0}}",
- "zyTFKp4": "{{value0}}s 以内に接続できませんでした — 停止した場所については以下のログを参照してください",
- "feaDGg4": "有効なペアリング コードではありません - コンピュータからコピーして、もう一度貼り付けてください",
- "iHaWj50": "有効な Orca QR コードではありません",
- "AIhB-fM": "家に戻る",
- "eQE_ziw": "ペアリングコードがありません",
- "cFPanOU": "サポート",
- "7jufUfc": "プライバシーポリシー",
- "EJmGYjM": "再試行",
- "ks7el1o": "ペアリング認証情報のクリアを再試行してください",
- "kiQMppk": "このデバイスのクリーンアップ ステータスを確認できませんでした。安全のために再試行してください。",
- "Wh-JD8U": "このデバイス上の {{value0}} 認証情報{{value1}} のクリーンアップを確認できませんでした。",
- "K-uhruk": "まだクリーンアップは確認できませんでした。後でもう一度試す。",
- "BFrWnfA": "ペアリング資格情報のクリーンアップ",
- "EELdtVU": "について",
- "0aipMZQ": "トラブルシューティング",
- "i8QR0SY": "通知",
- "rm30Zkg": "音声",
- "ttAM7Ds": "ブラウザ",
- "-aB74WM": "Chat UI",
- "QlyWJyY": "Terminal",
- "0cOgjik": "設定",
- "lfAeAOI": "Terminal の文字サイズ",
- "nN25Xmo": "{{value0}} を復元",
- "rE4IiF8": "オフ",
- "qR5mpHo": "オン",
- "AsTLd6A": "オートコンプリートとオートコレクト",
- "mK_kCfI": "terminal のコマンド バーで電話形式のオートコンプリート、自動修正、スペルの提案を有効にします。デフォルトではオフになっているため、キーボードはコマンド、フラグ、またはパスを書き換えません。直接キーボード入力 (キーが terminal に直接入力される場合) は常に生のキーストロークを送信するため、提案は適用されません。",
- "18J3yr0": "キーボード入力",
- "QcL6LT4": "文字サイズ",
- "nzfG92c": "ターミナルのテキストを拡大縮小します。サイズが小さいほど、サイドマージンのある列がより多く収まります。サイズが大きいほど、表示される列が少なくなります。横にドラッグしてパンします。terminal 自体をピンチしてズームインすることもでき、これによりこの設定が更新されます。デバイスごとの表示のみ。デスクトップターミナルは変わりません。",
- "OS-rNTI": "文字サイズ",
- "U2mtyZg": "ペアリングされたデスクトップはまだありません。 1 つをペアにして terminal の動作を制御します。",
- "-fV3Ce8": "スマートフォンで terminals を使用している間、Orca は terminals を画面に合わせて縮小します。アプリを閉じるか別のアプリに切り替えるときに、アプリをスマートフォンサイズのままにするか (インタラクティブ CLI ツールがリフローしないように)、サイズを変更してデスクトップに戻るかを制御します。バナー上の [この terminals を復元] または [すべての terminals を復元] を使用していつでも手動でサイズを変更できます。",
- "f9vgUHc": "アプリを終了するとき",
- "kJj5Z2g": "Terminal",
- "rU9qdt0": "30分後",
- "p2EWmRg": "5分後",
- "gBGOsCI": "1分後",
- "q6VQcZE": "スマートフォンサイズを維持(デフォルト)",
- "75Kr_24": "最大 (200%)",
- "tAn81tY": "大きい (150%)",
- "HqP6IBw": "大(125%)",
- "0OKOsKY": "デフォルト (100%)",
- "CAs8oUM": "小さい (75%)",
- "hiouM1M": "最小 (50%)",
- "2J8vm70": "よくある問題",
- "bwJLtK4": "接続ログの表示",
- "5xQU6vw": "診断を実行する",
- "B5C2aso": "もう一度実行します",
- "dQs8-jc": "実行中…",
- "DIEmGuM": "トラブルシューティング",
- "8sOFcoA": "プラットフォーム",
- "Ie918PM": "ホスト",
- "3gA9qeo": "インターネット",
- "_IfUZ2s": "ペアリングされたホスト",
- "C-t7pm8": "音声モデル",
- "n-BJK-c": "音声モデル",
- "uwVWBGE": "トグル: 1 回押すと開始し、もう一度押すと停止します。ホールド: 押したままディクテーションします。",
- "Jh4zuEU": "ディクテーションモード",
- "4g1gMYA": "デスクトップ上のフォーカスされたペインにテキストを口述入力します。",
- "23v3WVE": "音声ディクテーションを有効にする",
- "L4c5Sxw": "ディクテーション",
- "pJrwjt0": "デスクトップに接続して音声設定を管理します。",
- "pSmQbNo": "音声",
- "Wgx1aTY": "削除に失敗しました",
- "O-GK4L4": "Download failed",
- "cpL32fY": "モデルを選択できませんでした",
- "PiXz3AQ": "更新できませんでした",
- "wFKD2Es": "音声設定の読み込みに失敗しました",
- "hYUl_w0": "ホールド",
- "yxHp0Uc": "トグル",
- "fO2nz88": "PR",
- "AcEIxcI": "変更点",
- "atubgYk": "Agent セッション履歴",
- "MZqxT8s": "ソース管理",
- "wtxV_i4": "Terminal",
- "YTfV9-o": "タスク",
- "KVY3pfk": "アカウント",
- "0zcPPW8": "ホストの編集",
- "esqB5TM": "ホスト",
- "lXRU_hQ": "デスクトップの [設定] → [アカウント] からアカウントを追加または再認証します。",
- "z0N4v1Y": "アカウントを読み込み中…",
- "XheJ_p8": "アカウント",
- "08ocQGs": "7日",
- "YmnN8fw": "5時間",
- "rjJXJpg": "agent 独自のログインを使用する",
- "uuo9M60": "システムのデフォルト",
- "5TVCgEg": "アカウントを切り替えられませんでした",
- "nnr0WpI": "ホストが見つかりません",
- "Cop_m2o": "ホストからの無効なアカウントのスナップショット",
- "sqHaM-Q": "{{value0}} に接続中…",
- "dYplni8": "IP、host:port、または ws:// / wss:// を受け入れます。ポートが見つからない場合は、デフォルトで現在のポート (または 6768) が使用されます。",
- "kMmtf5E": "アドレス",
- "jHccG1s": "ホスト名",
- "wLjwLQg": "名前",
- "KytWtss": "表示名または接続アドレスを変更します。アドレス編集では、この電話の接続先が切り替わるだけであり、再ペアリングはされません。これは、同じデスクトップが異なる IP で到達可能な場合 (たとえば、家庭 LAN と Tailscale) に使用します。",
- "LS3NecQ": "戻る",
- "OOhGw28": "保存",
- "ugYhCr4": "ホストの保存",
- "NKISHlY": "ホストの編集",
- "K8w9o8U": "戻る",
- "sI26LXo": "ホストの保存に失敗しました。",
- "7UECNUc": "名前を入力します。",
- "koyS6Oc": "ホストのロードに失敗しました。",
- "T_ULLfI": "このホストはこの電話から削除されました。",
- "yLNjPPk": "ホストが見つかりません。",
- "eB5hKE4": "{{value0}} に接続します",
- "HbMqJ5k": "「{{value0}}」を削除しますか?後で再ペアリングできます。",
- "tndsmJE": "ホストの削除",
- "PCaw7X8": "削除",
- "7b05QJE": "寝る",
- "jQgIadE": "キャンセル",
- "sCHpXNI": "ワークツリーを削除",
- "aCNuYPE": "リポジトリ",
- "MFWDh4g": "デフォルトのブランチを非表示にする",
- "1w-t3vQ": "スリープ中を非表示",
- "bd8B2ME": "ワークスペース",
- "5IYckMg": "フィルターをクリアする",
- "S8jJ9v4": "フィルター",
- "fVWdjBk": "グループ化",
- "hFsVshM": "並べ替え",
- "sUx-id0": "PR",
- "CzGUIP8": "Repo",
- "GAUYfWk": "状態",
- "mZ5NlSU": "Group",
- "LgVSSVY": "ワークスペースの検索",
- "AYkrJs8": "検索を閉じる",
- "LIEbwVI": "新規ワークスペース",
- "qs3IfgE": "フローティングワークスペース",
- "V5DOCOQ": "タスク",
- "CVlu0tE": "アカウント",
- "KYYIQO4": "グループワークスペース",
- "jZR1hFw": "{{value0}} で並べ替え",
- "kz_Kdkw": "ワークスペースをフィルター",
- "6oNXq-k": "ワークスペースをフィルター、1 件の有効なフィルター",
- "DxBfvEc": "ワークスペースをフィルター、{{value0}} 件の有効なフィルター",
- "Iq0v42M": "サイドバーを隠す",
- "2FFC6Og": "再接続",
- "IDkp2AI": "ホストに戻る",
- "QHBQ8yI": "もう一度試す。",
- "P_OTj14": "ホストを削除できませんでした",
- "2FRJWFs": "ホストが見つかりません",
- "2hirWvg": "フィルター{{value0}}",
- "asTmnrM": "「{{value0}}」({{value1}}) を削除しますか?",
- "ZhTpuGQ": "アイテムの更新",
- "sSNY3pg": "PR をマージ",
- "cR4zEEM": "MR",
- "l77C_aI": "この PR をマージする方法を選択します。",
- "AxbwZZ0": "この MR をどのようにマージするかを選択します。",
- "ax5V10c": "マージ方法",
- "ZDweAzI": "ステータス変更",
- "Fc7HS-c": "マージ MR",
- "QnAsBMo": "GitHub はマージ競合を報告しています。",
- "MPMGVuk": "PR をマージする",
- "vW7-nd4": "GitHub リンクをコピーする",
- "xD9cVOU": "コピーされました",
- "tS4SSLM": "リニアリンクをコピー",
- "14O3-ys": "ワークスペースの作成",
- "ftImAuc": "作成...",
- "D7U7kB4": "コメントはありません。",
- "AXmMT_g": "議論",
- "z1ts1Vw": "サブ Issue を追加する",
- "G6AAKyI": "サブ Issue のタイトル",
- "czxJ7iQ": "オープン",
- "8MKn4Lk": "サブ Issue はありません。",
- "yIapPk8": "サブ Issue",
- "-uupizo": "この MR ではパイプラインは実行されません。",
- "pzBhZI4": "なし",
- "re5Bmac": "{{value0}} の求人",
- "iaudYyQ": "パイプライン",
- "XLoI3kU": "ファイルの内容は利用できません。",
- "jh3_4KI": "バイナリファイル。",
- "DtNbEWc": "閲覧済みとしてマークする",
- "11IaYcI": "未視聴としてマークする",
- "PYs8iJY": "表示",
- "_Qr_OQY": "隠れる",
- "WhM0uCg": "変更済みファイル",
- "Ct4OwyY": "チェックが見つかりませんでした。",
- "Hhu9oHM": "すべて再実行",
- "jphAkJQ": "再実行に失敗しました",
- "ruk6BoQ": "更新",
- "XlbT3Zg": "チェック",
- "KoPjVCY": "レビューのリクエスト",
- "WTd49qc": "リクエストレビュアー",
- "k2ppyKs": "レビュアーの提案が見つかりませんでした。",
- "Re-pmxo": "レビュアーを読み込み中...",
- "ifA4snA": "レビュアーはリクエストされていません。",
- "hDVISbQ": "レビュアー",
- "FQRH8fY": "担当者を更新する",
- "X_A_K1Q": "ユーザー名をカンマ区切りで削除します",
- "K9otrEQ": "ユーザー名をカンマ区切りで追加します",
- "--H0boQ": "このリポジトリに割り当て可能なユーザーが見つかりません。",
- "gX4WIW4": "担当者をロード中...",
- "oL0nsd4": "担当者",
- "K9OxCfg": "ラベルを更新する",
- "gyu0Q6w": "ラベルをカンマ区切りで削除します",
- "ByJ_aqM": "ラベルをカンマ区切りで追加します",
- "ySDu5JQ": "このリポジトリにはラベルがありません。",
- "vYfgNJ8": "ラベルを読み込んでいます...",
- "GhHLbBA": "ラベル",
- "OOzqk6Q": "タイトルの保存",
- "6b2exyc": "タイトル",
- "bmXEQhk": "説明を保存する",
- "xX2Cp7c": "説明",
- "iM5LG78": "プロジェクト",
- "b3RSkG0": "担当者",
- "Fa6K7yI": "状態",
- "o2-QUvU": "タイプ",
- "mDTZEr4": "詳細を更新",
- "bS5_420": "Merge には Orca にこのリポジトリが必要です。",
- "9bffkjg": "項目を閉じる",
- "vegmy2w": "アイテムを再度開く",
- "jKf3DPI": "GitHub で開く",
- "fngWtc4": "ワークスペースは、GitHub の Issue と PR からのみ作成できます。",
- "MVHK0qg": "削除",
- "BhSglbo": "編集",
- "2MyR_iQ": "返事",
- "Rjjl1iA": "スレッドを解決する",
- "qEc1OYo": "スレッドを再開する",
- "Fv7ly30": "キャンセル",
- "xxWLKS8": "保存",
- "loMCIgM": "コメントの編集",
- "z1fMPAI": "表示",
- "Uv1hPbA": "コメント {{value0}} 件",
- "GKSPk20": "フィールドをクリアする",
- "akD0kZQ": "フィールドを保存",
- "5gzka0E": "テキスト",
- "1jNZjFQ": "番号",
- "KulyzJY": "YYYY-MM-DD",
- "CXQp8Pw": "利用可能な反復はありません。",
- "6tQv41I": "日付を YYYY-MM-DD として入力します。",
- "DqtxPEI": "有効な番号を入力。",
- "JV1Xsds": "プロジェクトフィールド",
- "3p4QMPc": "クリアタイプ",
- "5DEGuK4": "このリポジトリに設定された Issue タイプはありません。",
- "w23rmTc": "Issue の種類を読み込んでいます...",
- "1YuDgI8": "Issue の種類",
- "NnYhRJs": "プロジェクトアイテム",
- "jGZods8": "ドラフト問題",
- "xcg6mvE": "Issue",
- "Bawm-QY": "PR",
- "eGT8LNM": "リポジトリのコピー",
- "p3aCd2Y": "Orca に Repos がありません",
- "eNyNmbU": "走らないで",
- "llz-FzM": "常に信じて走ってください",
- "520CKU4": "セットアップ スクリプトを信頼できませんでした。",
- "m-fVevQ": "フックを実行する",
- "XPutx64": "セットアップスクリプト",
- "vtdIQWU": "新規セットアップ スクリプト",
- "Q3oUbk4": "このリポジトリの orca.yaml は、ワークスペースが開始される前にマシン上で実行されます。このリポジトリを信頼する場合にのみ実行してください。",
- "M_Pqsow": "{{value0}} からセットアップを実行しますか?",
- "QetdCKc": "{{value0}} のセットアップ スクリプトが変更されました",
- "xd1VuYs": "セットアップをスキップして作成する",
- "b0Ah5tg": "セットアップを実行して作成する",
- "N0pQdfg": "セットアップ スクリプトを実行しますか?",
- "g2mP3mE": "src/レンダラーパッケージ/ui",
- "chkWwSI": "ディレクトリ",
- "oh8k9MM": "レンダラUI",
- "7dCN6Lk": "名前",
- "al2hOTo": "スパースプリセットの編集",
- "m6fKanI": "新規スパースプリセット",
- "6-gKCU8": "新規プリセット",
- "m38OFiM": "リポジトリ全体を使用する",
- "0fqNjoo": "フルチェックアウト",
- "6xj6dHo": "スパースチェックアウト",
- "uwfc5JU": "一致するブランチはありません。",
- "ajFYYlY": "このリポジトリの構成済みベースを使用する",
- "tJhJMIQ": "デフォルトのブランチ",
- "ww9236A": "ブランチを検索",
- "O0AHKnE": "既存のブランチまたは参照を選択します。",
- "vqofDcI": "開始日",
- "wD7tyKU": "Agent",
- "RBS8OI4": "リポジトリ",
- "SWOSFtY": "リポジトリに接続する",
- "phVPn2Q": "agents を検出中...",
- "4F__ZBY": "リポジトリが見つかりません。",
- "6kKiG2U": "Linear ワークスペースを作成する前に、Git リポジトリを追加します。",
- "naggWL4": "から開始",
- "8PDq1d4": "詳細設定",
- "SRP0mzk": "最初にリポジトリに接続します",
- "5URSVzY": "[オプション]",
- "nr-rmnA": "ワークスペース名",
- "eDrVQno": "接続",
- "HIci8AI": "接続中...",
- "hcl0Sms": "SSH 接続",
- "UHWW7sY": "ワークスペースの作成場所",
- "8aaa0oM": "キーはホスト OS キーチェーンを介して暗号化され、ローカルに保存されます。",
- "KV_5X9g": "リニア設定 / セキュリティ / 新規 API キー",
- "CCoHJhM": "lin_api_...",
- "a4vIye8": "個人用APIキー",
- "6EAEvD4": "Personal API キーを貼り付けて、そのワークスペースから問題を参照します。",
- "jbMHil8": "リニアワークスペースを接続する",
- "Xg1P3sw": "リニアチーム",
- "wSJtlQc": "Issue の作成",
- "cnRpEac": "コンテキストを追加する",
- "dxkQ090": "タスクのタイトル",
- "GbFyuJM": "オリジン",
- "CF9OlC4": "上流",
- "3U3WMlI": "Issue ソース",
- "czBdX7w": "チーム",
- "ZXVz3A4": "選択した Linear チームで Issue を作成します。",
- "V9yDSos": "選択したリポジトリに Issue を作成します。",
- "QoLelVI": "タスクの並べ替え",
- "Jhimi1k": "表示プロパティ",
- "skslBcE": "順序 Linear Issue",
- "4wjHjFU": "グループの Linear Issue",
- "59_okJI": "リニアビュー",
- "GpSeJMA": "利用可能な州がありません",
- "_mQhK7g": "状態を読み込み中...",
- "xw1L5lQ": "ステータスの変更",
- "dEIGNBo": "全チーム",
- "UL55j-A": "タスクに表示するチームを選択します。",
- "ZnNVwOs": "リニアチーム",
- "nLSftbc": "ワークスペースの切り替えに失敗しました",
- "3Nokros": "リニアワークスペース",
- "jnRj_2I": "Linear フィルター",
- "k98CNAU": "GitLab フィルター",
- "roI3I5g": "GitLab ビュー",
- "EQxa0Qk": "カードから隠されている",
- "p0Rtsu4": "カードに表示される",
- "nOtNSyE": "このビューには表示する追加のフィールドはありません。",
- "3YhoII8": "アイテム カードに表示するプロジェクト フィールドを選択します。",
- "kqKUAww": "プロジェクトフィールド",
- "TcKUEto": "プロジェクトの並べ替え",
- "pTwUfTs": "Orca はこの GitHub プロジェクト レイアウトをまだサポートしていません。",
- "E_vNSwU": "プロジェクトビュー",
- "4KsU0uw": "プロジェクトビューの選択",
- "RzP96Tg": "これ以上のプロジェクトはありません。",
- "HH8i3aE": "一致するプロジェクトはありません。",
- "yJYA52k": "すべて閲覧する",
- "2BAkBs4": "すべて参照 (読み込み中...)",
- "70mLMDk": "ピン",
- "d2YMdrw": "最近の",
- "6WVhiZM": "削除",
- "Rn74bFA": "固定された",
- "0Dc-Ym0": "タップして再試行します。",
- "dbO6elU": "プロジェクトがロードされていません",
- "wpUutIo": "プロジェクトのロードに失敗しました",
- "9srv5vA": "URL による追加を使用して、不足しているプロジェクトにアクセスします。",
- "x8yvGR0": "一部の組織は読み込まれませんでした ({{value0}})。",
- "rTimB6Y": "{{value0}} からプロジェクトをロードできませんでした。",
- "25-g19E": "追加",
- "i7LVjnE": "追加中...",
- "Qyb0AbI": "URL または所有者/番号で追加",
- "gBglOLc": "プロジェクトを検索する",
- "6e87BT8": "[タスク] ページのプロジェクト ビューを選択します。",
- "4pG_Id0": "GitHub プロジェクト",
- "5kq0ekc": "古い結果をロードします",
- "cR6luW0": "ロード済み",
- "K80V7xk": "ロードされた、または利用可能な結果ページにジャンプします。",
- "Zpsg1Hk": "GitHub ページ",
- "41d4YcM": "Issue",
- "sQ-iS-M": "PR",
- "LkEKGa8": "GitHub ビュー",
- "a5ldOMU": "利用できる代替の Issue ソースはありません。",
- "LGWybvE": "各リポジトリがアップストリームまたはオリジンのどちらからクエリを実行して作業を作成するかを選択します。",
- "aqrdcoU": "GitHub Issue ソース",
- "FohFTKc": "すべてのリポジトリ",
- "ec9l6fo": "クエリを実行するリポジトリを選択します。",
- "pMWEK5w": "リポジトリ",
- "JAnflBU": "タスクソース",
- "7L6hVV8": "次のページ",
- "7aV6RlU": "ページ{{value0}}",
- "mDUXZ5M": "ページを選択、ページ {{value0}}",
- "eLSyiVk": "前のページへ",
- "SlWRC8A": "ステータスを{{value0}}から変更します",
- "XHZQUAc": "プロジェクトアイテムがありません",
- "F7DoZNU": "プロジェクトを参照",
- "UqRLwDk": "GitHub プロジェクトを選択",
- "IQp4SP8": "リニア接続",
- "42DYBxM": "タスクから直接、割り当てられたリニアの問題を参照して作業を開始します。",
- "L9oPTag": "Linear アカウントを接続する",
- "J73iv2w": "このモバイル タスク ビューには、新規デスクトップ ランタイムが必要です。",
- "iUDJtXI": "Orca デスクトップを更新する",
- "KQkXL08": "トークンではサブ Issue データを利用できません。",
- "yF0bGcQ": "再試行",
- "aCzhUtY": "再試行中...",
- "QU-Uflw": "{{value0}}/{{value1}} からの問題の読み込みを再試行します",
- "91ACsJY": "からの Issue を読み込めませんでした",
- "7WH7i2M": "{{value0}} タスクを検索...",
- "RzsrKAc": "プロジェクト ビューを検索...",
- "niMSGwc": "画面",
- "_TeSdI8": "タスク",
- "-Qqso-0": "すべてのワークスペース",
- "Hs-i62I": "注文を見る",
- "UhoT2i4": "コメントを送信",
- "_I4A15k": "コメントを追加",
- "piHodso": "Issue ソースの更新に失敗しました",
- "XuKemqY": "タスクの作成に失敗しました",
- "Sni1IDk": "Linear サブ Issue の作成に失敗しました",
- "GdZdv18": "Linear サブ Issue の読み込みに失敗しました",
- "YpcHVvo": "Linear コメントの追加に失敗しました",
- "gNpYapQ": "リニアの Issue を更新できませんでした",
- "_t92UNY": "マージに失敗しました",
- "wPJymlU": "GitHub はマージ競合を報告しています。続行するには、GitHub で開きます。",
- "k4ojp0Y": "返信できませんでした",
- "jRm4RmA": "レビューコメントの追加に失敗しました",
- "4Si7jXY": "PR ヘッドの SHA がないとコメントできません。",
- "b6obzk0": "ファイルコンテンツのロードに失敗しました",
- "7sESNDQ": "この PR のファイル コンテンツをロードできません。",
- "Akq8bGo": "レビュー スレッドの更新に失敗しました",
- "3JBRDbM": "表示状態の更新に失敗しました",
- "HCcPUIo": "この PR の表示状態を同期できません。",
- "ppWaFdk": "チェックの再実行に失敗しました",
- "_sMIbrI": "チェックの更新に失敗しました",
- "eYVZBag": "レビュアーのリクエストに失敗しました",
- "4-krOeE": "テキストのコピーに失敗しました",
- "Y45YlXw": "リンクのコピーに失敗しました",
- "-bXRzXk": "コメントの追加に失敗しました",
- "nOlVFQ0": "GitLab アイテムの更新に失敗しました",
- "PA_I94w": "GitHub PR の更新に失敗しました",
- "aulxiV4": "GitHub の更新に失敗する問題",
- "BvA66yA": "ステータスの更新に失敗しました",
- "qVRnj6M": "PR のマージに失敗しました",
- "QKHONdI": "Issue タイプの更新に失敗しました",
- "Z7UA1fA": "このプロジェクトの Issue タイプはモバイルからは編集できません。",
- "QbIagpk": "プロジェクトフィールドの更新に失敗しました",
- "TE3rsP8": "アイテムの更新に失敗しました",
- "2lpu738": "このプロジェクト アイテムはモバイルからは編集できません。",
- "UbvF6N4": "コメントの削除に失敗しました",
- "22DpbZo": "このプロジェクトのコメントはモバイルからは削除できません。",
- "Lw1c31w": "コメントの編集に失敗しました",
- "fToZEE4": "このプロジェクトのコメントはモバイルからは編集できません。",
- "aCTe1aA": "ワークスペースを作成する前に、プロジェクト アイテム リポジトリを Orca に追加します。",
- "8r702TY": "ワークスペースの作成に失敗しました",
- "xWmoUM8": "スパース プリセットの保存に失敗しました。",
- "MNvx1_M": "ブランチの検索に失敗しました。",
- "f8dRWFk": "スパース プリセットのロードに失敗しました。",
- "WG-yXgM": "シェルを開く",
- "0uj422Y": "Issue タイプをロードできませんでした",
- "quO-aRc": "担当者のロードに失敗しました",
- "661kq0E": "ラベルのロードに失敗しました",
- "BRtGSdQ": "詳細のロードに失敗しました",
- "us3-SEs": "リニアコンテキストのロードに失敗しました",
- "-QPTwEw": "プロジェクトの追加に失敗しました。",
- "W2b7E0I": "プロジェクトの URL または所有者/番号が必要です。",
- "6aqSQa0": "プロジェクトの選択に失敗しました",
- "XhuO-88": "プロジェクトビューのロードに失敗しました",
- "y6brnh8": "さらに GitHub タスクをロードできませんでした",
- "bMml9Hw": "接続に失敗しました",
- "eVVS8u4": "タスクのロードに失敗しました",
- "jxeDUBI": "タスク設定のロードに失敗しました",
- "AmP4Z_A": "モバイルでタスクを使用できるように Orca デスクトップを更新します。",
- "_SIoB4k": "レビューコメントを追加",
- "T2C3fss": "テキストの変更は見つかりませんでした。",
- "_96Solc": "リポジトリごとにグループ化し、次に最新のアクティビティをグループ化します",
- "45bce5E": "最新のアクティビティを最初に",
- "43utnp4": "更新されました",
- "ncl7fEY": "保留中の GitLab todo",
- "uLI9QAU": "私のやるべきこと",
- "CNrYYPU": "リポジトリごとにリクエストと問題をマージする",
- "fxhXe98": "プロジェクト MR",
- "Vejw8iE": "自分に割り当てられたリクエストを確認する",
- "ox2Q3X4": "レビュー待ち",
- "Qcb2h_k": "あなたが作成した PR",
- "DitaVA4": "私の",
- "4q-Iqts": "オープンな PR",
- "90lx_rw": "あなたに割り当てられた未解決の問題",
- "NeeUliY": "私に割り当てられた Issue",
- "4HZ7SXw": "GitHub に関する未解決の問題",
- "QNj7rUo": "GitHub プロジェクトのビュー",
- "LB-QyhM": "プロジェクト",
- "RU009FY": "GitHub PR",
- "Xj-3fdg": "PR",
- "PAK8mwc": "GitHub Issue",
- "ISISlFo": "優先度",
- "kpxCp5s": "識別子",
- "Dd-TzXA": "グループ化なし",
- "JKx6Gd0": "グループ化された列",
- "uoATjeA": "ボード",
- "6GAUUa8": "コンパクトな発行行",
- "tIgX1ak": "リスト",
- "CW8el5g": "最近完了した問題",
- "HauqL5Y": "完了",
- "kRDldqg": "あなたが作成した問題",
- "o_j-FoE": "作成されました",
- "eNsBySI": "あなたに割り当てられた問題",
- "pP-07nE": "私の問題",
- "_kT7uQE": "接続されたワークスペース全体で未解決の問題を解決する",
- "gIF8518": "全て",
- "Svu67QM": "任意の GitLab 状態",
- "m5Y69Pc": "クローズされた問題と MR",
- "BpviSSw": "クローズ",
- "fM4vagY": "マージされた MR",
- "GtruncU": "マージ済み",
- "Dm3BEDs": "オープンな問題と MR",
- "L9I1oLA": "割り当てられた問題とチームの問題",
- "R_7ye6M": "Linear",
- "cBPoyj8": "問題と MR",
- "BaXOO9M": "GitLab",
- "monYp5Q": "問題と PR",
- "gcczsRA": "GitHub",
- "fCKRINY": "{{value1}} の差分行の最初の {{value0}} を表示しています。",
- "0WWDhS8": "{{value0}}行にコメントしてください",
- "LJbwLTk": "{{value0}} を {{value1}} によって解決しました",
- "3fJQdKo": "出典: {{value0}}",
- "F0yrwZ0": "並べ替え: {{value0}}",
- "ntCXZ5E": "フィールド: {{value0}}",
- "rkPw0BI": "グループ: {{value0}}",
- "KPrnw08": "注文: {{value0}}",
- "p08Gdhs": "{{value0}} では、アップストリームの優先 Issue ソースが利用できません。原点を使用します。",
- "3-41cjc": "+{{value0}} フィールド",
- "g8lrpKM": "{{value0}}に",
- "2x3FfB8": "{{value0}} のクエリ",
- "T-_RK2o": "ページ{{value0}}",
- "AHMKHtc": "{{value0}} チーム",
- "GRCIny0": "新規{{value0}}問題",
- "z7RLmIM": "{{value0}} のファイル",
- "Cb83OoQ": "{{value0}} から作成",
- "Fg7BUfE": "ブランチ名: {{value0}}",
- "Cx8BTNg": "{{value0}} では、このワークスペースを作成する前にセットアップを選択する必要があります。",
- "-1cVb10": "{{value0}}/{{value1}} は Orca に追加されません。デスクトップ アプリからこのリポジトリを追加し、モバイル タスクを更新します。",
- "TLa90Qg": "GitHub プロジェクト · {{value0}} {{value1}}",
- "sNIGIT0": "{{value0}} · {{value1}} · {{value2}}d",
- "Y1upIE8": "クイックコマンド",
- "j34FFK4": "削除",
- "RLWvqn8": "このカスタム ショートカットを削除しますか?",
- "PKSYVds": "https://example.com",
- "ZabOoVw": "URL を入力するか、新規タブの場合は空白のままにします。",
- "tKOmSkM": "新規ブラウザ",
- "pg8WJ-k": "Terminal 名",
- "gKi8D7w": "Terminal の名前を変更する",
- "gahpqR8": "電話の下書きを最新のデスクトップ ファイルに置き換えますか?",
- "tMSSoFA": "変更の破棄",
- "psn3klQ": "破棄して放置",
- "IytTrKE": "すべてコピーしてそのままにする",
- "knjkJaM": "出発前に電話の下書きをコピーまたは破棄してください。",
- "28Q3TbY": "保存されていない markdown の変更",
- "a6FBCvM": "更新",
- "a79zJAw": "パスのコピー",
- "_VDitck": "メモをコピーする",
- "-So6IQg": "現在のメモの agent セッションを選択します。",
- "eBYSC7A": "レビューメモを送信する",
- "c_XP7YM": "Markdown ノート",
- "vL8HgZo": "ブラウザ",
- "1ELofI0": "Terminal",
- "-95LQlw": "新規タブ",
- "UDf4wts": "ペースト",
- "IdjCS0U": "タブの作成",
- "S2Yv1rU": "作成...",
- "Xb4fMs0": "このセッションにはタブがありません",
- "jBv9pDk": "ワークスペース作成の警告を無視する",
- "uDcv4AM": "その他のセッション操作",
- "zUxrlPw": "デスクトップに再接続する",
- "z6d7HxM": "ワークツリーに戻る",
- "m6V9ozk": "Agent のプリセットは利用できません",
- "yBLhh9Y": "有効な Agents がありません",
- "pUeIX0M": "検出剤",
- "Ggr0PGg": "ブラウザ ページはまだ利用できません。",
- "xdJzAj8": "モバイルブラウザストリーミングにはデスクトップのアップデートが必要です",
- "6kcq1T8": "このクイックコマンドを実行する前に編集してください",
- "BYmvBAo": "選択がクリアされました (バッファからスクロールアウトされました)",
- "_0rBKLA": "コピーできませんでした",
- "A6mZ2G0": "コピーされました",
- "m332RRE": "terminal をクリアできませんでした",
- "8hc6lac": "Terminal クリア",
- "528pc28": "入力が大きすぎます (最大 256 KiB)",
- "RJlcmtM": "ホスト上で Orca を開き、スリープ中の agents を起動します。",
- "JnDupXg": "保存されました",
- "XIoxeds": "メモをコピーできませんでした",
- "dl26MWM": "メモをコピーしました",
- "TDYOpzk": "メモの削除に失敗しました",
- "ya3rgTk": "メモの保存に失敗しました",
- "TX0YgPk": "注記を追加しました",
- "ElSO0Bs": "markdown を読み込めませんでした",
- "eIqJOeA": "{{value0}} プレビュー",
- "GF9YPY8": "{{value0}}画像",
- "yHsoXLM": "送信",
- "Kvcps20": "レビューノートをAIに送信",
- "i7mE8Wc": "コピー",
- "G46090U": "レビューメモをコピーする",
- "o0woxZM": "{{value0}} レビュー {{value1}}",
- "bjh73HM": "レビューメモはありません",
- "bNrgw7Q": "メモを保存する",
- "AJOY4oY": "キャンセル",
- "vCc2hyw": "レビューメモを追加",
- "AMX0qpI": "{{value0}} 行目のメモを削除",
- "XjRhzvI": "{{value0}}行にメモを追加",
- "7su6EMM": "{{value0}} 差分行 {{value1}}",
- "fAJsFIg": "保存",
- "Hy2xmeg": "破棄",
- "8Uro2f0": "再試行",
- "HtCuTmQ": "{{value0}} 行目",
- "qrdoHLM": "Commit に失敗しました。",
- "Qpl1k5o": "コミットされた変更は利用できません。",
- "aqSqtLI": "ステップ {{value0}}",
- "XfBogi0": "{{value0}} ツール {{value1}}",
- "WL3i_AY": "画像",
- "tSzSq0U": "添付画像",
- "9kO5k1s": "ファイル",
- "76ELAmA": "プレビュー",
- "dZsgG-M": "フォルダーをロードできません",
- "wA_0d2E": "獲得した Codex レート制限のリセット",
- "CiFc9DQ": "例: pnpm build",
- "d0JpJz4": "例えば建てる",
- "rMV0BMU": "キーを選択してください",
- "fTbhbgg": "画像を開く",
- "oitC92A": "画像",
- "8ckUTUg": "フック",
- "hiRz7rE": "ORCA.YAML",
- "by8gktU": "メモを書く",
- "AmkPWYA": "リモートリポジトリ",
- "2Kl8BY4": "リポジトリを選択",
- "QjSzvc4": "結果が見つかりませんでした。",
- "RIaVSo8": "ベース",
- "IOLibYw": "システムのデフォルト",
- "2r4Wqzo": "ペアリングログ",
- "G_n7Zxg": "ペアリングログ",
- "Fbnf310": "音声設定の読み込みに失敗しました。",
- "4HGax2g": "ワークツリーなし",
- "oRXGJpo": "フィルターに一致するワークツリーはありません",
- "d-FojRM": "一致するワークツリーがありません",
- "Y4yzly8": "ワークツリーの検索",
- "ThGUKR8": "ワークツリーを検索…",
- "3GdsXVQ": "ホスト",
- "I0vv7aw": "タイプなし",
- "pjrxOkU": "{{value0}} ディレクトリ",
- "DvuAE90": "1 ディレクトリ",
- "EmJ0ZpA": "リモートリポジトリ",
- "mDtuNkA": "リポジトリを選択",
- "kbZvL2g": "Linear Issue",
- "Wg2C-lo": "アイテム",
- "ybs6rJE": "GitHub でビューを開く",
- "KVqCyig": "ショートカット",
- "WaegjuQ": "ファイル",
- "Dy-chOU": "Markdown",
- "ps5grWg": "コマンドを送信する",
- "XNw0eg0": "コマンドを入力してください…",
- "Rddk0Io": "入力されたテキストはアクティブな terminal に直接送信されます",
- "JQAVlGc": "ライブ terminal 入力用のキーボードを表示する",
- "WbNNU2M": "カスタムショートカットを追加",
- "UjbgRFg": "クリップボードから貼り付け",
- "g0S-mpY": "ライブ terminal 入力に切り替える",
- "LNjU0eA": "バッファされたコマンド入力に切り替える",
- "CAFCbk0": "スマートフォンモードに切り替え",
- "QB6eVqs": "デスクトップモードに切り替える",
- "jbJql9k": "ソフトウェア キーボードを非表示にし、現在の terminal セッションを開いたままにします。",
- "O4uFjyM": "キーボードを閉じる",
- "1Ef6jA8": "ローディング terminal",
- "5g1_I7Y": "デスクトップの機能をチェックしています - しばらくしてからもう一度お試しください",
- "UoNS0D4": "クイックコマンドを実行するにはデスクトップのアップデートが必要です",
- "7IGdkR0": "新規タブ",
- "Td8lqm0": "オープンソース管理",
- "8NqLc0E": "ファイルエクスプローラーを開く",
- "OcU2d6s": "メモを送信できませんでした",
- "4BJ8B0k": "送信されたメモ",
- "SM7vigo": "{{value0}} ファイル",
- "Dwq_r1o": "{{value0}} ファイル",
- "mLbULQw": "{{value0}} commit",
- "TWTFkY0": "{{value0}} commits",
- "t2Awy1s": "vs {{value0}}",
- "B2yGeak": "接続が中断されました",
- "TI9qKn0": "不明な terminal エラー",
- "R0VwXOs": "commit メッセージは生成されません",
- "-CpqM4g": "このブランチはまだ {{value0}} の準備ができていません。",
- "aDtTv18": "{{value0}} を作成する",
- "8TO561E": "この repo では PR を利用できません",
- "Xh63VTo": "ブランチのステータスを確認しています...",
- "o8ul7Iw": "最初にブランチを公開する",
- "9tlos5E": "commit メッセージを入力",
- "jzI4z6s": "少なくとも 1 つのファイルをステージングする",
- "Pej4iSQ": "ソース管理操作が失敗しました",
- "67FHeO0": "ソース管理をロードできません",
- "Z4IRqv4": "コミットされた変更をロードできません",
- "GXYBPqk": "上流はありません",
- "1YRKLD4": "{{value0}} 前、{{value1}} 後ろ",
- "kbozpKo": "ライブ入力",
- "_MGGD5E": "マイクを開始します",
- "Q7SP9fo": "処理",
- "y6GQnVA": "リスニング",
- "vXUuukQ": "クイックコマンド",
- "1rvpPn4": "Agent の選択",
- "SbxgQXc": "クイックコマンドを追加",
- "gaaVrjY": "クイックコマンドの編集",
- "uVgCcno": "削除",
- "jmIvPBQ": "キャンセル",
- "0dIGtV8": "行: {{value0}}",
- "ZueS87g": "行数: {{value0}}-{{value1}}",
- "hLNcWyo": "スコープ: ファイル",
- "57DUHqU": "エージェント",
- "0hhZYns": "セッション中に開けません",
- "1Z6vya0": "ファイルをロードできません",
- "FuhqCI4": "デスクトップを待っています...",
- "vu5sSQI": "デスクトップに接続しています...",
- "MpjZorw": "破棄",
- "5cnTshE": "滞在する",
- "jogAQ98": "ファイルを保存できません",
- "Rajm1co": "差分が利用できません",
- "9Sv7Jb4": "削除されたファイル",
- "BrE_aCg": "差分が大きすぎます",
- "Cku_aRM": "バイナリ差分",
- "9FhY-Sk": "コンテキスト",
- "0l1OykU": "削除されました",
- "bnfXRLU": "追加した",
- "eiEI8yY": "· {{value0}} アクティブ",
- "qNgdEE0": "{{value0}} ワークツリー{{value1}}{{value2}}",
- "UL6zDWw": "許可されていません - GitHub アカウントが接続されていません。",
- "nfDKqg4": "何か問題が発生しました。",
- "amP19yQ": "コンピュータ上の Orca を更新する",
- "NkNSfjQ": "Orca モバイルをアップデートする",
- "VWnR13E": "リセットを使用する",
- "_nuDzHY": "キャンセル",
- "rXScUPU": "ホストはこの試行を確認しましたが、この電話は再試行レコードをクリアできませんでした。後で再試行すると、同じ安全な操作 ID が再利用されます。",
- "d5V00qM": "このスマートフォンは、破棄された再試行レコードをクリアできませんでした。再試行しても安全ですが、このアカウントの新規リセットを確認するには、レコードをクリアする必要があります。",
- "B0fOGkI": "詳細",
- "21rrqn0": "ブラウザのストリームが失敗しました。",
- "ukxwfJ8": "agent セッションをロードできません",
- "dVAzjOs": "agent が入力を必要とするとき、またはタスクを完了したときに、このデバイスで通知を受け取ります。",
- "uzWRFSg": "システム設定で通知が無効になっています。",
- "J055vls": "何も選択されていません",
- "qVCBvFg": "最近の",
- "uGLg5VY": "直線的なタスクはありません",
- "ifuEhog": "GitLab タスクはありません",
- "haGU2eY": "GitHub タスクがありません",
- "OCkeuqU": "一致するタスクはありません",
- "Q9YN3Hk": "ホストに接続してタスクをロードする",
- "inyDHB0": "プロジェクトを選択",
- "73-jDqg": "{{value0}} チーム",
- "rqyU6Yo": "1チーム",
- "5U1KC3A": "ワークスペース",
- "DiuXQZo": "フィールド",
- "BJUllKs": "{{value0}}/{{value1}} フィールド",
- "qzEC9yM": "昇順",
- "2IFEfeA": "降順",
- "zrhQGaA": "{{value0}} リポジトリ",
- "nt1k3hc": "{{value0}} リポジトリ",
- "qzhASv0": "{{value0}} リポジトリ",
- "dBmZ43Q": "すべてのリポジトリ",
- "yX2I5Qc": "{{value0}} ソース",
- "x8ioLCA": "ターゲットの選択",
- "OR0Rh2U": "「{{value0}}」はすでに存在します。",
- "jBhX2v4": "名前は 80 文字以下にする必要があります。",
- "RT1HPds": "名前は必須です。",
- "TxiIlg0": "下書きをコピーできませんでした",
- "HimYt6k": "コピーされたパス",
- "S6RbGW8": "{{value0}} — タップして再試行します",
- "-4K4pmw": "{{value0}} タブ",
- "KRxO3Ug": "1タブ",
- "vFcOLlo": "タブの読み込み中",
- "6P8BtkA": "ブラウザコマンドが失敗しました",
- "sYGlLWQ": "ブラウザの作成に失敗しました",
- "HyIWUac": "有効な URL を入力",
- "6oL3kaQ": "markdown ノートの作成に失敗しました",
- "sgQvHe0": "クイックコマンド",
- "BphZ5Gw": "terminal の作成に失敗しました",
- "DKTAFXw": "保存に失敗しました",
- "qIT8ceU": "ファイルのプレビューを読み込めませんでした",
- "XD1EPRc": "差分プレビューを読み込めませんでした",
- "sJ7CwDw": "ファイルが大きすぎてモバイルでプレビューできない",
- "8Ho6nkA": "バイナリ プレビューは利用できません",
- "X1e46P4": "ディクテーションが挿入されました",
- "V4EVATY": "デスクトップで変更されました",
- "RwIU_9I": "読み取り専用",
- "hPnnpWc": "ダイレクト・LAN",
- "f3Si3vU": "ダイレクト · Tailscale",
- "Lo_8ioI": "Orca Relay",
- "QNvTsRo": "いいえ{{value0}}",
- "nDyX2e8": "ブランク Terminal",
- "7wOLCCY": "切断済み",
- "FZM-PD0": "接続に失敗しました",
- "wOY1nLM": "再接続に失敗しました",
- "55lbvEs": "認証に失敗しました",
- "uEprraQ": "再接続中",
- "XpcB6Lk": "リレーの展開",
- "Y4pY3mY": "接続中",
- "GyhUU1I": "接続済み",
- "VtNQIUo": "プッシュは成功しましたが、{{value0}} の作成に失敗しました: {{value1}}",
- "3fVn1VI": "マージを中止",
- "S5cNB0c": "リベースを中止",
- "wFxT3pM": "中止中…",
- "wL23gbE": "ブランチなし",
- "EiCMRDA": "未ステージ",
- "YcfLGog": "ステージ済み",
- "ZnNoGOU": "ブランチ",
- "ubcC1kU": "Terminal",
- "nMoq2GI": "ファイル",
- "oS6AL4Y": "Markdown",
- "YHLAtbk": "ブラウザ",
- "tgyhT8Q": "新規ブラウザ",
- "bdYtRH8": "ワークツリー",
- "972Qfrg": "{{value0}} 行目にメモを保存",
- "5Rc0T-w": "{{value0}} 未送信のメモ",
- "VuvuQv0": "未送信のメモ {{value0}} 件",
- "2KfV5_M": "メモ {{value0}} 件",
- "87GezVA": "メモ {{value0}} 件",
- "ZGxcUL4": "未レビュー",
- "08Yk1Go": "メモ",
- "ycKwNOI": "agent セッションをロード中...",
- "FjJb7Lo": "{{value0}} 行 {{value1}}",
- "sDDLSuM": "WSL の {{value0}} {{value1}}",
- "TUCQXxI": "ホスト上の{{value0}}",
- "mWMZ-dk": "セッションを再開する前にローカルワークスペースを開いてください。",
- "eTFpmzo": "このセッションはホスト マシンに保存されるため、SSH ワークスペースで再開することはできません。このプロジェクトのローカル ワークスペースを開きます。",
- "GLFjyPk": "履歴から再開は、ランタイムでホストされるワークスペースでは使用できません。",
- "WVNYnak": "{{value0}}秒後",
- "xYaQ41Y": "リポジトリフック",
- "EJg7NQU": "ローカルフック",
- "BeBymFk": "orca.yaml",
- "px-yCeQ": "コメント {{value0}} 件",
- "24Kgyy4": "まだコメントはありません",
- "PAtCwbU": "トップレベルのコメント",
- "br73014": "レビュースレッド",
- "Ak34AMw": "解決されたレビュースレッド",
- "oj0ltFk": "レビュー",
- "BWgU598": "解決されたレビュー",
- "6rtcg5s": "Linear で開く",
- "N_IsXzY": "GitLab で開く",
- "SpAtwKU": "リニア乗車券",
- "MKTNAHg": "{{value0}} やるべきこと",
- "mYLUh0s": "MR",
- "PoPA1vA": "空の",
- "cAXZUp4": "PR #{{value0}} をマージしますか?",
- "X5VvyPQ": "PR #{{value0}} をリベースしてマージしますか?",
- "LCOEY5w": "PR #{{value0}} を潰してマージしますか?",
- "1Shau08": "スカッシュしてマージする",
- "psZ6Lys": "PR",
- "xLFr_Co": "MR",
- "PAnLDcM": "マージ commit の作成",
- "b9yLdBs": "リベースとマージ",
- "6MEByr4": "未知",
- "cbIMuqY": "マージ可能",
- "YEiNYxU": "ブロック中",
- "OXTehpM": "遅れ",
- "hIW5XEU": "競合",
- "AXgAxVM": "マージ",
- "Sos7PxI": "{{value0}}/{{value1}} が合格しました",
- "Uc3hFHs": "{{value0}} 保留中",
- "L37iq1E": "{{value0}} は失敗しました",
- "X9M1AcA": "チェックなし",
- "pmjWIDk": "GitLab のやるべきこと",
- "kjZMz_U": "ロックされています",
- "1WEmdBA": "下書き",
- "BbDPGbM": "編集済み",
- "qJU9f5Q": "{{value0}} レビューメモ",
- "QGcvPOc": "{{value0}} レビューノート",
- "kYCT6qM": "{{value0}} によってスレッドが解決されました",
- "ahIRbHk": "{{value0}} によるコメントを解決しました",
- "qcFeMQM": "現在および今後の予定",
- "DCkRqC8": "このデバイス上の {{value0}} 資格情報のクリーンアップを確認できませんでした。",
- "XStfhOk": "このデバイス上の {{value0}} 資格情報のクリーンアップを確認できませんでした。",
- "xnvhKbA": "{{value0}} トランスクリプトがスキップされました",
- "UXXYuws": "{{value0}} トランスクリプトがスキップされました",
- "QlrZNys": "{{value0}} ファイルを確認、{{value1}} メモ",
- "J7M3gnY": "{{value0}} ファイルを確認、{{value1}} メモ",
- "uM2_gxc": "{{value0}} ファイルをレビュー、{{value1}} メモ",
- "JrNt3Dk": "{{value0}} ファイルをレビュー、{{value1}} メモ",
- "Id8zorY": "{{value0}} ワークツリー",
- "t4PccRo": "{{value0}} 件のワークツリー",
- "AYqemqw": "{{value0}} アクティブ",
- "lXLSjWw": "{{value0}} チェックに失敗しました",
- "N7XOlnE": "{{value0}} チェックに失敗しました",
- "dG4O1e4": "{{value0}} によってスレッドが解決されました",
- "lXnGpvs": "{{value0}} ({{value1}}) によってスレッドが解決されました",
- "njd-pFg": "{{value0}} によるコメントを解決しました",
- "tQONwOQ": "{{value0}} ({{value1}}) によるコメントを解決しました",
- "uxZVTz8": "{{value0}} ツール呼び出し",
- "IlwwqQs": "{{value0}} ツール呼び出し",
- "OLmV45U": "無題",
- "S-avV-Y": "レビュー済みファイル {{value0}} 件をステージしました",
- "IPu47z8": "レビュー済みファイル {{value0}} 件をステージしました",
- "TxG95wU": "Tailscale を確認",
- "oBMMuM8": "GitHub ワークアイテムには SSH リポジトリ用の GitHub リモートが必要です",
- "m4LECc4": "フローティングワークスペース",
- "ueRRwRg": "接続が遅すぎて音声ディクテーションができません。接続が改善されてからもう一度お試しください。",
- "hf0yXVE": "SSH 接続を確認できませんでした。ホストに再接続して、もう一度試す。",
- "XOHYcMw": "モバイル音声設定を使用するように、ペアリングされたデスクトップ Orca アプリを更新します。",
- "cuSNE9k": "Idle",
- "cfFE9JM": "完了",
- "eSniHCo": "中断されました",
- "clLXJRk": "入力を待っています",
- "CeMk5QY": "ブロック中",
- "xLtCpIk": "Working",
- "RvLuxao": "PR #{{value0}}、{{value1}}、{{value2}}{{value3}}。PR をオープンします。",
- "oDQaC0g": "PR は利用できません: {{value0}}",
- "MkY5xK4": "PR を読み込んでいます",
- "qE1-68U": "レビューを作成しています...",
- "JokOS5o": "リースを使用して強制的にプッシュします...",
- "0BMXLfE": "commits をプッシュしています...",
- "PnL-W2o": "ブランチを公開しています...",
- "uN9IaYI": "変更をコミットしています...",
- "us6yszU": "commit メッセージを生成中...",
- "eCa7Me8": "変更をステージしています...",
- "Kdbzhtg": "このブランチはまだ {{value0}} の準備ができていません。",
- "eeoaUzE": "{{value0}} を作成する前にベース ブランチをプッシュしてください。",
- "dhReg-4": "このフォークからの {{value0}} の作成はサポートされていません。",
- "UNrSqqU": "このブランチには {{value0}} がすでに存在します。",
- "CMzOREY": "この repo では {{value0}} の作成はサポートされていません。",
- "i65iwXo": "認証してから {{value0}} を作成してください。",
- "h5c6qGM": "このブランチを同期してから {{value0}} を作成してください。",
- "aDj0ISs": "コミットを公開してから {{value0}} を作成してください。",
- "J6J02jo": "{{value0}} を作成する前に、機能ブランチに切り替えてください。",
- "eL3YqZQ": "ブランチをチェックアウトしてから {{value0}} を作成してください。",
- "fS2uz3k": "変更をコミットしてから {{value0}} を作成してください。",
- "YnkDu_A": "Orca は、このブランチに既に {{value0}} があるかどうかを確認できませんでした。しばらくしてからもう一度試す。",
- "nUw7_cE": "{{value0}} が作成されましたが、Orca はまだ更新できませんでした。",
- "89Qhlf4": "{{value0}} #{{value1}} はすでにオープンしています。",
- "G0fuKJo": "commit するものがありません。ブランチは最新です。",
- "qgmf_L8": "プッシュ",
- "0OsPYDw": "プル",
- "gSinyKw": "リモート ブランチを更新するには、リースを使用して強制的にプッシュします。",
- "5MUJYGA": "このブランチをオリジンに公開します。",
- "5OKMsK4": "commits を公開する前にブランチをチェックアウトしてください。",
- "eSJfk9k": "少なくとも 1 つのファイルをステージングして commit します。",
- "MM3ixxY": "すべての変更をステージングします。",
- "YnDfQwA": "commit するには commit メッセージを入力します。",
- "sJ8R-8c": "段階的な変更を Commit します。",
- "lBQzq_8": "コミットする前に競合を解決してください。",
- "aIqyvoY": "リモート操作が終了したら、もう一度試す。",
- "YkxQqGg": "遠隔操作中です。",
- "cOOTv9E": "強制プッシュが進行中です。",
- "GqPiXjg": "Commit が進行中です。",
- "6Z1Zr78": "ブランチを公開",
- "gqhNZGI": "同期",
- "AvE0E2k": "ステージオール",
- "7HjRY3c": "Commit",
- "koj5rtA": "フォースプッシュ",
- "63siVQ8": "リクエストが失敗しました: {{value0}}",
- "8I2nZuQ": "スキップ済み",
- "Ba1jOdE": "中性",
- "lyHptRM": "タイムアウト",
- "thrHxG4": "キャンセル済み",
- "NO0ZjtQ": "失敗した",
- "6lXfNVk": "成功",
- "9XDJxdU": "進行中",
- "AXw1J4E": "コメントはまだありません。",
- "znwGBr8": "人間的なコメントはありません。",
- "BvW_4OE": "ボットのコメントはありません。",
- "jG05lVM": "{{value0}}/{{value1}} をロードできませんでした。",
- "zrt1n24": "レビュアーがいません",
- "yMw_C-k": "変更要求",
- "O3Knlx4": "承認された",
- "ziWbd9A": "オープンな PR のチェック",
- "z4-dCLM": "agent セッションの参照と再開",
- "td40qOY": "ここにデスクトップが表示されます。すべてがエンドツーエンドで暗号化されます。",
- "-SigWBo": "上のボタンをタップしてスキャナーを開きます。画面上の QR コードをポイントします。",
- "aCJTiqw": "[設定] → [モバイル] に移動し、ペアリング QR コードを生成します。",
- "_wFCKE8": "テストできませんでした",
- "gdHptko": "接続がありません",
- "DxL3QsM": "予期せぬ反応",
- "O1SHffI": "接続済み",
- "uJRC49k": "ホストデータを読み取れませんでした",
- "AtwKjZ4": "なし — QR をスキャンしてペアリングします",
- "OCWSDG0": "{{value0}} ペアリングされました",
- "s5C2oPk": "説明はありません。",
- "AnvMzjI": "代わりにメモをコピーする",
- "0IFqHX0": "新規 agent セッション",
- "k5E-6Qo": "ホスト接続を確認してください",
- "AXVCL9g": "反復",
- "G_aoVj8": "ワークスペースの作成に失敗しました",
- "2t3siE4": "現在",
- "X4spS84": "Commit に失敗しました",
- "Cqqzv8U": "ソース管理を更新できません",
- "8Tx_eZw": "PR の作成に失敗しました",
- "DIh5pvA": "リンクされたレビューを更新できませんでした",
- "D8-XyhU": "リンクされた PR の更新に失敗しました",
- "GaTugx8": "ローカルコミットが失われます。代わりにプルしてください",
- "qajmB_0": "早送りするものはありません",
- "fp_5pjo": "早送り",
- "UWyesQ8": "早送り ({{value0}})",
- "qq_p9K0": "ブランチはすでに公開されています",
- "5Vkd48o": "ブランチは最新です",
- "N0HpMMg": "同期",
- "26SoVIw": "同期 (↓{{value0}} ↑{{value1}})",
- "Ia0aBfU": "何も引っ張るものがない",
- "0pGBpyQ": "プル",
- "oCECucM": "プル ({{value0}})",
- "zgbzIDs": "押し付けるものは何もない",
- "eBZzWkw": "プッシュ",
- "9Xtk0Pg": "プッシュ ({{value0}})",
- "cBrXr-8": "Commit に失敗しました",
- "5jVDzOo": "デスクトップを待っています...",
- "cIZvHNg": "デスクトップに接続しています...",
- "zniLwck": "コミットされた差分をロードできません",
- "NJJe3ZA": "リクエストが失敗しました: github.resolveReviewThread",
- "xWj8WHk": "リクエストが失敗しました: github.updatePRTitle",
- "o-JIJFg": "リクエストが失敗しました: {{value0}}",
- "jdt98Vo": "リクエストが失敗しました: {{value0}}",
- "aLzpW3w": "コミットされた変更が失敗しました",
- "nKp2Mj0": "コミットされた変更は利用できません",
- "FJnzL9Y": "未ステージ",
- "senOKG4": "ステージ済み",
- "OtjVKog": "Terminal",
- "tod-ra0": "トランスクリプトストリームが失敗しました",
- "GmBjriA": "チャットビューに切り替える",
- "dqKsMqY": "terminal ビューに切り替える",
- "502R_mE": "電話に切り替える",
- "0XbzIAs": "デスクトップに切り替える",
- "BGT_JFw": "Terminal",
- "MOOmRCc": "差分をロードできません",
- "1ymIBpg": "レビューを読み込めません",
- "vMHt0l8": "agent セッションをロードできません",
- "4GOORsg": "Terminal",
- "FYj9qCM": "SSH リポジトリへの接続に失敗しました。",
- "Gli-J-E": "SSH 接続状態の読み取りに失敗しました。",
- "17Ky5K0": "Linear",
- "kWDpsSU": "問題 #",
- "G_t8Rjg": "MR !",
- "Jq988q0": "PR 番号",
- "a6UgDc8": "ブラウザダイアログ",
- "VgO3m0E": "無題のセッション",
- "X0HdEQ0": "接続",
- "Ho177Ac": "再接続",
- "ImyX3J0": "{{value0}} に到達可能",
- "JwcgRbU": "ピン",
- "dgZsiv8": "固定を解除する",
- "TNd6PjA": "デフォルト",
- "dXnxHU4": "{{value0}} · デフォルト",
- "dMUK4L8": "モバイルでサポートされていないレイアウト",
- "hy_B4J8": "#{{value0}} を表示",
- "yvbNVZo": "昇順に並べ替えます",
- "YKWIedk": "現在 {{value0}} · {{value1}} をタップ",
- "P-ZWamw": "GitHub のランク順を使用",
- "fERYVNg": "{{value0}} {{value1}} を使用します",
- "iD-UhpY": "リニア Issue の作成に失敗しました",
- "T_YfEh0": "最初にリニア チームを選択します。",
- "ffJZE1A": "{{value0}} Issue の作成に失敗しました",
- "C3TiEsc": "{{value0}} Issue を作成する前に、Git リポジトリを追加。",
- "2cHUFuY": "サブ Issue の作成に失敗しました",
- "KcjImC4": "サブ Issue が見つかりません",
- "ct__F0Q": "スレッドを再開できませんでした",
- "LVc8Fk0": "スレッドを解決できませんでした",
- "fpX38uo": "表示された状態を GitHub と同期できませんでした。",
- "lanbga8": "無効なチェックの応答",
- "lSNLJ4s": "GitHub ステータスの更新に失敗しました",
- "8U28lt8": "GitHub アイテムの更新に失敗しました",
- "QI7iJCw": "選択した agent は無効になっています。作成する前に、有効な agent を選択。",
- "AGIjbJU": "ワークスペースを作成する前に {{value0}} を接続してください。",
- "eCcpIL4": "SSH リポジトリへの接続に失敗しました。",
- "CyTKwng": "SSH 接続状態の読み取りに失敗しました。",
- "cTL2xfk": "空白",
- "-JNPw2M": "詳細が見つかりません",
- "s_tAbdk": "このプロジェクトにはサポートされているビューがありません。",
- "caw13Gk": "リニアの接続に失敗しました",
- "bNtRw1Q": "GitLab タスクのロードに失敗しました",
- "Bt_rGOI": "GitHub タスクのロードに失敗しました",
- "ObzOf3Y": "反復",
- "7wx0uDo": "未割り当て",
- "14_Cpwk": "無題の markdown ノートを作成できません",
- "1s8dFXg": "Terminal 入力が別のクライアントによってロックされています。",
- "v-nMJVc": "メモの送信に失敗しました",
- "5GHrSsw": "レビューメモの保存に失敗しました",
- "-0DsFBU": "デスクトップを待っています...",
- "I4VlaAs": "markdown を読み取れません",
- "65j23gQ": "{{value0}} を送信",
- "3ivaga8": "{{value0}}を編集",
- "9ZRI2cs": "ワークスペースを作成する前に {{value0}} を接続してください。",
- "h8LEFjY": "AI を使用して {{value0}} の詳細を生成する",
- "rOYT-0U": "{{value0}} を許可しますか?",
- "671hHtA": "ブラウザで開きますか?\n\n{{value0}}",
- "dTuoCp0": "{{value0}} #{{value1}} をスカッシュしてマージしますか?",
- "M2j9mpc": "{{value0}} コメント",
- "xZ4TQL8": "ページを選択、{{value1}} のページ {{value0}}",
- "7LorW8k": "ページ {{value0}} / {{value1}}",
- "CKtsHVY": "{{value0}}行",
- "ACQh2cM": "{{value0}} はすでにオープンしています。",
- "al8M9-M": "{{value0}} を引いて、{{value1}} を押します。",
- "UIMnif0": "{{value0}} commit をプルします。",
- "35baKac": "{{value0}} commits をプルします。",
- "y7z5WcU": "{{value0}} commit をプッシュします。",
- "0yFIngw": "{{value0}} commits をプッシュします。",
- "gx2zC4w": "有効なペアリング コードではありません",
- "WABgCvg": "ペアリングコードがありません",
- "_c5oKe0": "オープン",
- "aalP-X8": "破棄",
- "cTkYeR8": "MR",
- "OpWJNnA": "MR",
- "BWWtnQM": "MR",
- "GqNlrAs": "PR",
- "rUwwMh4": "PR",
- "Qic_Aa4": "PR",
- "-YeAYjI": "破棄",
- "myZTLv0": "{{value0}} 回のリセットが利用可能",
- "CfvCAaE": "{{value0}} 回のリセットが利用可能",
- "aaZ_2qE": "今、期限切れになります",
- "1neVPtc": "有効期限まで {{value0}}",
- "nH5aDJ4": "次の有効期限は今です",
- "fA_ezvI": "次の有効期限まで {{value0}}",
- "4DTdO1w": "マージ",
- "pZ3OPxE": "保存",
- "eVLkMyE": "コメント",
- "g0JLO88": "ジョブ",
- "OJSrr6g": "失敗したジョブ",
- "RfH2kOg": "リクエスト済み",
- "EaX2_X8": "削除",
- "y2BBXrA": "確認する",
- "7RncVJk": "リクエスト済み",
- "6BZSEjI": "オープン",
- "3OzvpCE": "たった今",
- "sC5iGOA": "クローズ",
- "epStUOc": "進行中",
- "sMpsrkY": "レビュー中",
- "LEXdDEk": "完了",
- "QESpnhs": "Terminal WebView レンダリング プロセスが終了しました",
- "9IP25z8": "Terminal WebView HTTP エラー",
- "GY53tDU": "Terminal WebView のロードに失敗しました",
- "_dDm4ic": "F12",
- "T7RTOC4": "F11",
- "d6orzBg": "F10",
- "rI3MEx0": "F9",
- "DR9i7SU": "F8",
- "EbNp-x4": "F7",
- "xOj4ngY": "F6",
- "MmdqLFU": "F5",
- "dMpOhHI": "F4",
- "fNbslzw": "F3",
- "5OQeDMc": "F2",
- "wPNSaMQ": "F1",
- "Z-W6Rzg": "ページダウン",
- "1n1QZYk": "ページアップ",
- "6UajMWQ": "終わり",
- "r2L-IvQ": "ホーム",
- "EvEE7WE": "右矢印",
- "1TJf6c4": "左矢印",
- "jB50jh8": "下矢印",
- "S_D2PxQ": "上矢印",
- "JAhWIZE": "入れる",
- "Wt9qvqo": "PGDN",
- "1qkhXPI": "PgUp",
- "bh9E9Gk": "インス",
- "lCZrWn4": "シフト",
- "zN_6g9g": "代替",
- "mthhwXw": "Ctrl",
- "fpKzlOM": "OpenClaw",
- "rZEdz3o": "Devin",
- "Lrz_Jb8": "Hermes",
- "tNRBWNU": "Rovo Dev",
- "X7ZF7JI": "Qwen Code",
- "yUpY07s": "Mistral Vibe",
- "HG6jBAg": "Kimi",
- "uvSF6-U": "Droid",
- "Vly29R0": "Cursor",
- "dSfrwic": "Continue",
- "WeGqDrY": "Command Code",
- "fm231VU": "Codebuff",
- "Vqp3lvY": "Cline",
- "RCPC-L0": "Autohand Code",
- "ufugQXE": "Auggie",
- "6Y3GKfY": "Charm",
- "kej-9Lc": "Kiro",
- "FYcf7kI": "Kilocode",
- "njg39j4": "Amp",
- "Gqznj90": "Goose",
- "FWr_S8c": "Aider",
- "tkhwBEU": "Antigravity",
- "qcMaCQk": "Gemini",
- "GovXMeA": "OMP",
- "BWhYVOA": "Pi",
- "STuGb5Q": "Trae",
- "Y9bn4gA": "Ante",
- "imGLJZs": "MiMo Code",
- "qar2VvQ": "OpenCode",
- "7u-Lga4": "GitHub Copilot",
- "58N2Zh8": "Grok",
- "Tvbh_c4": "Codex",
- "4os-vWc": "OpenClaude",
- "cUAuG8c": "Claude Agent Teams",
- "OZJxvKQ": "Claude",
- "x04i9ik": "ベースブランチの解決に失敗しました。",
- "vuFM3_E": "{{value0}}月",
- "m8V_LQQ": "たった今",
- "-DRFeFw": "ステージ済みの変更",
- "cdicUlU": "追跡されていないファイル",
- "cbaJlCE": "変更点",
- "knjcZG0": "変更のステージングに失敗しました",
- "2m5o9w0": "リースを使用した強制プッシュに失敗しました",
- "I8tYYd4": "commits のプッシュに失敗しました",
- "HtBxXOI": "ブランチの公開に失敗しました",
- "r9Wy-Q8": "Commits",
- "Xawq6ME": "PR",
- "TMv0RaY": "変更点",
- "tKcJoxk": "ベースブランチは head ブランチとは異なる必要があります。",
- "yBuJIFU": "ベースブランチを選択。",
- "b89N2ws": "{{value0}} のタイトルを入力。",
- "E7yK5NU": "生成が完了するまで待ちます。",
- "DAVoau0": "メッセージ、@ファイル、/コマンド",
- "zGX7CcI": "応答が送信されませんでした",
- "v7vfn5Q": "応答が未確認 — 再試行する前にチャットを確認してください",
- "6dxPsys": "応答が送信されない (切断された)",
- "sxVCOxI": "オプションを選択",
- "-D7_HMY": "PR を読み込めません",
- "xEMYAIw": "ペアリングが無効です",
- "G1BrrUQ": "再接続中",
- "7mbOxzE": "切断済み",
- "Fr9Rdq8": "接続済み",
- "yqEocVY": "確保",
- "S_1cAME": "接続中",
- "eOcfBcE": "回答は送信されませんでした",
- "ukuLb_A": "回答は未確認です — 再試行する前にチャットを確認してください",
- "UnHHxag": "回答が部分的に送信されました - 再試行する前にチャットを確認してください",
- "O2gcQk0": "回答が送信されませんでした (切断されました)",
- "htcCRsA": "キャンセルは送信されませんでした",
- "chT2Z44": "未確認でキャンセル — 再試行する前にチャットを確認してください",
- "Z_x_TcE": "キャンセル未送信(切断)",
- "c6Kd_Ps": "メッセージは送信されませんでした",
- "4Xgw97k": "メッセージは送信されませんでした (切断されました)",
- "ZkABdzg": "メッセージは送信されませんでした",
- "klTsRAk": "配信が未確認 — 再試行する前にチャットを確認してください",
- "t_qfHRA": "メッセージは送信されませんでした (切断されました)",
- "S9MYUPk": "停止は送信されませんでした",
- "i8UxPTM": "未確認で停止 — 再試行する前にチャットを確認してください",
- "ZhefrDE": "停止は送信されていません (terminal の準備ができていません)",
- "QVUePYc": "キャンセル",
- "OxB9eF0": "確認する",
- "PpZpLWw": "確認するファイルを選択します。",
- "Em5nLwQ": "このファイルは削除されました。ファイルメモを追加するか、レビュー済みとしてマークします。",
- "YeQabYs": "この差分はモバイル プレビューには大きすぎます。",
- "FdOHIhk": "このファイルはモバイルではテキストとしてレンダリングできません。",
- "5GRCze0": "検索をクリア",
- "GbS1Gw0": "保存",
- "tNw1xEA": "クローズ",
- "QYCFjQw": "下書き",
- "AF7gJFU": "マージ済み",
- "sbQ_yBw": "オープン",
- "rBMjMUM": "{{value0}} 年前",
- "5mTslyc": "{{value0}} か月前",
- "3u9-Kuw": "{{value0}} 日前",
- "J9EQWOE": "{{value0}} 時間前",
- "XG7ieU0": "{{value0}} 分前",
- "xbjFHYU": "たった今",
- "aJGSaVI": "送信済み",
- "_ax72Jw": "ブラウザのポインタアップに失敗しました",
- "oaarOD4": "ブラウザポインタダウンに失敗しました",
- "A-4DgN0": "ブラウザポインタの移動に失敗しました",
- "yrjs9M0": "ブラウザのスクロールに失敗しました",
- "9E99YI8": "ブラウザコマンドが失敗しました",
- "kZGbeC4": "Linear",
- "fvIr9H8": "GitLab",
- "TH4OaOM": "GitHub",
- "xPjEgDM": "低い",
- "7LgwgJM": "中くらい",
- "_pcc0Zw": "高い",
- "e3kayEE": "緊急",
- "X1FYz1o": "右クリック",
- "AX4IXS0": "予期しない Linear タスクの応答",
- "SX56B0U": "ブランチベースを解決できません",
- "f-93Rxs": "commit 履歴のロードに失敗しました",
- "O6Amqhs": "ブランチステータスが利用不可",
- "9AhI4NI": "Commit に失敗しました",
- "D2XJD5Q": "ソース管理操作が失敗しました",
- "1yTzUoY": "デスクトップを待っています...",
- "aNYrFtc": "リベース先のベース ブランチがありません",
- "rF-O-TA": "デスクトップを待っています...",
- "q53ZKds": "バイナリ ブランチの差分プレビューはモバイルでは利用できません",
- "AAVqwEI": "Terminal 入力がロックされています",
- "kiGJQl0": "再開コマンドの送信に失敗しました",
- "n6zBfFc": "作成された terminal 応答が無効でした",
- "GWephQg": "terminal の作成に失敗しました",
- "KEeLFyA": "このレガシー Codex セッションを準備できませんでした。再開を再試行してください。",
- "64b63WI": "クリップボードの画像コンテンツはbase64である必要があります",
- "Oht8bkc": "クリップボードの画像が大きすぎます",
- "u_SAyGc": "コミットされた差分は利用できません",
- "qK2AOt0": "差分応答が無効でした",
- "47q1BdE": "差分をロードできません",
- "1eue8fY": "レビューノートを読み込めません",
- "EgST0cw": "ソース管理応答が無効でした",
- "9Z6xNzo": "変更をロードできません",
- "kyy8tNA": "Terminal 入力がロックされています",
- "-j2Yzyc": "プロンプトの送信に失敗しました",
- "8WPx578": "作成された terminal 応答が無効でした",
- "p20YlWo": "terminal の作成に失敗しました",
- "dzoAXdg": "レビュー状態の保存に失敗しました",
- "a3rNaLA": "デスクトップを待っています...",
- "LYAe0FE": "作成された terminal 応答が無効でした",
- "NhC30K0": "terminal の作成に失敗しました",
- "-NMYOgc": "Terminal 入力がロックされています",
- "tpf9SfA": "メモの送信に失敗しました",
- "eH92OqQ": "サイズ変更されたクリップボード画像のエンコードに失敗しました",
- "qYK5Ouo": "クイックコマンドの保存に失敗しました",
- "LuqBIhs": "マイク録音の開始に失敗しました",
- "oQrz0NI": "キープアウェイク ネイティブ コールがタイムアウトしました",
- "qiXFVWc": "音声が検出されませんでした。",
- "Pwq6G9w": "マイクの初期化に失敗しました",
- "InUuqhA": "マイクの許可が拒否されました",
- "CdTon5s": "ディクテーション設定を更新できませんでした",
- "9VJGb2s": "モデルの削除に失敗しました",
- "hkwxfd0": "ダウンロードの開始に失敗しました",
- "jcVunZ4": "ディクテーション モデルのロードに失敗しました",
- "3cWf_os": "useHostProtocolGate は 内で使用する必要があります",
- "l0xDyns": "ホストからの無効なアカウントのスナップショット",
- "dWotxRU": "ホストからの無効なリセット応答",
- "hIvuhiQ": "チェックの詳細をロードできませんでした",
- "hRiZhQg": "ワークスペースのメタデータをロードできません。",
- "THbZzp4": "ホストにアクセスできません",
- "MJ1SglY": "その VPN を無効にするか、スプリット トンネリング / 「LAN を許可」を有効にします。",
- "n-WXtiA": "Tailscale 以外の VPN は、ローカル トラフィックをリモート サーバー経由でルーティングできます。",
- "PxeuBQc": "Tailscale アプリを更新します。最近のリリースでは再接続のバグが修正されています。",
- "j0KeldQ": "デスクトップが起動しており、テールネットに接続されていることが表示されていることを確認します。",
- "rmMn9Xc": "iOS/Android はサイレントにトンネルを遮断できます。Tailscale アプリで Tailscale をオフにしてからオンに戻します。",
- "T6EL0oM": "100.x.x.x や *.ts.net などのホスト アドレスは Tailscale 経由で接続します。これを ON にしておきます。",
- "S9tNuKw": "タイムアウトが続く場合は、両方のアプリを再起動します。",
- "gvS1F3o": "ホスト リストに戻り、ホストをタップして再試行します。",
- "uGWzUrE": "スマートフォンの WiFi 信号強度を確認します。",
- "neP0TKg": "アップデート後は、QR コードを使用して再ペアリングする必要がある場合があります。",
- "WkJ-I-g": "Orca を再起動してみてください。起動時にコンパニオン サーバーが開始されます。",
- "i4fV_jk": "接続を受け入れるには、デスクトップ上で Orca が開いている必要があります。",
- "rtC8ngI": "企業/学校のネットワークは P2P をブロックする可能性があります。個人用ホットスポットを試す。",
- "401zg0M": "Linux: sudo ufw allow 6768",
- "ayekp1A": "Windows: Defender ファイアウォール → アプリを許可 — プライベート ネットワークに対して Orca を有効にします。",
- "REilmMs": "macOS: システム設定 → ネットワーク → ファイアウォール — Orca を許可します。",
- "jEL8NQc": "両方のデバイスで WiFi を再接続してみてください。",
- "h6u3Ajc": "イーサネットと WiFi は同じサブネットを共有する必要があります。",
- "DFWK1QU": "両方のデバイスが同じ LAN 上にある必要があります (Tailscale 経由で接続されていない場合)。",
- "q1Pbqtk": "選択済み",
- "p2fnv7c": "{{value0}} {{value1}}",
- "nEDriRI": "Terminal が初期化されませんでした - Terminal ビューから準備完了信号がありません",
- "7IfxObc": "タップしてキーボードを表示します",
- "quM4RwQ": "画像をホストにアップロードしています",
- "ha7j7qM": "マイクの準備中",
- "_-dmI2A": "デスクトップ上での文字起こし",
- "GGXoono": "マイクをタップして停止します",
- "97h575A": "レビューが必要",
- "39Q08OU": "レビュアー {{value0}} 人",
- "d8cyKVY": "レビュアー {{value0}} 人",
- "UMqLjMs": "未解決のチェック"
+ "mobileWorkspaceStatuses": {
+ "todo": "未着手",
+ "progress": "進行中",
+ "review": "レビュー中",
+ "done": "完了"
+ },
+ "workspaceListPickerOptions": {
+ "pr": "PR 状況",
+ "status": "状態",
+ "no": "グループ化なし",
+ "server": "サーバーの順序",
+ "manual": "マニュアル",
+ "repository": "リポジトリ、ワークスペース名",
+ "most": "最新の出力が最初に表示されます",
+ "recent": "最近の",
+ "alphabetical": "名前のアルファベット順",
+ "name": "名前",
+ "agents": "注意が必要な Agents、その後の最近のアクティビティ",
+ "agent": "Agent のアクティビティ"
+ },
+ "agentRowDisplay": {
+ "done": "完了",
+ "interrupted": "中断されました",
+ "waiting": "入力を待っています",
+ "blocked": "ブロック中",
+ "just": "たった今"
+ },
+ "workspacePrStatusGroups": {
+ "closed": "クローズ",
+ "progress": "進行中",
+ "review": "レビュー中",
+ "done": "完了"
+ },
+ "task": {
+ "repository": "リポジトリ",
+ "close": "閉じる",
+ "reopen": "再度開く",
+ "pullRequest": "PR",
+ "updateItem": "アイテムの更新",
+ "mergePullRequestTitle": "PR をマージ",
+ "mergeRequestTitle": "MR",
+ "chooseHowPull": "この PR をマージする方法を選択します。",
+ "chooseHowMerge": "この MR をどのようにマージするかを選択します。",
+ "mergeMethod": "マージ方法",
+ "changeStatusMessage": "ステータス変更",
+ "mergeMerge": "マージ MR",
+ "gitHubReportsMergeConflicts": "GitHub はマージ競合を報告しています。",
+ "mergePullRequest": "PR をマージする",
+ "copyGit": "GitHub リンクをコピーする",
+ "copied": "コピーされました",
+ "copyLinear": "リニアリンクをコピー",
+ "createWorkspaceMessage": "ワークスペースの作成",
+ "creating": "作成...",
+ "noComments": "コメントはありません。",
+ "discussion": "議論",
+ "addSub": "サブ Issue を追加する",
+ "subIssueTitle": "サブ Issue のタイトル",
+ "open": "オープン",
+ "noSub": "サブ Issue はありません。",
+ "subIssues": "サブ Issue",
+ "noPipeline": "この MR ではパイプラインは実行されません。",
+ "none": "なし",
+ "pipelineJob": "{{pipelineJobCount}} の求人",
+ "pipeline": "パイプライン",
+ "fileContents": "ファイルの内容は利用できません。",
+ "binary": "バイナリファイル。",
+ "markViewed": "閲覧済みとしてマークする",
+ "markUnviewed": "未視聴としてマークする",
+ "view": "表示",
+ "hide": "隠れる",
+ "changed": "変更済みファイル",
+ "noChecks": "チェックが見つかりませんでした。",
+ "rerunAll": "すべて再実行",
+ "rerunFailed": "再実行に失敗しました",
+ "refresh": "更新",
+ "checks": "チェック",
+ "requestReview": "レビューのリクエスト",
+ "requestReviewers": "リクエストレビュアー",
+ "noReviewer": "レビュアーの提案が見つかりませんでした。",
+ "loadingReviewers": "レビュアーを読み込み中...",
+ "noReviewersRequested": "レビュアーはリクエストされていません。",
+ "reviewers": "レビュアー",
+ "updateAssignees": "担当者を更新する",
+ "removeUsernames": "ユーザー名をカンマ区切りで削除します",
+ "addUsernames": "ユーザー名をカンマ区切りで追加します",
+ "noAssignable": "このリポジトリに割り当て可能なユーザーが見つかりません。",
+ "loadingAssignees": "担当者をロード中...",
+ "assignees": "担当者",
+ "updateLabels": "ラベルを更新する",
+ "removeLabels": "ラベルをカンマ区切りで削除します",
+ "addLabels": "ラベルをカンマ区切りで追加します",
+ "noLabels": "このリポジトリにはラベルがありません。",
+ "loadingLabels": "ラベルを読み込んでいます...",
+ "labels": "ラベル",
+ "saveTitle": "タイトルの保存",
+ "title": "タイトル",
+ "saveDescription": "説明を保存する",
+ "description": "説明",
+ "project": "プロジェクト",
+ "assignee": "担当者",
+ "status": "状態",
+ "type": "タイプ",
+ "refreshDetails": "詳細を更新",
+ "mergeRequires": "Merge には Orca にこのリポジトリが必要です。",
+ "closeItem": "項目を閉じる",
+ "reopenItem": "アイテムを再度開く",
+ "openGitHub": "GitHub で開く",
+ "workspaces": "ワークスペースは、GitHub の Issue と PR からのみ作成できます。",
+ "delete": "削除",
+ "edit": "編集",
+ "reply": "返事",
+ "resolve": "スレッドを解決する",
+ "reopenThread": "スレッドを再開する",
+ "cancel": "キャンセル",
+ "save": "保存",
+ "editComment": "コメントの編集",
+ "show": "表示",
+ "commentCountComments": "コメント {{commentCount}} 件",
+ "clearField": "フィールドをクリアする",
+ "saveField": "フィールドを保存",
+ "text": "テキスト",
+ "number": "番号",
+ "noIterations": "利用可能な反復はありません。",
+ "enterDate": "日付を YYYY-MM-DD として入力します。",
+ "enterValid": "有効な番号を入力。",
+ "projectFieldsMessage": "プロジェクトフィールド",
+ "clearType": "クリアタイプ",
+ "noIssue": "このリポジトリに設定された Issue タイプはありません。",
+ "loadingIssue": "Issue の種類を読み込んでいます...",
+ "issueType": "Issue の種類",
+ "projectItem": "プロジェクトアイテム",
+ "draftIssue": "ドラフト問題",
+ "pullRequestMessage": "PR",
+ "copyRepository": "リポジトリのコピー",
+ "repositoryNotOrca": "Orca に Repos がありません",
+ "do": "走らないで",
+ "always": "常に信じて走ってください",
+ "failedTrust": "セットアップ スクリプトを信頼できませんでした。",
+ "runHooks": "フックを実行する",
+ "setup": "セットアップスクリプト",
+ "newSetup": "新規セットアップ スクリプト",
+ "orcaYamlTrustWarning": "このリポジトリの orca.yaml は、ワークスペースが開始される前にマシン上で実行されます。このリポジトリを信頼する場合にのみ実行してください。",
+ "runSetupRepo": "{{repoName}} からセットアップを実行しますか?",
+ "repoNameS": "{{repoName}} のセットアップ スクリプトが変更されました",
+ "skip": "セットアップをスキップして作成する",
+ "runSetupCreate": "セットアップを実行して作成する",
+ "runSetupScript": "セットアップ スクリプトを実行しますか?",
+ "src": "src/レンダラーパッケージ/ui",
+ "directories": "ディレクトリ",
+ "renderer": "レンダラUI",
+ "name": "名前",
+ "editSparse": "スパースプリセットの編集",
+ "newSparse": "新規スパースプリセット",
+ "newPreset": "新規プリセット",
+ "useWhole": "リポジトリ全体を使用する",
+ "full": "フルチェックアウト",
+ "sparse": "スパースチェックアウト",
+ "noBranches": "一致するブランチはありません。",
+ "useRepositorys": "このリポジトリの構成済みベースを使用する",
+ "defaultBranch": "デフォルトのブランチ",
+ "searchBranches": "ブランチを検索",
+ "pick": "既存のブランチまたは参照を選択します。",
+ "startMessage": "開始日",
+ "connectRepository": "リポジトリに接続する",
+ "detecting": "agents を検出中...",
+ "repositoryNotFound": "リポジトリが見つかりません。",
+ "addGitRepositoryBeforeCreatingLinear": "Linear ワークスペースを作成する前に、Git リポジトリを追加します。",
+ "start": "から開始",
+ "advanced": "詳細設定",
+ "connectRepositoryFirst": "最初にリポジトリに接続します",
+ "optional": "[オプション]",
+ "workspaceName": "ワークスペース名",
+ "connect": "接続",
+ "connecting": "接続中...",
+ "ssh": "SSH 接続",
+ "createWorkspace": "ワークスペースの作成場所",
+ "your": "キーはホスト OS キーチェーンを介して暗号化され、ローカルに保存されます。",
+ "linearSettings": "リニア設定 / セキュリティ / 新規 API キー",
+ "personal": "個人用APIキー",
+ "paste": "Personal API キーを貼り付けて、そのワークスペースから問題を参照します。",
+ "connectLinearWorkspace": "リニアワークスペースを接続する",
+ "linearTeam": "リニアチーム",
+ "createIssue": "Issue の作成",
+ "addContext": "コンテキストを追加する",
+ "taskTitle": "タスクのタイトル",
+ "origin": "オリジン",
+ "upstream": "上流",
+ "issueSource": "Issue ソース",
+ "team": "チーム",
+ "createIssueSelectedLinear": "選択した Linear チームで Issue を作成します。",
+ "createIssueSelectedRepository": "選択したリポジトリに Issue を作成します。",
+ "sortTasks": "タスクの並べ替え",
+ "displayProperties": "表示プロパティ",
+ "orderLinearIssues": "順序 Linear Issue",
+ "groupLinearIssues": "グループの Linear Issue",
+ "linearView": "リニアビュー",
+ "noStates": "利用可能な州がありません",
+ "loadingStates": "状態を読み込み中...",
+ "changeStatus": "ステータスの変更",
+ "allTeams": "全チーム",
+ "chooseWhichTeams": "タスクに表示するチームを選択します。",
+ "linearTeams": "リニアチーム",
+ "failedSwitch": "ワークスペースの切り替えに失敗しました",
+ "linearWorkspace": "リニアワークスペース",
+ "linearFilter": "Linear フィルター",
+ "gitLabFilter": "GitLab フィルター",
+ "gitLabView": "GitLab ビュー",
+ "hidden": "カードから隠されている",
+ "shown": "カードに表示される",
+ "viewHas": "このビューには表示する追加のフィールドはありません。",
+ "chooseWhichProject": "アイテム カードに表示するプロジェクト フィールドを選択します。",
+ "projectFields": "プロジェクトフィールド",
+ "projectSort": "プロジェクトの並べ替え",
+ "orcaDoes": "Orca はこの GitHub プロジェクト レイアウトをまだサポートしていません。",
+ "projectView": "プロジェクトビュー",
+ "chooseProjectView": "プロジェクトビューの選択",
+ "noMore": "これ以上のプロジェクトはありません。",
+ "noMatchingProjects": "一致するプロジェクトはありません。",
+ "browseAll": "すべて閲覧する",
+ "browseAllLoading": "すべて参照 (読み込み中...)",
+ "pin": "ピン",
+ "recent": "最近の",
+ "remove": "削除",
+ "pinned": "固定された",
+ "tap": "タップして再試行します。",
+ "noProjects": "プロジェクトがロードされていません",
+ "failedLoadProjects": "プロジェクトのロードに失敗しました",
+ "useAdd": "URL による追加を使用して、不足しているプロジェクトにアクセスします。",
+ "some": "一部の組織は読み込まれませんでした ({{githubProjectPartialFailureCount}})。",
+ "couldNotLoadProjects": "{{owner}} からプロジェクトをロードできませんでした。",
+ "add": "追加",
+ "adding": "追加中...",
+ "addUrl": "URL または所有者/番号で追加",
+ "searchProjects": "プロジェクトを検索する",
+ "chooseProjectViewTasks": "[タスク] ページのプロジェクト ビューを選択します。",
+ "gitHubProjects": "GitHub プロジェクト",
+ "loads": "古い結果をロードします",
+ "loaded": "ロード済み",
+ "jump": "ロードされた、または利用可能な結果ページにジャンプします。",
+ "gitHubPages": "GitHub ページ",
+ "issues": "Issue",
+ "pullRequests": "PR",
+ "gitHubView": "GitHub ビュー",
+ "noAlternate": "利用できる代替の Issue ソースはありません。",
+ "chooseWhether": "各リポジトリがアップストリームまたはオリジンのどちらからクエリを実行して作業を作成するかを選択します。",
+ "gitHubIssue": "GitHub Issue ソース",
+ "allRepositories": "すべてのリポジトリ",
+ "chooseWhichRepositories": "クエリを実行するリポジトリを選択します。",
+ "repositories": "リポジトリ",
+ "taskSource": "タスクソース",
+ "next": "次のページ",
+ "pagePage": "ページ{{pageNumber}}",
+ "selectPagePageGithubCurrentPage": "ページを選択、ページ {{githubCurrentPage}}",
+ "previous": "前のページへ",
+ "changeStatusName": "ステータスを{{fromName}}から変更します",
+ "noProject": "プロジェクトアイテムがありません",
+ "browseProjects": "プロジェクトを参照",
+ "chooseGit": "GitHub プロジェクトを選択",
+ "connectLinear": "リニア接続",
+ "browseStart": "タスクから直接、割り当てられたリニアの問題を参照して作業を開始します。",
+ "connectYour": "Linear アカウントを接続する",
+ "mobile": "このモバイル タスク ビューには、新規デスクトップ ランタイムが必要です。",
+ "updateOrcaDesktop": "Orca デスクトップを更新する",
+ "subIssueData": "トークンではサブ Issue データを利用できません。",
+ "retry": "再試行",
+ "retrying": "再試行中...",
+ "retryLoading": "{{owner}}/{{repo}} からの問題の読み込みを再試行します",
+ "couldNotLoadIssues": "からの Issue を読み込めませんでした",
+ "searchProvider": "{{providerLabel}} タスクを検索...",
+ "searchProject": "プロジェクト ビューを検索...",
+ "display": "画面",
+ "tasks": "タスク",
+ "allWorkspaces": "すべてのワークスペース",
+ "viewOrder": "注文を見る",
+ "send": "コメントを送信",
+ "addComment": "コメントを追加",
+ "failedUpdateIssueSource": "Issue ソースの更新に失敗しました",
+ "failedCreateTask": "タスクの作成に失敗しました",
+ "failedCreateLinearSub": "Linear サブ Issue の作成に失敗しました",
+ "failedLoadLinearSub": "Linear サブ Issue の読み込みに失敗しました",
+ "failedAddLinear": "Linear コメントの追加に失敗しました",
+ "failedUpdateLinear": "リニアの Issue を更新できませんでした",
+ "failedMerge": "マージに失敗しました",
+ "gitHubReportsMergeConflictsOpen": "GitHub はマージ競合を報告しています。続行するには、GitHub で開きます。",
+ "failedReply": "返信できませんでした",
+ "failedAddReview": "レビューコメントの追加に失敗しました",
+ "unableComment": "PR ヘッドの SHA がないとコメントできません。",
+ "failedLoadFile": "ファイルコンテンツのロードに失敗しました",
+ "unableLoad": "この PR のファイル コンテンツをロードできません。",
+ "failedUpdateReview": "レビュー スレッドの更新に失敗しました",
+ "failedUpdateViewed": "表示状態の更新に失敗しました",
+ "unableSync": "この PR の表示状態を同期できません。",
+ "failedRerun": "チェックの再実行に失敗しました",
+ "failedRefresh": "チェックの更新に失敗しました",
+ "failedRequest": "レビュアーのリクエストに失敗しました",
+ "failedCopyText": "テキストのコピーに失敗しました",
+ "failedCopyLink": "リンクのコピーに失敗しました",
+ "failedAddComment": "コメントの追加に失敗しました",
+ "failedUpdateGitLab": "GitLab アイテムの更新に失敗しました",
+ "failedUpdateGitHubPull": "GitHub PR の更新に失敗しました",
+ "failedUpdateGitHubIssue": "GitHub の更新に失敗する問題",
+ "failedUpdateStatus": "ステータスの更新に失敗しました",
+ "failedMergePull": "PR のマージに失敗しました",
+ "failedUpdateIssueType": "Issue タイプの更新に失敗しました",
+ "projectIssue": "このプロジェクトの Issue タイプはモバイルからは編集できません。",
+ "failedUpdateProject": "プロジェクトフィールドの更新に失敗しました",
+ "failedUpdateItem": "アイテムの更新に失敗しました",
+ "projectItemCannot": "このプロジェクト アイテムはモバイルからは編集できません。",
+ "failedDelete": "コメントの削除に失敗しました",
+ "projectCommentCannotDeleted": "このプロジェクトのコメントはモバイルからは削除できません。",
+ "failedEdit": "コメントの編集に失敗しました",
+ "projectCommentCannotEdited": "このプロジェクトのコメントはモバイルからは編集できません。",
+ "addProject": "ワークスペースを作成する前に、プロジェクト アイテム リポジトリを Orca に追加します。",
+ "failedCreateWorkspace": "ワークスペースの作成に失敗しました",
+ "failedSave": "スパース プリセットの保存に失敗しました。",
+ "failedSearch": "ブランチの検索に失敗しました。",
+ "failedLoadSparse": "スパース プリセットのロードに失敗しました。",
+ "openShell": "シェルを開く",
+ "failedLoadIssue": "Issue タイプをロードできませんでした",
+ "failedLoadAssignees": "担当者のロードに失敗しました",
+ "failedLoadLabels": "ラベルのロードに失敗しました",
+ "failedLoadDetails": "詳細のロードに失敗しました",
+ "failedLoadLinearContext": "リニアコンテキストのロードに失敗しました",
+ "failedAddProject": "プロジェクトの追加に失敗しました。",
+ "expected": "プロジェクトの URL または所有者/番号が必要です。",
+ "failedSelect": "プロジェクトの選択に失敗しました",
+ "failedLoadProject": "プロジェクトビューのロードに失敗しました",
+ "failedLoadMore": "さらに GitHub タスクをロードできませんでした",
+ "connection": "接続に失敗しました",
+ "failedLoadTasks": "タスクのロードに失敗しました",
+ "failedLoadTasksSettings": "タスク設定のロードに失敗しました",
+ "updateOrcaDesktopUse": "モバイルでタスクを使用できるように Orca デスクトップを更新します。",
+ "addReview": "レビューコメントを追加",
+ "noText": "テキストの変更は見つかりませんでした。",
+ "groupRepository": "リポジトリごとにグループ化し、次に最新のアクティビティをグループ化します",
+ "newest": "最新のアクティビティを最初に",
+ "updated": "更新されました",
+ "pending": "保留中の GitLab todo",
+ "myTodos": "私のやるべきこと",
+ "mergeRequests": "リポジトリごとにリクエストと問題をマージする",
+ "projectMrs": "プロジェクト MR",
+ "reviewRequests": "自分に割り当てられたリクエストを確認する",
+ "needs": "レビュー待ち",
+ "pullRequestsAuthored": "あなたが作成した PR",
+ "mine": "私の",
+ "openPull": "オープンな PR",
+ "openIssuesAssigned": "あなたに割り当てられた未解決の問題",
+ "assignedMe": "私に割り当てられた Issue",
+ "openGitHubIssues": "GitHub に関する未解決の問題",
+ "gitHubProjectsViews": "GitHub プロジェクトのビュー",
+ "projects": "プロジェクト",
+ "gitHubPull": "GitHub PR",
+ "prs": "PR",
+ "gitHubIssues": "GitHub Issue",
+ "priority": "優先度",
+ "identifier": "識別子",
+ "noGrouping": "グループ化なし",
+ "grouped": "グループ化された列",
+ "board": "ボード",
+ "compact": "コンパクトな発行行",
+ "list": "リスト",
+ "recently": "最近完了した問題",
+ "completed": "完了",
+ "issuesCreated": "あなたが作成した問題",
+ "created": "作成されました",
+ "issuesAssigned": "あなたに割り当てられた問題",
+ "myIssues": "私の問題",
+ "openIssuesAcross": "接続されたワークスペース全体で未解決の問題を解決する",
+ "all": "全て",
+ "any": "任意の GitLab 状態",
+ "closedIssues": "クローズされた問題と MR",
+ "closed": "クローズ",
+ "mergedMerge": "マージされた MR",
+ "merged": "マージ済み",
+ "openIssuesMerge": "オープンな問題と MR",
+ "assignedTeam": "割り当てられた問題とチームの問題",
+ "issuesMerge": "問題と MR",
+ "issuesPull": "問題と PR",
+ "diffPreviewTruncated": "{{totalLineCount}} の差分行の最初の {{maxRenderedPrDiffLines}} を表示しています。",
+ "commentLine": "{{commentLine}}行にコメントしてください",
+ "source": "出典: {{githubIssueSourceLabel}}",
+ "sortGithub": "並べ替え: {{githubProjectSortLabel}}",
+ "fieldsGithub": "フィールド: {{githubProjectFieldsLabel}}",
+ "groupLinearGroup": "グループ: {{linearGroupLabel}}",
+ "orderLinearOrder": "注文: {{linearOrderLabel}}",
+ "preferred": "{{repoName}} では、アップストリームの優先 Issue ソースが利用できません。原点を使用します。",
+ "plus": "+{{githubProjectSummaryFieldCount}} フィールド",
+ "baseBranch": "{{baseBranch}}に",
+ "querying": "{{prs}} のクエリ",
+ "teamCount": "{{teamCount}} チーム",
+ "newProvider": "新規{{providerLabel}}問題",
+ "fileIssue": "{{issueSource}} のファイル",
+ "createRef": "{{refName}} から作成",
+ "branch": "ブランチ名: {{localBranchName}}",
+ "repoNameRequires": "{{repoName}} では、このワークスペースを作成する前にセットアップを選択する必要があります。",
+ "owner": "{{owner}}/{{repo}} は Orca に追加されません。デスクトップ アプリからこのリポジトリを追加し、モバイル タスクを更新します。",
+ "gitHubProject": "GitHub プロジェクト · {{repository}} {{projectNumber}}",
+ "base": "ベース",
+ "noType": "タイプなし",
+ "directory": "{{directoryCount}} ディレクトリ",
+ "oneDirectory": "1 ディレクトリ",
+ "remote": "リモートリポジトリ",
+ "selectRepository": "リポジトリを選択",
+ "linearIssue": "Linear Issue",
+ "items": "アイテム",
+ "openView": "GitHub でビューを開く",
+ "noLinear": "直線的なタスクはありません",
+ "noGitLab": "GitLab タスクはありません",
+ "noGitHub": "GitHub タスクがありません",
+ "noMatchingTasks": "一致するタスクはありません",
+ "connectHost": "ホストに接続してタスクをロードする",
+ "chooseProject": "プロジェクトを選択",
+ "oneTeam": "1チーム",
+ "workspace": "ワークスペース",
+ "fields": "フィールド",
+ "githubProject": "{{githubProjectSummaryFieldCount}}/{{githubProjectAvailableSummaryFieldCount}} フィールド",
+ "ascending": "昇順",
+ "descending": "降順",
+ "selectedHosted": "{{selectedHostedRepoCount}} リポジトリ",
+ "repositoryCountRepository": "{{repositoryCount}} リポジトリ",
+ "repositoryCountRepositories": "{{repositoryCount}} リポジトリ",
+ "allRepos": "すべてのリポジトリ",
+ "githubIssue": "{{githubIssueSourceRowCount}} ソース",
+ "selectTarget": "ターゲットの選択",
+ "workspaceSparse": "「{{workspaceSparseDraftNameCollisionName}}」はすでに存在します。",
+ "nameMust": "名前は 80 文字以下にする必要があります。",
+ "nameRequired": "名前は必須です。",
+ "repositoryHooks": "リポジトリフック",
+ "local": "ローカルフック",
+ "commentCountComment": "コメント {{commentCount}} 件",
+ "noCommentsYet": "まだコメントはありません",
+ "top": "トップレベルのコメント",
+ "reviewThread": "レビュースレッド",
+ "resolvedReviewThread": "解決されたレビュースレッド",
+ "review": "レビュー",
+ "resolvedReview": "解決されたレビュー",
+ "openLinear": "Linear で開く",
+ "openGitLab": "GitLab で開く",
+ "linearTicket": "リニア乗車券",
+ "todo": "{{todoTarget}} やるべきこと",
+ "mergeRequest": "MR",
+ "empty": "空の",
+ "mergePr": "PR #{{pullRequestNumber}} をマージしますか?",
+ "rebaseMergePr": "PR #{{pullRequestNumber}} をリベースしてマージしますか?",
+ "squashMergePr": "PR #{{pullRequestNumber}} を潰してマージしますか?",
+ "squashMerge": "スカッシュしてマージする",
+ "mergeRequestMessage": "MR",
+ "createMerge": "マージ commit の作成",
+ "rebaseMerge": "リベースとマージ",
+ "unknown": "未知",
+ "able": "マージ可能",
+ "blocked": "ブロック中",
+ "behind": "遅れ",
+ "conflicts": "競合",
+ "merge": "マージ",
+ "gitLabTodo": "GitLab のやるべきこと",
+ "locked": "ロックされています",
+ "draft": "下書き",
+ "redacted": "編集済み",
+ "resolvedThread": "{{commentAuthor}} によってスレッドが解決されました",
+ "resolvedComment": "{{commentAuthor}} によるコメントを解決しました",
+ "current": "現在および今後の予定",
+ "failedCount": "{{failedCount}}/{{repositoryCount}} をロードできませんでした。",
+ "noReviewers": "レビュアーがいません",
+ "changes": "変更要求",
+ "approved": "承認された",
+ "noDescription": "説明はありません。",
+ "default": "デフォルト",
+ "subtitle": "{{subtitle}} · デフォルト",
+ "unsupported": "モバイルでサポートされていないレイアウト",
+ "viewProject": "#{{projectViewNumber}} を表示",
+ "sortAscending": "昇順に並べ替えます",
+ "currently": "現在 {{currentSortDirection}} · {{nextSortDirection}} をタップ",
+ "usesGit": "GitHub のランク順を使用",
+ "usesSort": "{{sortFieldName}} {{sortDirection}} を使用します",
+ "failedCreateLinearIssue": "リニア Issue の作成に失敗しました",
+ "selectLinear": "最初にリニア チームを選択します。",
+ "failedCreateProvider": "{{provider}} Issue の作成に失敗しました",
+ "addGitRepositoryBeforeCreatingProvider": "{{provider}} Issue を作成する前に、Git リポジトリを追加。",
+ "failedCreateSub": "サブ Issue の作成に失敗しました",
+ "subIssueNot": "サブ Issue が見つかりません",
+ "failedReopen": "スレッドを再開できませんでした",
+ "failedResolve": "スレッドを解決できませんでした",
+ "failedSync": "表示された状態を GitHub と同期できませんでした。",
+ "invalid": "無効なチェックの応答",
+ "failedUpdateGitHubStatus": "GitHub ステータスの更新に失敗しました",
+ "failedUpdateGitHubItem": "GitHub アイテムの更新に失敗しました",
+ "selectedAgent": "選択した agent は無効になっています。作成する前に、有効な agent を選択。",
+ "connectDisplay": "ワークスペースを作成する前に {{displayName}} を接続してください。",
+ "failedConnectSsh": "SSH リポジトリへの接続に失敗しました。",
+ "failedRead": "SSH 接続状態の読み取りに失敗しました。",
+ "details": "詳細が見つかりません",
+ "projectHas": "このプロジェクトにはサポートされているビューがありません。",
+ "failedConnectLinear": "リニアの接続に失敗しました",
+ "failedLoadGitLab": "GitLab タスクのロードに失敗しました",
+ "failedLoadGitHub": "GitHub タスクのロードに失敗しました",
+ "iteration": "反復",
+ "unassigned": "未割り当て",
+ "editPreset": "{{presetName}}を編集",
+ "squashMergeConfirmation": "{{reviewType}} #{{pullRequestNumber}} をスカッシュしてマージしますか?",
+ "discussionComment": "{{commentCount}} コメント",
+ "selectPagePageGithubCurrentPageGithub": "ページを選択、{{githubTotalPages}} のページ {{githubCurrentPage}}",
+ "pageGithub": "ページ {{githubCurrentPage}} / {{githubTotalPages}}",
+ "confirm": "確認する",
+ "requested": "リクエスト済み",
+ "low": "低い",
+ "medium": "中くらい",
+ "high": "高い",
+ "urgent": "緊急",
+ "selected": "選択済み"
+ },
+ "accounts": {
+ "host": "ホスト",
+ "add": "デスクトップの [設定] → [アカウント] からアカウントを追加または再認証します。",
+ "loading": "アカウントを読み込み中…",
+ "accounts": "アカウント",
+ "seven": "7日",
+ "five": "5時間",
+ "use": "agent 独自のログインを使用する",
+ "system": "システムのデフォルト",
+ "could": "アカウントを切り替えられませんでした",
+ "hostNot": "ホストが見つかりません",
+ "invalid": "ホストからの無効なアカウントのスナップショット",
+ "connecting": "{{hostName}} に接続中…"
+ },
+ "edit": {
+ "accepts": "IP、host:port、または ws:// / wss:// を受け入れます。ポートが見つからない場合は、デフォルトで現在のポート (または 6768) が使用されます。",
+ "address": "アドレス",
+ "hostName": "ホスト名",
+ "name": "名前",
+ "connectionAddressDescription": "表示名または接続アドレスを変更します。アドレス編集では、この電話の接続先が切り替わるだけであり、再ペアリングはされません。これは、同じデスクトップが異なる IP で到達可能な場合 (たとえば、家庭 LAN と Tailscale) に使用します。",
+ "go": "戻る",
+ "save": "保存",
+ "saveHost": "ホストの保存",
+ "edit": "ホストの編集",
+ "back": "戻る",
+ "failedSave": "ホストの保存に失敗しました。",
+ "enter": "名前を入力します。",
+ "failedLoad": "ホストのロードに失敗しました。",
+ "hostRemoved": "このホストはこの電話から削除されました。",
+ "missing": "ホストが見つかりません。",
+ "connects": "{{endpoint}} に接続します"
+ },
+ "host": {
+ "removeHostName": "「{{hostName}}」を削除しますか?後で再ペアリングできます。",
+ "removeHost": "ホストの削除",
+ "delete": "削除",
+ "sleep": "寝る",
+ "cancel": "キャンセル",
+ "deleteWorktree": "ワークツリーを削除",
+ "repositories": "リポジトリ",
+ "hideDefault": "デフォルトのブランチを非表示にする",
+ "hideSleeping": "スリープ中を非表示",
+ "workspaces": "ワークスペース",
+ "clear": "フィルターをクリアする",
+ "filter": "フィルター",
+ "groupTitle": "グループ化",
+ "sort": "並べ替え",
+ "status": "状態",
+ "searchWorkspaces": "ワークスペースの検索",
+ "close": "検索を閉じる",
+ "new": "新規ワークスペース",
+ "floating": "フローティングワークスペース",
+ "tasks": "タスク",
+ "accounts": "アカウント",
+ "groupWorkspaces": "グループワークスペース",
+ "sortSelected": "{{selectedSortLabel}} で並べ替え",
+ "filterWorkspaces": "ワークスペースをフィルター",
+ "filterWorkspaces1": "ワークスペースをフィルター、1 件の有効なフィルター",
+ "filterWorkspacesActive": "ワークスペースをフィルター、{{activeFilterCount}} 件の有効なフィルター",
+ "hideSidebar": "サイドバーを隠す",
+ "reconnect": "再接続",
+ "back": "ホストに戻る",
+ "please": "もう一度試す。",
+ "could": "ホストを削除できませんでした",
+ "hostNot": "ホストが見つかりません",
+ "filterActive": "フィルター{{activeFilterCount}}",
+ "deleteDisplay": "「{{displayName}}」({{branch}}) を削除しますか?",
+ "noWorktrees": "ワークツリーなし",
+ "noWorktreesMatch": "フィルターに一致するワークツリーはありません",
+ "noMatching": "一致するワークツリーがありません",
+ "searchWorktreesAccessibility": "ワークツリーの検索",
+ "searchWorktrees": "ワークツリーを検索…",
+ "host": "ホスト",
+ "recent": "最近の",
+ "pin": "ピン",
+ "unpin": "固定を解除する",
+ "remove": "削除"
+ },
+ "quickCommandsTabButton": {
+ "quick": "クイックコマンド"
+ },
+ "worktreeId": {
+ "remove": "削除",
+ "removeCustom": "このカスタム ショートカットを削除しますか?",
+ "enterUrl": "URL を入力するか、新規タブの場合は空白のままにします。",
+ "newBrowser": "新規ブラウザ",
+ "terminalName": "Terminal 名",
+ "rename": "Terminal の名前を変更する",
+ "replace": "電話の下書きを最新のデスクトップ ファイルに置き換えますか?",
+ "discardChanges": "変更の破棄",
+ "discardLeave": "破棄して放置",
+ "copyAll": "すべてコピーしてそのままにする",
+ "copyDiscard": "出発前に電話の下書きをコピーまたは破棄してください。",
+ "unsaved": "保存されていない markdown の変更",
+ "refresh": "更新",
+ "copyPath": "パスのコピー",
+ "copyNotes": "メモをコピーする",
+ "choose": "現在のメモの agent セッションを選択します。",
+ "sendReviewNotes": "レビューメモを送信する",
+ "markdownNote": "Markdown ノート",
+ "browser": "ブラウザ",
+ "newTabTitle": "新規タブ",
+ "paste": "ペースト",
+ "create": "タブの作成",
+ "creating": "作成...",
+ "noTabs": "このセッションにはタブがありません",
+ "dismissWorkspace": "ワークスペース作成の警告を無視する",
+ "more": "その他のセッション操作",
+ "reconnect": "デスクトップに再接続する",
+ "back": "ワークツリーに戻る",
+ "agent": "Agent のプリセットは利用できません",
+ "noEnabled": "有効な Agents がありません",
+ "detecting": "検出剤",
+ "browserPage": "ブラウザ ページはまだ利用できません。",
+ "desktopUpdateRequiredMobile": "モバイルブラウザストリーミングにはデスクトップのアップデートが必要です",
+ "edit": "このクイックコマンドを実行する前に編集してください",
+ "selection": "選択がクリアされました (バッファからスクロールアウトされました)",
+ "couldNotCopy": "コピーできませんでした",
+ "copied": "コピーされました",
+ "couldNotClear": "terminal をクリアできませんでした",
+ "terminalCleared": "Terminal クリア",
+ "input": "入力が大きすぎます (最大 256 KiB)",
+ "openOrca": "ホスト上で Orca を開き、スリープ中の agents を起動します。",
+ "saved": "保存されました",
+ "couldNotCopyNotes": "メモをコピーできませんでした",
+ "notesCopied": "メモをコピーしました",
+ "failedDelete": "メモの削除に失敗しました",
+ "failedSaveNote": "メモの保存に失敗しました",
+ "note": "注記を追加しました",
+ "couldNotLoadMarkdown": "markdown を読み込めませんでした",
+ "titlePreview": "{{title}} プレビュー",
+ "titleImage": "{{title}}画像",
+ "send": "送信",
+ "sendReviewNotesAi": "レビューノートをAIに送信",
+ "copy": "コピー",
+ "copyReview": "レビューメモをコピーする",
+ "noReview": "レビューメモはありません",
+ "saveNote": "メモを保存する",
+ "cancel": "キャンセル",
+ "addReview": "レビューメモを追加",
+ "delete": "{{lineNumber}} 行目のメモを削除",
+ "addNote": "{{commentLine}}行にメモを追加",
+ "titleDiff": "{{title}} 差分行 {{lineNumber}}",
+ "save": "保存",
+ "discard": "破棄",
+ "retry": "再試行",
+ "line": "{{lineNumber}} 行目",
+ "shortcut": "ショートカット",
+ "file": "ファイル",
+ "sendCommand": "コマンドを送信する",
+ "type": "コマンドを入力してください…",
+ "typed": "入力されたテキストはアクティブな terminal に直接送信されます",
+ "show": "ライブ terminal 入力用のキーボードを表示する",
+ "addCustom": "カスタムショートカットを追加",
+ "pasteClipboard": "クリップボードから貼り付け",
+ "switchLive": "ライブ terminal 入力に切り替える",
+ "switchBuffered": "バッファされたコマンド入力に切り替える",
+ "switchPhone": "スマートフォンモードに切り替え",
+ "switchDesktop": "デスクトップモードに切り替える",
+ "hides": "ソフトウェア キーボードを非表示にし、現在の terminal セッションを開いたままにします。",
+ "dismissKeyboard": "キーボードを閉じる",
+ "loadingTerminal": "ローディング terminal",
+ "checking": "デスクトップの機能をチェックしています - しばらくしてからもう一度お試しください",
+ "desktopUpdateRequiredQuick": "クイックコマンドを実行するにはデスクトップのアップデートが必要です",
+ "newTab": "新規タブ",
+ "openSource": "オープンソース管理",
+ "openFile": "ファイルエクスプローラーを開く",
+ "couldNotSend": "メモを送信できませんでした",
+ "notesSent": "送信されたメモ",
+ "couldNotCopyDrafts": "下書きをコピーできませんでした",
+ "path": "コピーされたパス",
+ "verdict": "{{verdictDisplayLabel}} — タップして再試行します",
+ "visible": "{{visibleTabCount}} タブ",
+ "one": "1タブ",
+ "loadingTabs": "タブの読み込み中",
+ "browserCommand": "ブラウザコマンドが失敗しました",
+ "failedCreateBrowser": "ブラウザの作成に失敗しました",
+ "enterValid": "有効な URL を入力",
+ "failedCreateMarkdown": "markdown ノートの作成に失敗しました",
+ "quick": "クイックコマンド",
+ "failedCreateTerminal": "terminal の作成に失敗しました",
+ "saveFailed": "保存に失敗しました",
+ "couldNotLoadFile": "ファイルのプレビューを読み込めませんでした",
+ "couldNotLoadDiff": "差分プレビューを読み込めませんでした",
+ "fileToo": "ファイルが大きすぎてモバイルでプレビューできない",
+ "binary": "バイナリ プレビューは利用できません",
+ "dictation": "ディクテーションが挿入されました",
+ "changed": "デスクトップで変更されました",
+ "read": "読み取り専用",
+ "commentCountReviewNote": "{{commentCount}} レビューメモ",
+ "commentCountReviewNotes": "{{commentCount}} レビューノート",
+ "copyNotesInstead": "代わりにメモをコピーする",
+ "newAgent": "新規 agent セッション",
+ "check": "ホスト接続を確認してください",
+ "unableCreate": "無題の markdown ノートを作成できません",
+ "terminalInput": "Terminal 入力が別のクライアントによってロックされています。",
+ "failedSend": "メモの送信に失敗しました",
+ "failedSaveReview": "レビューメモの保存に失敗しました",
+ "waiting": "デスクトップを待っています...",
+ "unableRead": "markdown を読み取れません",
+ "sendKey": "{{keyLabel}} を送信",
+ "open": "オープン"
+ },
+ "layout": {
+ "changes": "変更点",
+ "agent": "Agent セッション履歴",
+ "source": "ソース管理",
+ "tasks": "タスク",
+ "accounts": "アカウント",
+ "edit": "ホストの編集"
+ },
+ "connectionHealth": {
+ "reconnecting": "再接続中…",
+ "cannotConnect": "接続できません",
+ "cannotReach": "デスクトップにアクセスできません",
+ "disconnected": "切断済み",
+ "connecting": "接続中…",
+ "connected": "接続済み",
+ "pairing": "ペアリングが無効です - デスクトップと再ペアリングします",
+ "check": "Tailscale を確認"
+ },
+ "hostEndpoint": {
+ "port": "ポートは 1 ~ 65535 である必要があります。",
+ "missing": "ホスト名がありません。",
+ "notValidAddress": "有効な住所ではありません。",
+ "notValidHostname": "有効なホスト名ではありません。",
+ "host": "ホストにはパスやクエリを含めることはできません。",
+ "use": "ws:// または wss:// (または host:port) を使用します。",
+ "enter": "ホストアドレスを入力します。"
+ },
+ "mobileRelayHostOverlay": {
+ "expected": "構成されたリレー メタデータには 1 つのエンドポイントが必要です",
+ "relayHost": "リレーホスト ID の不一致",
+ "relayIdentity": "リレー ID とエンドポイントは共存する必要があります"
+ },
+ "mobileRelayRpcStreams": {
+ "connection": "接続が中断されました"
+ },
+ "mobileConnectionPathLabel": {
+ "directLan": "ダイレクト・LAN",
+ "directTailscale": "ダイレクト · Tailscale"
+ },
+ "pairConfirmState": {
+ "not": "有効なペアリング コードではありません",
+ "missing": "ペアリングコードがありません"
+ },
+ "terminalAccessoryKeyCatalog": {
+ "clearLine": "カーソル前の行をクリア",
+ "delete": "単語を後方に削除",
+ "end": "行末",
+ "start": "行の始まり",
+ "reverse": "逆引き検索",
+ "suspend": "プロセスを一時停止する",
+ "clearScreen": "画面をクリアする",
+ "send": "EOFを送信",
+ "interrupt": "割り込み terminal",
+ "arrowRight": "右矢印",
+ "arrowLeft": "左矢印",
+ "arrowDown": "下矢印",
+ "arrowUp": "上矢印",
+ "forward": "前方削除",
+ "del": "デル",
+ "backspace": "バックスペース",
+ "space": "スペース",
+ "shiftTab": "シフトタブ",
+ "enter": "入力",
+ "tab": "タブ",
+ "escape": "逃げる",
+ "esc": "ESC"
+ },
+ "terminalWebviewEngineErrorState": {
+ "reload": "リロード",
+ "terminal": "Terminal のロードに失敗しました"
+ },
+ "terminalWebviewNotificationDispatch": {
+ "unknown": "不明な terminal エラー"
+ },
+ "terminalWebView": {
+ "terminalWebViewRender": "Terminal WebView レンダリング プロセスが終了しました",
+ "terminalWebViewHttp": "Terminal WebView HTTP エラー",
+ "terminalWebViewLoad": "Terminal WebView のロードに失敗しました"
+ },
+ "terminalAccessoryKeys": {
+ "pageDown": "ページダウン",
+ "pageUp": "ページアップ",
+ "end": "終わり",
+ "home": "ホーム",
+ "arrowRight": "右矢印",
+ "arrowLeft": "左矢印",
+ "arrowDown": "下矢印",
+ "arrowUp": "上矢印",
+ "insert": "入れる",
+ "pgDn": "PGDN",
+ "ins": "インス",
+ "shift": "シフト",
+ "alt": "代替"
+ },
+ "terminalWebviewReadyWatchdog": {
+ "terminal": "Terminal が初期化されませんでした - Terminal ビューから準備完了信号がありません"
+ },
+ "mobileSmartSourceModes": {
+ "all": "全て",
+ "closed": "クローズ",
+ "merged": "マージ済み",
+ "open": "オープン",
+ "name": "名前",
+ "branch": "ブランチ",
+ "smart": "スマート"
+ },
+ "sparsePresetDraft": {
+ "use": "ルート、絶対パス、親セグメントではなく、repo 相対ディレクトリを使用してください。",
+ "add": "少なくとも 1 つのディレクトリを追加します。"
+ },
+ "mobileGithubProjectGroupSort": {
+ "no": "いいえ{{fieldName}}",
+ "iteration": "反復"
+ },
+ "workspaceAgentSelection": {
+ "blank": "ブランク Terminal"
+ },
+ "workspaceSshGate": {
+ "disconnected": "切断済み",
+ "connection": "接続に失敗しました",
+ "reconnect": "再接続に失敗しました",
+ "authentication": "認証に失敗しました",
+ "reconnecting": "再接続中",
+ "deploying": "リレーの展開",
+ "connecting": "接続中",
+ "connected": "接続済み"
+ },
+ "mobileHostedCheckStatus": {
+ "passed": "{{passedCheckCount}}/{{totalCheckCount}} が合格しました",
+ "pending": "{{pendingCheckCount}} 保留中",
+ "review": "レビューが必要",
+ "reviewerCountReviewer": "レビュアー {{reviewerCount}} 人",
+ "reviewerCountReviewers": "レビュアー {{reviewerCount}} 人"
+ },
+ "worktreeCreateRetry": {
+ "failed": "ワークスペースの作成に失敗しました"
+ },
+ "useMobileComposerSource": {
+ "failed": "ベースブランチの解決に失敗しました。"
+ },
+ "linearMobileIssueRead": {
+ "unexpected": "予期しない Linear タスクの応答"
+ },
+ "codexResetAttemptJournal": {
+ "wsl": "WSL リセット スコープには正確なディストリビューションが必要です",
+ "host": "ホスト リセット スコープでは WSL ディストリビューションに名前を付けることができません"
+ },
+ "mobileBranchDiffPreviewDrawer": {
+ "diff": "モバイル プレビュー用に差分が切り詰められています。",
+ "unable": "差分をロードできません",
+ "close": "コミットされた差分プレビューを閉じる",
+ "committed": "ブランチにコミット"
+ },
+ "mobileCommitFailurePanel": {
+ "showDetails": "詳細を表示",
+ "hideDetails": "詳細を非表示",
+ "showCommit": "commit 失敗の詳細を表示する",
+ "hideCommit": "commit 失敗の詳細を非表示にする",
+ "fix": "修正",
+ "fixCommit": "AI による commit 失敗の修正",
+ "commitFailed": "Commit に失敗しました",
+ "commitFailedMessage": "Commit に失敗しました。"
+ },
+ "mobileGitHistoryList": {
+ "noCommits": "commits はありません。",
+ "retry": "再試行",
+ "waiting": "デスクトップを待っています...",
+ "noFile": "ファイルの変更はありません",
+ "failed": "履歴のロードに失敗しました"
+ },
+ "mobileSourceControlBranchCard": {
+ "unstaged": "{{unstagedCount}} が変更されました",
+ "staged": "{{stagedCount}} 件をステージしました",
+ "branch": "ブランチ上の{{branchCount}}"
+ },
+ "mobileSourceControlContent": {
+ "generate": "AIで commit メッセージを生成",
+ "cancel": "commit メッセージ生成のキャンセル",
+ "commitMessage": "Commit メッセージ",
+ "noStaged": "ステージングされたファイルはありません",
+ "commitMessageDisabled": "Commit メッセージが無効になりました。ステージングされたファイルはありません。",
+ "working": "ワーキングツリーはきれいです。",
+ "noLocal": "ローカルの変更はありません",
+ "open": "オープンソース管理操作",
+ "unstage": "すべてのステージを解除",
+ "stage": "ステージオール",
+ "reconnecting": "デスクトップに再接続しています..."
+ },
+ "mobileSourceControlFileRows": {
+ "openCommitted": "コミットされた変更 {{filePath}} を開く",
+ "loading": "コミットされた変更をロードしています...",
+ "committedBranch": "ブランチに Commit",
+ "discard": "{{path}} を破棄",
+ "stage": "ステージ{{path}}",
+ "unstage": "{{path}} のステージを解除",
+ "unresolved": "未解決の競合",
+ "openChanged": "変更されたファイル {{path}} を開く",
+ "old": "{{oldPath}}から",
+ "committedChanges": "コミットされた変更は利用できません。"
+ },
+ "mobileSourceControlHeader": {
+ "refresh": "ソース管理を更新する",
+ "openPullRequestWeb": "Web 上で PR を開く",
+ "openPullRequestPull": "ウェブ上で PR #{{pullRequestNumber}} を開く",
+ "source": "ソース管理",
+ "back": "セッションに戻る",
+ "close": "ソース管理を閉じる"
+ },
+ "mobileSourceControlModals": {
+ "openYourBrowser": "ブラウザで開きますか?",
+ "pull": "PR が作成されました",
+ "switch": "スイッチブランチ",
+ "discardChanges": "「{{path}}」への変更を破棄しますか?これを元に戻すことはできません。",
+ "discardChange": "変更を破棄する",
+ "source": "ソース管理",
+ "current": "現在",
+ "openYourBrowserCreated": "ブラウザで開きますか?\n\n{{createdPrWarning}}",
+ "open": "オープン",
+ "discard": "破棄"
+ },
+ "mobileSourceControlPanel": {
+ "retry": "再試行",
+ "unable": "ロードできません",
+ "source": "ソース管理が利用できません"
+ },
+ "mobileSourceControlPrChip": {
+ "create": "PR を作成する",
+ "loadingPullRequest": "PR を読み込んでいます…",
+ "pullRequestPull": "PR #{{pullRequestNumber}}、{{stateLabel}}、{{checkSummary}}{{commentSummary}}。PR をオープンします。",
+ "pullRequestUnavailable": "PR は利用できません: {{summaryMessage}}",
+ "loadingPullRequestMessage": "PR を読み込んでいます"
+ },
+ "mobileBranchCompare": {
+ "committed": "ブランチに Commit",
+ "changedFileCountFile": "{{changedFileCount}} ファイル",
+ "changedFileCountFiles": "{{changedFileCount}} ファイル"
+ },
+ "mobileCommitMessageAi": {
+ "failed": "commit メッセージの生成に失敗しました",
+ "no": "commit メッセージは生成されません"
+ },
+ "mobileCreatePrAction": {
+ "createPull": "PR の作成",
+ "branch": "このブランチはまだ {{reviewType}} の準備ができていません。",
+ "createReview": "{{reviewType}} を作成する"
+ },
+ "mobileHostedReviewCreateIntent": {
+ "branch": "PR の準備中にブランチが変更されました。",
+ "could": "commit メッセージを生成できませんでした。ソース管理に追加して、再試行してください。",
+ "resolveStage": "PR を作成する前に、変更を解決するかステージングしてください。",
+ "resolveConflicts": "PR を作成する前に競合を解決してください。",
+ "creating": "レビューを作成しています...",
+ "force": "リースを使用して強制的にプッシュします...",
+ "pushing": "commits をプッシュしています...",
+ "publishing": "ブランチを公開しています...",
+ "committing": "変更をコミットしています...",
+ "generating": "commit メッセージを生成中...",
+ "staging": "変更をステージしています...",
+ "failed": "変更のステージングに失敗しました"
+ },
+ "mobileHostedReviewService": {
+ "pushFailed": "プッシュに失敗しました。プッシュエラーを解決してから、再試行してください。",
+ "pushSucceeded": "プッシュは成功しましたが、{{reviewType}} の作成に失敗しました: {{errorMessage}}",
+ "failed": "PR の作成に失敗しました"
+ },
+ "mobileSourceControlActions": {
+ "switch": "分岐を切り替える",
+ "rebase": "ベースにリベースする",
+ "publishBranch": "ブランチを公開",
+ "fetch": "フェッチ",
+ "pushCreate": "PR のプッシュと作成",
+ "create": "PR を作成",
+ "commitSync": "Commit と同期",
+ "commitPush": "Commit とプッシュ",
+ "pullRequests": "この repo では PR を利用できません",
+ "checking": "ブランチのステータスを確認しています...",
+ "publishBranchFirst": "最初にブランチを公開する",
+ "enter": "commit メッセージを入力",
+ "stage": "少なくとも 1 つのファイルをステージングする",
+ "local": "ローカルコミットが失われます。代わりにプルしてください",
+ "nothingFast": "早送りするものはありません",
+ "fastForward": "早送り",
+ "fastForwardBehind": "早送り ({{behindCommitCount}})",
+ "branchAlready": "ブランチはすでに公開されています",
+ "branchUp": "ブランチは最新です",
+ "sync": "同期",
+ "syncBehind": "同期 (↓{{behindCommitCount}} ↑{{aheadCommitCount}})",
+ "nothingPull": "何も引っ張るものがない",
+ "pull": "プル",
+ "pullBehind": "プル ({{behindCommitCount}})",
+ "nothingPush": "押し付けるものは何もない",
+ "push": "プッシュ",
+ "pushAhead": "プッシュ ({{aheadCommitCount}})"
+ },
+ "useMobileCommitFailureRecovery": {
+ "failed": "agent の起動に失敗しました",
+ "waiting": "デスクトップを待っています..."
+ },
+ "useMobileCommitMessageGeneration": {
+ "failed": "commit メッセージの生成に失敗しました"
+ },
+ "useMobileCreatePrRunner": {
+ "check": "PR を作成する前にブランチをチェックアウトしてください。"
+ },
+ "useMobileSourceControlLoaders": {
+ "update": "モバイルでソース管理を使用できるように Orca デスクトップを更新します。",
+ "unableResolve": "比較のためのベース ブランチを解決できません。",
+ "unableLoadSource": "ソース管理をロードできません",
+ "unableLoadCommitted": "コミットされた変更をロードできません",
+ "waiting": "デスクトップを待っています...",
+ "connecting": "デスクトップに接続しています..."
+ },
+ "useMobileSourceControlOpeners": {
+ "waiting": "デスクトップを待っています...",
+ "unableOpen": "差分を開けません",
+ "unableLoad": "コミットされた差分をロードできません",
+ "binary": "バイナリ ブランチの差分プレビューはモバイルでは利用できません"
+ },
+ "useMobileSourceControlRunners": {
+ "source": "ソース管理操作が失敗しました"
+ },
+ "useMobileSourceControlCommitRunners": {
+ "source": "ソース管理操作が失敗しました",
+ "commit": "Commit に失敗しました"
+ },
+ "mobileSourceControlScreenState": {
+ "noUpstream": "上流はありません",
+ "ahead": "{{aheadCommitCount}} 前、{{behindCommitCount}} 後ろ",
+ "noBranch": "ブランチなし"
+ },
+ "mobileSourceControlConflictAbort": {
+ "abortMerge": "マージを中止",
+ "abortRebase": "リベースを中止",
+ "aborting": "中止中…"
+ },
+ "mobilePrChipSummary": {
+ "failing": "{{failingCheckCount}} は失敗しました",
+ "no": "チェックなし",
+ "unresolved": "未解決のチェック"
+ },
+ "mobilePrCreate": {
+ "branch": "このブランチはまだ {{reviewType}} の準備ができていません。",
+ "push": "{{reviewType}} を作成する前にベース ブランチをプッシュしてください。",
+ "creatingReviewTypeFork": "このフォークからの {{reviewType}} の作成はサポートされていません。",
+ "reviewTypeAlreadyExists": "このブランチには {{reviewType}} がすでに存在します。",
+ "creatingReviewTypeS": "この repo では {{reviewType}} の作成はサポートされていません。",
+ "authenticate": "認証してから {{reviewType}} を作成してください。",
+ "sync": "このブランチを同期してから {{reviewType}} を作成してください。",
+ "publish": "コミットを公開してから {{reviewType}} を作成してください。",
+ "switch": "{{reviewType}} を作成する前に、機能ブランチに切り替えてください。",
+ "check": "ブランチをチェックアウトしてから {{reviewType}} を作成してください。",
+ "commit": "変更をコミットしてから {{reviewType}} を作成してください。",
+ "orca": "Orca は、このブランチに既に {{reviewType}} があるかどうかを確認できませんでした。しばらくしてからもう一度試す。",
+ "reviewTypeCreated": "{{reviewType}} が作成されましたが、Orca はまだ更新できませんでした。",
+ "reviewTypePull": "{{reviewType}} #{{pullRequestNumber}} はすでにオープンしています。",
+ "reviewTypeAlreadyOpen": "{{reviewType}} はすでにオープンしています。"
+ },
+ "mobileSourceControlPrimaryAction": {
+ "nothing": "commit するものがありません。ブランチは最新です。",
+ "push": "プッシュ",
+ "pull": "プル",
+ "forcePushLease": "リモート ブランチを更新するには、リースを使用して強制的にプッシュします。",
+ "publishBranchOrigin": "このブランチをオリジンに公開します。",
+ "check": "commits を公開する前にブランチをチェックアウトしてください。",
+ "stageLeast": "少なくとも 1 つのファイルをステージングして commit します。",
+ "stageAllChanges": "すべての変更をステージングします。",
+ "enter": "commit するには commit メッセージを入力します。",
+ "commitStaged": "段階的な変更を Commit します。",
+ "resolve": "コミットする前に競合を解決してください。",
+ "try": "リモート操作が終了したら、もう一度試す。",
+ "remote": "遠隔操作中です。",
+ "forcePushProgress": "強制プッシュが進行中です。",
+ "commitProgress": "Commit が進行中です。",
+ "publishBranch": "ブランチを公開",
+ "sync": "同期",
+ "stageAll": "ステージオール",
+ "forcePush": "フォースプッシュ",
+ "pullBehind": "{{behindCommitCount}} を引いて、{{aheadCommitCount}} を押します。",
+ "pullCommitCountCommit": "{{commitCount}} commit をプルします。",
+ "pullCommitCountCommits": "{{commitCount}} commits をプルします。",
+ "pushCommitCountCommit": "{{commitCount}} commit をプッシュします。",
+ "pushCommitCountCommits": "{{commitCount}} commits をプッシュします。"
+ },
+ "mobileHostedReviewGitPreparation": {
+ "commit": "Commit に失敗しました",
+ "unable": "ソース管理を更新できません"
+ },
+ "mobilePrLink": {
+ "failedUpdateLinkedReview": "リンクされたレビューを更新できませんでした",
+ "failedUpdateLinkedPull": "リンクされた PR の更新に失敗しました"
+ },
+ "hostedReviewCopy": {
+ "mergeRequestTitle": "MR",
+ "mergeRequest": "MR",
+ "pullRequestTitle": "PR",
+ "pullRequest": "PR"
+ },
+ "mobileGitHistory": {
+ "months": "{{months}}月",
+ "just": "たった今",
+ "failed": "commit 履歴のロードに失敗しました"
+ },
+ "mobileGitStatus": {
+ "staged": "ステージ済みの変更",
+ "untracked": "追跡されていないファイル",
+ "changes": "変更点"
+ },
+ "mobileHostedReviewRemotePrerequisite": {
+ "failedForce": "リースを使用した強制プッシュに失敗しました",
+ "failedPush": "commits のプッシュに失敗しました",
+ "failedPublish": "ブランチの公開に失敗しました"
+ },
+ "mobileSourceControlHubTab": {
+ "pull": "PR",
+ "changes": "変更点"
+ },
+ "prComposeValidation": {
+ "base": "ベースブランチは head ブランチとは異なる必要があります。",
+ "choose": "ベースブランチを選択。",
+ "enter": "{{reviewType}} のタイトルを入力。",
+ "wait": "生成が完了するまで待ちます。"
+ },
+ "mobileBranchBaseRef": {
+ "unable": "ブランチベースを解決できません"
+ },
+ "useMobileGitRequests": {
+ "branch": "ブランチステータスが利用不可",
+ "commit": "Commit に失敗しました",
+ "source": "ソース管理操作が失敗しました",
+ "waiting": "デスクトップを待っています..."
+ },
+ "useMobileSourceControlActionSheetRunners": {
+ "no": "リベース先のベース ブランチがありません",
+ "waiting": "デスクトップを待っています..."
+ },
+ "mobileAgentWorkingIndicator": {
+ "agent": "Agent は働いています"
+ },
+ "mobileBrowserTabActionSheet": {
+ "reload": "リロード",
+ "forward": "進む",
+ "back": "戻る",
+ "browser": "ブラウザ"
+ },
+ "mobileNativeChatAsk": {
+ "next": "次へ",
+ "send": "回答を送信する",
+ "cancel": "キャンセル",
+ "type": "答えを入力してください",
+ "other": "他の…",
+ "step": "ステップ {{stepNumber}}"
+ },
+ "mobileNativeChatComposer": {
+ "send": "メッセージを送信する",
+ "dictate": "口述する",
+ "stop": "ディクテーションを停止する",
+ "attach": "画像を添付",
+ "remove": "画像を削除する",
+ "message": "メッセージ、@ファイル、/コマンド"
+ },
+ "mobileNativeChatMessage": {
+ "queued": "キュー待ち",
+ "scroll": "このメッセージを一番上までスクロールします",
+ "copy": "メッセージをコピーする",
+ "remaining": "… {{remainingToolCallCount}} 個以上のツール呼び出し",
+ "image": "画像",
+ "attached": "添付画像",
+ "callCountToolCall": "{{callCount}} ツール呼び出し",
+ "callCountToolCalls": "{{callCount}} ツール呼び出し"
+ },
+ "mobileNativeChatQuestion": {
+ "send": "返信を送信",
+ "typeYour": "返信を入力してください…",
+ "typeReply": "または返信を入力してください…",
+ "submitSelectedOptions": "選択したオプションを送信する",
+ "submitSelectedCommand": "送信{{selectedCommandCount}}",
+ "choose": "オプションを選択"
+ },
+ "mobileNativeChatView": {
+ "message": "メッセージ、@ファイル、/コマンド",
+ "waiting": "terminal を待っています…",
+ "reconnecting": "再接続中…",
+ "stop": "停止",
+ "stopAgent": "agent を停止",
+ "tools": "ツール",
+ "collapse": "折りたたむ",
+ "scroll": "最新までスクロール",
+ "load": "以前のメッセージをロードする"
+ },
+ "mobileSessionHeaderMoreActionsSheet": {
+ "checks": "チェック",
+ "agent": "Agent 履歴",
+ "open": "オープンな PR のチェック",
+ "browse": "agent セッションの参照と再開"
+ },
+ "mobileTerminalInputActions": {
+ "start": "音声ディクテーションを開始する",
+ "starting": "音声ディクテーションを開始する",
+ "cancel": "音声ディクテーションをキャンセルする",
+ "stop": "音声ディクテーションを停止する",
+ "long": "長押しすると代わりにファイルを添付できます",
+ "attach": "写真を添付する",
+ "sending": "画像送信"
+ },
+ "quickCommandEditorForm": {
+ "add": "クイックコマンドを追加",
+ "save": "保存",
+ "cancel": "キャンセル",
+ "project": "プロジェクト",
+ "global": "グローバル",
+ "scope": "範囲",
+ "submit": "テキストを挿入するだけでなく、すぐに送信してください。",
+ "append": "追加 Enter",
+ "advanced": "詳細設定",
+ "supports": "スキル、ファイル パス、組み込みコマンドをサポートします。",
+ "ask": "agent にこのワークスペースを調査するよう依頼します",
+ "command": "コマンドテキスト",
+ "prompt": "プロンプト",
+ "choose": "agent を選択",
+ "action": "操作",
+ "start": "開発サーバーを起動する",
+ "label": "ラベル",
+ "agentPrompt": "Agent プロンプト",
+ "terminal": "Terminal コマンド"
+ },
+ "quickCommandsList": {
+ "edit": "{{commandLabel}}を編集",
+ "run": "{{commandLabel}} を実行します",
+ "quick": "クイックコマンドの制限に達しました",
+ "new": "新規クイックコマンド",
+ "global": "グローバル",
+ "project": "このプロジェクト",
+ "noMatching": "一致するクイック コマンドはありません。",
+ "noQuick": "クイックコマンドはまだありません。",
+ "search": "クイックコマンドを検索..."
+ },
+ "quickCommandsSheet": {
+ "save": "terminal コマンドまたは agent プロンプトを保存して、すぐにアクセスできるようにします。",
+ "back": "戻る",
+ "quickCommand": "このクイック コマンドは保存されたリストから削除されます。",
+ "deleteDelete": "「{{deleteLabel}}」を削除しますか?",
+ "quickCommands": "クイックコマンド",
+ "choose": "Agent の選択",
+ "add": "クイックコマンドを追加",
+ "edit": "クイックコマンドの編集",
+ "delete": "削除",
+ "cancel": "キャンセル",
+ "untitled": "無題"
+ },
+ "githubPr": {
+ "failedUpdateReview": "レビュー スレッドの更新に失敗しました。",
+ "failedUpdateTitle": "タイトルの更新に失敗しました。",
+ "requestFailedRequest": "リクエストが失敗しました: {{requestMethod}}",
+ "requestFailedGithubResolve": "リクエストが失敗しました: github.resolveReviewThread",
+ "requestFailedGithubUpdate": "リクエストが失敗しました: github.updatePRTitle"
+ },
+ "mobileBulkCloseSheetActions": {
+ "close": "閉じる"
+ },
+ "mobileDiffReviewLoaders": {
+ "update": "Orca デスクトップを更新して、モバイルでの変更を確認します。",
+ "committedChangesResponse": "コミットされた変更の応答が無効でした",
+ "committedChangesFailed": "コミットされた変更が失敗しました",
+ "committedChangesUnavailable": "コミットされた変更は利用できません",
+ "committedDiff": "コミットされた差分は利用できません",
+ "diff": "差分応答が無効でした",
+ "unableLoadDiff": "差分をロードできません",
+ "unableLoadReview": "レビューノートを読み込めません",
+ "source": "ソース管理応答が無効でした",
+ "unableLoadChanges": "変更をロードできません"
+ },
+ "mobileDiffReviewQueue": {
+ "committed": "ブランチにコミット",
+ "unstaged": "未ステージ",
+ "staged": "ステージ済み"
+ },
+ "mobileNativeChatPermission": {
+ "permission": "許可が要求されました",
+ "allowAlways": "常に許可する",
+ "deny": "拒否",
+ "allow": "許可する",
+ "allowPermission": "{{permissionName}} を許可しますか?"
+ },
+ "mobileTabCloseSelection": {
+ "closeTabsRight": "右側のタブを閉じる",
+ "closeTabsLeft": "左側のタブを閉じる",
+ "closeOther": "他のタブを閉じる"
+ },
+ "mobileTerminalActionSheetActions": {
+ "close": "閉じる",
+ "clear": "クリア Terminal",
+ "rename": "名前を変更する",
+ "switchPhone": "電話に切り替える",
+ "switchDesktop": "デスクトップに切り替える"
+ },
+ "prActionsEngine": {
+ "failedMerge": "PR のマージに失敗しました。",
+ "failedRefresh": "PR の更新に失敗しました。"
+ },
+ "useMobileAttachmentInputLeaseGate": {
+ "attach": "アタッチに失敗しました (再接続)"
+ },
+ "useMobileDiffReviewCommentActions": {
+ "failedSaveReview": "レビューの保存に失敗しました",
+ "failedSaveReviewState": "レビュー状態の保存に失敗しました",
+ "waiting": "デスクトップを待っています..."
+ },
+ "diffReview": {
+ "waiting": "デスクトップを待っています...",
+ "missing": "ワークツリーがありません",
+ "unableLoadDiff": "差分をロードできません",
+ "unableLoadReview": "レビューを読み込めません"
+ },
+ "useMobileDiffReviewGitActions": {
+ "stagedFile": "{{stagedFileCount}} 件をステージ、{{failedFileCount}} 件失敗",
+ "waiting": "デスクトップを待っています...",
+ "source": "ソース管理操作が失敗しました",
+ "stagedReviewedFile": "レビュー済みファイル {{staged}} 件をステージしました",
+ "stagedReviewedFiles": "レビュー済みファイル {{staged}} 件をステージしました"
+ },
+ "useMobileDiffReviewSendActions": {
+ "waiting": "デスクトップを待っています...",
+ "reviewNotesSent": "送信されたメモを確認する",
+ "reviewNotesCopied": "コピーしたメモを確認する",
+ "unable": "agent セッションをロードできません",
+ "created": "作成された terminal 応答が無効でした",
+ "failedCreate": "terminal の作成に失敗しました",
+ "terminal": "Terminal 入力がロックされています",
+ "failedSend": "メモの送信に失敗しました"
+ },
+ "useMobileImageAttachment": {
+ "attachFailed": "アタッチに失敗しました",
+ "image": "画像が大きすぎて添付できません",
+ "photo": "写真の許可が拒否されました",
+ "attachFailedDisconnected": "アタッチ失敗(切断)"
+ },
+ "useMobileNativeChatImageAttachments": {
+ "attachFailed": "アタッチに失敗しました",
+ "image": "画像が大きすぎて添付できません",
+ "photo": "写真の許可が拒否されました",
+ "attachFailedDisconnected": "アタッチ失敗(切断)",
+ "messageNotSent": "メッセージは送信されませんでした",
+ "messageNotSentDisconnected": "メッセージは送信されませんでした (切断されました)"
+ },
+ "useMobilePrActions": {
+ "not": "未接続"
+ },
+ "useMobilePrAiTriage": {
+ "failed": "agent の起動に失敗しました",
+ "waiting": "デスクトップを待っています…"
+ },
+ "useMobilePrCommentActions": {
+ "comment": "コメント操作が失敗しました"
+ },
+ "useMobilePrTitleAction": {
+ "failed": "タイトルの更新に失敗しました。",
+ "not": "デスクトップに接続されていません。"
+ },
+ "useMobileTerminalPaste": {
+ "pasteFailed": "貼り付けに失敗しました",
+ "image": "画像が大きすぎて貼り付けられません",
+ "pasteFailedDisconnected": "貼り付けに失敗しました (切断されました)",
+ "pasteToo": "ペーストが大きすぎます (最大 256 KiB)",
+ "failed": "サイズ変更されたクリップボード画像のエンコードに失敗しました"
+ },
+ "useQuickCommands": {
+ "failedLoad": "クイックコマンドのロードに失敗しました",
+ "failedSave": "クイックコマンドの保存に失敗しました"
+ },
+ "mobileDiffReviewScreenModel": {
+ "all": "全て",
+ "unstaged": "未ステージ",
+ "staged": "ステージ済み",
+ "branch": "ブランチ",
+ "unsent": "未送信のメモ {{unsentCount}} 件",
+ "noteCountNote": "メモ {{noteCount}} 件",
+ "noteCountNotes": "メモ {{noteCount}} 件",
+ "unreviewed": "未レビュー",
+ "notes": "メモ"
+ },
+ "mobileTerminalLiveInputStatus": {
+ "live": "ライブ入力",
+ "starting": "マイクを開始します",
+ "processing": "処理",
+ "listening": "リスニング",
+ "tapShow": "タップしてキーボードを表示します",
+ "uploading": "画像をホストにアップロードしています",
+ "preparing": "マイクの準備中",
+ "transcribing": "デスクトップ上での文字起こし",
+ "tapMic": "マイクをタップして停止します"
+ },
+ "mobileNativeChatRenderData": {
+ "agent": "エージェント"
+ },
+ "useMobileDiffReviewInteractions": {
+ "unable": "セッション中に開けません"
+ },
+ "mobileTerminalTabAgent": {
+ "file": "ファイル",
+ "browser": "ブラウザ",
+ "new": "新規ブラウザ"
+ },
+ "worktreeLabel": {
+ "worktree": "ワークツリー"
+ },
+ "floatingWorkspace": {
+ "floating": "フローティングワークスペース"
+ },
+ "githubPrRpc": {
+ "request": "リクエストが失敗しました: {{requestMethod}}"
+ },
+ "mobileNativeChatStreamFrame": {
+ "transcript": "トランスクリプトストリームが失敗しました"
+ },
+ "mobileNativeChatToggleAction": {
+ "switchChat": "チャットビューに切り替える",
+ "switchTerminal": "terminal ビューに切り替える"
+ },
+ "mobileNativeChatPermissionSend": {
+ "responseNotSent": "応答が送信されませんでした",
+ "responseUnconfirmed": "応答が未確認 — 再試行する前にチャットを確認してください",
+ "responseNotSentDisconnected": "応答が送信されない (切断された)"
+ },
+ "mobilePrSidebarState": {
+ "unable": "PR を読み込めません"
+ },
+ "mobileSessionRouteHelpers": {
+ "pairing": "ペアリングが無効です",
+ "reconnecting": "再接続中",
+ "disconnected": "切断済み",
+ "connected": "接続済み",
+ "securing": "確保",
+ "connecting": "接続中"
+ },
+ "useMobileNativeChatAnswerSend": {
+ "answerNotSent": "回答は送信されませんでした",
+ "answerUnconfirmed": "回答は未確認です — 再試行する前にチャットを確認してください",
+ "answerPartly": "回答が部分的に送信されました - 再試行する前にチャットを確認してください",
+ "answerNotSentDisconnected": "回答が送信されませんでした (切断されました)"
+ },
+ "useMobileNativeChatCancelAsk": {
+ "cancelNotSent": "キャンセルは送信されませんでした",
+ "cancelUnconfirmed": "未確認でキャンセル — 再試行する前にチャットを確認してください",
+ "cancelNotSentDisconnected": "キャンセル未送信(切断)"
+ },
+ "useMobileNativeChatMessageSend": {
+ "messageNotSent": "メッセージは送信されませんでした",
+ "delivery": "配信が未確認 — 再試行する前にチャットを確認してください",
+ "messageNotSentDisconnected": "メッセージは送信されませんでした (切断されました)"
+ },
+ "useMobileNativeChatStop": {
+ "stopNotSent": "停止は送信されませんでした",
+ "stopUnconfirmed": "未確認で停止 — 再試行する前にチャットを確認してください",
+ "stopNotSentTerminal": "停止は送信されていません (terminal の準備ができていません)"
+ },
+ "aiVaultResumeLaunch": {
+ "terminal": "Terminal 入力がロックされています",
+ "failedSend": "再開コマンドの送信に失敗しました",
+ "created": "作成された terminal 応答が無効でした",
+ "failedCreate": "terminal の作成に失敗しました"
+ },
+ "aiVaultResumePreparation": {
+ "could": "このレガシー Codex セッションを準備できませんでした。再開を再試行してください。"
+ },
+ "mobileClipboardImage": {
+ "clipboard": "クリップボードの画像コンテンツはbase64である必要があります"
+ },
+ "prAiTriageLaunch": {
+ "terminal": "Terminal 入力がロックされています",
+ "failedSend": "プロンプトの送信に失敗しました",
+ "created": "作成された terminal 応答が無効でした",
+ "failedCreate": "terminal の作成に失敗しました"
+ },
+ "voiceModelList": {
+ "delete": "{{commandLabel}} を削除",
+ "useMessage": "使用",
+ "use": "使用中",
+ "set": "デスクトップにセットアップする",
+ "api": "APIキーセット",
+ "recommended": "推奨"
+ },
+ "authFailedBanner": {
+ "remove": "削除",
+ "re": "修理",
+ "retry": "再試行",
+ "authentication": "認証に失敗しました — まず再接続してみてください。失敗し続ける場合は、デスクトップから再ペアリングします。"
+ },
+ "codexResetCreditAction": {
+ "useReset": "リセットを使用する",
+ "resetting": "リセット中…",
+ "usesOneEarnedResetActive": "アクティブな Codex アカウントに対して 1 つの獲得リセットを使用します",
+ "usesOneEarnedResetScope": "{{scopeLabel}} の獲得リセットを 1 つ使用します",
+ "useCodex": "Codex レート制限リセットを使用する",
+ "resettingCodex": "Codex のレート制限のリセット",
+ "earned": "獲得した Codex レート制限のリセット"
+ },
+ "customKeyModal": {
+ "addShortcut": "ショートカットを追加",
+ "press": "Enterを押してください",
+ "command": "コマンド",
+ "label": "ラベル",
+ "add": "追加",
+ "more": "その他のキー — Tab、矢印、F1 ~ F12…",
+ "key": "鍵",
+ "modifiers": "修飾子",
+ "show": "ショートカット キーの表示、非表示、または並べ替え",
+ "manage": "ショートカットの管理",
+ "send": "カスタム テキスト コマンドを送信する",
+ "text": "テキストマクロ",
+ "build": "Ctrl、Alt、Shift キー コードを作成する",
+ "shortcut": "ショートカットコンボ",
+ "back": "戻る",
+ "function": "関数",
+ "navigation": "ナビゲーション",
+ "editing": "編集",
+ "eGPnpm": "例: pnpm build",
+ "eGBuild": "例えば建てる",
+ "pick": "キーを選択してください"
+ },
+ "dragReorderList": {
+ "moveDown": "下に移動",
+ "moveUp": "上に移動",
+ "use": "上に移動および下に移動操作を使用して、ドラッグせずに順序を変更します。",
+ "drag": "ドラッグして並べ替えます"
+ },
+ "hostProtocolGate": {
+ "checking": "ホストの互換性を確認する",
+ "use": "useHostProtocolGate は 内で使用する必要があります"
+ },
+ "mobileDictationSetupSheet": {
+ "download": "ダウンロード",
+ "useMessage": "使用",
+ "use": "使用中",
+ "setUpDesktop": "デスクトップにセットアップする",
+ "api": "APIキーセット",
+ "extracting": "· 抽出中…",
+ "recommended": "推奨",
+ "dictation": "ディクテーションが有効になっています",
+ "setupInstructions": "モデルをダウンロードし、デスクトップでディクテーションを有効にします。すべてここから行います。",
+ "setUpVoice": "音声ディクテーションを設定する",
+ "couldNotUpdate": "更新できませんでした",
+ "couldNotSelect": "モデルを選択できませんでした",
+ "failed": "ロードに失敗しました"
+ },
+ "mobileDiffReviewBody": {
+ "retry": "再試行",
+ "retryLoading": "レビューの読み込みを再試行してください",
+ "diffTruncated": "モバイル プレビュー用に差分が切り詰められています。",
+ "loadingDiff": "差分を読み込み中...",
+ "try": "別のレビュー フィルターを試す。",
+ "no": "レビュー可能な変更はありません",
+ "unable": "レビューを読み込めません",
+ "review": "レビューは利用できません",
+ "loadingReview": "レビューを読み込み中...",
+ "diffUnavailable": "差分が利用できません",
+ "deleted": "削除されたファイル",
+ "diffTooLarge": "差分が大きすぎます",
+ "binary": "バイナリ差分",
+ "select": "確認するファイルを選択します。",
+ "fileDeleted": "このファイルは削除されました。ファイルメモを追加するか、レビュー済みとしてマークします。",
+ "diffTooLargeMobile": "この差分はモバイル プレビューには大きすぎます。",
+ "fileCannot": "このファイルはモバイルではテキストとしてレンダリングできません。"
+ },
+ "mobileDiffReviewDrawers": {
+ "sendNotes": "メモを送信する",
+ "sendNotesAgent": "メモを agent に送信する",
+ "stageReviewed": "ステージレビュー",
+ "stageReviewedFilesAccessibility": "ステージレビューされたファイル",
+ "reviewComplete": "レビュー完了",
+ "save": "保存",
+ "delete": "削除",
+ "deleteNote": "メモの削除",
+ "reviewNote": "レビューメモ",
+ "cancel": "メモをキャンセルする",
+ "file": "ファイルメモ",
+ "line": "{{lineNumber}} 行目",
+ "add": "メモを追加",
+ "edit": "メモの編集",
+ "open": "セッションで開く",
+ "mark": "未レビューとしてマークする",
+ "stageReviewedFiles": "ステージレビューされたファイル",
+ "clear": "送信済みメモをクリアする",
+ "sendUnsent": "未送信のメモを送信する",
+ "copy": "メモをコピーする",
+ "new": "新規 Agent セッション",
+ "discardChanges": "「{{filePath}}」への変更を破棄しますか?これを元に戻すことはできません。",
+ "discardFile": "ファイルを破棄する",
+ "reviewedFileCountReviewed": "{{reviewedFileCount}} レビュー済みのステージングされていないファイルはステージング可能",
+ "reviewActions": "レビュー操作",
+ "saveNote": "{{lineNumber}} 行目にメモを保存",
+ "unsent": "{{unsentCommentCount}} 未送信のメモ",
+ "loading": "agent セッションをロード中...",
+ "reviewedFileCountFileReviewedNoteCountNote": "{{reviewedFileCount}} ファイルを確認、{{noteCount}} メモ",
+ "reviewedFileCountFileReviewedNoteCountNotes": "{{reviewedFileCount}} ファイルを確認、{{noteCount}} メモ",
+ "reviewedFileCountFilesReviewedNoteCountNote": "{{reviewedFileCount}} ファイルをレビュー、{{noteCount}} メモ",
+ "reviewedFileCountFilesReviewedNoteCountNotes": "{{reviewedFileCount}} ファイルをレビュー、{{noteCount}} メモ",
+ "discard": "破棄"
+ },
+ "mobileDiffReviewFileSummary": {
+ "hunk": "ハンク",
+ "next": "次のハンク",
+ "previous": "前のハンク",
+ "stale": "古い",
+ "edit": "ファイルメモを編集する",
+ "changed": "変更されました",
+ "reviewed": "レビュー済み",
+ "old": "{{oldPath}}から",
+ "staleNote": "{{staleNoteCount}} は古いです"
+ },
+ "mobileDiffReviewFooter": {
+ "next": "次のファイル",
+ "markReviewed": "レビュー済みとしてマークする",
+ "reviewed": "レビュー済み",
+ "markFile": "ファイルをレビュー済みとしてマークする",
+ "note": "注記",
+ "add": "ファイルメモを追加",
+ "previous": "前のファイル",
+ "discard": "破棄",
+ "discardFile": "ファイルを破棄する",
+ "unstage": "アンステージ",
+ "unstageFile": "ファイルのステージングを解除する",
+ "stage": "ステージ",
+ "stageFile": "ファイルをステージ"
+ },
+ "mobileDiffReviewHeader": {
+ "show": "{{mobileReviewFilterLabel}} レビュー ファイルを表示",
+ "openReview": "オープンレビュー操作",
+ "openPull": "PR のサイドバーを開く",
+ "changes": "変更点",
+ "back": "戻る",
+ "reviewed": "{{reviewedCount}}/{{queueLength}} をレビューしました"
+ },
+ "mobileDiffReviewLine": {
+ "edit": "{{lineNumber}} 行目のメモを編集してください",
+ "add": "{{newLineNumber}}行にメモを追加",
+ "context": "コンテキスト",
+ "deleted": "削除されました",
+ "added": "追加した",
+ "lineLabelLineLine": "{{lineLabel}} 行 {{lineNumber}}",
+ "lineLabelLine": "{{lineLabel}}行"
+ },
+ "mobileHostCard": {
+ "update": "デスクトップ Orca を更新し、どこからでも接続できるようにサインインします",
+ "worktreeCountWorktree": "{{worktreeCount}} ワークツリー",
+ "worktreeCountWorktrees": "{{worktreeCount}} 件のワークツリー",
+ "active": "{{activeWorktreeCount}} アクティブ"
+ },
+ "mobileHtmlPreview": {
+ "view": "HTMLソースを表示する",
+ "preview": "プレビュー",
+ "previewRendered": "レンダリングされた HTML をプレビューする"
+ },
+ "mobileMarkdown": {
+ "x": "[×]",
+ "hiddenColumn": "{{hiddenColumnCount}} その他の列",
+ "hiddenRow": "{{hiddenRowCount}} 行追加",
+ "open": "画像を開く",
+ "image": "画像"
+ },
+ "mobilePrsidebar": {
+ "retry": "再試行",
+ "retryLoading": "PR の読み込みを再試行します",
+ "loading": "PR を読み込んでいます…",
+ "not": "許可されていません - GitHub アカウントが接続されていません。",
+ "something": "何か問題が発生しました。"
+ },
+ "mobileRichMarkdownEditor": {
+ "code": "コードブロック",
+ "inline": "インラインコード",
+ "image": "画像",
+ "link": "リンク",
+ "quote": "引用",
+ "checklist": "チェックリスト",
+ "numbered": "番号付きリスト",
+ "bullet": "箇条書きリスト",
+ "strike": "取り消し線",
+ "italic": "イタリック",
+ "bold": "太字",
+ "body": "体"
+ },
+ "mobileWorkspaceNameInput": {
+ "workspace": "ワークスペース名"
+ },
+ "newWorkspaceFab": {
+ "new": "新規ワークスペース"
+ },
+ "newWorktreeModal": {
+ "repository": "リポジトリ",
+ "create": "ワークスペースの作成",
+ "connectRepository": "リポジトリに接続する",
+ "runSetup": "セットアップコマンドを実行する",
+ "skip": "スキップ",
+ "run": "走る",
+ "setup": "セットアップスクリプト",
+ "note": "注記",
+ "advanced": "詳細設定",
+ "connectRepositoryFirst": "最初にリポジトリに接続します",
+ "connect": "接続",
+ "connecting": "接続中...",
+ "ssh": "SSH 接続",
+ "workspace": "ワークスペース名",
+ "name": "名前または「作成元」",
+ "no": "リポジトリが見つかりません",
+ "pick": "リポジトリと agent を選択して、新規ワークスペースを起動します。",
+ "failedTrust": "セットアップ スクリプトを信頼できませんでした。",
+ "failedCreate": "ワークスペースの作成に失敗しました",
+ "choose": "セットアップ スクリプトを実行するかどうかを選択します。",
+ "selected": "選択した agent は無効になっています。作成する前に、有効な agent を選択。",
+ "write": "メモを書く",
+ "remote": "リモートリポジトリ",
+ "select": "リポジトリを選択",
+ "failedConnect": "SSH リポジトリへの接続に失敗しました。",
+ "failedRead": "SSH 接続状態の読み取りに失敗しました。",
+ "connectDisplay": "ワークスペースを作成する前に {{displayName}} を接続してください。"
+ },
+ "protocolBlockScreen": {
+ "back": "ホストに戻る",
+ "openGit": "オープンな GitHub リリース",
+ "openApp": "アプリストアを開く",
+ "updateOrcaYour": "コンピュータ上の Orca を更新する",
+ "updateOrcaMobile": "Orca モバイルをアップデートする"
+ },
+ "setupHookTrustDrawer": {
+ "do": "走らないで",
+ "always": "常に信じて走ってください",
+ "runHooks": "フックを実行する",
+ "setup": "セットアップスクリプト",
+ "new": "新規セットアップ スクリプト",
+ "repositorys": "このリポジトリの orca.yaml は、ワークスペースが開始される前に実行されます。このリポジトリを信頼する場合にのみ実行してください。",
+ "runSetup": "{{repoName}} からセットアップを実行しますか?",
+ "repo": "{{repoName}} のセットアップ スクリプトが変更されました"
+ },
+ "smartWorkspaceAdvancedFields": {
+ "derived": "名前の由来",
+ "branch": "ブランチ名",
+ "workspace": "ワークスペース名",
+ "name": "名前",
+ "reuse": "ブランチ「{{reuseEligibleBranch}}」を再利用します"
+ },
+ "smartWorkspaceSourceDrawer": {
+ "typeName": "名前を入力するか、ソースを検索します",
+ "typeWorkspace": "下のフィールドにワークスペース名を入力します。",
+ "ssh": "この SSH repo には、問題と PR をリストするための GitHub リモートが必要です。",
+ "connect": "リポジトリを検索ソースに接続します。",
+ "cancel": "キャンセル",
+ "done": "完了",
+ "name": "名前または「作成元」",
+ "item": "このアイテムは {{owner}}/ {{repo}} にあります。",
+ "switch": "{{displayName}} に切り替えます",
+ "no": "結果が見つかりませんでした。"
+ },
+ "smartWorkspaceSourceField": {
+ "type": "名前を入力するか、ソースを検索します",
+ "optional": "[オプション]"
+ },
+ "smartWorkspaceSourceRow": {
+ "new": "新規ブランチ",
+ "create": "ブランチ「{{rowName}}」を作成します",
+ "name": "このワークスペースに名前を付けます",
+ "use": "「{{rowName}}」を使用してください",
+ "issue": "問題 #",
+ "pr": "PR 番号"
+ },
+ "terminalShortcutSettings": {
+ "create": "キーコンボまたはテキストマクロを作成する",
+ "add": "カスタムショートカットを追加…",
+ "no": "カスタム ショートカットはまだ定義されていません。",
+ "custom": "カスタムショートカット",
+ "show": "すべての組み込みショートカット キーを元の順序で表示します",
+ "reset": "デフォルトにリセット",
+ "toggle": "キーを切り替えて表示または非表示にし、グリップを押したままキーを terminal のショートカット バー上の希望の順序にドラッグします。",
+ "shortcut": "ショートカットバー"
+ },
+ "textInputModal": {
+ "cancel": "キャンセル",
+ "save": "保存"
+ },
+ "workspaceDetailPlaceholder": {
+ "pick": "サイドバーからワークスペースを選択して、ここでその terminal を開きます。",
+ "no": "開いているワークスペースがありません"
+ },
+ "worktreeListRow": {
+ "child": "子供",
+ "folder": "フォルダ"
+ },
+ "accountsSnapshot": {
+ "inactiveCodex": "非アクティブな Codex 制限で間違ったプロバイダー ID が使用される",
+ "inactiveClaude": "非アクティブな Claude 制限は間違ったプロバイダー ID を使用します",
+ "codex": "Codex 制限で間違ったプロバイダー ID が使用される",
+ "claude": "Claude 制限で間違ったプロバイダー ID が使用される",
+ "wslCodex": "WSL Codex アカウントには正確なディストリビューションが必要です",
+ "hostCodex": "ホスト Codex アカウントでは WSL ディストリビューションに名前を付けることができません",
+ "wslRate": "WSL レート制限ターゲットには正確なディストリビューションが必要です",
+ "hostRate": "ホストのレート制限ターゲットは WSL ディストリビューションに名前を付けることができません",
+ "invalid": "ホストからの無効なアカウントのスナップショット"
+ },
+ "codexResetCredit": {
+ "account": "このアカウントには獲得可能なリセット クレジットがありません。",
+ "noReset": "利用可能なリセットはありません",
+ "noEligible": "適格な Codex レート制限ウィンドウが使い果たされていません。",
+ "nothing": "リセットするものは何もありません",
+ "codex": "Codex の使用法が更新されました。",
+ "resetAlready": "リセットはすでに適用されています",
+ "rate": "レート制限のリセット",
+ "resetCountResets": "{{resetCount}} 回のリセットが利用可能",
+ "resetCountReset": "{{resetCount}} 回のリセットが利用可能",
+ "expiresNow": "今、期限切れになります",
+ "expiresDuration": "有効期限まで {{duration}}",
+ "nextExpiresNow": "次の有効期限は今です",
+ "nextExpiresDuration": "次の有効期限まで {{duration}}",
+ "invalid": "ホストからの無効なリセット応答"
+ },
+ "mountedBottomDrawer": {
+ "dismiss": "ドロワーを閉じる"
+ },
+ "newWorktreeAgentSelection": {
+ "blank": "ブランク Terminal"
+ },
+ "useCodexResetCreditAction": {
+ "spends": "これにより、{{confirmedLabel}} の獲得リセットが 1 回消費され、対象となるレート制限ウィンドウがすぐにリセットされます。",
+ "useRate": "レート制限のリセットを使用しますか?",
+ "could": "レート制限をリセットできませんでした",
+ "account": "ホストが Codex に連絡する前に、アカウントまたはリセット オファーが変更されました。更新された詳細を確認し、再度確認します。{{cleanupWarning}}",
+ "reset": "リセットの詳細が変更されました",
+ "useReset": "リセットを使用する",
+ "cancel": "キャンセル",
+ "host": "ホストはこの試行を確認しましたが、この電話は再試行レコードをクリアできませんでした。後で再試行すると、同じ安全な操作 ID が再利用されます。",
+ "phone": "このスマートフォンは、破棄された再試行レコードをクリアできませんでした。再試行しても安全ですが、このアカウントの新規リセットを確認するには、レコードをクリアする必要があります。",
+ "identityWsl": "WSL の {{identity}} {{wslDistro}}",
+ "identityHost": "ホスト上の{{identity}}"
+ },
+ "mobileLinkPrForm": {
+ "linkPull": "リンク PR",
+ "linkLinked": "リンク #{{linkedItemNumber}}",
+ "pull": "#123 または https://github.com/owner/repo/pull/123",
+ "pr": "PR 番号または GitHub URL",
+ "cancel": "キャンセル",
+ "linkExisting": "既存の PR をリンクする"
+ },
+ "mobilePrComposeForm": {
+ "createReview": "{{reviewType}} を作成する",
+ "createDraftReview": "ドラフト {{reviewType}} を作成する",
+ "pushCreateReview": "プッシュして{{reviewType}}を作成",
+ "pushCreateDraft": "プッシュしてドラフトを作成 {{reviewType}}",
+ "createDraft": "下書きとして作成",
+ "base": "ベース",
+ "generatingTitle": "タイトルと説明を生成しています…",
+ "reviewTypeDescription": "{{reviewType}} の説明",
+ "description": "説明 (オプション)",
+ "reviewTypeTitle": "{{reviewType}} タイトル",
+ "title": "タイトル",
+ "cancel": "キャンセル",
+ "generate": "生成",
+ "generating": "生成中…",
+ "failed": "PR フィールドの生成に失敗しました",
+ "new": "新規 {{reviewType}}",
+ "generateReview": "AI を使用して {{reviewType}} の詳細を生成する"
+ },
+ "mobilePrViewPanel": {
+ "current": "現在のブランチは利用できません。",
+ "hosted": "このプロバイダーではホストされたレビュー パネルを利用できません。"
+ },
+ "practionsSection": {
+ "unlink": "リンクを解除する",
+ "unlinkPull": "PR のリンクを解除する",
+ "reopenPullRequestAccessibility": "PR を再開する",
+ "closePullRequestAccessibility": "PR を閉じる",
+ "off": "オフ",
+ "on": "オン",
+ "toggle": "自動マージの切り替え",
+ "auto": "準備ができたら自動マージ",
+ "mergePullRequestAccessibility": "PR をマージする",
+ "pullRequestNumberWillReopened": "#{{pullRequestNumber}} は再開されます。",
+ "reopenPullRequest": "PR を再開しますか?",
+ "pullRequestNumberWillClosed": "#{{pullRequestNumber}} は結合せずに閉じられます。",
+ "closePullRequest": "PR を閉じますか?",
+ "will": "これにより、#{{pullRequestNumber}} がそのベース ブランチにマージされます。",
+ "mergePullRequest": "PR をマージしますか?",
+ "failed": "PR のリンクを解除できませんでした。",
+ "merge": "マージ"
+ },
+ "prcheckDetail": {
+ "showingFirst100": "最初の 100 件のジョブを表示しています",
+ "showingFirst20": "最初の 20 個の注釈を表示",
+ "annotations": "注釈",
+ "no": "詳細はありません。"
+ },
+ "prchecksSection": {
+ "open": "ウェブ上で{{checkName}}を開く",
+ "check": "{{checkName}} 詳細を確認する",
+ "fix": "修正",
+ "fixFailing": "失敗したチェックを AI で修正する",
+ "inspect": "詳細を検査するか、AI 修正パスを開始します。",
+ "rerun": "失敗したチェックを再実行する",
+ "checks": "チェック",
+ "failingCheckCountFailingCheck": "{{failingCheckCount}} チェックに失敗しました",
+ "failingCheckCountFailingChecks": "{{failingCheckCount}} チェックに失敗しました",
+ "failed": "チェックの詳細をロードできませんでした"
+ },
+ "prcommentCard": {
+ "permanently": "これにより、GitHub 上のコメントが完全に削除されます。",
+ "deleteCommentTitle": "コメントを削除しますか?",
+ "write": "返信を書いてください…",
+ "resolve": "解決",
+ "unresolve": "未解決",
+ "resolveThread": "スレッドを解決する",
+ "unresolveThread": "未解決のスレッド",
+ "delete": "削除",
+ "deleteComment": "コメントの削除",
+ "edit": "編集",
+ "editCommentAccessibility": "コメントの編集",
+ "reply": "返事",
+ "replyComment": "コメントに返信",
+ "editComment": "コメントを編集…",
+ "resolved": "解決済み",
+ "save": "保存"
+ },
+ "prcommentComposer": {
+ "cancel": "キャンセル"
+ },
+ "prcommentsSection": {
+ "add": "コメントを追加…",
+ "noComments": "コメントはまだありません。",
+ "couldNotLoadComments": "コメントを読み込めませんでした。再試行するには、「更新」をタップします。",
+ "comments": "コメント",
+ "noDescription": "説明はありません。",
+ "couldNotLoadDescription": "説明を読み込めませんでした。再試行するには、「更新」をタップします。",
+ "description": "説明",
+ "showVisible": "全 {{remaining}} 件中、さらに {{visibleCommentCount}} 件を表示",
+ "showRemaining": "さらに {{remainingCommentCount}} 件を表示",
+ "resolvedThreadAuthor": "{{author}} によってスレッドが解決されました",
+ "resolvedThreadAuthorReply": "{{author}} ({{replyCount}}) によってスレッドが解決されました",
+ "resolvedCommentAuthor": "{{author}} によるコメントを解決しました",
+ "resolvedCommentAuthorReply": "{{author}} ({{replyCount}}) によるコメントを解決しました",
+ "comment": "コメント"
+ },
+ "prconflictingFilesSection": {
+ "resolve": "AI で競合を解決する",
+ "conflicting": "競合するファイル",
+ "copied": "コピーされました",
+ "branch": "このブランチには解決する必要のある競合があります",
+ "commitsBehindCommits": "{{commitsBehind}} コミット遅れ (ベースコミット:",
+ "commitsBehindCommit": "{{commitsBehind}} コミット遅れ (ベースコミット:",
+ "conflicts": "競合"
+ },
+ "prreviewersSection": {
+ "remove": "{{login}} を削除",
+ "no": "レビュアーは要求されていません",
+ "could": "レビュアーを読み込めませんでした。再試行するには、「更新」をタップします。",
+ "loading": "レビュアーを読み込み中…",
+ "reviewers": "レビュアー",
+ "add": "レビュアーを追加または削除する"
+ },
+ "prsidebarHeader": {
+ "edit": "PR のタイトルを編集する",
+ "save": "保存",
+ "saveTitle": "タイトルの保存",
+ "cancel": "キャンセル",
+ "cancelEditing": "タイトル編集をキャンセル",
+ "open": "ウェブ上で PR #{{pullRequestNumber}} を開く"
+ },
+ "prSidebarCreateEmptyState": {
+ "linkExistingPr": "既存の PR をリンクする",
+ "linkExistingPull": "既存の PR をリンクする",
+ "current": "現在のブランチはオープン PR にリンクされていません。",
+ "git": "{{gitBranch}} はオープン PR にリンクされていません。",
+ "refreshCheck": "更新して再度確認するか、このブランチの新規 PR を作成します。",
+ "no": "オープンな PR はありません",
+ "linked": "リンクされた PR #{{pullRequestNumber}} は使用できません",
+ "createPr": "PR を作成",
+ "createPull": "PR を作成する",
+ "refreshPull": "PR を更新する",
+ "pull": "PR",
+ "failed": "PR の作成に失敗しました。",
+ "check": "PR を作成する前にブランチをチェックアウトします。"
+ },
+ "reviewerPickerDrawer": {
+ "no": "一致する人がいません",
+ "search": "人を検索する",
+ "reviewers": "レビュアー",
+ "failed": "人物の読み込みに失敗しました"
+ },
+ "prChecksPresentation": {
+ "reviewed": "レビュー済み",
+ "pending": "保留中",
+ "dismissed": "閉じるされた",
+ "commented": "コメント付き",
+ "changes": "変更要求",
+ "approved": "承認された",
+ "no": "チェックなし",
+ "skipped": "スキップ済み",
+ "neutral": "中性",
+ "timed": "タイムアウト",
+ "cancelled": "キャンセル済み",
+ "failed": "失敗した",
+ "successful": "成功",
+ "progress": "進行中",
+ "requested": "リクエスト済み",
+ "closed": "クローズ",
+ "draft": "下書き",
+ "merged": "マージ済み",
+ "open": "オープン"
+ },
+ "prCommentAudience": {
+ "bots": "ボット",
+ "humans": "人間",
+ "all": "全て",
+ "noComments": "コメントはまだありません。",
+ "noHuman": "人間的なコメントはありません。",
+ "noBot": "ボットのコメントはありません。"
+ },
+ "markdownBlocks": {
+ "details": "詳細"
+ },
+ "prCheckDetailContent": {
+ "jobs": "ジョブ",
+ "failed": "失敗したジョブ"
+ },
+ "prCommentTime": {
+ "years": "{{years}} 年前",
+ "months": "{{months}} か月前",
+ "days": "{{days}} 日前",
+ "hours": "{{hours}} 時間前",
+ "minutes": "{{minutes}} 分前",
+ "just": "たった今"
+ },
+ "confirmModal": {
+ "cancel": "キャンセル",
+ "confirm": "確認する"
+ },
+ "mobileSearchField": {
+ "clear": "検索をクリア"
+ },
+ "mobileOnboardingPage": {
+ "skip": "今のところ通知をスキップする",
+ "not": "後で",
+ "enableAgent": "agent 通知を有効にする",
+ "enableNotifications": "通知を有効にする",
+ "openSessionsTerminal": "terminal でセッションを開く",
+ "keep": "terminal を維持する",
+ "openSessionsChat": "チャット UI でセッションを開く",
+ "use": "チャット UI を使用する",
+ "get": "agent が入力を必要とするとき、またはタスクを完了したときに、このデバイスで通知を受け取ります。",
+ "choose": "サポートされている agent セッションを terminal で開くか、このデバイスのチャット UI で開くかを選択します。セッション タブを長押ししてビューを切り替えるか、後で [設定] でデフォルトを変更します。",
+ "stay": "外出中でも最新情報を入手",
+ "how": "セッションはどのように開くべきですか?"
+ },
+ "mobileFileExplorerPanel": {
+ "no": "ファイルが見つかりません",
+ "retry": "再試行",
+ "showing": "- 最初の 5000 件を表示",
+ "files": "ファイル",
+ "back": "セッションに戻る",
+ "close": "ファイルを閉じる",
+ "unable": "ファイルをロードできません",
+ "waiting": "デスクトップを待っています...",
+ "connecting": "デスクトップに接続しています..."
+ },
+ "mobileFileMarkdownPreview": {
+ "viewRendered": "レンダリングされた Markdown プレビューを表示する",
+ "viewMarkdown": "Markdown ソースを表示"
+ },
+ "mobileFilePreviewBody": {
+ "title": "{{title}}画像",
+ "empty": "空のファイル",
+ "retry": "再試行"
+ },
+ "mobileFilePreviewEditableSource": {
+ "title": "{{title}} エディター"
+ },
+ "mobileFilePreviewScreen": {
+ "unableLoad": "プレビューを読み込めません",
+ "save": "terminal アーティファクトを保存する",
+ "back": "ファイルに戻る",
+ "unsaved": "保存されていない編集内容は失われます。",
+ "discardChanges": "変更を破棄しますか?",
+ "loading": "プレビューを読み込んでいます...",
+ "waiting": "デスクトップを待っています...",
+ "file": "ファイル",
+ "preview": "プレビュー",
+ "discard": "破棄",
+ "stay": "滞在する",
+ "unableSave": "ファイルを保存できません"
+ },
+ "mobileFilePreviewSourceText": {
+ "file": "ファイルのプレビュー",
+ "preview": "プレビューが切り詰められました。ファイルサイズ: {{formatPreviewByteLength}}。"
+ },
+ "mobileFileExplorerRow": {
+ "unavailable": "モバイルでは利用できません",
+ "preview": "プレビュー ファイル {{itemName}}",
+ "item": "{{itemName}} はモバイルでは利用できません",
+ "open": "フォルダー {{itemName}} を開く",
+ "retry": "再試行",
+ "retryLoading": "{{relativePath}} のロードを再試行してください",
+ "loading": "読み込み中...",
+ "unable": "フォルダーをロードできません"
+ },
+ "mobileFilePreviewRequest": {
+ "file": "デスクトップ上のファイルが変更されました。保存する前にプレビューをリロードする"
+ },
+ "mobileFilePreviewResponse": {
+ "unableLoad": "プレビューを読み込めません",
+ "fileNot": "ファイルが見つかりません",
+ "unableReach": "デスクトップのファイルシステムにアクセスできません",
+ "reload": "保存する前にプレビューをリロードする",
+ "fileToo": "ファイルが大きすぎてモバイルでプレビューできない",
+ "binary": "バイナリ プレビューは利用できません"
+ },
+ "mobileFilePreviewRoute": {
+ "unable": "プレビューを読み込めません"
+ },
+ "mobileFileMutationOwnership": {
+ "could": "SSH 接続を確認できませんでした。ホストに再接続して、もう一度試す。"
+ },
+ "troubleshootCommonIssues": {
+ "other": "その他の VPN 干渉",
+ "tailscale": "Tailscale ホストに到達できません",
+ "connection": "接続タイムアウト",
+ "desktop": "デスクトップアプリが実行されていない",
+ "firewall": "ファイアウォールがポート 6768 をブロックしている",
+ "different": "さまざまな WiFi ネットワーク",
+ "disable": "その VPN を無効にするか、スプリット トンネリング / 「LAN を許可」を有効にします。",
+ "non": "Tailscale 以外の VPN は、ローカル トラフィックをリモート サーバー経由でルーティングできます。",
+ "update": "Tailscale アプリを更新します。最近のリリースでは再接続のバグが修正されています。",
+ "checkDesktop": "デスクトップが起動しており、テールネットに接続されていることが表示されていることを確認します。",
+ "i": "iOS/Android はサイレントにトンネルを遮断できます。Tailscale アプリで Tailscale をオフにしてからオンに戻します。",
+ "host": "100.x.x.x や *.ts.net などのホスト アドレスは Tailscale 経由で接続します。これを ON にしておきます。",
+ "restart": "タイムアウトが続く場合は、両方のアプリを再起動します。",
+ "go": "ホスト リストに戻り、ホストをタップして再試行します。",
+ "checkWi": "スマートフォンの WiFi 信号強度を確認します。",
+ "after": "アップデート後は、QR コードを使用して再ペアリングする必要がある場合があります。",
+ "tryRestarting": "Orca を再起動してみてください。起動時にコンパニオン サーバーが開始されます。",
+ "orca": "接続を受け入れるには、デスクトップ上で Orca が開いている必要があります。",
+ "corporate": "企業/学校のネットワークは P2P をブロックする可能性があります。個人用ホットスポットを試す。",
+ "windows": "Windows: Defender ファイアウォール → アプリを許可 — プライベート ネットワークに対して Orca を有効にします。",
+ "mac": "macOS: システム設定 → ネットワーク → ファイアウォール — Orca を許可します。",
+ "tryReconnecting": "両方のデバイスで WiFi を再接続してみてください。",
+ "ethernet": "イーサネットと WiFi は同じサブネットを共有する必要があります。",
+ "both": "両方のデバイスが同じ LAN 上にある必要があります (Tailscale 経由で接続されていない場合)。"
+ },
+ "mobileBrowserKeyRow": {
+ "esc": "ESC"
+ },
+ "mobileBrowserPane": {
+ "send": "テキストをブラウザに送信する",
+ "type": "ページに入力…",
+ "ok": "わかりました",
+ "cancel": "キャンセル",
+ "browserDialogMessage": "ブラウザダイアログ",
+ "reload": "リロード",
+ "forward": "進む",
+ "back": "戻る",
+ "enter": "有効な URL を入力。",
+ "browserStreamTimed": "ブラウザのストリームがタイムアウトしました。",
+ "browserPage": "ブラウザ ページはまだ利用できません。",
+ "checking": "デスクトップブラウザのストリーミングサポートを確認しています。",
+ "update": "モバイルでブラウザ タブをストリーミングできるようにデスクトップ Orca を更新します。",
+ "browserStreamFailed": "ブラウザのストリームが失敗しました。",
+ "browserDialog": "ブラウザダイアログ",
+ "sent": "送信済み",
+ "browserPointerUp": "ブラウザのポインタアップに失敗しました",
+ "browserPointerDown": "ブラウザポインタダウンに失敗しました",
+ "browserPointerMove": "ブラウザポインタの移動に失敗しました",
+ "browserScroll": "ブラウザのスクロールに失敗しました",
+ "browserCommand": "ブラウザコマンドが失敗しました",
+ "right": "右クリック"
+ },
+ "mobileBrowserPointerModifiers": {
+ "modifier": "{{modifierLabel}} クリック修飾子",
+ "shift": "シフト",
+ "alt": "代替",
+ "cmd": "コマンド"
+ },
+ "mobileBrowserViewModeSwitch": {
+ "show": "{{browserLabel}} Web サイトビューを表示",
+ "mobile": "モバイル",
+ "web": "ウェブ"
+ },
+ "mobileAgentSessionHistoryList": {
+ "resume": "agent セッションを再開する",
+ "messages": "メッセージ",
+ "message": "メッセージ"
+ },
+ "agentHistory": {
+ "noPast": "この範囲には過去の agent セッションはありません。",
+ "noSessions": "検索に一致するセッションはありません。",
+ "noAgent": "agent セッションなし",
+ "search": "セッション、repo:、パス: を検索します。",
+ "retry": "再試行",
+ "unableLoad": "ロードできません",
+ "update": "agent セッション履歴を参照するには、このホスト上の Orca を更新します。",
+ "agentSessionHistoryUnavailable": "Agent セッション履歴は利用できません",
+ "refresh": "agent セッションを更新する",
+ "agentSessionHistory": "Agent セッション履歴",
+ "back": "戻る",
+ "failed": "セッションの再開に失敗しました。",
+ "agentSessionQueued": "Agent セッションがキューに入れられました。",
+ "unableDetermine": "ホスト プラットフォームを特定できません。",
+ "session": "このセッションには再開 ID がありません。",
+ "waiting": "ホストを待っています...",
+ "all": "全て",
+ "project": "プロジェクト",
+ "workspace": "ワークスペース",
+ "issueCountTranscript": "{{issueCount}} トランスクリプトがスキップされました",
+ "issueCountTranscripts": "{{issueCount}} トランスクリプトがスキップされました",
+ "unableLoadWorkspace": "ワークスペースのメタデータをロードできません。"
+ },
+ "useMobileAgentHistoryState": {
+ "waiting": "ホストを待っています…",
+ "unableLoad": "agent セッションをロードできません",
+ "unableReach": "ホストにアクセスできません"
+ },
+ "worktreeNavigationActions": {
+ "agent": "Agent セッション履歴",
+ "source": "ソース管理"
+ },
+ "agentHistoryResumeTarget": {
+ "open": "セッションを再開する前にローカルワークスペースを開いてください。",
+ "session": "このセッションはホスト マシンに保存されるため、SSH ワークスペースで再開することはできません。このプロジェクトのローカル ワークスペースを開きます。",
+ "resume": "履歴から再開は、ランタイムでホストされるワークスペースでは使用できません。"
+ },
+ "agentHistorySessionCard": {
+ "untitled": "無題のセッション"
+ },
+ "about": {
+ "open": "100x ビルダー向けのオープンソース agent IDE",
+ "about": "について"
+ },
+ "browserSettings": {
+ "openTerminal": "terminal リンクを開く",
+ "choose": "terminal 出力でタップされた HTTP(S) リンクが開く場所を選択します。",
+ "links": "リンク",
+ "browser": "ブラウザ",
+ "openSafari": "このスマートフォンの Safari、Chrome、または別のブラウザで開きます。",
+ "phone": "電話ブラウザ",
+ "openStreamed": "ペアリングされたデスクトップからストリーミング ブラウザーで開きます。",
+ "orca": "デスクトップ上の Orca ブラウザ"
+ },
+ "connectionLog": {
+ "noPaired": "ペアリングされたホストがありません。",
+ "noConnection": "このセッションではまだ接続イベントがありません。アプリがこのホストにダイヤルすると、イベントが表示されます。",
+ "copy": "コピー診断",
+ "copied": "コピーされました",
+ "attempt": "· {{reconnectAttempts}}を試みます",
+ "connection": "接続ログ"
+ },
+ "home": {
+ "youre": "つながっています",
+ "scan": "コードをスキャンします",
+ "openOrca": "Orca デスクトップを開く",
+ "removeConfirm": "「{{confirmRemoveName}}」を削除しますか?後で再ペアリングできます。",
+ "removeHost": "ホストの削除",
+ "remove": "削除",
+ "edit": "ホストの編集",
+ "disconnect": "切断",
+ "seven": "7日",
+ "five": "5時間",
+ "account": "アカウントの使用状況",
+ "new": "新規ワークスペース",
+ "pair": "デスクトップのペアリング",
+ "quick": "クイック操作",
+ "tasks": "タスク",
+ "resume": "再開する",
+ "desktops": "デスクトップ",
+ "prs": "作成された PR",
+ "agent": "Agent 時間",
+ "agents": "Agents が生成されました",
+ "welcome": "おかえり",
+ "how": "仕組み",
+ "pairingDescription": "コンピュータ上で Orca とペアリングすると、agents の状態を確認し、任意の terminal にアクセスして、スマートフォンから作業を進めることができます。",
+ "connectYour": "デスクトップを接続する",
+ "please": "もう一度試す。",
+ "could": "ホストを削除できませんでした",
+ "openTask": "{{taskProviderLabel}} タスクを開く",
+ "no": "タスクソースが接続されていません",
+ "system": "システムのデフォルト",
+ "your": "ここにデスクトップが表示されます。すべてがエンドツーエンドで暗号化されます。",
+ "tap": "上のボタンをタップしてスキャナーを開きます。画面上の QR コードをポイントします。",
+ "go": "[設定] → [モバイル] に移動し、ペアリング QR コードを生成します。",
+ "connect": "接続",
+ "reconnect": "再接続"
+ },
+ "mobileOnboarding": {
+ "onboarding": "オンボーディングの進捗状況",
+ "notification": "Notification settings could not be updated.再試行。",
+ "your": "Your choice could not be saved.再試行。"
+ },
+ "nativeChatSettings": {
+ "open": "チャット UI でセッションを開く",
+ "off": "オフ",
+ "on": "オン",
+ "choose": "サポートされている agents セッション (Claude、Codex、その他のチャット対応 agents) をこのデバイスで開く方法を選択します。Terminal には生の CLI が表示されます。チャット UI は、デスクトップ アプリのようなチャット インターフェイスを表示します。長押しメニューから個々のセッションを切り替えることもできます。",
+ "default": "デフォルトビュー",
+ "back": "戻る"
+ },
+ "notifications": {
+ "open": "設定を開く",
+ "agent": "Agent の通知",
+ "notifications": "通知",
+ "get": "agent が入力を必要とするとき、またはタスクを完了したときに、このデバイスで通知を受け取ります。",
+ "notificationsDisabled": "システム設定で通知が無効になっています。"
+ },
+ "pairConfirm": {
+ "back": "家に戻る",
+ "connecting": "接続中…",
+ "cancel": "キャンセル",
+ "pair": "ペア",
+ "confirmDesktopPairingLink": "デスクトップからペアリング リンクを開いた。ホストに追加することを確認します。",
+ "pairDesktop": "このデスクトップとペアリングしますか?",
+ "pairingFailed": "ペアリングに失敗しました: {{errorMessage}}",
+ "could": "{{pairingOverallTimeoutSeconds}}s 以内に接続できませんでした — 停止した場所については以下のログを参照してください",
+ "pairingLog": "ペアリングログ"
+ },
+ "pairScan": {
+ "copy": "QR の下に表示されているコードをコンピューターにコピーします。",
+ "pastePairingCode": "ペアリングコードを貼り付けます",
+ "pasteCode": "代わりにコードを貼り付けてください",
+ "try": "再試行",
+ "connecting": "接続中…",
+ "pastePairingCodeMessage": "またはペアリングコードを貼り付けてください",
+ "scan": "QRコードをスキャンしてください",
+ "go": "「設定」→「モバイル」に移動します",
+ "openOrca": "コンピューターで Orca を開きます",
+ "openSettings": "設定を開く",
+ "continue": "続ける",
+ "enable": "[設定] でカメラへのアクセスを有効にするか、代わりにペアリング コードを貼り付けます。",
+ "scanOrPastePairingCode": "デスクトップ上の Orca から QR コードをスキャンするか、代わりにペアリング コードを貼り付けます。",
+ "camera": "カメラアクセスが無効です",
+ "pair": "デスクトップとペアリングする",
+ "pairingFailed": "ペアリングに失敗しました: {{errorMessage}}",
+ "could": "{{pairingOverallTimeoutSeconds}}s 以内に接続できませんでした — 停止した場所については以下のログを参照してください",
+ "notValidPairing": "有効なペアリング コードではありません - コンピュータからコピーして、もう一度貼り付けてください",
+ "notValidOrca": "有効な Orca QR コードではありません",
+ "pairingLog": "ペアリングログ"
+ },
+ "pair": {
+ "back": "家に戻る",
+ "missing": "ペアリングコードがありません"
+ },
+ "settings": {
+ "support": "サポート",
+ "privacy": "プライバシーポリシー",
+ "retry": "再試行",
+ "retryClearing": "ペアリング認証情報のクリアを再試行してください",
+ "couldNotCheck": "このデバイスのクリーンアップ ステータスを確認できませんでした。安全のために再試行してください。",
+ "cleanup": "まだクリーンアップは確認できませんでした。後でもう一度試す。",
+ "pairing": "ペアリング資格情報のクリーンアップ",
+ "about": "について",
+ "troubleshooting": "トラブルシューティング",
+ "notifications": "通知",
+ "voice": "音声",
+ "browser": "ブラウザ",
+ "settings": "設定",
+ "couldNotConfirmCleanupPendingCredentialCountCredential": "このデバイス上の {{pendingCredentialCount}} 資格情報のクリーンアップを確認できませんでした。",
+ "couldNotConfirmCleanupPendingCredentialCountCredentials": "このデバイス上の {{pendingCredentialCount}} 資格情報のクリーンアップを確認できませんでした。"
+ },
+ "terminalSettings": {
+ "terminalText": "Terminal の文字サイズ",
+ "restore": "{{pickerHostName}} を復元",
+ "off": "オフ",
+ "on": "オン",
+ "autocomplete": "オートコンプリートとオートコレクト",
+ "autocompleteDescription": "terminal のコマンド バーで電話形式のオートコンプリート、自動修正、スペルの提案を有効にします。デフォルトではオフになっているため、キーボードはコマンド、フラグ、またはパスを書き換えません。直接キーボード入力 (キーが terminal に直接入力される場合) は常に生のキーストロークを送信するため、提案は適用されません。",
+ "keyboard": "キーボード入力",
+ "textSizeMessage": "文字サイズ",
+ "textScaleDescription": "ターミナルのテキストを拡大縮小します。サイズが小さいほど、サイドマージンのある列がより多く収まります。サイズが大きいほど、表示される列が少なくなります。横にドラッグしてパンします。terminal 自体をピンチしてズームインすることもでき、これによりこの設定が更新されます。デバイスごとの表示のみ。デスクトップターミナルは変わりません。",
+ "textSize": "文字サイズ",
+ "no": "ペアリングされたデスクトップはまだありません。 1 つをペアにして terminal の動作を制御します。",
+ "resizeBehaviorDescription": "スマートフォンで terminals を使用している間、Orca は terminals を画面に合わせて縮小します。アプリを閉じるか別のアプリに切り替えるときに、アプリをスマートフォンサイズのままにするか (インタラクティブ CLI ツールがリフローしないように)、サイズを変更してデスクトップに戻るかを制御します。バナー上の [この terminals を復元] または [すべての terminals を復元] を使用していつでも手動でサイズを変更できます。",
+ "when": "アプリを終了するとき",
+ "after30": "30分後",
+ "after5": "5分後",
+ "after1": "1分後",
+ "keep": "スマートフォンサイズを維持(デフォルト)",
+ "largest": "最大 (200%)",
+ "larger": "大きい (150%)",
+ "large": "大(125%)",
+ "default": "デフォルト (100%)",
+ "smaller": "小さい (75%)",
+ "smallest": "最小 (50%)",
+ "afterDuration": "{{durationSeconds}}秒後"
+ },
+ "troubleshoot": {
+ "common": "よくある問題",
+ "view": "接続ログの表示",
+ "runDiagnostics": "診断を実行する",
+ "runAgain": "もう一度実行します",
+ "running": "実行中…",
+ "troubleshooting": "トラブルシューティング",
+ "platform": "プラットフォーム",
+ "hosts": "ホスト",
+ "internet": "インターネット",
+ "paired": "ペアリングされたホスト",
+ "couldNotTest": "テストできませんでした",
+ "no": "接続がありません",
+ "unexpected": "予期せぬ反応",
+ "connected": "接続済み",
+ "couldNotRead": "ホストデータを読み取れませんでした",
+ "none": "なし — QR をスキャンしてペアリングします",
+ "host": "{{hostCount}} ペアリングされました",
+ "reachable": "{{endpoint}} に到達可能"
+ },
+ "voiceSettings": {
+ "speechModelMessage": "音声モデル",
+ "speechModel": "音声モデル",
+ "togglePress": "トグル: 1 回押すと開始し、もう一度押すと停止します。ホールド: 押したままディクテーションします。",
+ "dictationMode": "ディクテーションモード",
+ "dictate": "デスクトップ上のフォーカスされたペインにテキストを口述入力します。",
+ "enable": "音声ディクテーションを有効にする",
+ "dictation": "ディクテーション",
+ "connect": "デスクトップに接続して音声設定を管理します。",
+ "voice": "音声",
+ "delete": "削除に失敗しました",
+ "couldNotSelect": "モデルを選択できませんでした",
+ "couldNotUpdate": "更新できませんでした",
+ "failedLoadVoiceSettings": "音声設定の読み込みに失敗しました",
+ "hold": "ホールド",
+ "toggle": "トグル",
+ "failedLoadVoiceSettingsMessage": "音声設定の読み込みに失敗しました。",
+ "none": "何も選択されていません"
+ },
+ "mobileDictationPendingAudioBudget": {
+ "connection": "接続が遅すぎて音声ディクテーションができません。接続が改善されてからもう一度お試しください。"
+ },
+ "mobileDictationDesktopStart": {
+ "failed": "マイク録音の開始に失敗しました"
+ },
+ "mobileDictationKeepAwake": {
+ "keep": "キープアウェイク ネイティブ コールがタイムアウトしました"
+ },
+ "useMobileDictation": {
+ "no": "音声が検出されませんでした。",
+ "failed": "マイクの初期化に失敗しました",
+ "microphone": "マイクの許可が拒否されました"
+ },
+ "mobileDictationSetup": {
+ "update": "モバイル音声設定を使用するように、ペアリングされたデスクトップ Orca アプリを更新します。",
+ "failedUpdate": "ディクテーション設定を更新できませんでした",
+ "failedDelete": "モデルの削除に失敗しました",
+ "failedStart": "ダウンロードの開始に失敗しました",
+ "failedLoad": "ディクテーション モデルのロードに失敗しました"
},
"prChecks": {
"summary": {
diff --git a/mobile/src/i18n/locales/ko.json b/mobile/src/i18n/locales/ko.json
index ebac6ce55bb..a66e7c410e3 100644
--- a/mobile/src/i18n/locales/ko.json
+++ b/mobile/src/i18n/locales/ko.json
@@ -1,2180 +1,2459 @@
{
- "m": {
- "zWwi3-o": "할 일",
- "hWeTdOM": "진행중",
- "mg8ozqs": "리뷰 중",
- "EleEi2Q": "완료",
- "1Bc_S64": "PR 현황",
- "BX2Np3Y": "리포지토리",
- "oBZu0_c": "상태",
- "Iq3a5so": "그룹화 없음",
- "y1TvQWs": "서버 주문",
- "FyGSYV4": "수동",
- "yH1bPxU": "저장소, 워크스페이스 이름",
- "v5H1mJY": "Repo",
- "egkm8qI": "가장 최근 출력 먼저",
- "2xJ96AA": "최근",
- "BaGIgrE": "이름 알파벳순",
- "tQqkyxI": "이름",
- "RcmL46Y": "주의가 필요한 Agents와 최근 활동",
- "6gEQgs0": "Agent 활동",
- "KbmpcZs": "다시 연결 중…",
- "6_SeqME": "연결할 수 없습니다",
- "YAPgxBM": "데스크톱에 연결할 수 없습니다.",
- "G6a1Jqk": "연결 끊김",
- "I-waJyg": "연결 중…",
- "jgGsba4": "연결됨",
- "0BvjSKA": "페어링이 잘못되었습니다. 데스크톱과 다시 페어링하세요.",
- "HguWCpQ": "포트는 1~65535여야 합니다.",
- "dRmw4EQ": "호스트 이름이 누락되었습니다.",
- "CshxztM": "유효한 주소가 아닙니다.",
- "6lctDfQ": "유효한 호스트 이름이 아닙니다.",
- "fX92Peg": "호스트에는 경로나 쿼리가 포함되어서는 안 됩니다.",
- "HQMAFdE": "ws:// 또는 wss://(또는 호스트:포트)를 사용하세요.",
- "z85IfPo": "호스트 주소를 입력하세요.",
- "lxKZMMw": "구성된 릴레이 메타데이터에 대해 정확히 하나의 엔드포인트가 예상됩니다.",
- "e-zCiAo": "릴레이 호스트 ID 불일치",
- "CjbcG3A": "릴레이 ID와 엔드포인트가 공존해야 합니다.",
- "HrWsdDM": "커서 앞의 줄 지우기",
- "sL5fKGQ": "Ctrl+U",
- "Bd9qfdk": "뒤로 단어 삭제",
- "jVVj75Y": "Ctrl+W",
- "0VWtVO8": "줄 끝",
- "5m_ucwE": "Ctrl+E",
- "CKFp_QM": "줄의 시작",
- "u9q9lPQ": "Ctrl+A",
- "mcvHf4o": "역방향 검색",
- "a2Cb3GE": "Ctrl+R",
- "hqWfNmA": "프로세스 일시 중지",
- "NIdsbYo": "Ctrl+Z",
- "Eqaj8oY": "화면 지우기",
- "R6ZcIz8": "Ctrl+L",
- "PBPnPeQ": "EOF 보내기",
- "vFYSo0s": "Ctrl+D",
- "AzHoQzM": "인터럽트 terminal",
- "ke03J5M": "Ctrl+C",
- "v5WSGO0": "오른쪽 화살표",
- "RiGIavM": "왼쪽 화살표",
- "vVsy7qk": "아래쪽 화살표",
- "IwJi8TY": "위쪽 화살표",
- "fNgDk9o": "앞으로 삭제",
- "gmy3A7M": "델",
- "6TRPiic": "역행 키이",
- "l6KJT3M": "공간",
- "p7_d2FU": "시프트 탭",
- "S9DH8y4": "Shift+Tab",
- "9KFo5zM": "입력",
- "hM5KUAw": "Tab",
- "jHe6UUU": "탈출하다",
- "bNejRmQ": "Esc",
- "UnBBA1A": "새로고침",
- "p2soPzg": "Terminal을 로드하지 못했습니다.",
- "IwMISoQ": "모두",
- "J54idHw": "닫힘",
- "sKFSmrM": "병합됨",
- "dGRdl38": "열기",
- "_NhxpRw": "이름",
- "efmLHxE": "브랜치",
- "JEQaLyM": "GitLab",
- "j6H-ZB8": "Linear",
- "fLijFJI": "GitHub",
- "0GQcyjg": "스마트",
- "TgLMnDc": "루트, 절대 경로, 상위 경로가 아니라 repo 기준 상대 디렉터리를 사용하세요.",
- "M0WKvoE": "하나 이상의 디렉터리를 추가합니다.",
- "fCVCUqw": "WSL 재설정 범위에는 정확한 배포판이 필요합니다.",
- "TJPBpxE": "호스트 재설정 범위는 WSL 배포판의 이름을 지정할 수 없습니다.",
- "CgVIb2E": "모바일 미리보기에서는 차이가 잘렸습니다.",
- "mZj5XBY": "차이점을 로드할 수 없습니다.",
- "v6-Hc8I": "커밋된 Diff 미리보기 닫기",
- "I6GjQO8": "브랜치에서 커밋됨",
- "6lym-WQ": "{{value0}}..HEAD",
- "P2fbbug": "세부 정보 표시",
- "eysP-fI": "세부 정보 숨기기",
- "6Pb0W84": "commit 실패 세부정보 표시",
- "7eT5oiE": "commit 실패 세부정보 숨기기",
- "-RbEI6M": "수정",
- "3iqxoCY": "AI로 commit 실패 수정",
- "Hol4rtI": "Commit 실패",
- "fcDHZ1U": "commits이 없습니다.",
- "Qb3CogY": "다시 시도",
- "kylGvPU": "데스크톱을 기다리는 중...",
- "y0bB4-s": "파일 변경 없음",
- "c_4jbTI": "기록을 로드하지 못했습니다.",
- "O_0cF4M": "{{value0}} 변경됨",
- "cLOWzDM": "{{value0}}개 스테이징됨",
- "Dysvcf0": "브랜치의 {{value0}}",
- "8tFmU9A": "AI로 commit 메시지 생성",
- "PTohtCY": "commit 메시지 생성 취소",
- "uTRYt2U": "Commit 메시지",
- "2X52pxU": "준비된 파일 없음",
- "ELJU7AQ": "Commit 메시지가 비활성화되었습니다. 준비된 파일이 없습니다.",
- "yKqTr9E": "작업 트리가 깨끗합니다.",
- "89qgAps": "로컬 변경 없음",
- "8E6deJU": "오픈 소스 제어 작업",
- "DHXoi2A": "모두 언스테이지",
- "9pCKA8U": "모두 스테이지",
- "o_TTJDk": "데스크톱에 다시 연결하는 중...",
- "PW__oVI": "커밋된 변경 사항 열기 {{value0}}",
- "tZHFwCg": "커밋된 변경사항 로드 중...",
- "m_C8jkI": "브랜치에 Commit 됨",
- "IET9hpI": "{{value0}} 삭제",
- "WTkbKTE": "단계 {{value0}}",
- "9OoD7rs": "무대 해제 {{value0}}",
- "av_Mh7U": "해결되지 않은 충돌",
- "4a6Yo9s": "변경된 파일 열기 {{value0}}",
- "SrSDY0M": "{{value0}}에서",
- "Pt1enm0": "소스 제어 새로 고침",
- "5lXW9sQ": "웹에서 PR 열기",
- "HUC1SZA": "웹에서 PR #{{value0}} 열기",
- "PjA8ztc": "소스 제어",
- "OtpFc0w": "세션으로 돌아가기",
- "MDlHRa0": "소스 제어 닫기",
- "84pwQsY": "브라우저에서 열까요?",
- "4E80Be4": "PR이 생성되었습니다.",
- "n9UDFoo": "브랜치 전환",
- "Oh7cEhY": "'{{value0}}'에 대한 변경사항을 취소하시겠습니까? 이 작업은 취소할 수 없습니다.",
- "7IMotMA": "변경사항 취소",
- "7p6X0C0": "소스 제어",
- "dggV318": "다시 시도",
- "SlcSA9A": "로드할 수 없습니다",
- "UgUD08U": "소스 제어를 사용할 수 없음",
- "Q1mHSX4": "PR 생성",
- "xoN_ZQM": "PR 로드 중…",
- "jrzi7yY": "브랜치에 Commit 됨",
- "cU7VGGA": "commit 메시지를 생성하지 못했습니다.",
- "6N6POoY": "PR 생성",
- "8fhgeQQ": "PR를 준비하는 동안 브랜치가 변경되었습니다.",
- "zAg6hUc": "commit 메시지를 생성할 수 없습니다. 소스 제어에 하나를 추가한 후 다시 시도하세요.",
- "x1skfkY": "PR을 생성하기 전에 변경 사항을 해결하거나 준비하세요.",
- "695pbL4": "PR을 생성하기 전에 충돌을 해결하세요.",
- "QeyCTxE": "푸시에 실패했습니다. 푸시 오류를 해결한 후 다시 시도하세요.",
- "hjs2AB4": "Commits",
- "bOc3nUM": "브랜치 전환",
- "ntik19Q": "베이스에 리베이스",
- "r_MPRhE": "브랜치 게시",
- "3blspe8": "가져오기",
- "_Pq5EEw": "푸시 및 PR 생성",
- "IgtghkE": "PR 생성",
- "ZFwznUg": "Commit 및 동기화",
- "4pU4zTo": "Commit 및 푸시",
- "_Srm4Jk": "Commit",
- "s7LT0Wk": "agent를 시작하지 못했습니다.",
- "Ngsl81c": "데스크톱을 기다리는 중...",
- "h4RNhQ0": "commit 메시지를 생성하지 못했습니다.",
- "IhhRQcI": "PR을 생성하기 전에 브랜치를 확인하세요.",
- "8lyq50g": "모바일에서 소스 제어를 사용하려면 Orca 데스크톱을 업데이트하세요.",
- "v0PMFRE": "비교를 위해 기본 브랜치를 확인할 수 없습니다.",
- "xLlZko0": "데스크톱을 기다리는 중...",
- "0MDy3xU": "차이점을 열 수 없습니다.",
- "iO0cooo": "소스 제어 작업이 실패했습니다.",
- "0EPx-aA": "Agent가 작업 중입니다.",
- "vCnFzKQ": "닫기",
- "8xevGic": "새로고침",
- "m4hO2RY": "포워드",
- "SKku3yE": "뒤로",
- "GZwtZCE": "브라우저",
- "EwbB5VI": "다음",
- "ZEWq5OM": "답변 보내기",
- "yxcaJwo": "취소",
- "7nef7b0": "답변을 입력하세요",
- "biG4V5Q": "다른…",
- "imHMT2Y": "메시지 보내기",
- "0JFch-U": "명령",
- "r9MfglU": "받아쓰기 중지",
- "o_uvOaw": "이미지 첨부",
- "8VDRuNk": "이미지 삭제",
- "lHpfBcs": "대기 중",
- "85E7hns": "이 메시지를 맨 위로 스크롤",
- "m5GqFPc": "메시지 복사",
- "0bAYawM": "{{value0}}×",
- "0mLnbZ0": "… {{value0}} 추가 도구 호출",
- "O8aNMg0": "답장 보내기",
- "psOJLjQ": "답장을 입력하세요…",
- "bSeVb4U": "아니면 답장을 입력하세요...",
- "NR7KpaA": "선택한 옵션 제출",
- "BcZ8-jY": "제출{{value0}}",
- "55yDVNk": "메시지, @files, /명령",
- "AXyDPsE": "terminal을 기다리는 중…",
- "gFSApKE": "다시 연결 중…",
- "X8_vuao": "중지",
- "1oeCDU8": "agent 중지",
- "J3nTi3Q": "도구",
- "HgMEzFE": "접기",
- "MWJZkOQ": "최신으로 스크롤",
- "AexlW6I": "이전 메시지 로드",
- "u8wilUo": "체크",
- "6R8BWsw": "Agent 기록",
- "a4FTXPM": "음성 받아쓰기 시작",
- "4Bofttg": "음성 받아쓰기 시작",
- "467WHFs": "음성 받아쓰기 취소",
- "lmt1VYs": "음성 받아쓰기 중지",
- "diKZlw8": "대신 파일을 첨부하려면 길게 누르세요.",
- "THy0254": "사진 첨부",
- "Vl7Dj48": "이미지 전송 중",
- "mr8N0cA": "빠른 명령 추가",
- "SZAlJoE": "저장",
- "z9Me_JI": "취소",
- "nB0fh-Q": "프로젝트",
- "spBXyhw": "글로벌",
- "JVmE8Lo": "범위",
- "iAdHX2w": "텍스트만 삽입하지 않고 즉시 제출합니다.",
- "S9UUSi8": "Enter 추가",
- "MsJOHDg": "고급",
- "WFigoqY": "기술, 파일 경로 및 내장 명령을 지원합니다.",
- "YGxS8ck": "npm run dev",
- "j_uWjuQ": "agent에게 이 워크스페이스를 조사하도록 요청하세요.",
- "2WUowpg": "명령 텍스트",
- "v512Bqc": "프롬프트",
- "9D9oj64": "agent 선택",
- "th44i2A": "Agent",
- "AQ41agY": "작업",
- "pcq4xtU": "개발 서버 시작",
- "GXMFUnA": "레이블",
- "CQKw8CA": "Agent 프롬프트",
- "9xkz8HQ": "Terminal 명령",
- "r6942Dw": "{{value0}} 삭제",
- "N8k0x7U": "{{value0}} 편집",
- "VrXVT_A": "{{value0}} 실행",
- "Jqxtf0c": "빠른 명령 제한에 도달했습니다.",
- "LmWWV94": "새로운 빠른 명령",
- "YWp9eI8": "글로벌",
- "0ye1crk": "이 프로젝트",
- "stjjcN4": "일치하는 빠른 명령이 없습니다.",
- "WGZgVlw": "아직 빠른 명령이 없습니다.",
- "Mlzs2q8": "빠른 명령 검색...",
- "c7kUeNA": "빠른 액세스를 위해 terminal 명령이나 agent 프롬프트를 저장하세요.",
- "XUyBgA4": "뒤로",
- "8mDod7I": "이 빠른 명령은 저장된 목록에서 제거됩니다.",
- "y7ppLrs": "'{{value0}}'을 삭제하시겠습니까?",
- "gz_v97k": "리뷰 스레드를 업데이트하지 못했습니다.",
- "ssoDq0g": "제목을 업데이트하지 못했습니다.",
- "fZbxiK0": "닫기",
- "9OSp60k": "모바일에서 변경 사항을 리뷰하려면 Orca 데스크톱을 업데이트하세요.",
- "RSAKe4M": "커밋된 변경사항 응답이 잘못되었습니다.",
- "hKX4q6A": "브랜치에서 커밋됨",
- "LHMnD5o": "권한이 요청되었습니다",
- "zqu69ik": "항상 허용",
- "3EBdICM": "부인하다",
- "sjphObI": "허용하다",
- "QX9RTgc": "오른쪽 탭 닫기",
- "_ijK2wo": "왼쪽 탭 닫기",
- "XxfyMlc": "다른 탭 닫기",
- "k32XW6w": "닫기",
- "5s4VNsw": "Terminal 지우기",
- "2wFDKaY": "이름 바꾸기",
- "umfRNkc": "PR을 병합하지 못했습니다.",
- "vXd8YYA": "PR을 새로고침하지 못했습니다.",
- "Lq5nqds": "연결 실패(다시 연결 중)",
- "kOr-gVg": "리뷰를 저장하지 못했습니다.",
- "AtE6oQA": "데스크톱을 기다리는 중...",
- "HkX9h2s": "누락된 작업 트리",
- "-k-F-P0": "{{value0}}개 스테이징됨",
- "tyXkf4g": "{{value0}}개 스테이징됨, {{value1}}개 실패",
- "L-xz6vw": "데스크톱을 기다리는 중...",
- "MOtwYRI": "소스 제어 작업이 실패했습니다.",
- "x0Dr_H8": "데스크톱을 기다리는 중...",
- "U2LqmGk": "보낸 검토 메모",
- "LtedJAM": "검토 메모가 복사되었습니다.",
- "NSS4Or0": "첨부 실패",
- "hJYA7AQ": "이미지가 너무 커서 첨부할 수 없습니다.",
- "JdGd1Ic": "사진 허가가 거부되었습니다",
- "tu-qlN0": "연결 실패(연결 끊김)",
- "JlNqDLA": "첨부 실패",
- "-YjNIcU": "이미지가 너무 커서 첨부할 수 없습니다.",
- "jdkmIaw": "사진 허가가 거부되었습니다",
- "Kc1O9hE": "연결 실패(연결 끊김)",
- "AandnA4": "연결되지 않음",
- "62Wqvcg": "agent를 시작하지 못했습니다.",
- "WXv-mcQ": "데스크톱을 기다리는 중…",
- "zchh0X0": "댓글 작업 실패",
- "6VPjkF8": "제목을 업데이트하지 못했습니다.",
- "RqzbvDE": "데스크톱에 연결되지 않았습니다.",
- "weTQMew": "붙여넣기 실패",
- "5dhlsXo": "붙여넣기에는 이미지가 너무 큽니다.",
- "gG0saX0": "붙여넣기 실패(연결 끊김)",
- "Ezj8Uog": "붙여넣기가 너무 큼(최대 256KiB)",
- "e1BO4eM": "빠른 명령을 로드하지 못했습니다.",
- "K20RdWM": "지금은 알림 건너뛰기",
- "KP3UPPY": "나중에",
- "sSrQIeg": "agent 알림 활성화",
- "QM9B4lA": "알림 활성화",
- "B5cl_6I": "terminal에서 세션 열기",
- "9bF2iuQ": "terminal 유지",
- "tYyQCnY": "Chat UI에서 세션 열기",
- "KogvSYY": "채팅 UI 사용",
- "3vHqv6U": "agent이 귀하의 입력을 필요로 하거나 작업을 완료하면 이 장치에서 알림을 받습니다.",
- "dV8UVHg": "지원되는 agent 세션이 이 장치의 terminal 또는 Chat UI에서 열릴지 선택합니다. 세션 탭을 길게 눌러 보기를 전환하거나 나중에 설정에서 기본값을 변경하세요.",
- "OmdgGNs": "자리를 비운 동안에도 최신 소식을 받아보세요",
- "o9LxHPg": "세션은 어떻게 열리나요?",
- "CaZB1fk": "파일을 찾을 수 없습니다",
- "LS0hOug": "다시 시도",
- "UomXr8g": "- 처음 5000개 표시",
- "8ojoNLo": "파일",
- "vT-EgZw": "세션으로 돌아가기",
- "A053H2s": "파일 닫기",
- "ujEE5Aw": "렌더링된 Markdown 미리보기 보기",
- "12QKL8A": "Markdown 소스 보기",
- "cDZy2i8": "{{value0}} 이미지",
- "0U_34Zg": "빈 파일",
- "zqZaJJo": "다시 시도",
- "yc-xh3U": "{{value0}} 편집자",
- "uLXt2Qs": "미리보기를 로드할 수 없습니다.",
- "BnjL5Ho": "terminal 아티팩트 저장",
- "nxnMGkU": "파일로 돌아가기",
- "vXalblI": "저장되지 않은 수정사항은 손실됩니다.",
- "k969DeE": "변경사항을 삭제하시겠습니까?",
- "Iqn4mt4": "미리보기 로드 중...",
- "MCFjuu8": "데스크톱을 기다리는 중...",
- "1_VaWXc": "파일 미리보기",
- "mGhZjxw": "미리보기가 잘렸습니다. 파일 크기: {{value0}}.",
- "m0QdE2U": "모바일에서는 사용할 수 없습니다.",
- "F2AHmFI": "미리보기 파일 {{value0}}",
- "AnmS3ZU": "{{value0}}은 모바일에서 사용할 수 없습니다.",
- "LuU4lSE": "{{value0}} 폴더 열기",
- "CGYoYAY": "다시 시도",
- "v4sDG-8": "{{value0}} 로드를 다시 시도하세요.",
- "t2QYxhU": "로드 중...",
- "kYWeCgo": "데스크탑에서 파일이 변경되었습니다. 저장하기 전에 미리보기를 다시 로드하세요.",
- "nbgr4H0": "미리보기를 로드할 수 없습니다.",
- "Jj_IDwY": "파일을 찾을 수 없습니다",
- "X-whfMo": "데스크톱 파일 시스템에 연결할 수 없습니다.",
- "ktGDvZE": "저장하기 전에 미리보기를 다시 로드하세요.",
- "UFAFIP0": "모바일 미리보기에 파일이 너무 큽니다.",
- "UfU4CAU": "바이너리 미리보기를 사용할 수 없습니다.",
- "2t0lh6U": "미리보기를 로드할 수 없습니다.",
- "jLhPXXQ": "기타 VPN 간섭",
- "ngjn4tY": "Tailscale 호스트에 연결할 수 없음",
- "AE3mc7A": "연결 시간 초과",
- "MED_8yU": "데스크탑 앱이 실행되지 않음",
- "amY3iCs": "방화벽 차단 포트 6768",
- "vuZn-_E": "다양한 WiFi 네트워크",
- "q-MNnd4": "제거",
- "KuqR8FY": "수리하다",
- "ujiecek": "다시 시도",
- "IrfKQh8": "인증 실패 — 먼저 다시 연결해 보십시오. 계속 실패하면 데스크톱에서 다시 페어링하세요.",
- "2LrOLw8": "재설정 사용",
- "LN50bQ0": "재설정 중…",
- "8CLIWuE": "활성 Codex 계정에 대해 한 번의 재설정을 사용합니다.",
- "Y2o7mgc": "{{value0}}에 대해 1회 획득한 재설정을 사용합니다.",
- "7uEIrNQ": "Codex 비율 제한 재설정 사용",
- "fNZPjTQ": "Codex 속도 제한 재설정",
- "_g9qkig": "바로가기 추가",
- "N7UodPY": "Enter 키를 누르세요",
- "YZWk8R4": "명령",
- "zkM-vYk": "레이블",
- "ndVygIU": "추가",
- "GSrBito": "추가 키 — 탭, 화살표, F1~F12…",
- "QlB11DI": "키",
- "9jQVv-8": "수정자",
- "w7YJ0Kw": "바로가기 키 표시, 숨기기 또는 재정렬",
- "BFsLjpc": "바로가기 관리",
- "I-Rlhvc": "사용자 정의 텍스트 명령 보내기",
- "fNBP1Us": "텍스트 매크로",
- "Y7zDQOM": "Ctrl, Alt, Shift 키 코드 만들기",
- "Lr_GVFQ": "바로가기 콤보",
- "v1Nn-IY": "뒤로",
- "WwKbTEk": "기능",
- "ClgDZUM": "탐색",
- "1RunS2Y": "편집",
- "Dl9mAnI": "옮기다",
- "Mz-qIO4": "Alt",
- "OZLCEBo": "Ctrl 키",
- "uGHhnC0": "아래로 이동",
- "ee4D14o": "위로 이동",
- "T-H1CUQ": "드래그하지 않고 순서를 변경하려면 위로 이동 및 아래로 이동 작업을 사용하세요.",
- "-lwE4Q0": "드래그하여 재정렬하세요.",
- "qvnQ47I": "호스트 호환성 확인",
- "oJ3sUM4": "다운로드",
- "N18umz0": "사용",
- "ri8swSc": "사용 중",
- "qf7IWvA": "데스크톱에서 설정",
- "D90AZhs": "API 키 세트",
- "PG_Pfbo": "· 추출 중…",
- "bh_QQps": "오픈AI API",
- "TJd8_nE": "권장",
- "6WwF0_8": "받아쓰기 활성화됨",
- "D5YFHLU": "모델을 다운로드하고 데스크톱에서 받아쓰기를 활성화하세요. 모두 여기에서 가능합니다.",
- "13hFHO4": "음성 받아쓰기 설정",
- "kocNlo8": "업데이트할 수 없습니다.",
- "jX7Yn3E": "모델을 선택할 수 없습니다",
- "0rsS1Dw": "Download failed",
- "lUsptPY": "로드하지 못했습니다.",
- "GWwDGTE": "다시 시도",
- "RF7UWwo": "리뷰 로드를 다시 시도하세요.",
- "W6MLNo0": "모바일 미리보기에서는 차이가 잘렸습니다.",
- "e6R_IPM": "차이점 로드 중...",
- "Ku2wK-g": "다른 리뷰 필터를 사용해 보세요.",
- "3-RMeIo": "검토 가능한 변경사항 없음",
- "e5sIbV0": "리뷰를 로드할 수 없습니다.",
- "r-dK9lI": "검토할 수 없음",
- "On0H_JY": "리뷰 로드 중...",
- "voLBMwU": "메모 보내기",
- "XNffV5A": "agent에게 메모 보내기",
- "a1hiCFE": "검토된 단계",
- "XhmaYgY": "검토된 파일 스테이지",
- "du7kB18": "검토 완료",
- "ls_e0g8": "저장",
- "-bToH9I": "삭제",
- "7BEb-8o": "메모 삭제",
- "2lwuEDc": "리뷰 노트",
- "cy6hF-c": "메모 취소",
- "K4ExXj0": "파일 노트",
- "YlMekyY": "라인 {{value0}}",
- "SqSZ_D4": "메모 추가",
- "vX8hCPw": "메모 편집",
- "QyPs23A": "세션에서 열기",
- "lDOi4xI": "검토되지 않은 것으로 표시",
- "9YSL2XY": "단계 검토 파일",
- "AMn9p6c": "보낸 메모 지우기",
- "bboDcz4": "보내지 않은 메모 보내기",
- "SGgu3t8": "메모 복사",
- "qljZwNc": "신규 Agent 세션",
- "ajcWpiI": "'{{value0}}'에 대한 변경사항을 취소하시겠습니까? 이 작업은 취소할 수 없습니다.",
- "1V8B5pc": "파일 삭제",
- "_TCuNKQ": "{{value0}} 검토된 스테이지되지 않은 파일을 스테이지할 수 있음",
- "oCVOA0w": "검토 작업",
- "cq6J0Qk": "{{value0}}이(가) 검토됨, {{value1}}",
- "N0W7j-Y": "큰 덩어리",
- "-v8Njek": "다음 덩어리",
- "co1PXQY": "이전 덩어리",
- "PpqbMu4": "탁한",
- "6NQSDSg": "파일 메모 편집",
- "cV_5zt0": "변경됨",
- "TGeBFA8": "검토됨",
- "Tqe6zfQ": "{{value0}}에서",
- "OAIsqbU": "{{value0}} 오래됨",
- "n5_ZJMM": "다음 파일",
- "gLGElnY": "마크가 검토됨",
- "gUbQPjk": "검토됨",
- "a2xZWo8": "파일을 검토한 것으로 표시",
- "vRhESp0": "메모",
- "e_IyR5Y": "파일 메모 추가",
- "0CC3Pjk": "이전 파일",
- "lL_q8JA": "버리기",
- "TpLj1K8": "파일 삭제",
- "v58oW_E": "언스테이지",
- "VZPK0FM": "언스테이지 파일",
- "JiM1DAU": "스테이지",
- "SzcIpKs": "파일 스테이징",
- "r-agX-k": "모두",
- "qcWQKWI": "{{value0}} 리뷰 파일 표시",
- "LU8BxDQ": "검토 작업 열기",
- "GAXIVbU": "PR 사이드바 열기",
- "1lIaLfU": "변경 사항",
- "Xot6WdE": "뒤로",
- "fEoGCmQ": "{{value0}}/{{value1}}이(가) 검토됨",
- "mIZ0_V0": "{{value0}}행에서 메모 수정",
- "mCd0V4A": "{{value0}}행에 메모 추가",
- "4bPe4Ao": "데스크톱 Orca를 업데이트하고 로그인하여 어디서나 연결하세요",
- "HdJ9GVY": "소스",
- "BE93iOI": "HTML 소스 보기",
- "bvUfBWI": "미리보기",
- "-FhPMsI": "렌더링된 HTML 미리보기",
- "ywMqsWY": "[엑스]",
- "kijMg1M": "{{value0}}개 열 더보기",
- "Jmh-3ik": "{{value0}} 행 추가",
- "viizK3M": "다시 시도",
- "Re9yZkw": "PR 로드 재시도",
- "-ZCN2f0": "PR 로드 중…",
- "O3OecWo": "main",
- "sLMnsJA": "코드 블록",
- "h1ikg-I": "인라인 코드",
- "fT3N_UQ": "이미지",
- "eLAtZAk": "링크",
- "dQOT7tM": "인용",
- "jPlQhig": "체크리스트",
- "_79TK6I": "번호가 매겨진 목록",
- "hKyID9A": "글머리 기호 목록",
- "wwdkeIc": "취소선",
- "zwoUjcU": "기울임",
- "TcUIfHg": "굵게",
- "qpILEoE": "H3",
- "T0-0mLw": "H2",
- "Tkw-XG4": "H1",
- "3Ph2vuM": "몸",
- "UIMZetU": "워크스페이스 이름",
- "ybPEhxk": "새로운 워크스페이스",
- "VEK8Z7E": "Agent",
- "38lAWJQ": "리포지토리",
- "ZK7Il8w": "워크스페이스 만들기",
- "g5YUeP0": "저장소 연결",
- "obLmzkw": "설정 명령 실행",
- "sZHa-TU": "건너뛰기",
- "0qYyICI": "실행",
- "0cbkbTE": "설정 스크립트",
- "LMAqKNQ": "메모",
- "ATo76K0": "고급",
- "M2A4pJA": "먼저 저장소를 연결하세요",
- "O93svfk": "연결",
- "oroOvnM": "연결 중...",
- "JNDDz3c": "SSH 연결",
- "EFTSrpI": "워크스페이스 이름",
- "yymZMiQ": "이름 또는 '다음에서 만들기'",
- "osrkufA": "저장소를 찾을 수 없습니다.",
- "sMWTBAA": "새 워크스페이스를 가동하려면 저장소와 agent를 선택하세요.",
- "C8UjQk0": "설정 스크립트를 신뢰하지 못했습니다.",
- "jSxyaws": "워크스페이스를 생성하지 못했습니다.",
- "rwQDraY": "설정 스크립트를 실행할지 여부를 선택합니다.",
- "F1iAV4A": "선택한 agent가 비활성화되었습니다. 생성하기 전에 활성화된 agent를 선택하세요.",
- "kA_OuTE": "호스트로 돌아가기",
- "h3ZwGv0": "GitHub 릴리스 열기",
- "oxg5VTs": "앱 스토어 열기",
- "Pe9Dmhc": "실행 안 함",
- "hUSRq7I": "항상 믿고 달려가세요",
- "wOCs5LA": "후크 실행",
- "m7jxYm8": "설정 스크립트",
- "gxXtGpI": "새로운 설정 스크립트",
- "JU7DVfY": "이 저장소의 orca.yaml은 워크스페이스가 시작되기 전에 실행됩니다. 이 저장소를 신뢰하는 경우에만 실행하세요.",
- "SSMlLr8": "{{value0}}에서 설정을 실행하시겠습니까?",
- "egQ-qgQ": "{{value0}}의 설정 스크립트가 변경되었습니다.",
- "Lkm1Ms4": "이름에서 파생됨",
- "CATZTEM": "브랜치 이름",
- "MJ_zXUU": "워크스페이스 이름",
- "jueQw6Q": "이름",
- "Yz166iM": "“{{value0}}” 브랜치 재사용",
- "qOsqJv0": "이름을 입력하거나 출처를 검색하세요.",
- "qNPX_ws": "아래 필드에 워크스페이스 이름을 입력하세요.",
- "LbOI-wE": "이 SSH repo에는 문제와 PR을 나열하려면 GitHub 원격이 필요합니다.",
- "2sNZWLI": "저장소를 검색 소스에 연결합니다.",
- "h8XKauY": "취소",
- "A6zs-7I": "완료",
- "J6XOFqM": "이름 또는 '다음에서 만들기'",
- "WDddFyg": "이 항목은 {{value0}}/ {{value1}}에 있습니다.",
- "FLDQvbE": "{{value0}}(으)로 전환",
- "HHq8Y80": "이름을 입력하거나 출처를 검색하세요.",
- "eMl2uLM": "[선택 사항]",
- "zTK803o": "새로운 브랜치",
- "dDSXnKk": "\"{{value0}}\" 브랜치 생성",
- "Z7csSYQ": "이 워크스페이스의 이름을 지정하세요.",
- "uK2T1OQ": "\"{{value0}}\"을(를) 사용하세요",
- "CgJBkqk": "키 콤보 또는 텍스트 매크로 만들기",
- "d-64Q0E": "사용자 정의 바로가기 추가…",
- "AwkMohI": "아직 정의된 맞춤 단축키가 없습니다.",
- "EGxWrwk": "맞춤 단축키",
- "_YyvrjM": "모든 내장 단축키를 원래 순서대로 표시",
- "P0qiUsA": "기본값 재설정",
- "Odmd4jg": "키를 표시하거나 숨기려면 키를 전환하고, terminal 바로가기 표시줄에서 원하는 순서로 키를 드래그하려면 그립을 누르세요.",
- "u1ZHouk": "바로가기 바",
- "NOYO7QE": "취소",
- "8Zue0js": "다운로드",
- "jCov6Mc": "삭제",
- "EorN5mI": "사용",
- "kg-vs7o": "사용 중",
- "j2yOGiA": "데스크톱에서 설정",
- "JnTRemk": "API 키 세트",
- "B45mQIQ": "권장",
- "6qylM4Q": "사이드바에서 워크스페이스를 선택하여 여기에서 terminal을 엽니다.",
- "qe5Mx6E": "열려 있는 워크스페이스가 없습니다.",
- "JLc6yd4": "하위",
- "ugLQfPg": "하위",
- "lCIVZpI": "하위",
- "uQ24VuE": "폴더",
- "CkCg0Xk": "비활성 Codex 제한이 잘못된 공급자 ID를 사용합니다.",
- "4NLLG4A": "비활성 Claude 한도가 잘못된 공급자 ID를 사용함",
- "N8kYEP4": "Codex 제한이 잘못된 공급자 ID를 사용합니다.",
- "OWfo7Qc": "Claude 제한이 잘못된 공급자 ID를 사용함",
- "95Xks08": "WSL Codex 계정에는 정확한 배포판이 필요합니다.",
- "OZiafyo": "Host Codex 계정은 WSL 배포판의 이름을 지정할 수 없습니다.",
- "ZlNO6fQ": "WSL 비율 제한 목표에는 정확한 배포판이 필요합니다.",
- "EIhMdN0": "호스트 속도 제한 대상은 WSL 배포판의 이름을 지정할 수 없습니다.",
- "zFyydp8": "이 계정에는 사용 가능한 재설정 크레딧이 없습니다.",
- "_-grAdc": "재설정 불가",
- "Um-XfOo": "적합한 Codex 속도 제한 기간이 소진되지 않습니다.",
- "JMEauuw": "재설정할 항목이 없습니다.",
- "3qHVa1w": "Codex 사용법이 새로 고쳐졌습니다.",
- "9b3h0Pg": "재설정이 이미 적용되었습니다.",
- "QiJiFeQ": "비율 제한 재설정",
- "V9XaZZ8": "창 닫기",
- "84CVutM": "빈 Terminal",
- "5hDxS58": "이렇게 하면 {{value0}}에 대해 1번의 재설정이 소비되고 적격 속도 제한 기간이 즉시 재설정됩니다.",
- "EzPa9ek": "속도 제한 재설정을 사용하시겠습니까?",
- "TKIeXbw": "속도 제한을 재설정할 수 없습니다.",
- "rii7ZAs": "호스트가 Codex에 연락하기 전에 계정 또는 재설정 제안이 변경되었습니다. 업데이트된 세부정보를 검토한 후 다시 확인하세요.{{value0}}",
- "4DQGAog": "재설정 세부정보가 변경됨",
- "W6bmrY4": "mermaid",
- "kPLcd1A": "링크 PR",
- "UzLJy8Q": "링크 #{{value0}}",
- "5tB7Tdg": "#123 또는 https://github.com/owner/repo/pull/123",
- "D2wJo3U": "PR 번호 또는 GitHub URL",
- "ZLWuIYo": "취소",
- "f8ZsL9k": "기존 PR 연결",
- "T0kbQLc": "{{value0}} 만들기",
- "zouGGt0": "초안 {{value0}} 만들기",
- "YpkfCr0": "{{value0}} 푸시 및 생성",
- "aUTTsqg": "초안 푸시 및 생성 {{value0}}",
- "3Yb2tD4": "초안으로 만들기",
- "oPjbjuk": "베이스",
- "UsM_A3E": "제목 및 설명 생성 중…",
- "-QF2aQc": "{{value0}} 설명",
- "-uhp5Eo": "설명(선택사항)",
- "CYW43ss": "{{value0}} 제목",
- "JnixruY": "제목",
- "56ar5ss": "취소",
- "w4jN8ic": "생성",
- "E5u75yA": "생성 중…",
- "Tf6JzYM": "PR 필드를 생성하지 못했습니다.",
- "gTT3Qik": "새 {{value0}}",
- "LINjP1k": "현재 브랜치을 사용할 수 없습니다.",
- "_svp6us": "이 제공업체에서는 호스팅 PR 패널을 사용할 수 없습니다.",
- "nO4i6C8": "풀리다",
- "ZqSwRWA": "PR 연결 해제",
- "zRLzboM": "다시 열기",
- "gL1buuY": "닫기",
- "2xdqaDc": "PR 다시 열기",
- "Pz82S8w": "PR 닫기",
- "Al6-RQA": "끄기",
- "oSg4C5A": "켜짐",
- "X0q7qvA": "자동 병합 전환",
- "0J91CIk": "준비되면 자동 병합",
- "8xiSsiA": "PR 병합",
- "3XhqaKU": "#{{value0}}이(가) 다시 열립니다.",
- "oCXRjL8": "PR을 다시 열까요?",
- "b_7nPgo": "#{{value0}}은(는) 병합되지 않고 폐쇄됩니다.",
- "02Qj2V4": "PR을 닫으시겠어요?",
- "zNuHY-c": "그러면 #{{value0}}이 기본 브랜치로 병합됩니다.",
- "_0lAHWg": "PR을 병합하시겠습니까?",
- "uLhV2xU": "PR 연결을 해제하지 못했습니다.",
- "q6iGz3o": "처음 100개 작업 표시",
- "HW_qZBo": "처음 20개의 주석 표시 중",
- "x1QqPYg": "주석",
- "xJbH0vA": "세부정보가 없습니다.",
- "WPX7hnI": "웹에서 {{value0}} 열기",
- "wKKGPQ8": "{{value0}} 세부정보 확인",
- "QiC7wz8": "수정",
- "O95nvcA": "AI로 실패한 검사 수정",
- "t67jzCk": "세부 정보를 검사하거나 AI 수정 패스를 시작하세요.",
- "TkRK-a4": "실패한 검사 다시 실행",
- "hyZyn8M": "체크",
- "XfucVi0": "{{value0}} 확인 실패{{value1}}",
- "W8A4HvA": "GitHub의 댓글이 영구적으로 삭제됩니다.",
- "xGeFr98": "댓글을 삭제하시겠습니까?",
- "p4p6sek": "답장을 쓰세요…",
- "7oybC2M": "해결",
- "A6XXe-4": "해결 취소",
- "2PITe20": "스레드 해결",
- "mkEkYMY": "스레드 해결 취소",
- "4idOoK8": "삭제",
- "u9hUgiY": "댓글 삭제",
- "wS1VT0I": "편집",
- "Fs36PXM": "댓글 수정",
- "Ragn9hY": "회신",
- "s3o5DeE": "댓글에 답장하기",
- "Bnwan2Q": "댓글 수정…",
- "FKCKtAo": "GitHub에서 댓글 열기",
- "C_gXfCo": "해결됨",
- "EXMnl_4": "취소",
- "2Mrfqx0": "댓글 추가…",
- "xX8eZhc": "아직 댓글이 없습니다.",
- "FVdefgc": "댓글을 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
- "_l0TaO0": "댓글",
- "vdfQtbs": "설명이 제공되지 않았습니다.",
- "hO2eecI": "설명을 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
- "6VkqcQk": "설명",
- "vV46Tns": "전체 {{value1}}개 중 {{value0}}개 더 보기",
- "cHoCGwY": "{{value0}}개 더 보기",
- "wAwFDJY": "{{value1}} {{value2}}에 의해 {{value0}}이(가) 해결되었습니다.",
- "zrerXGc": "AI로 충돌 해결",
- "w2WcFns": "충돌하는 파일",
- "KuLUlYc": "Copy commands",
- "7E56l1g": "복사됨",
- "6TXtA4Q": "병합 가능성 새로 고침 명령 복사",
- "39Nl8mw": "이 워크트리에서 실행",
- "7Qv5eYo": "이 브랜치에는 해결해야 할 충돌이 있습니다.",
- "93sCYQo": "{{value0}}개 커밋 뒤처짐 (기준 커밋:",
- "ngn4NjA": "{{value0}}개 커밋 뒤처짐 (기준 커밋:",
- "mTbAh0Q": "commit",
- "DnSMHG0": "충돌",
- "8Est-xI": "{{value0}} 제거",
- "jBToX-I": "요청된 리뷰어가 없습니다.",
- "T5Uc4Ao": "리뷰어를 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
- "Ryr3DCQ": "리뷰어 로드 중…",
- "fX2uAEU": "리뷰어",
- "E5rQqRQ": "리뷰어 추가 또는 제거",
- "E2VHius": "PR 제목 편집",
- "oBmCrB8": "저장",
- "xOwofss": "제목 저장",
- "UgBLL4w": "취소",
- "D-7jM08": "제목 수정 취소",
- "nbfmLgg": "웹에서 PR #{{value0}} 열기",
- "eNX9Nmo": "기존 PR 연결",
- "_mT5R7M": "기존 PR 연결",
- "SRr0o4U": "현재 브랜치는 공개 PR에 연결되어 있지 않습니다.",
- "CmpszXU": "{{value0}}은(는) 공개 PR에 연결되어 있지 않습니다.",
- "maf-eds": "새로고침하여 다시 확인하거나 이 브랜치에 대한 새 PR을 생성하세요.",
- "G2BaE-Y": "공개 PR이 없습니다.",
- "I3xSuPA": "연결된 PR #{{value0}}을(를) 사용할 수 없습니다.",
- "5kE-iVM": "PR 생성",
- "Y_NnJ9M": "PR 생성",
- "YZFe3Qg": "PR 새로 고침",
- "TSDVcKU": "PR",
- "tca0V2E": "PR을 생성하지 못했습니다.",
- "EMFMGnw": "PR을 생성하기 전에 브랜치를 확인하세요.",
- "6OYLM7w": "일치하는 사용자가 없습니다.",
- "Ne-d-yA": "사람 검색",
- "K34xo24": "리뷰어",
- "dVs-M9I": "사용자를 로드하지 못했습니다.",
- "_IeDTL8": "검토됨",
- "NEg29tM": "대기 중",
- "dmAcep8": "해고됨",
- "bF0aphw": "댓글이 달림",
- "rjj84-Y": "변경 요청됨",
- "IloG18k": "승인됨",
- "hCKjn9A": "체크 없음",
- "_RfDeuw": "봇",
- "4fGywsA": "사람",
- "rkpE-Mg": "모두",
- "u8NH0Xk": "Esc",
- "rfYWlSA": "브라우저에 텍스트 보내기",
- "g3GvsOs": "페이지에 입력…",
- "48esWoc": "좋아요",
- "RXEfHVA": "취소",
- "z1nkBLw": "브라우저 대화 상자",
- "-00MlTU": "URL",
- "GVCAd00": "새로고침",
- "-YMBg9U": "포워드",
- "a_PEZW8": "뒤로",
- "5dQ6Hbc": "유효한 URL을 입력하세요.",
- "ZoS2fOc": "브라우저 스트림 시간이 초과되었습니다.",
- "YmwDAcU": "브라우저 페이지는 아직 사용할 수 없습니다.",
- "lBu6FGw": "데스크톱 브라우저 스트리밍 지원을 확인하는 중입니다.",
- "X2WJPN4": "모바일에서 브라우저 탭을 스트리밍하려면 데스크톱 Orca를 업데이트하세요.",
- "gZUBadw": "{{value0}} 클릭 수정자",
- "GTbLYFM": "옮기다",
- "fP87QIY": "Alt",
- "EqW8StQ": "Ctrl 키",
- "IW8xp4k": "명령",
- "lV607bI": "{{value0}} 웹사이트 보기 표시",
- "eJJUzYE": "모바일",
- "3TuUR-s": "웹",
- "p7fz5tw": "agent 세션 재개",
- "f1-v-HM": "현재 워크트리",
- "tL7Cy3c": "메시지",
- "fZXkGhQ": "메시지",
- "L_8qprI": "이 범위에는 이전 agent 세션이 없습니다.",
- "X8748Hs": "검색어와 일치하는 세션이 없습니다.",
- "KkgSO8k": "agent 세션 없음",
- "Uc72mxE": "세션 검색, repo:, 경로:",
- "7OL03t8": "다시 시도",
- "IFh38kk": "로드할 수 없습니다",
- "D1lHtt4": "agent 세션 기록을 찾아보려면 이 호스트에서 Orca를 업데이트하세요.",
- "yRlsHYk": "Agent 세션 기록을 사용할 수 없습니다.",
- "Qvd5WD0": "agent 세션 새로 고침",
- "z2KOXZE": "Agent 세션 기록",
- "bGNaHw8": "뒤로",
- "HsI5rsc": "세션을 재개하지 못했습니다.",
- "sibM7yE": "Agent 세션이 대기 중입니다.",
- "ADvyKkM": "호스트 플랫폼을 확인할 수 없습니다.",
- "8fvhHmw": "이 세션에 이력서 ID가 없습니다.",
- "BLr07Ao": "호스트를 기다리는 중...",
- "rcPfxtE": "모두",
- "dhgeP_o": "프로젝트",
- "0k6Zchk": "워크스페이스",
- "E5PTzrk": "{{value0}} {{value1}} 건너뛰었습니다.",
- "nSh69OQ": "호스트를 기다리는 중…",
- "Au06U2c": "Agent 세션 기록",
- "XjyxBLA": "소스 제어",
- "pBOdX2k": "@orca_build",
- "qfIlnqY": "stablyai/orca",
- "1sjQKuE": "onOrca.dev",
- "wRf8z4A": "100x 빌더를 위한 오픈 소스 agent IDE",
- "o1zkACA": "Orca",
- "qBqOdtg": "에 대한",
- "wdyLCXU": "terminal 링크 열기",
- "K6VU-6c": "terminal 출력에서 탭한 HTTP(S) 링크가 열리는 위치를 선택합니다.",
- "gh7VaTc": "링크",
- "GJwMNak": "브라우저",
- "Wj6QRnE": "이 휴대전화의 Safari, Chrome 또는 다른 브라우저에서 엽니다.",
- "hIo6XgE": "전화 브라우저",
- "Z49nZqQ": "페어링된 데스크톱의 스트리밍 브라우저에서 엽니다.",
- "OcnHGtE": "데스크톱의 Orca 브라우저",
- "POUjxlM": "페어링된 호스트가 없습니다.",
- "FX9lUwo": "이 세션에는 아직 연결 이벤트가 없습니다. 앱이 이 호스트에 전화를 걸면 이벤트가 나타납니다.",
- "GiZXYb8": "진단 복사",
- "DYy9eRs": "복사됨",
- "mu5iayg": "· {{value0}} 시도",
- "x43FzPs": "연결 로그",
- "rqAbU9s": "연결되었습니다",
- "bKwbnYs": "코드를 스캔하세요",
- "N1Ra8Og": "Orca 데스크탑 열기",
- "o8-uNXo": "'{{value0}}'을(를) 삭제하시겠습니까? 나중에 다시 페어링할 수 있습니다.",
- "yOJT3HY": "호스트 제거",
- "t1m0jcA": "제거",
- "dqjXxV8": "호스트 수정",
- "RwT781U": "연결 해제",
- "JnIDr0Y": "7일",
- "_KqkyAU": "5h",
- "VXpHvL4": "계정 사용량",
- "8CNCPA8": "새 워크스페이스",
- "lWqrsbM": "데스크탑 페어링",
- "1St5QBU": "빠른 작업",
- "y7w0hIs": "작업",
- "ROZQW2U": "재개",
- "81Qrbno": "데스크탑",
- "TPknwrs": "생성된 PR",
- "4uJ9yUY": "Agent 시간",
- "qFFbXcQ": "시작된 Agents",
- "9i5ZhFo": "다시 오신 것을 환영합니다",
- "9HldFAc": "작동 원리",
- "QT_H7rk": "컴퓨터에서 Orca와 페어링하여 agents를 확인하고, 모든 terminal로 이동하고, 휴대폰에서 작업을 수행하세요.",
- "8vieqXE": "데스크탑을 연결하세요",
- "VjaDNq0": "Orca",
- "GLgoz1s": "다시 시도해 주세요.",
- "U7WlIpo": "호스트를 제거할 수 없습니다.",
- "tNj4XnM": "{{value0}} 작업 열기",
- "1_sz9cs": "연결된 작업 소스가 없습니다.",
- "aOm3VN4": "온보딩 진행",
- "mB8kw4M": "Orca",
- "6vGSxlM": "알림 설정을 업데이트할 수 없습니다. 다시 시도해 보세요.",
- "Dl9ttFI": "선택사항을 저장할 수 없습니다. 다시 시도해 보세요.",
- "LutlQWg": "Chat UI에서 세션 열기",
- "p0ydSMw": "끄기",
- "OXcAS68": "켜짐",
- "sW_6PG4": "이 장치에서 지원되는 agents 세션(Claude, Codex 및 기타 채팅 가능 agents)이 열리는 방식을 선택하세요. Terminal에는 원시 CLI가 표시됩니다. 채팅 UI는 데스크톱 앱과 같은 채팅 인터페이스를 보여줍니다. 길게 누르기 메뉴에서 개별 세션을 전환할 수 있습니다.",
- "R7mksio": "기본 보기",
- "ao09T48": "Chat UI",
- "yTJLwao": "뒤로",
- "x7lqDGA": "설정 열기",
- "aXWuT8I": "Agent 알림",
- "GIjQvDw": "알림",
- "sKiKFEI": "집으로 돌아가기",
- "zDZEMlw": "연결 중…",
- "gZ1SfD8": "취소",
- "V-NORJA": "쌍",
- "3LfZ8xU": "데스크탑에서 페어링 링크를 열었습니다. 호스트에 추가하려면 확인하세요.",
- "ymuJ-Uc": "이 데스크탑과 페어링하시겠습니까?",
- "AHFOidY": "페어링 실패: {{value0}}",
- "uZiEDJ8": "{{value0}}s 내에 연결할 수 없습니다. 중단된 위치는 아래 로그를 참조하세요.",
- "-jAAi0E": "orca://pair?code=... or paste the code",
- "G-MJBZU": "컴퓨터의 QR 아래에 표시된 코드를 복사하세요.",
- "klFU7hQ": "페어링 코드 붙여넣기",
- "Q_qrUNw": "대신 코드 붙여넣기",
- "_C6l3j4": "다시 시도",
- "T3HZLEU": "연결 중…",
- "U_fkYz4": "또는 페어링 코드 붙여넣기",
- "dTFolus": "QR 코드를 스캔하세요",
- "mPdpsdo": "설정 → 모바일로 이동하세요.",
- "dFxLHEw": "컴퓨터에서 Orca를 엽니다.",
- "wvDgXHk": "설정 열기",
- "Scz67W0": "계속",
- "b6n4c_8": "설정에서 카메라 액세스를 활성화하거나 대신 페어링 코드를 붙여넣으세요.",
- "InfekMg": "데스크톱의 Orca에서 QR 코드를 스캔하거나 대신 페어링 코드를 붙여넣으세요.",
- "sBkGoYA": "카메라 액세스 비활성화됨",
- "0VOtRkg": "데스크톱과 페어링",
- "HVl7cpc": "페어링 실패: {{value0}}",
- "zyTFKp4": "{{value0}}s 내에 연결할 수 없습니다. 중단된 위치는 아래 로그를 참조하세요.",
- "feaDGg4": "유효한 페어링 코드가 아닙니다. 컴퓨터에서 복사하여 다시 붙여넣으세요.",
- "iHaWj50": "유효한 Orca QR 코드가 아닙니다.",
- "AIhB-fM": "집으로 돌아가기",
- "eQE_ziw": "페어링 코드 누락",
- "cFPanOU": "지원",
- "7jufUfc": "개인 정보 보호 정책",
- "EJmGYjM": "다시 시도",
- "ks7el1o": "페어링 자격 증명 삭제를 다시 시도하세요.",
- "kiQMppk": "이 기기의 정리 상태를 확인할 수 없습니다. 안전하게 다시 시도하세요.",
- "Wh-JD8U": "이 기기에서 {{value0}} 자격 증명{{value1}}의 정리를 확인할 수 없습니다.",
- "K-uhruk": "아직 정리를 확인할 수 없습니다. 나중에 다시 시도하세요.",
- "BFrWnfA": "페어링 자격 증명 정리",
- "EELdtVU": "에 대한",
- "0aipMZQ": "문제 해결",
- "i8QR0SY": "알림",
- "rm30Zkg": "음성",
- "ttAM7Ds": "브라우저",
- "-aB74WM": "Chat UI",
- "QlyWJyY": "Terminal",
- "0cOgjik": "설정",
- "lfAeAOI": "Terminal 텍스트 크기",
- "nN25Xmo": "{{value0}} 복원",
- "rE4IiF8": "끄기",
- "qR5mpHo": "켜짐",
- "AsTLd6A": "자동 완성 및 자동 수정",
- "mK_kCfI": "terminal 명령 모음에서 전화 스타일 자동 완성, 자동 수정 및 맞춤법 제안을 활성화합니다. 기본적으로 꺼져 있으므로 키보드는 명령, 플래그 또는 경로를 다시 쓰지 않습니다. 직접 키보드 입력(키가 terminal로 바로 이동하는 경우)은 항상 원시 키 입력을 전송하므로 제안 사항이 적용되지 않습니다.",
- "18J3yr0": "키보드 입력",
- "QcL6LT4": "텍스트 크기",
- "nzfG92c": "terminal 텍스트의 크기를 조정합니다. 크기가 작을수록 측면 여백이 있는 더 많은 열에 적합합니다. 크기가 클수록 더 적은 수의 열이 표시됩니다. 옆으로 드래그하면 이동됩니다. 또한 terminal 자체를 핀치하여 확대하여 이 설정을 업데이트할 수도 있습니다. 장치별 표시만 가능합니다. 데스크탑 terminal을 변경하지 않습니다.",
- "OS-rNTI": "텍스트 크기",
- "U2mtyZg": "아직 페어링된 데스크톱이 없습니다. terminal 동작을 제어하려면 하나를 페어링하십시오.",
- "-fV3Ce8": "휴대폰에서 terminals을 사용하는 동안 Orca는 화면에 맞게 terminals을 축소합니다. 앱을 닫거나 다른 곳으로 전환하면 앱이 휴대폰 크기로 유지되는지(대화형 CLI 도구가 리플로우되지 않음) 또는 데스크탑으로 다시 크기가 조정되는지 여부가 제어됩니다. 언제든지 이 terminals 복원 또는 배너의 모든 terminals 복원을 사용하여 수동으로 크기를 조정할 수 있습니다.",
- "f9vgUHc": "앱을 종료할 때",
- "kJj5Z2g": "Terminal",
- "rU9qdt0": "30분 후",
- "p2EWmRg": "5분 후",
- "gBGOsCI": "1분 후",
- "q6VQcZE": "휴대폰 크기로 유지(기본값)",
- "75Kr_24": "최대 (200%)",
- "tAn81tY": "더 크게(150%)",
- "HqP6IBw": "대형 (125%)",
- "0OKOsKY": "기본값(100%)",
- "CAs8oUM": "작음(75%)",
- "hiouM1M": "최소(50%)",
- "2J8vm70": "일반 문제",
- "bwJLtK4": "연결 로그 보기",
- "5xQU6vw": "진단 실행",
- "B5C2aso": "다시 실행",
- "dQs8-jc": "실행 중…",
- "DIEmGuM": "문제 해결",
- "8sOFcoA": "플랫폼",
- "Ie918PM": "호스트",
- "3gA9qeo": "인터넷",
- "_IfUZ2s": "페어링된 호스트",
- "C-t7pm8": "음성 모델",
- "n-BJK-c": "연설 모델",
- "uwVWBGE": "토글: 한 번 누르면 시작되고 다시 누르면 중지됩니다. 보류: 누르고 있는 동안 지시합니다.",
- "Jh4zuEU": "받아쓰기 모드",
- "4g1gMYA": "데스크탑의 초점이 맞춰진 창에 텍스트를 받아쓰세요.",
- "23v3WVE": "음성 받아쓰기 활성화",
- "L4c5Sxw": "받아쓰기",
- "pJrwjt0": "음성 설정을 관리하려면 데스크톱에 연결하세요.",
- "pSmQbNo": "음성",
- "Wgx1aTY": "삭제 실패",
- "O-GK4L4": "Download failed",
- "cpL32fY": "모델을 선택할 수 없습니다",
- "PiXz3AQ": "업데이트할 수 없습니다.",
- "wFKD2Es": "음성 설정을 로드하지 못했습니다.",
- "hYUl_w0": "길게 누르기",
- "yxHp0Uc": "토글",
- "fO2nz88": "PR",
- "AcEIxcI": "변경 사항",
- "atubgYk": "Agent 세션 기록",
- "MZqxT8s": "소스 제어",
- "wtxV_i4": "Terminal",
- "YTfV9-o": "작업",
- "KVY3pfk": "계정",
- "0zcPPW8": "호스트 수정",
- "esqB5TM": "호스트",
- "lXRU_hQ": "데스크톱 설정 → 계정에서 계정을 추가하거나 재인증하세요.",
- "z0N4v1Y": "계정 로드 중…",
- "XheJ_p8": "계정",
- "08ocQGs": "7일",
- "YmnN8fw": "5h",
- "rjJXJpg": "agent 자체 로그인 사용",
- "uuo9M60": "시스템 기본값",
- "5TVCgEg": "계정을 전환할 수 없습니다.",
- "nnr0WpI": "호스트를 찾을 수 없습니다",
- "Cop_m2o": "호스트의 잘못된 계정 스냅샷",
- "sqHaM-Q": "{{value0}}에 연결 중…",
- "dYplni8": "IP, 호스트:포트 또는 ws:// / wss://를 허용합니다. 누락된 포트는 현재 포트(또는 6768)로 기본 설정됩니다.",
- "kMmtf5E": "주소",
- "jHccG1s": "호스트 이름",
- "wLjwLQg": "이름",
- "KytWtss": "표시 이름이나 연결 주소를 변경하세요. 주소 편집은 이 전화기가 연결된 스위치에만 적용되며 다시 페어링되지는 않습니다. 동일한 데스크톱이 다른 IP로 연결될 수 있는 경우(예: 홈 LAN과 Tailscale) 이를 사용합니다.",
- "LS3NecQ": "돌아가기",
- "OOhGw28": "저장",
- "ugYhCr4": "호스트 저장",
- "NKISHlY": "호스트 수정",
- "K8w9o8U": "뒤로",
- "sI26LXo": "호스트를 저장하지 못했습니다.",
- "7UECNUc": "이름을 입력하세요.",
- "koyS6Oc": "호스트를 로드하지 못했습니다.",
- "T_ULLfI": "이 호스트는 이 전화에서 삭제되었습니다.",
- "yLNjPPk": "호스트가 없습니다.",
- "eB5hKE4": "{{value0}}에 연결",
- "HbMqJ5k": "'{{value0}}'을(를) 삭제하시겠습니까? 나중에 다시 페어링할 수 있습니다.",
- "tndsmJE": "호스트 제거",
- "PCaw7X8": "삭제",
- "7b05QJE": "잠",
- "jQgIadE": "취소",
- "sCHpXNI": "작업 트리 삭제",
- "aCNuYPE": "저장소",
- "MFWDh4g": "기본 브랜치 숨기기",
- "1w-t3vQ": "슬립 중인 항목 숨기기",
- "bd8B2ME": "워크스페이스",
- "5IYckMg": "필터 지우기",
- "S8jJ9v4": "필터",
- "fVWdjBk": "그룹화 기준",
- "hFsVshM": "정렬 기준",
- "sUx-id0": "PR",
- "CzGUIP8": "Repo",
- "GAUYfWk": "상태",
- "mZ5NlSU": "그룹",
- "LgVSSVY": "워크스페이스 검색",
- "AYkrJs8": "검색 닫기",
- "LIEbwVI": "새로운 워크스페이스",
- "qs3IfgE": "플로팅 워크스페이스",
- "V5DOCOQ": "작업",
- "CVlu0tE": "계정",
- "KYYIQO4": "그룹 워크스페이스",
- "jZR1hFw": "{{value0}} 기준으로 정렬",
- "kz_Kdkw": "워크스페이스 필터링",
- "6oNXq-k": "워크스페이스 필터링, 활성 필터 1개",
- "DxBfvEc": "워크스페이스 필터링, 활성 필터 {{value0}}개",
- "Iq0v42M": "사이드바 숨기기",
- "2FFC6Og": "다시 연결",
- "IDkp2AI": "호스트로 돌아가기",
- "QHBQ8yI": "다시 시도해 주세요.",
- "P_OTj14": "호스트를 제거할 수 없습니다.",
- "2FRJWFs": "호스트를 찾을 수 없습니다",
- "2hirWvg": "필터{{value0}}",
- "asTmnrM": "'{{value0}}'({{value1}})을 삭제하시겠습니까?",
- "ZhTpuGQ": "업데이트 항목",
- "sSNY3pg": "PR 병합",
- "cR4zEEM": "머지 리퀘스트",
- "l77C_aI": "이 PR을 병합하는 방법을 선택하세요.",
- "AxbwZZ0": "이 MR을 병합하는 방법을 선택하세요.",
- "ax5V10c": "병합 방법",
- "ZDweAzI": "상태 변경",
- "Fc7HS-c": "병합 MR",
- "QnAsBMo": "GitHub는 병합 충돌을 보고합니다.",
- "MPMGVuk": "PR 병합",
- "vW7-nd4": "GitHub 링크 복사",
- "xD9cVOU": "복사됨",
- "tS4SSLM": "Linear 링크 복사",
- "14O3-ys": "워크스페이스 만들기",
- "ftImAuc": "만드는 중...",
- "D7U7kB4": "댓글이 없습니다.",
- "AXmMT_g": "논의",
- "z1ts1Vw": "하위 이슈 추가",
- "G6AAKyI": "하위 이슈 제목",
- "czxJ7iQ": "열기",
- "8MKn4Lk": "하위 이슈가 없습니다.",
- "yIapPk8": "하위 이슈",
- "-uupizo": "이 MR에 실행된 파이프라인이 없습니다.",
- "pzBhZI4": "없음",
- "re5Bmac": "{{value0}} 직업",
- "iaudYyQ": "파이프라인",
- "XLoI3kU": "파일 콘텐츠를 사용할 수 없습니다.",
- "jh3_4KI": "바이너리 파일.",
- "DtNbEWc": "본 것으로 표시",
- "11IaYcI": "보지 않은 것으로 표시",
- "PYs8iJY": "보기",
- "_Qr_OQY": "숨기기",
- "WhM0uCg": "변경된 파일",
- "Ct4OwyY": "수표를 찾을 수 없습니다.",
- "Hhu9oHM": "모두 다시 실행",
- "jphAkJQ": "재실행 실패",
- "ruk6BoQ": "새로고침",
- "XlbT3Zg": "체크",
- "KoPjVCY": "검토 요청",
- "WTd49qc": "리뷰어 요청",
- "k2ppyKs": "리뷰어 제안이 없습니다.",
- "Re-pmxo": "리뷰어 로드 중...",
- "ifA4snA": "요청한 리뷰어가 없습니다.",
- "hDVISbQ": "리뷰어",
- "FQRH8fY": "담당자 업데이트",
- "X_A_K1Q": "사용자 이름 삭제, 쉼표로 구분",
- "K9otrEQ": "사용자 이름을 쉼표로 구분하여 추가하세요.",
- "--H0boQ": "이 저장소에 할당 가능한 사용자가 없습니다.",
- "gX4WIW4": "담당자 로드 중...",
- "oL0nsd4": "담당자",
- "K9OxCfg": "라벨 업데이트",
- "gyu0Q6w": "라벨 삭제, 쉼표로 구분",
- "ByJ_aqM": "라벨 추가(쉼표로 구분)",
- "ySDu5JQ": "이 저장소에는 라벨이 없습니다.",
- "vYfgNJ8": "라벨 로드 중...",
- "GhHLbBA": "라벨",
- "OOzqk6Q": "제목 저장",
- "6b2exyc": "제목",
- "bmXEQhk": "설명 저장",
- "xX2Cp7c": "설명",
- "iM5LG78": "프로젝트",
- "b3RSkG0": "담당자",
- "Fa6K7yI": "상태",
- "o2-QUvU": "유형",
- "mDTZEr4": "세부정보 새로고침",
- "bS5_420": "Merge에는 Orca에 이 저장소가 필요합니다.",
- "9bffkjg": "항목 닫기",
- "vegmy2w": "항목 다시 열기",
- "jKf3DPI": "GitHub에서 열기",
- "fngWtc4": "워크스페이스는 GitHub 이슈 및 PR에서만 생성할 수 있습니다.",
- "MVHK0qg": "삭제",
- "BhSglbo": "편집",
- "2MyR_iQ": "회신",
- "Rjjl1iA": "스레드 해결",
- "qEc1OYo": "스레드 다시 열기",
- "Fv7ly30": "취소",
- "xxWLKS8": "저장",
- "loMCIgM": "댓글 수정",
- "z1fMPAI": "표시",
- "Uv1hPbA": "댓글 {{value0}}개",
- "GKSPk20": "필드 지우기",
- "akD0kZQ": "필드 저장",
- "5gzka0E": "텍스트",
- "1jNZjFQ": "숫자",
- "KulyzJY": "YYYY-MM-DD",
- "CXQp8Pw": "사용 가능한 반복이 없습니다.",
- "6tQv41I": "날짜를 YYYY-MM-DD로 입력하세요.",
- "DqtxPEI": "유효한 숫자를 입력하세요.",
- "JV1Xsds": "프로젝트 분야",
- "3p4QMPc": "클리어 타입",
- "5DEGuK4": "이 저장소에 대해 구성된 문제 유형이 없습니다.",
- "w23rmTc": "문제 유형 로드 중...",
- "1YuDgI8": "이슈 유형",
- "NnYhRJs": "프로젝트 아이템",
- "jGZods8": "초안 문제",
- "xcg6mvE": "이슈",
- "Bawm-QY": "PR",
- "eGT8LNM": "저장소 복사",
- "p3aCd2Y": "Orca에 없는 Repos",
- "eNyNmbU": "실행 안 함",
- "llz-FzM": "항상 믿고 달려가세요",
- "520CKU4": "설정 스크립트를 신뢰하지 못했습니다.",
- "m-fVevQ": "후크 실행",
- "XPutx64": "설정 스크립트",
- "vtdIQWU": "새로운 설정 스크립트",
- "Q3oUbk4": "이 저장소의 orca.yaml은 워크스페이스가 시작되기 전에 컴퓨터에서 실행됩니다. 이 저장소를 신뢰하는 경우에만 실행하세요.",
- "M_Pqsow": "{{value0}}에서 설정을 실행하시겠습니까?",
- "QetdCKc": "{{value0}}의 설정 스크립트가 변경되었습니다.",
- "xd1VuYs": "설정 건너뛰고 만들기",
- "b0Ah5tg": "설정 실행 및 생성",
- "N0pQdfg": "설치 스크립트를 실행하시겠습니까?",
- "g2mP3mE": "src/renderer packages/ui",
- "chkWwSI": "디렉토리",
- "oh8k9MM": "렌더러 UI",
- "7dCN6Lk": "이름",
- "al2hOTo": "스파스 사전 설정 편집",
- "m6fKanI": "새로운 희소 사전 설정",
- "6-gKCU8": "새로운 사전 설정",
- "m38OFiM": "전체 저장소 사용",
- "0fqNjoo": "전체 체크아웃",
- "6xj6dHo": "스파스 체크아웃",
- "uwfc5JU": "일치하는 브랜치가 없습니다.",
- "ajFYYlY": "이 저장소의 구성된 기반을 사용하십시오.",
- "tJhJMIQ": "기본 브랜치",
- "ww9236A": "브랜치 검색",
- "O0AHKnE": "기존 브랜치 또는 참조를 선택합니다.",
- "vqofDcI": "시작 위치",
- "wD7tyKU": "Agent",
- "RBS8OI4": "리포지토리",
- "SWOSFtY": "저장소 연결",
- "phVPn2Q": "agents 감지 중...",
- "4F__ZBY": "저장소를 찾을 수 없습니다.",
- "6kKiG2U": "Linear 워크스페이스를 만들기 전에 Git 저장소를 추가하세요.",
- "naggWL4": "다음에서 시작",
- "8PDq1d4": "고급",
- "SRP0mzk": "먼저 저장소를 연결하세요",
- "5URSVzY": "[선택 사항]",
- "nr-rmnA": "워크스페이스 이름",
- "eDrVQno": "연결",
- "HIci8AI": "연결 중...",
- "hcl0Sms": "SSH 연결",
- "UHWW7sY": "다음 위치에 워크스페이스 만들기",
- "8aaa0oM": "귀하의 키는 호스트 OS 키체인을 통해 암호화되어 로컬에 저장됩니다.",
- "KV_5X9g": "Linear 설정 / 보안 / 새 API 키",
- "CCoHJhM": "lin_api_...",
- "a4vIye8": "개인 API 키",
- "6EAEvD4": "해당 워크스페이스에서 문제를 찾아보려면 개인 API 키를 붙여넣으세요.",
- "jbMHil8": "Linear 워크스페이스 연결",
- "Xg1P3sw": "Linear 팀",
- "wSJtlQc": "이슈 생성",
- "cnRpEac": "컨텍스트 추가",
- "dxkQ090": "작업 제목",
- "GbFyuJM": "origin",
- "CF9OlC4": "업스트림",
- "3U3WMlI": "이슈 소스",
- "czBdX7w": "팀",
- "ZXVz3A4": "선택한 Linear 팀에서 이슈를 생성합니다.",
- "V9yDSos": "선택한 저장소에서 이슈를 생성합니다.",
- "QoLelVI": "작업 정렬",
- "Jhimi1k": "디스플레이 속성",
- "skslBcE": "주문 Linear 문제",
- "4wjHjFU": "그룹 Linear 문제",
- "59_okJI": "Linear 보기",
- "GpSeJMA": "사용 가능한 주 없음",
- "_mQhK7g": "상태 로드 중...",
- "xw1L5lQ": "상태 변경",
- "dEIGNBo": "모든 팀",
- "UL55j-A": "작업에 표시할 팀을 선택하세요.",
- "ZnNVwOs": "Linear 팀",
- "nLSftbc": "워크스페이스를 전환하지 못했습니다.",
- "3Nokros": "Linear 워크스페이스",
- "jnRj_2I": "Linear 필터",
- "k98CNAU": "GitLab 필터",
- "roI3I5g": "GitLab 보기",
- "EQxa0Qk": "카드에서 숨겨짐",
- "p0Rtsu4": "카드에 표시됨",
- "nOtNSyE": "이 보기에는 표시할 추가 필드가 없습니다.",
- "3YhoII8": "항목 카드에 표시되는 프로젝트 필드를 선택합니다.",
- "kqKUAww": "프로젝트 분야",
- "TcKUEto": "프로젝트 정렬",
- "pTwUfTs": "Orca는 아직 이 GitHub 프로젝트 레이아웃을 지원하지 않습니다.",
- "E_vNSwU": "프로젝트 보기",
- "4KsU0uw": "프로젝트 보기 선택",
- "RzP96Tg": "더 이상 프로젝트가 없습니다.",
- "HH8i3aE": "일치하는 프로젝트가 없습니다.",
- "yJYA52k": "모두 찾아보기",
- "2BAkBs4": "모두 찾아보기(로드 중...)",
- "70mLMDk": "핀",
- "d2YMdrw": "최근",
- "6WVhiZM": "제거",
- "Rn74bFA": "고정됨",
- "0Dc-Ym0": "다시 시도하려면 탭하세요.",
- "dbO6elU": "로드된 프로젝트가 없습니다.",
- "wpUutIo": "프로젝트를 로드하지 못했습니다.",
- "9srv5vA": "누락된 프로젝트에 접근하려면 URL로 추가를 사용하세요.",
- "x8yvGR0": "일부 조직이 로드되지 않았습니다({{value0}}).",
- "rTimB6Y": "{{value0}}에서 프로젝트를 로드할 수 없습니다.",
- "25-g19E": "추가",
- "i7LVjnE": "추가 중...",
- "Qyb0AbI": "URL 또는 소유자/번호로 추가",
- "gBglOLc": "프로젝트 검색",
- "6e87BT8": "작업 페이지에 대한 프로젝트 보기를 선택합니다.",
- "4pG_Id0": "GitHub 프로젝트",
- "5kq0ekc": "이전 결과를 로드합니다.",
- "cR6luW0": "짐을 실은",
- "K80V7xk": "로드되었거나 사용 가능한 결과 페이지로 이동합니다.",
- "Zpsg1Hk": "GitHub 페이지",
- "41d4YcM": "이슈",
- "sQ-iS-M": "PR",
- "LkEKGa8": "GitHub 보기",
- "a5ldOMU": "대체 이슈 소스를 사용할 수 없습니다.",
- "LGWybvE": "각 저장소가 업스트림 또는 원본에서 작업을 쿼리하고 생성하는지 선택합니다.",
- "aqrdcoU": "GitHub 이슈 소스",
- "FohFTKc": "모든 리포지토리",
- "ec9l6fo": "쿼리할 저장소를 선택하세요.",
- "pMWEK5w": "저장소",
- "JAnflBU": "작업 소스",
- "7L6hVV8": "다음 페이지",
- "7aV6RlU": "페이지 {{value0}}",
- "mDUXZ5M": "페이지 선택, 페이지 {{value0}}",
- "eLSyiVk": "이전 페이지",
- "SlWRC8A": "{{value0}}에서 상태 변경",
- "XHZQUAc": "프로젝트 항목 없음",
- "F7DoZNU": "프로젝트 검색",
- "UqRLwDk": "GitHub 프로젝트 선택",
- "IQp4SP8": "Linear 연결",
- "42DYBxM": "작업에서 직접 할당된 Linear 문제를 찾아보고 작업을 시작하세요.",
- "L9oPTag": "Linear 계정 연결",
- "J73iv2w": "이 모바일 작업 보기에는 최신 데스크톱 런타임이 필요합니다.",
- "iUDJtXI": "Orca 데스크탑 업데이트",
- "KQkXL08": "토큰에 대한 하위 이슈 데이터를 사용할 수 없습니다.",
- "yF0bGcQ": "다시 시도",
- "aCzhUtY": "재시도 중...",
- "QU-Uflw": "{{value0}}/{{value1}}에서 문제 로드를 다시 시도하세요.",
- "91ACsJY": "다음에서 이슈를 로드할 수 없습니다.",
- "7WH7i2M": "{{value0}} 작업 검색...",
- "RzsrKAc": "프로젝트 보기 검색...",
- "niMSGwc": "표시",
- "_TeSdI8": "작업",
- "-Qqso-0": "모든 워크스페이스",
- "Hs-i62I": "주문 보기",
- "UhoT2i4": "댓글 보내기",
- "_I4A15k": "댓글 추가",
- "piHodso": "이슈 소스를 업데이트하지 못했습니다.",
- "XuKemqY": "작업을 생성하지 못했습니다.",
- "Sni1IDk": "Linear 하위 이슈를 생성하지 못했습니다.",
- "GdZdv18": "Linear 하위 이슈를 로드하지 못했습니다.",
- "YpcHVvo": "Linear 댓글을 추가하지 못했습니다.",
- "gNpYapQ": "Linear 문제를 업데이트하지 못했습니다.",
- "_t92UNY": "병합하지 못했습니다.",
- "wPJymlU": "GitHub는 병합 충돌을 보고합니다. 계속하려면 GitHub에서 여세요.",
- "k4ojp0Y": "답장하지 못했습니다.",
- "jRm4RmA": "리뷰 댓글을 추가하지 못했습니다.",
- "4Si7jXY": "PR 헤드 SHA가 없으면 댓글을 달 수 없습니다.",
- "b6obzk0": "파일 콘텐츠를 로드하지 못했습니다.",
- "7sESNDQ": "이 PR에 대한 파일 콘텐츠를 로드할 수 없습니다.",
- "Akq8bGo": "리뷰 스레드를 업데이트하지 못했습니다.",
- "3JBRDbM": "조회 상태를 업데이트하지 못했습니다.",
- "HCcPUIo": "이 PR의 조회 상태를 동기화할 수 없습니다.",
- "ppWaFdk": "체크를 다시 실행하지 못했습니다.",
- "_sMIbrI": "체크를 새로고침하지 못했습니다.",
- "eYVZBag": "리뷰어를 요청하지 못했습니다.",
- "4-krOeE": "텍스트를 복사하지 못했습니다.",
- "Y45YlXw": "링크 복사 실패",
- "-bXRzXk": "댓글을 추가하지 못했습니다.",
- "nOlVFQ0": "GitLab 항목을 업데이트하지 못했습니다.",
- "PA_I94w": "GitHub PR을 업데이트하지 못했습니다.",
- "aulxiV4": "GitHub 이슈를 업데이트하지 못했습니다.",
- "BvA66yA": "상태를 업데이트하지 못했습니다.",
- "qVRnj6M": "PR을 병합하지 못했습니다.",
- "QKHONdI": "문제 유형을 업데이트하지 못했습니다.",
- "Z7UA1fA": "이 프로젝트 이슈 유형은 모바일에서 편집할 수 없습니다.",
- "QbIagpk": "프로젝트 필드를 업데이트하지 못했습니다.",
- "TE3rsP8": "항목을 업데이트하지 못했습니다.",
- "2lpu738": "이 프로젝트 항목은 모바일에서 편집할 수 없습니다.",
- "UbvF6N4": "댓글을 삭제하지 못했습니다.",
- "22DpbZo": "본 프로젝트 댓글은 모바일에서는 삭제할 수 없습니다.",
- "Lw1c31w": "댓글을 수정하지 못했습니다.",
- "fToZEE4": "본 프로젝트 댓글은 모바일에서는 편집이 불가능합니다.",
- "aCTe1aA": "워크스페이스를 만들기 전에 Orca에 프로젝트 항목 저장소를 추가하세요.",
- "8r702TY": "워크스페이스를 생성하지 못했습니다.",
- "xWmoUM8": "스파스 사전 설정을 저장하지 못했습니다.",
- "MNvx1_M": "브랜치 검색에 실패했습니다.",
- "f8dRWFk": "희소 사전 설정을 로드하지 못했습니다.",
- "WG-yXgM": "셸 열기",
- "0uj422Y": "문제 유형을 로드하지 못했습니다.",
- "quO-aRc": "담당자를 로드하지 못했습니다.",
- "661kq0E": "라벨을 로드하지 못했습니다.",
- "BRtGSdQ": "세부정보를 로드하지 못했습니다.",
- "us3-SEs": "Linear 컨텍스트를 로드하지 못했습니다.",
- "-QPTwEw": "프로젝트를 추가하지 못했습니다.",
- "W2b7E0I": "프로젝트 URL 또는 소유자/번호가 필요합니다.",
- "6aqSQa0": "프로젝트를 선택하지 못했습니다.",
- "XhuO-88": "프로젝트 보기를 로드하지 못했습니다.",
- "y6brnh8": "추가 GitHub 작업을 로드하지 못했습니다.",
- "bMml9Hw": "연결 실패",
- "eVVS8u4": "작업을 로드하지 못했습니다.",
- "jxeDUBI": "작업 설정을 로드하지 못했습니다.",
- "AmP4Z_A": "모바일에서 작업을 사용하려면 Orca 데스크톱을 업데이트하세요.",
- "_SIoB4k": "리뷰 코멘트 추가",
- "T2C3fss": "텍스트 변경사항이 없습니다.",
- "_96Solc": "저장소별로 그룹화한 후 최신 활동",
- "45bce5E": "최신 활동 먼저",
- "43utnp4": "업데이트됨",
- "ncl7fEY": "보류 중인 GitLab 할 일",
- "uLI9QAU": "내 할일",
- "CNrYYPU": "저장소별 요청 및 이슈 병합",
- "fxhXe98": "프로젝트 MR",
- "Vejw8iE": "귀하에게 할당된 요청 검토",
- "ox2Q3X4": "리뷰 필요",
- "Qcb2h_k": "귀하가 작성한 PR",
- "DitaVA4": "내 항목",
- "4q-Iqts": "PR 열기",
- "90lx_rw": "나에게 할당된 미결 문제",
- "NeeUliY": "나에게 할당됨",
- "4HZ7SXw": "GitHub 이슈 열기",
- "QNj7rUo": "GitHub 프로젝트 보기",
- "LB-QyhM": "프로젝트",
- "RU009FY": "GitHub PR",
- "Xj-3fdg": "PR",
- "PAK8mwc": "GitHub 이슈",
- "ISISlFo": "우선순위",
- "kpxCp5s": "식별자",
- "Dd-TzXA": "그룹화 없음",
- "JKx6Gd0": "그룹화된 열",
- "uoATjeA": "보드",
- "6GAUUa8": "컴팩트 이슈 행",
- "tIgX1ak": "목록",
- "CW8el5g": "최근 완결된 이슈",
- "HauqL5Y": "완료됨",
- "kRDldqg": "귀하가 만든 문제",
- "o_j-FoE": "생성됨",
- "eNsBySI": "귀하에게 할당된 문제",
- "pP-07nE": "내 문제",
- "_kT7uQE": "연결된 워크스페이스 전반에 걸쳐 미해결 문제",
- "gIF8518": "모두",
- "Svu67QM": "모든 GitLab 상태",
- "m5Y69Pc": "종결된 문제 및 MR",
- "BpviSSw": "닫힘",
- "fM4vagY": "병합된 MR",
- "GtruncU": "병합됨",
- "Dm3BEDs": "미해결 이슈 및 MR",
- "L9I1oLA": "할당된 문제 및 팀 문제",
- "R_7ye6M": "Linear",
- "cBPoyj8": "문제 및 MR",
- "BaXOO9M": "GitLab",
- "monYp5Q": "문제 및 PR",
- "gcczsRA": "GitHub",
- "fCKRINY": "{{value1}} 차이점 줄 중 첫 번째 {{value0}}을(를) 표시합니다.",
- "0WWDhS8": "{{value0}}행에 댓글 달기",
- "LJbwLTk": "{{value1}}에 의해 {{value0}}이(가) 해결되었습니다.",
- "3fJQdKo": "출처: {{value0}}",
- "F0yrwZ0": "정렬: {{value0}}",
- "ntCXZ5E": "필드: {{value0}}",
- "rkPw0BI": "그룹: {{value0}}",
- "KPrnw08": "주문: {{value0}}",
- "p08Gdhs": "{{value0}}에는 기본 이슈 소스 업스트림을 사용할 수 없습니다. 원산지를 사용합니다.",
- "3-41cjc": "+{{value0}} 필드",
- "g8lrpKM": "{{value0}}에",
- "2x3FfB8": "{{value0}} 쿼리 중",
- "T-_RK2o": "페이지 {{value0}}",
- "AHMKHtc": "{{value0}} 팀",
- "GRCIny0": "새로운 {{value0}} 문제",
- "z7RLmIM": "{{value0}}에 제출",
- "Cb83OoQ": "{{value0}}에서 생성",
- "Fg7BUfE": "브랜치 이름: {{value0}}",
- "Cx8BTNg": "{{value0}}에는 이 워크스페이스를 생성하기 전에 설정 선택이 필요합니다.",
- "-1cVb10": "{{value0}}/{{value1}}은(는) Orca에 추가되지 않습니다. 데스크톱 앱에서 이 저장소를 추가한 다음 모바일 작업을 새로고침세요.",
- "TLa90Qg": "GitHub 프로젝트 · {{value0}} {{value1}}",
- "sNIGIT0": "{{value0}} · {{value1}} · {{value2}}d",
- "Y1upIE8": "빠른 명령",
- "j34FFK4": "제거",
- "RLWvqn8": "이 맞춤 단축키를 삭제하시겠습니까?",
- "PKSYVds": "https://example.com",
- "ZabOoVw": "URL을 입력하거나 새 탭을 입력하려면 비워 두세요.",
- "tKOmSkM": "새 브라우저",
- "pg8WJ-k": "Terminal 이름",
- "gKi8D7w": "Terminal 이름 바꾸기",
- "gahpqR8": "전화 초안을 최신 데스크톱 파일로 바꾸시겠습니까?",
- "tMSSoFA": "변경사항 취소",
- "psn3klQ": "폐기 및 탈퇴",
- "IytTrKE": "모두 복사하고 나가기",
- "knjkJaM": "떠나기 전에 전화 초안을 복사하거나 삭제하세요.",
- "28Q3TbY": "저장되지 않은 markdown 변경사항",
- "a6FBCvM": "새로고침",
- "a79zJAw": "경로 복사",
- "_VDitck": "메모 복사",
- "-So6IQg": "현재 메모에 대한 agent 세션을 선택하세요.",
- "eBYSC7A": "리뷰 노트 보내기",
- "c_XP7YM": "Markdown 노트",
- "vL8HgZo": "브라우저",
- "1ELofI0": "Terminal",
- "-95LQlw": "새 탭",
- "UDf4wts": "붙여넣기",
- "IdjCS0U": "탭 만들기",
- "S2Yv1rU": "만드는 중...",
- "Xb4fMs0": "이 세션에는 탭이 없습니다.",
- "jBv9pDk": "워크스페이스 생성 경고 닫기",
- "uDcv4AM": "추가 세션 작업",
- "zUxrlPw": "데스크톱에 다시 연결",
- "z6d7HxM": "작업 트리로 돌아가기",
- "m6V9ozk": "Agent 사전 설정을 사용할 수 없음",
- "yBLhh9Y": "활성화된 Agents 없음",
- "pUeIX0M": "Agents 감지",
- "Ggr0PGg": "브라우저 페이지는 아직 사용할 수 없습니다.",
- "xdJzAj8": "모바일 브라우저 스트리밍을 위해서는 데스크톱 업데이트가 필요합니다.",
- "6kcq1T8": "실행하기 전에 이 빠른 명령을 편집하세요",
- "BYmvBAo": "선택 항목이 지워짐(버퍼 밖으로 스크롤됨)",
- "_0rBKLA": "복사할 수 없습니다.",
- "A6mZ2G0": "복사됨",
- "m332RRE": "terminal을 지울 수 없습니다",
- "8hc6lac": "Terminal이 지워졌습니다.",
- "528pc28": "입력이 너무 큼(최대 256KiB)",
- "RJlcmtM": "호스트에서 Orca를 열어 잠자는 agents를 깨우세요.",
- "JnDupXg": "저장됨",
- "XIoxeds": "메모를 복사할 수 없습니다.",
- "dl26MWM": "메모가 복사되었습니다.",
- "TDYOpzk": "메모를 삭제하지 못했습니다.",
- "ya3rgTk": "메모를 저장하지 못했습니다.",
- "TX0YgPk": "메모가 추가됨",
- "ElSO0Bs": "markdown을 로드할 수 없습니다.",
- "eIqJOeA": "{{value0}} 미리보기",
- "GF9YPY8": "{{value0}} 이미지",
- "yHsoXLM": "보내기",
- "Kvcps20": "AI에 리뷰 노트 보내기",
- "i7mE8Wc": "복사",
- "G46090U": "리뷰 메모 복사",
- "o0woxZM": "{{value0}} 검토 {{value1}}",
- "bjh73HM": "리뷰 메모 없음",
- "bNrgw7Q": "메모 저장",
- "AJOY4oY": "취소",
- "vCc2hyw": "리뷰 메모 추가",
- "AMX0qpI": "{{value0}}행의 메모 삭제",
- "XjRhzvI": "{{value0}}행에 메모 추가",
- "7su6EMM": "{{value0}} 차이점 라인 {{value1}}",
- "fAJsFIg": "저장",
- "Hy2xmeg": "버리기",
- "8Uro2f0": "다시 시도",
- "HtCuTmQ": "라인 {{value0}}",
- "qrdoHLM": "Commit에 실패했습니다.",
- "Qpl1k5o": "커밋된 변경사항을 사용할 수 없습니다.",
- "aqSqtLI": "{{value0}} 단계",
- "XfBogi0": "{{value0}} 도구 {{value1}}",
- "WL3i_AY": "영상",
- "tSzSq0U": "첨부된 이미지",
- "9kO5k1s": "파일",
- "76ELAmA": "미리보기",
- "dZsgG-M": "폴더를 로드할 수 없습니다.",
- "wA_0d2E": "Codex 비율 제한 재설정을 획득했습니다.",
- "CiFc9DQ": "예: pnpm build",
- "d0JpJz4": "예를 들어 짓다",
- "rMV0BMU": "키를 선택하세요",
- "fTbhbgg": "이미지 열기",
- "oitC92A": "영상",
- "8ckUTUg": "후크",
- "hiRz7rE": "ORCA.YAML",
- "by8gktU": "메모 쓰기",
- "AmkPWYA": "원격 저장소",
- "2Kl8BY4": "저장소 선택",
- "QjSzvc4": "검색된 결과가 없습니다.",
- "RIaVSo8": "베이스",
- "IOLibYw": "시스템 기본값",
- "2r4Wqzo": "페어링 로그",
- "G_n7Zxg": "페어링 로그",
- "Fbnf310": "음성 설정을 로드하지 못했습니다.",
- "4HGax2g": "작업 트리 없음",
- "oRXGJpo": "작업 트리 일치 필터가 없습니다.",
- "d-FojRM": "일치하는 작업 트리가 없습니다.",
- "Y4yzly8": "작업 트리 검색",
- "ThGUKR8": "작업 트리 검색…",
- "3GdsXVQ": "호스트",
- "I0vv7aw": "유형 없음",
- "pjrxOkU": "{{value0}} 디렉토리",
- "DvuAE90": "디렉토리 1개",
- "EmJ0ZpA": "원격 저장소",
- "mDtuNkA": "저장소 선택",
- "kbZvL2g": "Linear 이슈",
- "Wg2C-lo": "품목",
- "ybs6rJE": "GitHub에서 보기 열기",
- "KVqCyig": "지름길",
- "WaegjuQ": "파일",
- "Dy-chOU": "Markdown",
- "ps5grWg": "명령 보내기",
- "XNw0eg0": "명령을 입력하세요…",
- "Rddk0Io": "입력된 텍스트는 활성 terminal로 직접 전송됩니다.",
- "JQAVlGc": "실시간 terminal 입력을 위한 키보드 표시",
- "WbNNU2M": "맞춤 바로가기 추가",
- "UjbgRFg": "클립보드에서 붙여넣기",
- "g0S-mpY": "라이브 terminal 입력으로 전환",
- "LNjU0eA": "버퍼링된 명령 입력으로 전환",
- "CAFCbk0": "휴대폰 모드로 전환",
- "QB6eVqs": "데스크톱 모드로 전환",
- "jbJql9k": "소프트웨어 키보드를 숨기고 현재 terminal 세션을 열어 둡니다.",
- "O4uFjyM": "키보드 닫기",
- "1Ef6jA8": "로딩 terminal",
- "5g1_I7Y": "데스크톱 기능 확인 중 — 잠시 후 다시 시도하세요",
- "UoNS0D4": "빠른 명령을 사용하려면 데스크탑 업데이트가 필요합니다.",
- "7IGdkR0": "새 탭",
- "Td8lqm0": "오픈소스 제어",
- "8NqLc0E": "파일 탐색기 열기",
- "OcU2d6s": "메모를 보낼 수 없습니다.",
- "4BJ8B0k": "보낸 메모",
- "SM7vigo": "{{value0}} 파일",
- "Dwq_r1o": "{{value0}} 파일",
- "mLbULQw": "{{value0}} commit",
- "TWTFkY0": "{{value0}} commits",
- "t2Awy1s": "대 {{value0}}",
- "B2yGeak": "연결이 중단되었습니다.",
- "TI9qKn0": "알 수 없는 terminal 오류",
- "R0VwXOs": "commit 메시지가 생성되지 않았습니다.",
- "-CpqM4g": "이 브랜치는 아직 {{value0}}을(를) 만들 준비가 되지 않았습니다.",
- "aDtTv18": "{{value0}} 만들기",
- "8TO561E": "이 repo에는 PR을 사용할 수 없습니다.",
- "Xh63VTo": "브랜치 상태 확인 중...",
- "o8ul7Iw": "먼저 Branch 게시",
- "9tlos5E": "commit 메시지를 입력하세요.",
- "jzI4z6s": "하나 이상의 파일을 준비합니다.",
- "Pej4iSQ": "소스 제어 작업이 실패했습니다.",
- "67FHeO0": "소스 제어를 로드할 수 없습니다.",
- "Z4IRqv4": "커밋된 변경 사항을 로드할 수 없습니다.",
- "GXYBPqk": "업스트림 없음",
- "1YRKLD4": "앞에 {{value0}}, 뒤에 {{value1}}",
- "kbozpKo": "실시간 입력",
- "_MGGD5E": "마이크 시작 중",
- "Q7SP9fo": "처리",
- "y6GQnVA": "청취",
- "vXUuukQ": "빠른 명령어",
- "1rvpPn4": "Agent 선택",
- "SbxgQXc": "빠른 명령 추가",
- "gaaVrjY": "빠른 명령 편집",
- "uVgCcno": "삭제",
- "jmIvPBQ": "취소",
- "0dIGtV8": "줄: {{value0}}",
- "ZueS87g": "줄: {{value0}}-{{value1}}",
- "hLNcWyo": "범위: 파일",
- "57DUHqU": "에이전트",
- "0hhZYns": "세션에서 열 수 없습니다.",
- "1Z6vya0": "파일을 로드할 수 없습니다.",
- "FuhqCI4": "데스크톱을 기다리는 중...",
- "vu5sSQI": "데스크톱에 연결하는 중...",
- "MpjZorw": "버리기",
- "5cnTshE": "머무르다",
- "jogAQ98": "파일을 저장할 수 없습니다.",
- "Rajm1co": "차이점을 사용할 수 없음",
- "9Sv7Jb4": "삭제된 파일",
- "BrE_aCg": "차이가 너무 큼",
- "Cku_aRM": "바이너리 차이",
- "9FhY-Sk": "문맥",
- "0l1OykU": "삭제됨",
- "bnfXRLU": "추가됨",
- "eiEI8yY": "· {{value0}} 활성",
- "qNgdEE0": "{{value0}} 작업 트리{{value1}}{{value2}}",
- "UL6zDWw": "허용되지 않음 - GitHub 계정이 연결되어 있지 않습니다.",
- "nfDKqg4": "문제가 발생했습니다.",
- "amP19yQ": "컴퓨터에서 Orca를 업데이트하세요.",
- "NkNSfjQ": "Orca 모바일 업데이트",
- "VWnR13E": "재설정 사용",
- "_nuDzHY": "취소",
- "rXScUPU": "호스트가 이 시도를 확인했지만 이 전화기는 재시도 기록을 지울 수 없습니다. 나중에 재시도하면 동일한 안전 작업 ID가 재사용됩니다.",
- "d5V00qM": "이 휴대전화에서는 삭제된 재시도 기록을 삭제할 수 없습니다. 다시 시도하는 것은 안전하지만 이 계정에 대한 새로운 재설정을 확인하려면 먼저 기록을 지워야 합니다.",
- "B0fOGkI": "세부정보",
- "21rrqn0": "브라우저 스트림이 실패했습니다.",
- "ukxwfJ8": "agent 세션을 로드할 수 없습니다.",
- "dVAzjOs": "agent이 귀하의 입력을 필요로 하거나 작업을 완료하면 이 장치에서 알림을 받습니다.",
- "uzWRFSg": "시스템 설정에서 알림이 비활성화되어 있습니다.",
- "J055vls": "선택한 항목 없음",
- "qVCBvFg": "최근",
- "uGLg5VY": "Linear 작업 없음",
- "ifuEhog": "GitLab 작업 없음",
- "haGU2eY": "GitHub 작업 없음",
- "OCkeuqU": "일치하는 작업 없음",
- "Q9YN3Hk": "작업을 로드하려면 호스트에 연결하세요.",
- "inyDHB0": "프로젝트 선택",
- "73-jDqg": "{{value0}} 팀",
- "rqyU6Yo": "1팀",
- "5U1KC3A": "워크스페이스",
- "DiuXQZo": "전지",
- "BJUllKs": "{{value0}}/{{value1}} 필드",
- "qzEC9yM": "오름차순",
- "2IFEfeA": "내림차순",
- "zrhQGaA": "저장소 {{value0}}개",
- "nt1k3hc": "저장소 {{value0}}개",
- "qzhASv0": "저장소 {{value0}}개",
- "dBmZ43Q": "모든 저장소",
- "yX2I5Qc": "{{value0}} 소스",
- "x8ioLCA": "대상 선택",
- "OR0Rh2U": "\"{{value0}}\"이(가) 이미 존재합니다.",
- "jBhX2v4": "이름은 80자 이하여야 합니다.",
- "RT1HPds": "이름은 필수입니다.",
- "TxiIlg0": "초안을 복사할 수 없습니다.",
- "HimYt6k": "경로가 복사되었습니다.",
- "S6RbGW8": "{{value0}} — 다시 시도하려면 탭하세요.",
- "-4K4pmw": "{{value0}} 탭",
- "KRxO3Ug": "탭 1개",
- "vFcOLlo": "탭 로드 중",
- "6P8BtkA": "브라우저 명령이 실패했습니다.",
- "sYGlLWQ": "브라우저를 생성하지 못했습니다.",
- "HyIWUac": "유효한 URL을 입력하세요.",
- "6oL3kaQ": "markdown 메모를 생성하지 못했습니다.",
- "sgQvHe0": "빠른 명령",
- "BphZ5Gw": "terminal을 생성하지 못했습니다.",
- "DKTAFXw": "저장 실패",
- "qIT8ceU": "파일 미리보기를 로드할 수 없습니다.",
- "XD1EPRc": "차이점 미리보기를 로드할 수 없습니다.",
- "sJ7CwDw": "모바일 미리보기에 파일이 너무 큽니다.",
- "8Ho6nkA": "바이너리 미리보기를 사용할 수 없습니다.",
- "X1e46P4": "받아쓰기 삽입됨",
- "V4EVATY": "데스크탑에서 변경됨",
- "RwIU_9I": "읽기 전용",
- "hPnnpWc": "직접 · LAN",
- "f3Si3vU": "다이렉트 · Tailscale",
- "Lo_8ioI": "Orca Relay",
- "QNvTsRo": "아니요 {{value0}}",
- "nDyX2e8": "빈 Terminal",
- "7wOLCCY": "연결 끊김",
- "FZM-PD0": "연결 실패",
- "wOY1nLM": "재연결 실패",
- "55lbvEs": "인증 실패",
- "uEprraQ": "다시 연결 중",
- "XpcB6Lk": "릴레이 배포",
- "Y4pY3mY": "연결 중",
- "GyhUU1I": "연결됨",
- "VtNQIUo": "푸시는 성공했지만 {{value0}} 생성에 실패했습니다: {{value1}}",
- "3fVn1VI": "병합 중단",
- "S5cNB0c": "리베이스 중단",
- "wFxT3pM": "중단 중…",
- "wL23gbE": "브랜치 없음",
- "EiCMRDA": "스테이징되지 않음",
- "YcfLGog": "스테이징됨",
- "ZnNoGOU": "브랜치",
- "ubcC1kU": "Terminal",
- "nMoq2GI": "파일",
- "oS6AL4Y": "Markdown",
- "YHLAtbk": "브라우저",
- "tgyhT8Q": "새 브라우저",
- "bdYtRH8": "워크트리",
- "972Qfrg": "{{value0}} 라인에 메모 저장",
- "5Rc0T-w": "{{value0}} 보내지 않은 메모",
- "VuvuQv0": "보내지 않은 메모 {{value0}}개",
- "2KfV5_M": "메모 {{value0}}개",
- "87GezVA": "메모 {{value0}}개",
- "ZGxcUL4": "검토 안 됨",
- "08Yk1Go": "메모",
- "ycKwNOI": "agent 세션 로드 중...",
- "FjJb7Lo": "{{value0}} 라인 {{value1}}",
- "sDDLSuM": "WSL의 {{value0}} {{value1}}",
- "TUCQXxI": "호스트의 {{value0}}",
- "mWMZ-dk": "세션을 재개하기 전에 로컬 워크스페이스를 여세요.",
- "eTFpmzo": "이 세션은 호스트 시스템에 저장되므로 SSH 워크스페이스에서 재개될 수 없습니다. 이 프로젝트에 대한 로컬 워크스페이스를 엽니다.",
- "GLFjyPk": "런타임 호스팅 워크스페이스에서는 기록에서 재개를 사용할 수 없습니다.",
- "WVNYnak": "{{value0}}초 후",
- "xYaQ41Y": "저장소 후크",
- "EJg7NQU": "로컬 후크",
- "BeBymFk": "orca.yaml",
- "px-yCeQ": "댓글 {{value0}}개",
- "24Kgyy4": "아직 댓글이 없습니다",
- "PAtCwbU": "최상위 댓글",
- "br73014": "리뷰 스레드",
- "Ak34AMw": "해결된 리뷰 스레드",
- "oj0ltFk": "리뷰",
- "BWgU598": "해결된 검토",
- "6rtcg5s": "Linear에서 열기",
- "N_IsXzY": "GitLab에서 열기",
- "SpAtwKU": "Linear 티켓",
- "MKTNAHg": "{{value0}} 할 일",
- "mYLUh0s": "MR",
- "PoPA1vA": "비어 있음",
- "cAXZUp4": "PR #{{value0}}을(를) 병합할까요?",
- "X5VvyPQ": "PR #{{value0}}을(를) 리베이스하고 병합할까요?",
- "LCOEY5w": "PR #{{value0}}을 스쿼시하고 병합하시겠습니까?",
- "1Shau08": "스쿼시 및 병합",
- "psZ6Lys": "PR",
- "xLFr_Co": "MR",
- "PAnLDcM": "병합 commit 만들기",
- "b9yLdBs": "리베이스 및 병합",
- "6MEByr4": "알 수 없음",
- "cbIMuqY": "병합 가능",
- "YEiNYxU": "차단됨",
- "OXTehpM": "뒤처짐",
- "hIW5XEU": "충돌",
- "AXgAxVM": "병합",
- "Sos7PxI": "{{value0}}/{{value1}} 통과됨",
- "Uc3hFHs": "{{value0}} 보류 중",
- "L37iq1E": "{{value0}} 실패",
- "X9M1AcA": "체크 없음",
- "pmjWIDk": "GitLab 할 일",
- "kjZMz_U": "잠김",
- "1WEmdBA": "초안",
- "BbDPGbM": "수정됨",
- "qJU9f5Q": "{{value0}} 리뷰 노트",
- "QGcvPOc": "{{value0}} 리뷰 노트",
- "kYCT6qM": "{{value0}}님이 해결한 스레드",
- "ahIRbHk": "{{value0}}님의 댓글이 해결되었습니다.",
- "qcFeMQM": "현재 및 향후",
- "DCkRqC8": "이 기기에서 {{value0}} 사용자 인증 정보 정리를 확인할 수 없습니다.",
- "XStfhOk": "이 기기에서 {{value0}} 사용자 인증 정보 정리를 확인할 수 없습니다.",
- "xnvhKbA": "{{value0}} 성적표를 건너뛰었습니다.",
- "UXXYuws": "{{value0}} 성적표를 건너뛰었습니다.",
- "QlrZNys": "{{value0}} 파일이 검토됨, {{value1}} 메모",
- "J7M3gnY": "{{value0}} 파일 검토됨, {{value1}} 메모",
- "uM2_gxc": "{{value0}} 파일 검토됨, {{value1}} 메모",
- "JrNt3Dk": "{{value0}}개 파일이 검토됨, {{value1}}개 메모",
- "Id8zorY": "{{value0}} 작업 트리",
- "t4PccRo": "워크트리 {{value0}}개",
- "AYqemqw": "{{value0}} 활성",
- "lXLSjWw": "{{value0}} 확인 실패",
- "N7XOlnE": "{{value0}} 검사 실패",
- "dG4O1e4": "{{value0}}님이 해결한 스레드",
- "lXnGpvs": "{{value0}}({{value1}})에 의해 해결된 스레드",
- "njd-pFg": "{{value0}}님의 댓글이 해결되었습니다.",
- "tQONwOQ": "{{value0}}({{value1}})님의 댓글이 해결되었습니다.",
- "uxZVTz8": "{{value0}} 도구 호출",
- "IlwwqQs": "{{value0}} 도구 호출",
- "OLmV45U": "제목 없음",
- "S-avV-Y": "검토된 파일 {{value0}}개 스테이징됨",
- "IPu47z8": "검토된 파일 {{value0}}개 스테이징됨",
- "TxG95wU": "Tailscale을 확인하세요",
- "oBMMuM8": "GitHub 작업 항목에는 SSH 저장소용 GitHub 원격이 필요합니다.",
- "m4LECc4": "플로팅 워크스페이스",
- "ueRRwRg": "음성 받아쓰기를 하기에는 연결 속도가 너무 느립니다. 연결 상태가 좋아지면 다시 시도하세요.",
- "hf0yXVE": "SSH 연결을 확인할 수 없습니다. 호스트를 다시 연결하고 다시 시도하세요.",
- "XOHYcMw": "모바일 음성 설정을 사용하려면 페어링된 데스크톱 Orca 앱을 업데이트하세요.",
- "cuSNE9k": "Idle",
- "cfFE9JM": "완료",
- "eSniHCo": "중단된",
- "clLXJRk": "입력을 기다리는 중",
- "CeMk5QY": "차단됨",
- "xLtCpIk": "Working",
- "RvLuxao": "PR #{{value0}}, {{value1}}, {{value2}}{{value3}}. PR을 엽니다.",
- "oDQaC0g": "PR을 사용할 수 없음: {{value0}}",
- "MkY5xK4": "PR 로드 중",
- "qE1-68U": "리뷰 작성 중...",
- "JokOS5o": "임대로 강제 추진 중...",
- "0BMXLfE": "commits 푸시 중...",
- "PnL-W2o": "브랜치 게시 중...",
- "uN9IaYI": "변경사항을 커밋하는 중...",
- "us6yszU": "commit 메시지 생성 중...",
- "eCa7Me8": "변경 사항을 스테이징하는 중...",
- "Kdbzhtg": "이 브랜치는 아직 {{value0}}을(를) 만들 준비가 되지 않았습니다.",
- "eeoaUzE": "{{value0}}을 생성하기 전에 기본 브랜치를 푸시하세요.",
- "dhReg-4": "이 포크에서 {{value0}}을 생성하는 것은 지원되지 않습니다.",
- "UNrSqqU": "이 브랜치에는 {{value0}}이 이미 존재합니다.",
- "CMzOREY": "이 repo에서는 {{value0}} 생성이 지원되지 않습니다.",
- "i65iwXo": "{{value0}}을(를) 만들기 전에 인증하세요.",
- "h5c6qGM": "{{value0}}을(를) 만들기 전에 이 브랜치를 동기화하세요.",
- "aDj0ISs": "{{value0}}을(를) 만들기 전에 commits을 게시하세요.",
- "J6J02jo": "{{value0}}을 생성하기 전에 기능 브랜치로 전환하세요.",
- "eL3YqZQ": "{{value0}}을(를) 만들기 전에 브랜치를 체크아웃하세요.",
- "fS2uz3k": "{{value0}}을(를) 만들기 전에 변경 사항을 Commit 하세요.",
- "YnkDu_A": "Orca는 이 브랜치에 이미 {{value0}}이 있는지 확인할 수 없습니다. 잠시 후에 다시 시도해 보세요.",
- "nUw7_cE": "{{value0}}이(가) 생성되었지만 Orca가 아직 새로 고칠 수 없습니다.",
- "89Qhlf4": "{{value0}} #{{value1}}은(는) 이미 열려 있습니다.",
- "G0fuKJo": "commit 할 항목이 없습니다. 브랜치가 최신 상태입니다.",
- "qgmf_L8": "푸시",
- "0OsPYDw": "풀",
- "gSinyKw": "원격 브랜치를 업데이트하려면 임대를 통해 강제로 푸시하세요.",
- "5MUJYGA": "이 브랜치를 원본에 게시합니다.",
- "5OKMsK4": "commits을 게시하기 전에 브랜치를 체크아웃하세요.",
- "eSJfk9k": "commit 할 파일을 하나 이상 준비하세요.",
- "MM3ixxY": "모든 변경 사항을 준비합니다.",
- "YnDfQwA": "commit 할 commit 메시지를 입력하세요.",
- "sJ8R-8c": "단계적 변경 사항을 Commit 합니다.",
- "lBQzq_8": "커밋하기 전에 충돌을 해결하세요.",
- "aIqyvoY": "원격 작업이 완료되면 다시 시도하세요.",
- "YkxQqGg": "원격 작업이 진행 중입니다.",
- "cOOTv9E": "강제 푸시가 진행 중입니다.",
- "GqPiXjg": "Commit이 진행 중입니다.",
- "6Z1Zr78": "브랜치 게시",
- "gqhNZGI": "동기화",
- "AvE0E2k": "모두 스테이지",
- "7HjRY3c": "Commit",
- "koj5rtA": "강제 푸시",
- "63siVQ8": "요청 실패: {{value0}}",
- "8I2nZuQ": "건너뜀",
- "Ba1jOdE": "중립",
- "lyHptRM": "시간 초과",
- "thrHxG4": "취소됨",
- "NO0ZjtQ": "실패",
- "6lXfNVk": "성공적인",
- "9XDJxdU": "진행중",
- "AXw1J4E": "아직 댓글이 없습니다.",
- "znwGBr8": "사람 댓글이 없습니다.",
- "BvW_4OE": "봇 댓글이 없습니다.",
- "jG05lVM": "{{value1}} 중 {{value0}}을(를) 로드하지 못했습니다.",
- "zrt1n24": "리뷰어 없음",
- "yMw_C-k": "변경 요청됨",
- "O3Knlx4": "승인됨",
- "ziWbd9A": "PR 확인 열기",
- "z4-dCLM": "agent 세션 찾아보기 및 재개",
- "td40qOY": "바탕 화면이 여기에 나타납니다. 모든 것이 엔드 투 엔드로 암호화됩니다.",
- "-SigWBo": "위의 버튼을 탭하여 스캐너를 엽니다. 화면의 QR 코드를 가리킵니다.",
- "aCJTiqw": "설정 → 모바일로 이동하여 페어링 QR 코드를 생성하세요.",
- "_wFCKE8": "테스트할 수 없음",
- "gdHptko": "연결되지 않음",
- "DxL3QsM": "예상치 못한 반응",
- "O1SHffI": "연결됨",
- "uJRC49k": "호스트 데이터를 읽을 수 없습니다.",
- "AtwKjZ4": "없음 — QR을 스캔하여 페어링",
- "OCWSDG0": "{{value0}} 페어링됨",
- "s5C2oPk": "설명이 없습니다.",
- "AnvMzjI": "대신 메모 복사",
- "0IFqHX0": "새 agent 세션",
- "k5E-6Qo": "호스트 연결을 확인하세요.",
- "AXVCL9g": "반복",
- "G_aoVj8": "워크스페이스를 생성하지 못했습니다.",
- "2t3siE4": "현재",
- "X4spS84": "Commit 실패",
- "Cqqzv8U": "소스 제어를 새로 고칠 수 없습니다",
- "8Tx_eZw": "PR을 생성하지 못했습니다.",
- "DIh5pvA": "연결된 리뷰를 업데이트하지 못했습니다.",
- "D8-XyhU": "연결된 PR을 업데이트하지 못했습니다.",
- "GaTugx8": "로컬 커밋이 손실됩니다. 대신 풀하세요",
- "qajmB_0": "빨리 감을 항목이 없습니다.",
- "fp_5pjo": "빨리감기",
- "UWyesQ8": "빨리 감기({{value0}})",
- "qq_p9K0": "브랜치이 이미 게시되었습니다.",
- "5Vkd48o": "브랜치이 최신 상태입니다.",
- "N0HpMMg": "동기화",
- "26SoVIw": "동기화(↓{{value0}} ↑{{value1}})",
- "Ia0aBfU": "당길 게 하나도 없어",
- "0pGBpyQ": "풀",
- "oCECucM": "당기기({{value0}})",
- "zgbzIDs": "밀어붙일 게 하나도 없어",
- "eBZzWkw": "푸시",
- "9Xtk0Pg": "푸시({{value0}})",
- "cBrXr-8": "Commit 실패",
- "5jVDzOo": "데스크톱을 기다리는 중...",
- "cIZvHNg": "데스크톱에 연결하는 중...",
- "zniLwck": "커밋된 diff를 로드할 수 없습니다.",
- "NJJe3ZA": "요청 실패: github.resolveReviewThread",
- "xWj8WHk": "요청 실패: github.updatePRTitle",
- "o-JIJFg": "요청 실패: {{value0}}",
- "jdt98Vo": "요청 실패: {{value0}}",
- "aLzpW3w": "커밋된 변경 사항이 실패했습니다.",
- "nKp2Mj0": "커밋된 변경 사항을 사용할 수 없습니다.",
- "FJnzL9Y": "스테이징되지 않음",
- "senOKG4": "스테이징됨",
- "OtjVKog": "Terminal",
- "tod-ra0": "스크립트 스트림 실패",
- "GmBjriA": "채팅 보기로 전환",
- "dqKsMqY": "terminal 보기로 전환",
- "502R_mE": "전화로 전환",
- "0XbzIAs": "데스크톱으로 전환",
- "BGT_JFw": "Terminal",
- "MOOmRCc": "차이점을 로드할 수 없습니다.",
- "1ymIBpg": "리뷰를 로드할 수 없습니다.",
- "vMHt0l8": "agent 세션을 로드할 수 없습니다.",
- "4GOORsg": "Terminal",
- "FYj9qCM": "SSH 저장소에 연결하지 못했습니다.",
- "Gli-J-E": "SSH 연결 상태를 읽지 못했습니다.",
- "17Ky5K0": "Linear",
- "kWDpsSU": "이슈 #",
- "G_t8Rjg": "MR !",
- "Jq988q0": "PR 번호",
- "a6UgDc8": "브라우저 대화상자",
- "VgO3m0E": "제목 없는 세션",
- "X0HdEQ0": "연결",
- "Ho177Ac": "다시 연결",
- "ImyX3J0": "{{value0}}에서 연결 가능",
- "JwcgRbU": "핀",
- "dgZsiv8": "고정 해제",
- "TNd6PjA": "기본",
- "dXnxHU4": "{{value0}} · 기본값",
- "dMUK4L8": "모바일에서 지원되지 않는 레이아웃",
- "hy_B4J8": "#{{value0}} 보기",
- "yvbNVZo": "오름차순 정렬",
- "YKWIedk": "현재 {{value0}} · {{value1}}을(를) 탭하세요",
- "P-ZWamw": "GitHub 순위 순서를 사용합니다.",
- "fERYVNg": "{{value0}} {{value1}} 사용",
- "iD-UhpY": "Linear 문제를 생성하지 못했습니다.",
- "T_YfEh0": "먼저 Linear 팀을 선택하세요.",
- "ffJZE1A": "{{value0}} 문제를 생성하지 못했습니다.",
- "C3TiEsc": "{{value0}} 문제를 생성하기 전에 Git 저장소를 추가하세요.",
- "2cHUFuY": "하위 이슈를 생성하지 못했습니다.",
- "KcjImC4": "하위 이슈를 찾을 수 없습니다.",
- "ct__F0Q": "스레드를 다시 열지 못했습니다.",
- "LVc8Fk0": "스레드를 해결하지 못했습니다.",
- "fpX38uo": "본 상태를 GitHub와 동기화하지 못했습니다.",
- "lanbga8": "잘못된 수표 응답",
- "lSNLJ4s": "GitHub 상태를 업데이트하지 못했습니다.",
- "8U28lt8": "GitHub 항목을 업데이트하지 못했습니다.",
- "QI7iJCw": "선택한 agent가 비활성화되었습니다. 생성하기 전에 활성화된 agent를 선택하세요.",
- "AGIjbJU": "워크스페이스를 만들기 전에 {{value0}}을(를) 연결하세요.",
- "eCcpIL4": "SSH 저장소에 연결하지 못했습니다.",
- "CyTKwng": "SSH 연결 상태를 읽지 못했습니다.",
- "cTL2xfk": "공백",
- "-JNPw2M": "세부정보를 찾을 수 없습니다.",
- "s_tAbdk": "이 프로젝트에는 지원되는 보기가 없습니다.",
- "caw13Gk": "Linear 연결에 실패했습니다.",
- "bNtRw1Q": "GitLab 작업을 로드하지 못했습니다.",
- "Bt_rGOI": "GitHub 작업을 로드하지 못했습니다.",
- "ObzOf3Y": "반복",
- "7wx0uDo": "할당되지 않음",
- "14_Cpwk": "제목 없는 markdown 노트를 생성할 수 없습니다",
- "1s8dFXg": "Terminal 입력이 다른 클라이언트에 의해 잠겨 있습니다.",
- "v-nMJVc": "메모를 보내지 못했습니다.",
- "5GHrSsw": "리뷰 메모를 저장하지 못했습니다.",
- "-0DsFBU": "데스크톱을 기다리는 중...",
- "I4VlaAs": "markdown을 읽을 수 없습니다",
- "65j23gQ": "{{value0}} 보내기",
- "3ivaga8": "{{value0}} 편집",
- "9ZRI2cs": "워크스페이스를 만들기 전에 {{value0}}을(를) 연결하세요.",
- "h8LEFjY": "AI로 {{value0}} 세부정보 생성",
- "rOYT-0U": "{{value0}}을(를) 허용하시겠습니까?",
- "671hHtA": "브라우저에서 열까요?\n\n{{value0}}",
- "dTuoCp0": "{{value0}} #{{value1}} 스쿼시 및 병합?",
- "M2j9mpc": "{{value0}} 댓글",
- "xZ4TQL8": "페이지 선택, {{value1}} 중 {{value0}} 페이지",
- "7LorW8k": "{{value1}} 중 {{value0}} 페이지",
- "CKtsHVY": "{{value0}} 라인",
- "ACQh2cM": "{{value0}}은(는) 이미 열려 있습니다.",
- "al8M9-M": "{{value0}}을 당기고, {{value1}}을 누르세요.",
- "UIMnif0": "{{value0}} commit을 가져옵니다.",
- "35baKac": "{{value0}} commits을 가져옵니다.",
- "y7z5WcU": "{{value0}} commit을 푸시합니다.",
- "0yFIngw": "{{value0}} commits을 푸시합니다.",
- "gx2zC4w": "유효한 페어링 코드가 아닙니다.",
- "WABgCvg": "페어링 코드 누락",
- "_c5oKe0": "열기",
- "aalP-X8": "버리기",
- "cTkYeR8": "머지 리퀘스트",
- "OpWJNnA": "MR",
- "BWWtnQM": "MR",
- "GqNlrAs": "PR",
- "rUwwMh4": "PR",
- "Qic_Aa4": "PR",
- "-YeAYjI": "버리기",
- "myZTLv0": "재설정 {{value0}}회 사용 가능",
- "CfvCAaE": "재설정 {{value0}}회 사용 가능",
- "aaZ_2qE": "지금 만료",
- "1neVPtc": "{{value0}} 후 만료",
- "nH5aDJ4": "다음 항목이 지금 만료",
- "fA_ezvI": "다음 만료까지 {{value0}}",
- "4DTdO1w": "병합",
- "pZ3OPxE": "저장",
- "eVLkMyE": "댓글",
- "g0JLO88": "작업",
- "OJSrr6g": "실패한 작업",
- "RfH2kOg": "요청됨",
- "EaX2_X8": "제거",
- "y2BBXrA": "확인",
- "7RncVJk": "요청됨",
- "6BZSEjI": "열기",
- "3OzvpCE": "방금 전",
- "sC5iGOA": "닫힘",
- "epStUOc": "진행 중",
- "sMpsrkY": "리뷰 중",
- "LEXdDEk": "완료",
- "QESpnhs": "Terminal WebView 렌더링 프로세스가 종료되었습니다.",
- "9IP25z8": "Terminal WebView HTTP 오류",
- "GY53tDU": "Terminal WebView 로드 실패",
- "_dDm4ic": "F12",
- "T7RTOC4": "F11",
- "d6orzBg": "F10",
- "rI3MEx0": "F9",
- "DR9i7SU": "F8",
- "EbNp-x4": "F7",
- "xOj4ngY": "F6",
- "MmdqLFU": "F5",
- "dMpOhHI": "F4",
- "fNbslzw": "F3",
- "5OQeDMc": "F2",
- "wPNSaMQ": "F1",
- "Z-W6Rzg": "페이지 아래로",
- "1n1QZYk": "페이지 위로",
- "6UajMWQ": "끝",
- "r2L-IvQ": "홈",
- "EvEE7WE": "오른쪽 화살표",
- "1TJf6c4": "왼쪽 화살표",
- "jB50jh8": "아래쪽 화살표",
- "S_D2PxQ": "위쪽 화살표",
- "JAhWIZE": "삽입",
- "Wt9qvqo": "PgDn",
- "1qkhXPI": "PgUp",
- "bh9E9Gk": "인",
- "lCZrWn4": "옮기다",
- "zN_6g9g": "Alt",
- "mthhwXw": "Ctrl 키",
- "fpKzlOM": "OpenClaw",
- "rZEdz3o": "Devin",
- "Lrz_Jb8": "Hermes",
- "tNRBWNU": "Rovo Dev",
- "X7ZF7JI": "Qwen Code",
- "yUpY07s": "Mistral Vibe",
- "HG6jBAg": "Kimi",
- "uvSF6-U": "Droid",
- "Vly29R0": "Cursor",
- "dSfrwic": "Continue",
- "WeGqDrY": "Command Code",
- "fm231VU": "Codebuff",
- "Vqp3lvY": "Cline",
- "RCPC-L0": "Autohand Code",
- "ufugQXE": "Auggie",
- "6Y3GKfY": "Charm",
- "kej-9Lc": "Kiro",
- "FYcf7kI": "Kilocode",
- "njg39j4": "Amp",
- "Gqznj90": "Goose",
- "FWr_S8c": "Aider",
- "tkhwBEU": "Antigravity",
- "qcMaCQk": "Gemini",
- "GovXMeA": "OMP",
- "BWhYVOA": "Pi",
- "STuGb5Q": "Trae",
- "Y9bn4gA": "Ante",
- "imGLJZs": "MiMo Code",
- "qar2VvQ": "OpenCode",
- "7u-Lga4": "GitHub Copilot",
- "58N2Zh8": "Grok",
- "Tvbh_c4": "Codex",
- "4os-vWc": "OpenClaude",
- "cUAuG8c": "Claude Agent Teams",
- "OZJxvKQ": "Claude",
- "x04i9ik": "기본 브랜치를 확인하지 못했습니다.",
- "vuFM3_E": "{{value0}}월",
- "m8V_LQQ": "방금 전",
- "-DRFeFw": "스테이징된 변경 사항",
- "cdicUlU": "추적되지 않은 파일",
- "cbaJlCE": "변경 사항",
- "knjcZG0": "변경 사항을 단계화하지 못했습니다.",
- "2m5o9w0": "임대를 강제로 푸시하지 못했습니다.",
- "I8tYYd4": "commits을 푸시하지 못했습니다.",
- "HtBxXOI": "브랜치을 게시하지 못했습니다.",
- "r9Wy-Q8": "Commits",
- "Xawq6ME": "PR",
- "TMv0RaY": "변경 사항",
- "tKcJoxk": "베이스 브랜치는 head 브랜치와 달라야 합니다.",
- "yBuJIFU": "베이스 브랜치를 선택하세요.",
- "b89N2ws": "{{value0}} 제목을 입력하세요.",
- "E7yK5NU": "생성이 완료될 때까지 기다립니다.",
- "DAVoau0": "메시지, @files, /명령",
- "zGX7CcI": "응답이 전송되지 않았습니다.",
- "v7vfn5Q": "응답이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
- "6dxPsys": "응답이 전송되지 않음(연결 끊김)",
- "sxVCOxI": "옵션을 선택하세요",
- "-D7_HMY": "PR을 로드할 수 없습니다.",
- "xEMYAIw": "페어링이 잘못되었습니다.",
- "G1BrrUQ": "다시 연결 중",
- "7mbOxzE": "연결 끊김",
- "Fr9Rdq8": "연결됨",
- "yqEocVY": "보안",
- "S_1cAME": "연결 중",
- "eOcfBcE": "답변이 전송되지 않았습니다.",
- "ukuLb_A": "답변이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
- "UnHHxag": "답변이 부분적으로 전송되었습니다. 다시 시도하기 전에 채팅을 확인하세요.",
- "O2gcQk0": "답변이 전송되지 않음(연결이 끊김)",
- "htcCRsA": "취소가 전송되지 않았습니다.",
- "chT2Z44": "확인되지 않은 취소 - 다시 시도하기 전에 채팅을 확인하세요.",
- "Z_x_TcE": "취소가 전송되지 않음(연결이 끊김)",
- "c6Kd_Ps": "메시지가 전송되지 않았습니다.",
- "4Xgw97k": "메시지가 전송되지 않음(연결이 끊김)",
- "ZkABdzg": "메시지가 전송되지 않았습니다.",
- "klTsRAk": "배송이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
- "t_qfHRA": "메시지가 전송되지 않음(연결이 끊김)",
- "S9MYUPk": "중지가 전송되지 않았습니다.",
- "i8UxPTM": "확인되지 않은 중지 - 다시 시도하기 전에 채팅을 확인하세요.",
- "ZhefrDE": "중지가 전송되지 않음(terminal이 준비되지 않음)",
- "QVUePYc": "취소",
- "OxB9eF0": "확인",
- "PpZpLWw": "검토할 파일을 선택하세요.",
- "Em5nLwQ": "이 파일은 삭제되었습니다. 파일 메모를 추가하거나 검토한 것으로 표시하세요.",
- "YeQabYs": "이 차이는 모바일 미리보기에 비해 너무 큽니다.",
- "FdOHIhk": "이 파일은 모바일에서 텍스트로 렌더링될 수 없습니다.",
- "5GRCze0": "검색 지우기",
- "GbS1Gw0": "저장",
- "tNw1xEA": "닫힘",
- "QYCFjQw": "초안",
- "AF7gJFU": "병합됨",
- "sbQ_yBw": "열기",
- "rBMjMUM": "{{value0}}년 전",
- "5mTslyc": "{{value0}}개월 전",
- "3u9-Kuw": "{{value0}}일 전",
- "J9EQWOE": "{{value0}}시간 전",
- "XG7ieU0": "{{value0}}분 전",
- "xbjFHYU": "방금 전",
- "aJGSaVI": "전송된",
- "_ax72Jw": "브라우저 포인터 올리기 실패",
- "oaarOD4": "브라우저 포인터 다운 실패",
- "A-4DgN0": "브라우저 포인터 이동 실패",
- "yrjs9M0": "브라우저 스크롤 실패",
- "9E99YI8": "브라우저 명령이 실패했습니다.",
- "kZGbeC4": "Linear",
- "fvIr9H8": "GitLab",
- "TH4OaOM": "GitHub",
- "xPjEgDM": "낮음",
- "7LgwgJM": "중간",
- "_pcc0Zw": "높음",
- "e3kayEE": "긴급",
- "X1FYz1o": "마우스 오른쪽 버튼을 클릭하세요.",
- "AX4IXS0": "예상치 못한 Linear 작업 응답",
- "SX56B0U": "브랜치 기반을 확인할 수 없습니다.",
- "f-93Rxs": "commit 기록을 로드하지 못했습니다.",
- "O6Amqhs": "브랜치 상태를 확인할 수 없습니다",
- "9AhI4NI": "Commit 실패",
- "D2XJD5Q": "소스 제어 작업이 실패했습니다.",
- "1yTzUoY": "데스크톱을 기다리는 중...",
- "aNYrFtc": "리베이스할 기본 브랜치가 없습니다.",
- "rF-O-TA": "데스크톱을 기다리는 중...",
- "q53ZKds": "모바일에서는 바이너리 브랜치 diff 미리보기를 사용할 수 없습니다.",
- "AAVqwEI": "Terminal 입력이 잠겨 있습니다.",
- "kiGJQl0": "재개 명령을 보내지 못했습니다.",
- "n6zBfFc": "생성된 terminal 응답이 잘못되었습니다.",
- "GWephQg": "terminal을 생성하지 못했습니다.",
- "KEeLFyA": "이 레거시 Codex 세션을 준비할 수 없습니다. 이력서를 다시 시도하세요.",
- "64b63WI": "클립보드 이미지 콘텐츠는 base64여야 합니다.",
- "Oht8bkc": "클립보드 이미지가 너무 큽니다.",
- "u_SAyGc": "커밋된 diff를 사용할 수 없습니다.",
- "qK2AOt0": "Diff 응답이 잘못되었습니다.",
- "47q1BdE": "차이점을 로드할 수 없습니다.",
- "1eue8fY": "리뷰 메모를 로드할 수 없습니다.",
- "EgST0cw": "소스 제어 응답이 잘못되었습니다.",
- "9Z6xNzo": "변경사항을 로드할 수 없습니다.",
- "kyy8tNA": "Terminal 입력이 잠겨 있습니다.",
- "-j2Yzyc": "메시지를 보내지 못했습니다.",
- "8WPx578": "생성된 terminal 응답이 잘못되었습니다.",
- "p20YlWo": "terminal을 생성하지 못했습니다.",
- "dzoAXdg": "검토 상태를 저장하지 못했습니다.",
- "a3rNaLA": "데스크톱을 기다리는 중...",
- "LYAe0FE": "생성된 terminal 응답이 잘못되었습니다.",
- "NhC30K0": "terminal을 생성하지 못했습니다.",
- "-NMYOgc": "Terminal 입력이 잠겨 있습니다.",
- "tpf9SfA": "메모를 보내지 못했습니다.",
- "eH92OqQ": "크기가 조정된 클립보드 이미지를 인코딩하지 못했습니다.",
- "qYK5Ouo": "빠른 명령을 저장하지 못했습니다.",
- "LuqBIhs": "마이크 녹음을 시작하지 못했습니다.",
- "oQrz0NI": "Keep-awake 기본 호출 시간이 초과되었습니다.",
- "qiXFVWc": "음성이 감지되지 않았습니다.",
- "Pwq6G9w": "마이크를 초기화하지 못했습니다.",
- "InUuqhA": "마이크 권한이 거부되었습니다.",
- "CdTon5s": "음성기록 설정을 업데이트하지 못했습니다.",
- "9VJGb2s": "모델을 삭제하지 못했습니다.",
- "hkwxfd0": "다운로드를 시작하지 못했습니다.",
- "jcVunZ4": "음성기록 모델을 로드하지 못했습니다.",
- "3cWf_os": "useHostProtocolGates는 내부에서 사용해야 합니다.",
- "l0xDyns": "호스트의 잘못된 계정 스냅샷",
- "dWotxRU": "호스트의 잘못된 재설정 응답",
- "hIvuhiQ": "수표 세부정보를 로드하지 못했습니다.",
- "hRiZhQg": "워크스페이스 메타데이터를 로드할 수 없습니다.",
- "THbZzp4": "호스트에 연결할 수 없습니다.",
- "MJ1SglY": "해당 VPN을 비활성화하거나 분할 터널링 / \"LAN 허용\"을 활성화하십시오.",
- "n-WXtiA": "Tailscale이 아닌 VPN은 원격 서버를 통해 로컬 트래픽을 라우팅할 수 있습니다.",
- "PxeuBQc": "Tailscale 앱을 업데이트하세요. 최근 릴리스에서는 재연결 버그가 수정되었습니다.",
- "j0KeldQ": "데스크탑이 활성화되어 있고 tailnet에 연결된 것으로 표시되는지 확인하십시오.",
- "rmMn9Xc": "iOS/Android는 터널을 자동으로 고정할 수 있습니다. Tailscale 앱에서 Tailscale을 껐다가 다시 켭니다.",
- "T6EL0oM": "100.x.x.x 또는 *.ts.net과 같은 호스트 주소는 Tailscale을 통해 연결됩니다. 이를 ON으로 유지하세요.",
- "S9tNuKw": "시간 초과가 지속되면 두 앱을 모두 다시 시작하세요.",
- "gvS1F3o": "호스트 목록으로 돌아가서 호스트를 탭하여 다시 시도하세요.",
- "uGWzUrE": "휴대폰에서 WiFi 신호 강도를 확인하세요.",
- "neP0TKg": "업데이트 후에는 QR 코드를 통해 다시 페어링해야 할 수도 있습니다.",
- "WkJ-I-g": "Orca를 다시 시작해 보세요. 실행 시 컴패니언 서버가 시작됩니다.",
- "i4fV_jk": "연결을 수락하려면 데스크톱에서 Orca를 열어야 합니다.",
- "rtC8ngI": "회사/학교 네트워크는 P2P를 차단할 수 있습니다. 개인 핫스팟을 사용해 보세요.",
- "401zg0M": "Linux: sudo ufw allow 6768",
- "ayekp1A": "Windows: Defender Firewall → 앱 허용 — 개인 네트워크용 Orca를 활성화합니다.",
- "REilmMs": "macOS: 시스템 설정 → 네트워크 → 방화벽 — Orca를 허용합니다.",
- "jEL8NQc": "두 장치 모두에서 Wi-Fi를 다시 연결해 보세요.",
- "h6u3Ajc": "이더넷과 WiFi는 동일한 서브넷을 공유해야 합니다.",
- "DFWK1QU": "두 장치 모두 동일한 LAN에 있어야 합니다(Tailscale을 통해 연결되지 않은 경우).",
- "q1Pbqtk": "선택된",
- "p2fnv7c": "{{value0}} {{value1}}",
- "nEDriRI": "Terminal이 초기화되지 않았습니다. Terminal 보기에 준비 신호가 없습니다.",
- "7IfxObc": "키보드를 표시하려면 탭하세요.",
- "quM4RwQ": "호스트에 이미지 업로드 중",
- "ha7j7qM": "마이크 준비 중",
- "_-dmI2A": "데스크톱에서 스크립트 작성",
- "GGXoono": "중지하려면 마이크를 탭하세요.",
- "97h575A": "검토 필요",
- "39Q08OU": "리뷰어 {{value0}}명",
- "d8cyKVY": "리뷰어 {{value0}}명",
- "UMqLjMs": "해결되지 않은 체크"
+ "mobileWorkspaceStatuses": {
+ "todo": "할 일",
+ "progress": "진행중",
+ "review": "리뷰 중",
+ "done": "완료"
+ },
+ "workspaceListPickerOptions": {
+ "pr": "PR 현황",
+ "status": "상태",
+ "no": "그룹화 없음",
+ "server": "서버 주문",
+ "manual": "수동",
+ "repository": "저장소, 워크스페이스 이름",
+ "most": "가장 최근 출력 먼저",
+ "recent": "최근",
+ "alphabetical": "이름 알파벳순",
+ "name": "이름",
+ "agents": "주의가 필요한 Agents와 최근 활동",
+ "agent": "Agent 활동"
+ },
+ "agentRowDisplay": {
+ "done": "완료",
+ "interrupted": "중단된",
+ "waiting": "입력을 기다리는 중",
+ "blocked": "차단됨",
+ "just": "방금 전"
+ },
+ "workspacePrStatusGroups": {
+ "closed": "닫힘",
+ "progress": "진행 중",
+ "review": "리뷰 중",
+ "done": "완료"
+ },
+ "task": {
+ "repository": "리포지토리",
+ "close": "닫기",
+ "reopen": "다시 열기",
+ "pullRequest": "PR",
+ "updateItem": "업데이트 항목",
+ "mergePullRequestTitle": "PR 병합",
+ "mergeRequestTitle": "머지 리퀘스트",
+ "chooseHowPull": "이 PR을 병합하는 방법을 선택하세요.",
+ "chooseHowMerge": "이 MR을 병합하는 방법을 선택하세요.",
+ "mergeMethod": "병합 방법",
+ "changeStatusMessage": "상태 변경",
+ "mergeMerge": "병합 MR",
+ "gitHubReportsMergeConflicts": "GitHub는 병합 충돌을 보고합니다.",
+ "mergePullRequest": "PR 병합",
+ "copyGit": "GitHub 링크 복사",
+ "copied": "복사됨",
+ "copyLinear": "Linear 링크 복사",
+ "createWorkspaceMessage": "워크스페이스 만들기",
+ "creating": "만드는 중...",
+ "noComments": "댓글이 없습니다.",
+ "discussion": "논의",
+ "addSub": "하위 이슈 추가",
+ "subIssueTitle": "하위 이슈 제목",
+ "open": "열기",
+ "noSub": "하위 이슈가 없습니다.",
+ "subIssues": "하위 이슈",
+ "noPipeline": "이 MR에 실행된 파이프라인이 없습니다.",
+ "none": "없음",
+ "pipelineJob": "{{pipelineJobCount}} 직업",
+ "pipeline": "파이프라인",
+ "fileContents": "파일 콘텐츠를 사용할 수 없습니다.",
+ "binary": "바이너리 파일.",
+ "markViewed": "본 것으로 표시",
+ "markUnviewed": "보지 않은 것으로 표시",
+ "view": "보기",
+ "hide": "숨기기",
+ "changed": "변경된 파일",
+ "noChecks": "수표를 찾을 수 없습니다.",
+ "rerunAll": "모두 다시 실행",
+ "rerunFailed": "재실행 실패",
+ "refresh": "새로고침",
+ "checks": "체크",
+ "requestReview": "검토 요청",
+ "requestReviewers": "리뷰어 요청",
+ "noReviewer": "리뷰어 제안이 없습니다.",
+ "loadingReviewers": "리뷰어 로드 중...",
+ "noReviewersRequested": "요청한 리뷰어가 없습니다.",
+ "reviewers": "리뷰어",
+ "updateAssignees": "담당자 업데이트",
+ "removeUsernames": "사용자 이름 삭제, 쉼표로 구분",
+ "addUsernames": "사용자 이름을 쉼표로 구분하여 추가하세요.",
+ "noAssignable": "이 저장소에 할당 가능한 사용자가 없습니다.",
+ "loadingAssignees": "담당자 로드 중...",
+ "assignees": "담당자",
+ "updateLabels": "라벨 업데이트",
+ "removeLabels": "라벨 삭제, 쉼표로 구분",
+ "addLabels": "라벨 추가(쉼표로 구분)",
+ "noLabels": "이 저장소에는 라벨이 없습니다.",
+ "loadingLabels": "라벨 로드 중...",
+ "labels": "라벨",
+ "saveTitle": "제목 저장",
+ "title": "제목",
+ "saveDescription": "설명 저장",
+ "description": "설명",
+ "project": "프로젝트",
+ "assignee": "담당자",
+ "status": "상태",
+ "type": "유형",
+ "refreshDetails": "세부정보 새로고침",
+ "mergeRequires": "Merge에는 Orca에 이 저장소가 필요합니다.",
+ "closeItem": "항목 닫기",
+ "reopenItem": "항목 다시 열기",
+ "openGitHub": "GitHub에서 열기",
+ "workspaces": "워크스페이스는 GitHub 이슈 및 PR에서만 생성할 수 있습니다.",
+ "delete": "삭제",
+ "edit": "편집",
+ "reply": "회신",
+ "resolve": "스레드 해결",
+ "reopenThread": "스레드 다시 열기",
+ "cancel": "취소",
+ "save": "저장",
+ "editComment": "댓글 수정",
+ "show": "표시",
+ "commentCountComments": "댓글 {{commentCount}}개",
+ "clearField": "필드 지우기",
+ "saveField": "필드 저장",
+ "text": "텍스트",
+ "number": "숫자",
+ "noIterations": "사용 가능한 반복이 없습니다.",
+ "enterDate": "날짜를 YYYY-MM-DD로 입력하세요.",
+ "enterValid": "유효한 숫자를 입력하세요.",
+ "projectFieldsMessage": "프로젝트 분야",
+ "clearType": "클리어 타입",
+ "noIssue": "이 저장소에 대해 구성된 문제 유형이 없습니다.",
+ "loadingIssue": "문제 유형 로드 중...",
+ "issueType": "이슈 유형",
+ "projectItem": "프로젝트 아이템",
+ "draftIssue": "초안 문제",
+ "issue": "이슈",
+ "pullRequestMessage": "PR",
+ "copyRepository": "저장소 복사",
+ "repositoryNotOrca": "Orca에 없는 Repos",
+ "do": "실행 안 함",
+ "always": "항상 믿고 달려가세요",
+ "failedTrust": "설정 스크립트를 신뢰하지 못했습니다.",
+ "runHooks": "후크 실행",
+ "setup": "설정 스크립트",
+ "newSetup": "새로운 설정 스크립트",
+ "orcaYamlTrustWarning": "이 저장소의 orca.yaml은 워크스페이스가 시작되기 전에 컴퓨터에서 실행됩니다. 이 저장소를 신뢰하는 경우에만 실행하세요.",
+ "runSetupRepo": "{{repoName}}에서 설정을 실행하시겠습니까?",
+ "repoNameS": "{{repoName}}의 설정 스크립트가 변경되었습니다.",
+ "skip": "설정 건너뛰고 만들기",
+ "runSetupCreate": "설정 실행 및 생성",
+ "runSetupScript": "설치 스크립트를 실행하시겠습니까?",
+ "directories": "디렉토리",
+ "renderer": "렌더러 UI",
+ "name": "이름",
+ "editSparse": "스파스 사전 설정 편집",
+ "newSparse": "새로운 희소 사전 설정",
+ "newPreset": "새로운 사전 설정",
+ "useWhole": "전체 저장소 사용",
+ "full": "전체 체크아웃",
+ "sparse": "스파스 체크아웃",
+ "noBranches": "일치하는 브랜치가 없습니다.",
+ "useRepositorys": "이 저장소의 구성된 기반을 사용하십시오.",
+ "defaultBranch": "기본 브랜치",
+ "searchBranches": "브랜치 검색",
+ "pick": "기존 브랜치 또는 참조를 선택합니다.",
+ "startMessage": "시작 위치",
+ "connectRepository": "저장소 연결",
+ "detecting": "agents 감지 중...",
+ "repositoryNotFound": "저장소를 찾을 수 없습니다.",
+ "addGitRepositoryBeforeCreatingLinear": "Linear 워크스페이스를 만들기 전에 Git 저장소를 추가하세요.",
+ "start": "다음에서 시작",
+ "advanced": "고급",
+ "connectRepositoryFirst": "먼저 저장소를 연결하세요",
+ "optional": "[선택 사항]",
+ "workspaceName": "워크스페이스 이름",
+ "connect": "연결",
+ "connecting": "연결 중...",
+ "ssh": "SSH 연결",
+ "createWorkspace": "다음 위치에 워크스페이스 만들기",
+ "your": "귀하의 키는 호스트 OS 키체인을 통해 암호화되어 로컬에 저장됩니다.",
+ "linearSettings": "Linear 설정 / 보안 / 새 API 키",
+ "personal": "개인 API 키",
+ "paste": "해당 워크스페이스에서 문제를 찾아보려면 개인 API 키를 붙여넣으세요.",
+ "connectLinearWorkspace": "Linear 워크스페이스 연결",
+ "linearTeam": "Linear 팀",
+ "createIssue": "이슈 생성",
+ "addContext": "컨텍스트 추가",
+ "taskTitle": "작업 제목",
+ "origin": "origin",
+ "upstream": "업스트림",
+ "issueSource": "이슈 소스",
+ "team": "팀",
+ "createIssueSelectedLinear": "선택한 Linear 팀에서 이슈를 생성합니다.",
+ "createIssueSelectedRepository": "선택한 저장소에서 이슈를 생성합니다.",
+ "sortTasks": "작업 정렬",
+ "displayProperties": "디스플레이 속성",
+ "orderLinearIssues": "주문 Linear 문제",
+ "groupLinearIssues": "그룹 Linear 문제",
+ "linearView": "Linear 보기",
+ "noStates": "사용 가능한 주 없음",
+ "loadingStates": "상태 로드 중...",
+ "changeStatus": "상태 변경",
+ "allTeams": "모든 팀",
+ "chooseWhichTeams": "작업에 표시할 팀을 선택하세요.",
+ "linearTeams": "Linear 팀",
+ "failedSwitch": "워크스페이스를 전환하지 못했습니다.",
+ "linearWorkspace": "Linear 워크스페이스",
+ "linearFilter": "Linear 필터",
+ "gitLabFilter": "GitLab 필터",
+ "gitLabView": "GitLab 보기",
+ "hidden": "카드에서 숨겨짐",
+ "shown": "카드에 표시됨",
+ "viewHas": "이 보기에는 표시할 추가 필드가 없습니다.",
+ "chooseWhichProject": "항목 카드에 표시되는 프로젝트 필드를 선택합니다.",
+ "projectFields": "프로젝트 분야",
+ "projectSort": "프로젝트 정렬",
+ "orcaDoes": "Orca는 아직 이 GitHub 프로젝트 레이아웃을 지원하지 않습니다.",
+ "projectView": "프로젝트 보기",
+ "chooseProjectView": "프로젝트 보기 선택",
+ "noMore": "더 이상 프로젝트가 없습니다.",
+ "noMatchingProjects": "일치하는 프로젝트가 없습니다.",
+ "browseAll": "모두 찾아보기",
+ "browseAllLoading": "모두 찾아보기(로드 중...)",
+ "pin": "핀",
+ "recent": "최근",
+ "remove": "제거",
+ "pinned": "고정됨",
+ "tap": "다시 시도하려면 탭하세요.",
+ "noProjects": "로드된 프로젝트가 없습니다.",
+ "failedLoadProjects": "프로젝트를 로드하지 못했습니다.",
+ "useAdd": "누락된 프로젝트에 접근하려면 URL로 추가를 사용하세요.",
+ "some": "일부 조직이 로드되지 않았습니다({{githubProjectPartialFailureCount}}).",
+ "couldNotLoadProjects": "{{owner}}에서 프로젝트를 로드할 수 없습니다.",
+ "add": "추가",
+ "adding": "추가 중...",
+ "addUrl": "URL 또는 소유자/번호로 추가",
+ "searchProjects": "프로젝트 검색",
+ "chooseProjectViewTasks": "작업 페이지에 대한 프로젝트 보기를 선택합니다.",
+ "gitHubProjects": "GitHub 프로젝트",
+ "loads": "이전 결과를 로드합니다.",
+ "loaded": "짐을 실은",
+ "jump": "로드되었거나 사용 가능한 결과 페이지로 이동합니다.",
+ "gitHubPages": "GitHub 페이지",
+ "issues": "이슈",
+ "pullRequests": "PR",
+ "gitHubView": "GitHub 보기",
+ "noAlternate": "대체 이슈 소스를 사용할 수 없습니다.",
+ "chooseWhether": "각 저장소가 업스트림 또는 원본에서 작업을 쿼리하고 생성하는지 선택합니다.",
+ "gitHubIssue": "GitHub 이슈 소스",
+ "allRepositories": "모든 리포지토리",
+ "chooseWhichRepositories": "쿼리할 저장소를 선택하세요.",
+ "repositories": "저장소",
+ "taskSource": "작업 소스",
+ "next": "다음 페이지",
+ "pagePage": "페이지 {{pageNumber}}",
+ "selectPagePageGithubCurrentPage": "페이지 선택, 페이지 {{githubCurrentPage}}",
+ "previous": "이전 페이지",
+ "changeStatusName": "{{fromName}}에서 상태 변경",
+ "noProject": "프로젝트 항목 없음",
+ "browseProjects": "프로젝트 검색",
+ "chooseGit": "GitHub 프로젝트 선택",
+ "connectLinear": "Linear 연결",
+ "browseStart": "작업에서 직접 할당된 Linear 문제를 찾아보고 작업을 시작하세요.",
+ "connectYour": "Linear 계정 연결",
+ "mobile": "이 모바일 작업 보기에는 최신 데스크톱 런타임이 필요합니다.",
+ "updateOrcaDesktop": "Orca 데스크탑 업데이트",
+ "subIssueData": "토큰에 대한 하위 이슈 데이터를 사용할 수 없습니다.",
+ "retry": "다시 시도",
+ "retrying": "재시도 중...",
+ "retryLoading": "{{owner}}/{{repo}}에서 문제 로드를 다시 시도하세요.",
+ "couldNotLoadIssues": "다음에서 이슈를 로드할 수 없습니다.",
+ "searchProvider": "{{providerLabel}} 작업 검색...",
+ "searchProject": "프로젝트 보기 검색...",
+ "display": "표시",
+ "tasks": "작업",
+ "allWorkspaces": "모든 워크스페이스",
+ "viewOrder": "주문 보기",
+ "send": "댓글 보내기",
+ "addComment": "댓글 추가",
+ "failedUpdateIssueSource": "이슈 소스를 업데이트하지 못했습니다.",
+ "failedCreateTask": "작업을 생성하지 못했습니다.",
+ "failedCreateLinearSub": "Linear 하위 이슈를 생성하지 못했습니다.",
+ "failedLoadLinearSub": "Linear 하위 이슈를 로드하지 못했습니다.",
+ "failedAddLinear": "Linear 댓글을 추가하지 못했습니다.",
+ "failedUpdateLinear": "Linear 문제를 업데이트하지 못했습니다.",
+ "failedMerge": "병합하지 못했습니다.",
+ "gitHubReportsMergeConflictsOpen": "GitHub는 병합 충돌을 보고합니다. 계속하려면 GitHub에서 여세요.",
+ "failedReply": "답장하지 못했습니다.",
+ "failedAddReview": "리뷰 댓글을 추가하지 못했습니다.",
+ "unableComment": "PR 헤드 SHA가 없으면 댓글을 달 수 없습니다.",
+ "failedLoadFile": "파일 콘텐츠를 로드하지 못했습니다.",
+ "unableLoad": "이 PR에 대한 파일 콘텐츠를 로드할 수 없습니다.",
+ "failedUpdateReview": "리뷰 스레드를 업데이트하지 못했습니다.",
+ "failedUpdateViewed": "조회 상태를 업데이트하지 못했습니다.",
+ "unableSync": "이 PR의 조회 상태를 동기화할 수 없습니다.",
+ "failedRerun": "체크를 다시 실행하지 못했습니다.",
+ "failedRefresh": "체크를 새로고침하지 못했습니다.",
+ "failedRequest": "리뷰어를 요청하지 못했습니다.",
+ "failedCopyText": "텍스트를 복사하지 못했습니다.",
+ "failedCopyLink": "링크 복사 실패",
+ "failedAddComment": "댓글을 추가하지 못했습니다.",
+ "failedUpdateGitLab": "GitLab 항목을 업데이트하지 못했습니다.",
+ "failedUpdateGitHubPull": "GitHub PR을 업데이트하지 못했습니다.",
+ "failedUpdateGitHubIssue": "GitHub 이슈를 업데이트하지 못했습니다.",
+ "failedUpdateStatus": "상태를 업데이트하지 못했습니다.",
+ "failedMergePull": "PR을 병합하지 못했습니다.",
+ "failedUpdateIssueType": "문제 유형을 업데이트하지 못했습니다.",
+ "projectIssue": "이 프로젝트 이슈 유형은 모바일에서 편집할 수 없습니다.",
+ "failedUpdateProject": "프로젝트 필드를 업데이트하지 못했습니다.",
+ "failedUpdateItem": "항목을 업데이트하지 못했습니다.",
+ "projectItemCannot": "이 프로젝트 항목은 모바일에서 편집할 수 없습니다.",
+ "failedDelete": "댓글을 삭제하지 못했습니다.",
+ "projectCommentCannotDeleted": "본 프로젝트 댓글은 모바일에서는 삭제할 수 없습니다.",
+ "failedEdit": "댓글을 수정하지 못했습니다.",
+ "projectCommentCannotEdited": "본 프로젝트 댓글은 모바일에서는 편집이 불가능합니다.",
+ "addProject": "워크스페이스를 만들기 전에 Orca에 프로젝트 항목 저장소를 추가하세요.",
+ "failedCreateWorkspace": "워크스페이스를 생성하지 못했습니다.",
+ "failedSave": "스파스 사전 설정을 저장하지 못했습니다.",
+ "failedSearch": "브랜치 검색에 실패했습니다.",
+ "failedLoadSparse": "희소 사전 설정을 로드하지 못했습니다.",
+ "openShell": "셸 열기",
+ "failedLoadIssue": "문제 유형을 로드하지 못했습니다.",
+ "failedLoadAssignees": "담당자를 로드하지 못했습니다.",
+ "failedLoadLabels": "라벨을 로드하지 못했습니다.",
+ "failedLoadDetails": "세부정보를 로드하지 못했습니다.",
+ "failedLoadLinearContext": "Linear 컨텍스트를 로드하지 못했습니다.",
+ "failedAddProject": "프로젝트를 추가하지 못했습니다.",
+ "expected": "프로젝트 URL 또는 소유자/번호가 필요합니다.",
+ "failedSelect": "프로젝트를 선택하지 못했습니다.",
+ "failedLoadProject": "프로젝트 보기를 로드하지 못했습니다.",
+ "failedLoadMore": "추가 GitHub 작업을 로드하지 못했습니다.",
+ "connection": "연결 실패",
+ "failedLoadTasks": "작업을 로드하지 못했습니다.",
+ "failedLoadTasksSettings": "작업 설정을 로드하지 못했습니다.",
+ "updateOrcaDesktopUse": "모바일에서 작업을 사용하려면 Orca 데스크톱을 업데이트하세요.",
+ "addReview": "리뷰 코멘트 추가",
+ "noText": "텍스트 변경사항이 없습니다.",
+ "groupRepository": "저장소별로 그룹화한 후 최신 활동",
+ "newest": "최신 활동 먼저",
+ "updated": "업데이트됨",
+ "pending": "보류 중인 GitLab 할 일",
+ "myTodos": "내 할일",
+ "mergeRequests": "저장소별 요청 및 이슈 병합",
+ "projectMrs": "프로젝트 MR",
+ "reviewRequests": "귀하에게 할당된 요청 검토",
+ "needs": "리뷰 필요",
+ "pullRequestsAuthored": "귀하가 작성한 PR",
+ "mine": "내 항목",
+ "openPull": "PR 열기",
+ "openIssuesAssigned": "나에게 할당된 미결 문제",
+ "assignedMe": "나에게 할당됨",
+ "openGitHubIssues": "GitHub 이슈 열기",
+ "gitHubProjectsViews": "GitHub 프로젝트 보기",
+ "projects": "프로젝트",
+ "gitHubPull": "GitHub PR",
+ "prs": "PR",
+ "gitHubIssues": "GitHub 이슈",
+ "priority": "우선순위",
+ "identifier": "식별자",
+ "noGrouping": "그룹화 없음",
+ "grouped": "그룹화된 열",
+ "board": "보드",
+ "compact": "컴팩트 이슈 행",
+ "list": "목록",
+ "recently": "최근 완결된 이슈",
+ "completed": "완료됨",
+ "issuesCreated": "귀하가 만든 문제",
+ "created": "생성됨",
+ "issuesAssigned": "귀하에게 할당된 문제",
+ "myIssues": "내 문제",
+ "openIssuesAcross": "연결된 워크스페이스 전반에 걸쳐 미해결 문제",
+ "all": "모두",
+ "any": "모든 GitLab 상태",
+ "closedIssues": "종결된 문제 및 MR",
+ "closed": "닫힘",
+ "mergedMerge": "병합된 MR",
+ "merged": "병합됨",
+ "openIssuesMerge": "미해결 이슈 및 MR",
+ "assignedTeam": "할당된 문제 및 팀 문제",
+ "issuesMerge": "문제 및 MR",
+ "issuesPull": "문제 및 PR",
+ "diffPreviewTruncated": "{{totalLineCount}} 차이점 줄 중 첫 번째 {{maxRenderedPrDiffLines}}을(를) 표시합니다.",
+ "commentLine": "{{commentLine}}행에 댓글 달기",
+ "source": "출처: {{githubIssueSourceLabel}}",
+ "sortGithub": "정렬: {{githubProjectSortLabel}}",
+ "fieldsGithub": "필드: {{githubProjectFieldsLabel}}",
+ "groupLinearGroup": "그룹: {{linearGroupLabel}}",
+ "orderLinearOrder": "주문: {{linearOrderLabel}}",
+ "preferred": "{{repoName}}에는 기본 이슈 소스 업스트림을 사용할 수 없습니다. 원산지를 사용합니다.",
+ "plus": "+{{githubProjectSummaryFieldCount}} 필드",
+ "baseBranch": "{{baseBranch}}에",
+ "querying": "{{prs}} 쿼리 중",
+ "teamCount": "{{teamCount}} 팀",
+ "newProvider": "새로운 {{providerLabel}} 문제",
+ "fileIssue": "{{issueSource}}에 제출",
+ "createRef": "{{refName}}에서 생성",
+ "branch": "브랜치 이름: {{localBranchName}}",
+ "repoNameRequires": "{{repoName}}에는 이 워크스페이스를 생성하기 전에 설정 선택이 필요합니다.",
+ "owner": "{{owner}}/{{repo}}은(는) Orca에 추가되지 않습니다. 데스크톱 앱에서 이 저장소를 추가한 다음 모바일 작업을 새로고침세요.",
+ "gitHubProject": "GitHub 프로젝트 · {{repository}} {{projectNumber}}",
+ "base": "베이스",
+ "noType": "유형 없음",
+ "directory": "{{directoryCount}} 디렉토리",
+ "oneDirectory": "디렉토리 1개",
+ "remote": "원격 저장소",
+ "selectRepository": "저장소 선택",
+ "linearIssue": "Linear 이슈",
+ "items": "품목",
+ "openView": "GitHub에서 보기 열기",
+ "noLinear": "Linear 작업 없음",
+ "noGitLab": "GitLab 작업 없음",
+ "noGitHub": "GitHub 작업 없음",
+ "noMatchingTasks": "일치하는 작업 없음",
+ "connectHost": "작업을 로드하려면 호스트에 연결하세요.",
+ "chooseProject": "프로젝트 선택",
+ "oneTeam": "1팀",
+ "workspace": "워크스페이스",
+ "fields": "전지",
+ "githubProject": "{{githubProjectSummaryFieldCount}}/{{githubProjectAvailableSummaryFieldCount}} 필드",
+ "ascending": "오름차순",
+ "descending": "내림차순",
+ "selectedHosted": "저장소 {{selectedHostedRepoCount}}개",
+ "repositoryCountRepository": "저장소 {{repositoryCount}}개",
+ "repositoryCountRepositories": "저장소 {{repositoryCount}}개",
+ "allRepos": "모든 저장소",
+ "githubIssue": "{{githubIssueSourceRowCount}} 소스",
+ "selectTarget": "대상 선택",
+ "workspaceSparse": "\"{{workspaceSparseDraftNameCollisionName}}\"이(가) 이미 존재합니다.",
+ "nameMust": "이름은 80자 이하여야 합니다.",
+ "nameRequired": "이름은 필수입니다.",
+ "repositoryHooks": "저장소 후크",
+ "local": "로컬 후크",
+ "commentCountComment": "댓글 {{commentCount}}개",
+ "noCommentsYet": "아직 댓글이 없습니다",
+ "top": "최상위 댓글",
+ "reviewThread": "리뷰 스레드",
+ "resolvedReviewThread": "해결된 리뷰 스레드",
+ "review": "리뷰",
+ "resolvedReview": "해결된 검토",
+ "openLinear": "Linear에서 열기",
+ "openGitLab": "GitLab에서 열기",
+ "linearTicket": "Linear 티켓",
+ "todo": "{{todoTarget}} 할 일",
+ "mergeRequest": "MR",
+ "empty": "비어 있음",
+ "mergePr": "PR #{{pullRequestNumber}}을(를) 병합할까요?",
+ "rebaseMergePr": "PR #{{pullRequestNumber}}을(를) 리베이스하고 병합할까요?",
+ "squashMergePr": "PR #{{pullRequestNumber}}을 스쿼시하고 병합하시겠습니까?",
+ "squashMerge": "스쿼시 및 병합",
+ "mergeRequestMessage": "MR",
+ "createMerge": "병합 commit 만들기",
+ "rebaseMerge": "리베이스 및 병합",
+ "unknown": "알 수 없음",
+ "able": "병합 가능",
+ "blocked": "차단됨",
+ "behind": "뒤처짐",
+ "conflicts": "충돌",
+ "merge": "병합",
+ "gitLabTodo": "GitLab 할 일",
+ "locked": "잠김",
+ "draft": "초안",
+ "redacted": "수정됨",
+ "resolvedThread": "{{commentAuthor}}님이 해결한 스레드",
+ "resolvedComment": "{{commentAuthor}}님의 댓글이 해결되었습니다.",
+ "current": "현재 및 향후",
+ "failedCount": "{{repositoryCount}} 중 {{failedCount}}을(를) 로드하지 못했습니다.",
+ "noReviewers": "리뷰어 없음",
+ "changes": "변경 요청됨",
+ "approved": "승인됨",
+ "noDescription": "설명이 없습니다.",
+ "default": "기본",
+ "subtitle": "{{subtitle}} · 기본값",
+ "unsupported": "모바일에서 지원되지 않는 레이아웃",
+ "viewProject": "#{{projectViewNumber}} 보기",
+ "sortAscending": "오름차순 정렬",
+ "currently": "현재 {{currentSortDirection}} · {{nextSortDirection}}을(를) 탭하세요",
+ "usesGit": "GitHub 순위 순서를 사용합니다.",
+ "usesSort": "{{sortFieldName}} {{sortDirection}} 사용",
+ "failedCreateLinearIssue": "Linear 문제를 생성하지 못했습니다.",
+ "selectLinear": "먼저 Linear 팀을 선택하세요.",
+ "failedCreateProvider": "{{provider}} 문제를 생성하지 못했습니다.",
+ "addGitRepositoryBeforeCreatingProvider": "{{provider}} 문제를 생성하기 전에 Git 저장소를 추가하세요.",
+ "failedCreateSub": "하위 이슈를 생성하지 못했습니다.",
+ "subIssueNot": "하위 이슈를 찾을 수 없습니다.",
+ "failedReopen": "스레드를 다시 열지 못했습니다.",
+ "failedResolve": "스레드를 해결하지 못했습니다.",
+ "failedSync": "본 상태를 GitHub와 동기화하지 못했습니다.",
+ "invalid": "잘못된 수표 응답",
+ "failedUpdateGitHubStatus": "GitHub 상태를 업데이트하지 못했습니다.",
+ "failedUpdateGitHubItem": "GitHub 항목을 업데이트하지 못했습니다.",
+ "selectedAgent": "선택한 agent가 비활성화되었습니다. 생성하기 전에 활성화된 agent를 선택하세요.",
+ "connectDisplay": "워크스페이스를 만들기 전에 {{displayName}}을(를) 연결하세요.",
+ "failedConnectSsh": "SSH 저장소에 연결하지 못했습니다.",
+ "failedRead": "SSH 연결 상태를 읽지 못했습니다.",
+ "details": "세부정보를 찾을 수 없습니다.",
+ "projectHas": "이 프로젝트에는 지원되는 보기가 없습니다.",
+ "failedConnectLinear": "Linear 연결에 실패했습니다.",
+ "failedLoadGitLab": "GitLab 작업을 로드하지 못했습니다.",
+ "failedLoadGitHub": "GitHub 작업을 로드하지 못했습니다.",
+ "iteration": "반복",
+ "unassigned": "할당되지 않음",
+ "editPreset": "{{presetName}} 편집",
+ "squashMergeConfirmation": "{{reviewType}} #{{pullRequestNumber}} 스쿼시 및 병합?",
+ "discussionComment": "{{commentCount}} 댓글",
+ "selectPagePageGithubCurrentPageGithub": "페이지 선택, {{githubTotalPages}} 중 {{githubCurrentPage}} 페이지",
+ "pageGithub": "{{githubTotalPages}} 중 {{githubCurrentPage}} 페이지",
+ "confirm": "확인",
+ "requested": "요청됨",
+ "low": "낮음",
+ "medium": "중간",
+ "high": "높음",
+ "urgent": "긴급",
+ "selected": "선택된"
+ },
+ "accounts": {
+ "host": "호스트",
+ "add": "데스크톱 설정 → 계정에서 계정을 추가하거나 재인증하세요.",
+ "loading": "계정 로드 중…",
+ "accounts": "계정",
+ "seven": "7일",
+ "use": "agent 자체 로그인 사용",
+ "system": "시스템 기본값",
+ "could": "계정을 전환할 수 없습니다.",
+ "hostNot": "호스트를 찾을 수 없습니다",
+ "invalid": "호스트의 잘못된 계정 스냅샷",
+ "connecting": "{{hostName}}에 연결 중…"
+ },
+ "edit": {
+ "accepts": "IP, 호스트:포트 또는 ws:// / wss://를 허용합니다. 누락된 포트는 현재 포트(또는 6768)로 기본 설정됩니다.",
+ "address": "주소",
+ "hostName": "호스트 이름",
+ "name": "이름",
+ "connectionAddressDescription": "표시 이름이나 연결 주소를 변경하세요. 주소 편집은 이 전화기가 연결된 스위치에만 적용되며 다시 페어링되지는 않습니다. 동일한 데스크톱이 다른 IP로 연결될 수 있는 경우(예: 홈 LAN과 Tailscale) 이를 사용합니다.",
+ "go": "돌아가기",
+ "save": "저장",
+ "saveHost": "호스트 저장",
+ "edit": "호스트 수정",
+ "back": "뒤로",
+ "failedSave": "호스트를 저장하지 못했습니다.",
+ "enter": "이름을 입력하세요.",
+ "failedLoad": "호스트를 로드하지 못했습니다.",
+ "hostRemoved": "이 호스트는 이 전화에서 삭제되었습니다.",
+ "missing": "호스트가 없습니다.",
+ "connects": "{{endpoint}}에 연결"
+ },
+ "host": {
+ "removeHostName": "'{{hostName}}'을(를) 삭제하시겠습니까? 나중에 다시 페어링할 수 있습니다.",
+ "removeHost": "호스트 제거",
+ "delete": "삭제",
+ "sleep": "잠",
+ "cancel": "취소",
+ "deleteWorktree": "작업 트리 삭제",
+ "repositories": "저장소",
+ "hideDefault": "기본 브랜치 숨기기",
+ "hideSleeping": "슬립 중인 항목 숨기기",
+ "workspaces": "워크스페이스",
+ "clear": "필터 지우기",
+ "filter": "필터",
+ "groupTitle": "그룹화 기준",
+ "sort": "정렬 기준",
+ "status": "상태",
+ "group": "그룹",
+ "searchWorkspaces": "워크스페이스 검색",
+ "close": "검색 닫기",
+ "new": "새로운 워크스페이스",
+ "floating": "플로팅 워크스페이스",
+ "tasks": "작업",
+ "accounts": "계정",
+ "groupWorkspaces": "그룹 워크스페이스",
+ "sortSelected": "{{selectedSortLabel}} 기준으로 정렬",
+ "filterWorkspaces": "워크스페이스 필터링",
+ "filterWorkspaces1": "워크스페이스 필터링, 활성 필터 1개",
+ "filterWorkspacesActive": "워크스페이스 필터링, 활성 필터 {{activeFilterCount}}개",
+ "hideSidebar": "사이드바 숨기기",
+ "reconnect": "다시 연결",
+ "back": "호스트로 돌아가기",
+ "please": "다시 시도해 주세요.",
+ "could": "호스트를 제거할 수 없습니다.",
+ "hostNot": "호스트를 찾을 수 없습니다",
+ "filterActive": "필터{{activeFilterCount}}",
+ "deleteDisplay": "'{{displayName}}'({{branch}})을 삭제하시겠습니까?",
+ "noWorktrees": "작업 트리 없음",
+ "noWorktreesMatch": "작업 트리 일치 필터가 없습니다.",
+ "noMatching": "일치하는 작업 트리가 없습니다.",
+ "searchWorktreesAccessibility": "작업 트리 검색",
+ "searchWorktrees": "작업 트리 검색…",
+ "host": "호스트",
+ "recent": "최근",
+ "pin": "핀",
+ "unpin": "고정 해제",
+ "remove": "제거"
+ },
+ "quickCommandsTabButton": {
+ "quick": "빠른 명령"
+ },
+ "worktreeId": {
+ "remove": "제거",
+ "removeCustom": "이 맞춤 단축키를 삭제하시겠습니까?",
+ "enterUrl": "URL을 입력하거나 새 탭을 입력하려면 비워 두세요.",
+ "newBrowser": "새 브라우저",
+ "terminalName": "Terminal 이름",
+ "rename": "Terminal 이름 바꾸기",
+ "replace": "전화 초안을 최신 데스크톱 파일로 바꾸시겠습니까?",
+ "discardChanges": "변경사항 취소",
+ "discardLeave": "폐기 및 탈퇴",
+ "copyAll": "모두 복사하고 나가기",
+ "copyDiscard": "떠나기 전에 전화 초안을 복사하거나 삭제하세요.",
+ "unsaved": "저장되지 않은 markdown 변경사항",
+ "refresh": "새로고침",
+ "copyPath": "경로 복사",
+ "copyNotes": "메모 복사",
+ "choose": "현재 메모에 대한 agent 세션을 선택하세요.",
+ "sendReviewNotes": "리뷰 노트 보내기",
+ "markdownNote": "Markdown 노트",
+ "browser": "브라우저",
+ "newTabTitle": "새 탭",
+ "paste": "붙여넣기",
+ "create": "탭 만들기",
+ "creating": "만드는 중...",
+ "noTabs": "이 세션에는 탭이 없습니다.",
+ "dismissWorkspace": "워크스페이스 생성 경고 닫기",
+ "more": "추가 세션 작업",
+ "reconnect": "데스크톱에 다시 연결",
+ "back": "작업 트리로 돌아가기",
+ "agent": "Agent 사전 설정을 사용할 수 없음",
+ "noEnabled": "활성화된 Agents 없음",
+ "detecting": "Agents 감지",
+ "browserPage": "브라우저 페이지는 아직 사용할 수 없습니다.",
+ "desktopUpdateRequiredMobile": "모바일 브라우저 스트리밍을 위해서는 데스크톱 업데이트가 필요합니다.",
+ "edit": "실행하기 전에 이 빠른 명령을 편집하세요",
+ "selection": "선택 항목이 지워짐(버퍼 밖으로 스크롤됨)",
+ "couldNotCopy": "복사할 수 없습니다.",
+ "copied": "복사됨",
+ "couldNotClear": "terminal을 지울 수 없습니다",
+ "terminalCleared": "Terminal이 지워졌습니다.",
+ "input": "입력이 너무 큼(최대 256KiB)",
+ "openOrca": "호스트에서 Orca를 열어 잠자는 agents를 깨우세요.",
+ "saved": "저장됨",
+ "couldNotCopyNotes": "메모를 복사할 수 없습니다.",
+ "notesCopied": "메모가 복사되었습니다.",
+ "failedDelete": "메모를 삭제하지 못했습니다.",
+ "failedSaveNote": "메모를 저장하지 못했습니다.",
+ "note": "메모가 추가됨",
+ "couldNotLoadMarkdown": "markdown을 로드할 수 없습니다.",
+ "titlePreview": "{{title}} 미리보기",
+ "titleImage": "{{title}} 이미지",
+ "send": "보내기",
+ "sendReviewNotesAi": "AI에 리뷰 노트 보내기",
+ "copy": "복사",
+ "copyReview": "리뷰 메모 복사",
+ "noReview": "리뷰 메모 없음",
+ "saveNote": "메모 저장",
+ "cancel": "취소",
+ "addReview": "리뷰 메모 추가",
+ "delete": "{{lineNumber}}행의 메모 삭제",
+ "addNote": "{{commentLine}}행에 메모 추가",
+ "titleDiff": "{{title}} 차이점 라인 {{lineNumber}}",
+ "save": "저장",
+ "discard": "버리기",
+ "retry": "다시 시도",
+ "line": "라인 {{lineNumber}}",
+ "shortcut": "지름길",
+ "file": "파일",
+ "sendCommand": "명령 보내기",
+ "type": "명령을 입력하세요…",
+ "typed": "입력된 텍스트는 활성 terminal로 직접 전송됩니다.",
+ "show": "실시간 terminal 입력을 위한 키보드 표시",
+ "addCustom": "맞춤 바로가기 추가",
+ "pasteClipboard": "클립보드에서 붙여넣기",
+ "switchLive": "라이브 terminal 입력으로 전환",
+ "switchBuffered": "버퍼링된 명령 입력으로 전환",
+ "switchPhone": "휴대폰 모드로 전환",
+ "switchDesktop": "데스크톱 모드로 전환",
+ "hides": "소프트웨어 키보드를 숨기고 현재 terminal 세션을 열어 둡니다.",
+ "dismissKeyboard": "키보드 닫기",
+ "loadingTerminal": "로딩 terminal",
+ "checking": "데스크톱 기능 확인 중 — 잠시 후 다시 시도하세요",
+ "desktopUpdateRequiredQuick": "빠른 명령을 사용하려면 데스크탑 업데이트가 필요합니다.",
+ "newTab": "새 탭",
+ "openSource": "오픈소스 제어",
+ "openFile": "파일 탐색기 열기",
+ "couldNotSend": "메모를 보낼 수 없습니다.",
+ "notesSent": "보낸 메모",
+ "couldNotCopyDrafts": "초안을 복사할 수 없습니다.",
+ "path": "경로가 복사되었습니다.",
+ "verdict": "{{verdictDisplayLabel}} — 다시 시도하려면 탭하세요.",
+ "visible": "{{visibleTabCount}} 탭",
+ "one": "탭 1개",
+ "loadingTabs": "탭 로드 중",
+ "browserCommand": "브라우저 명령이 실패했습니다.",
+ "failedCreateBrowser": "브라우저를 생성하지 못했습니다.",
+ "enterValid": "유효한 URL을 입력하세요.",
+ "failedCreateMarkdown": "markdown 메모를 생성하지 못했습니다.",
+ "quick": "빠른 명령",
+ "failedCreateTerminal": "terminal을 생성하지 못했습니다.",
+ "saveFailed": "저장 실패",
+ "couldNotLoadFile": "파일 미리보기를 로드할 수 없습니다.",
+ "couldNotLoadDiff": "차이점 미리보기를 로드할 수 없습니다.",
+ "fileToo": "모바일 미리보기에 파일이 너무 큽니다.",
+ "binary": "바이너리 미리보기를 사용할 수 없습니다.",
+ "dictation": "받아쓰기 삽입됨",
+ "changed": "데스크탑에서 변경됨",
+ "read": "읽기 전용",
+ "commentCountReviewNote": "{{commentCount}} 리뷰 노트",
+ "commentCountReviewNotes": "{{commentCount}} 리뷰 노트",
+ "copyNotesInstead": "대신 메모 복사",
+ "newAgent": "새 agent 세션",
+ "check": "호스트 연결을 확인하세요.",
+ "unableCreate": "제목 없는 markdown 노트를 생성할 수 없습니다",
+ "terminalInput": "Terminal 입력이 다른 클라이언트에 의해 잠겨 있습니다.",
+ "failedSend": "메모를 보내지 못했습니다.",
+ "failedSaveReview": "리뷰 메모를 저장하지 못했습니다.",
+ "waiting": "데스크톱을 기다리는 중...",
+ "unableRead": "markdown을 읽을 수 없습니다",
+ "sendKey": "{{keyLabel}} 보내기",
+ "open": "열기"
+ },
+ "layout": {
+ "changes": "변경 사항",
+ "agent": "Agent 세션 기록",
+ "source": "소스 제어",
+ "tasks": "작업",
+ "accounts": "계정",
+ "edit": "호스트 수정"
+ },
+ "connectionHealth": {
+ "reconnecting": "다시 연결 중…",
+ "cannotConnect": "연결할 수 없습니다",
+ "cannotReach": "데스크톱에 연결할 수 없습니다.",
+ "disconnected": "연결 끊김",
+ "connecting": "연결 중…",
+ "connected": "연결됨",
+ "pairing": "페어링이 잘못되었습니다. 데스크톱과 다시 페어링하세요.",
+ "check": "Tailscale을 확인하세요"
+ },
+ "hostEndpoint": {
+ "port": "포트는 1~65535여야 합니다.",
+ "missing": "호스트 이름이 누락되었습니다.",
+ "notValidAddress": "유효한 주소가 아닙니다.",
+ "notValidHostname": "유효한 호스트 이름이 아닙니다.",
+ "host": "호스트에는 경로나 쿼리가 포함되어서는 안 됩니다.",
+ "use": "ws:// 또는 wss://(또는 호스트:포트)를 사용하세요.",
+ "enter": "호스트 주소를 입력하세요."
+ },
+ "mobileRelayHostOverlay": {
+ "expected": "구성된 릴레이 메타데이터에 대해 정확히 하나의 엔드포인트가 예상됩니다.",
+ "relayHost": "릴레이 호스트 ID 불일치",
+ "relayIdentity": "릴레이 ID와 엔드포인트가 공존해야 합니다."
+ },
+ "mobileRelayRpcStreams": {
+ "connection": "연결이 중단되었습니다."
+ },
+ "mobileConnectionPathLabel": {
+ "directLan": "직접 · LAN",
+ "directTailscale": "다이렉트 · Tailscale"
+ },
+ "pairConfirmState": {
+ "not": "유효한 페어링 코드가 아닙니다.",
+ "missing": "페어링 코드 누락"
+ },
+ "terminalAccessoryKeyCatalog": {
+ "clearLine": "커서 앞의 줄 지우기",
+ "delete": "뒤로 단어 삭제",
+ "end": "줄 끝",
+ "start": "줄의 시작",
+ "reverse": "역방향 검색",
+ "suspend": "프로세스 일시 중지",
+ "clearScreen": "화면 지우기",
+ "send": "EOF 보내기",
+ "interrupt": "인터럽트 terminal",
+ "arrowRight": "오른쪽 화살표",
+ "arrowLeft": "왼쪽 화살표",
+ "arrowDown": "아래쪽 화살표",
+ "arrowUp": "위쪽 화살표",
+ "forward": "앞으로 삭제",
+ "del": "델",
+ "backspace": "역행 키이",
+ "space": "공간",
+ "shiftTab": "시프트 탭",
+ "enter": "입력",
+ "escape": "탈출하다"
+ },
+ "terminalWebviewEngineErrorState": {
+ "reload": "새로고침",
+ "terminal": "Terminal을 로드하지 못했습니다."
+ },
+ "terminalWebviewNotificationDispatch": {
+ "unknown": "알 수 없는 terminal 오류"
+ },
+ "terminalWebView": {
+ "terminalWebViewRender": "Terminal WebView 렌더링 프로세스가 종료되었습니다.",
+ "terminalWebViewHttp": "Terminal WebView HTTP 오류",
+ "terminalWebViewLoad": "Terminal WebView 로드 실패"
+ },
+ "terminalAccessoryKeys": {
+ "pageDown": "페이지 아래로",
+ "pageUp": "페이지 위로",
+ "end": "끝",
+ "home": "홈",
+ "arrowRight": "오른쪽 화살표",
+ "arrowLeft": "왼쪽 화살표",
+ "arrowDown": "아래쪽 화살표",
+ "arrowUp": "위쪽 화살표",
+ "insert": "삽입",
+ "ins": "인",
+ "shift": "옮기다",
+ "ctrl": "Ctrl 키"
+ },
+ "terminalWebviewReadyWatchdog": {
+ "terminal": "Terminal이 초기화되지 않았습니다. Terminal 보기에 준비 신호가 없습니다."
+ },
+ "mobileSmartSourceModes": {
+ "all": "모두",
+ "closed": "닫힘",
+ "merged": "병합됨",
+ "open": "열기",
+ "name": "이름",
+ "branch": "브랜치",
+ "smart": "스마트"
+ },
+ "sparsePresetDraft": {
+ "use": "루트, 절대 경로, 상위 경로가 아니라 repo 기준 상대 디렉터리를 사용하세요.",
+ "add": "하나 이상의 디렉터리를 추가합니다."
+ },
+ "mobileGithubProjectGroupSort": {
+ "no": "아니요 {{fieldName}}",
+ "iteration": "반복"
+ },
+ "workspaceAgentSelection": {
+ "blank": "빈 Terminal"
+ },
+ "workspaceSshGate": {
+ "disconnected": "연결 끊김",
+ "connection": "연결 실패",
+ "reconnect": "재연결 실패",
+ "authentication": "인증 실패",
+ "reconnecting": "다시 연결 중",
+ "deploying": "릴레이 배포",
+ "connecting": "연결 중",
+ "connected": "연결됨"
+ },
+ "mobileHostedCheckStatus": {
+ "passed": "{{passedCheckCount}}/{{totalCheckCount}} 통과됨",
+ "pending": "{{pendingCheckCount}} 보류 중",
+ "review": "검토 필요",
+ "reviewerCountReviewer": "리뷰어 {{reviewerCount}}명",
+ "reviewerCountReviewers": "리뷰어 {{reviewerCount}}명"
+ },
+ "worktreeCreateRetry": {
+ "failed": "워크스페이스를 생성하지 못했습니다."
+ },
+ "useMobileComposerSource": {
+ "failed": "기본 브랜치를 확인하지 못했습니다."
+ },
+ "linearMobileIssueRead": {
+ "unexpected": "예상치 못한 Linear 작업 응답"
+ },
+ "codexResetAttemptJournal": {
+ "wsl": "WSL 재설정 범위에는 정확한 배포판이 필요합니다.",
+ "host": "호스트 재설정 범위는 WSL 배포판의 이름을 지정할 수 없습니다."
+ },
+ "mobileBranchDiffPreviewDrawer": {
+ "diff": "모바일 미리보기에서는 차이가 잘렸습니다.",
+ "unable": "차이점을 로드할 수 없습니다.",
+ "close": "커밋된 Diff 미리보기 닫기",
+ "committed": "브랜치에서 커밋됨"
+ },
+ "mobileCommitFailurePanel": {
+ "showDetails": "세부 정보 표시",
+ "hideDetails": "세부 정보 숨기기",
+ "showCommit": "commit 실패 세부정보 표시",
+ "hideCommit": "commit 실패 세부정보 숨기기",
+ "fix": "수정",
+ "fixCommit": "AI로 commit 실패 수정",
+ "commitFailed": "Commit 실패",
+ "commitFailedMessage": "Commit에 실패했습니다."
+ },
+ "mobileGitHistoryList": {
+ "noCommits": "commits이 없습니다.",
+ "retry": "다시 시도",
+ "waiting": "데스크톱을 기다리는 중...",
+ "noFile": "파일 변경 없음",
+ "failed": "기록을 로드하지 못했습니다."
+ },
+ "mobileSourceControlBranchCard": {
+ "unstaged": "{{unstagedCount}} 변경됨",
+ "staged": "{{stagedCount}}개 스테이징됨",
+ "branch": "브랜치의 {{branchCount}}"
+ },
+ "mobileSourceControlContent": {
+ "generate": "AI로 commit 메시지 생성",
+ "cancel": "commit 메시지 생성 취소",
+ "commitMessage": "Commit 메시지",
+ "noStaged": "준비된 파일 없음",
+ "commitMessageDisabled": "Commit 메시지가 비활성화되었습니다. 준비된 파일이 없습니다.",
+ "working": "작업 트리가 깨끗합니다.",
+ "noLocal": "로컬 변경 없음",
+ "open": "오픈 소스 제어 작업",
+ "unstage": "모두 언스테이지",
+ "stage": "모두 스테이지",
+ "reconnecting": "데스크톱에 다시 연결하는 중..."
+ },
+ "mobileSourceControlFileRows": {
+ "openCommitted": "커밋된 변경 사항 열기 {{filePath}}",
+ "loading": "커밋된 변경사항 로드 중...",
+ "committedBranch": "브랜치에 Commit 됨",
+ "discard": "{{path}} 삭제",
+ "stage": "단계 {{path}}",
+ "unstage": "무대 해제 {{path}}",
+ "unresolved": "해결되지 않은 충돌",
+ "openChanged": "변경된 파일 열기 {{path}}",
+ "old": "{{oldPath}}에서",
+ "committedChanges": "커밋된 변경사항을 사용할 수 없습니다."
+ },
+ "mobileSourceControlHeader": {
+ "refresh": "소스 제어 새로 고침",
+ "openPullRequestWeb": "웹에서 PR 열기",
+ "openPullRequestPull": "웹에서 PR #{{pullRequestNumber}} 열기",
+ "source": "소스 제어",
+ "back": "세션으로 돌아가기",
+ "close": "소스 제어 닫기"
+ },
+ "mobileSourceControlModals": {
+ "openYourBrowser": "브라우저에서 열까요?",
+ "pull": "PR이 생성되었습니다.",
+ "switch": "브랜치 전환",
+ "discardChanges": "'{{path}}'에 대한 변경사항을 취소하시겠습니까? 이 작업은 취소할 수 없습니다.",
+ "discardChange": "변경사항 취소",
+ "source": "소스 제어",
+ "current": "현재",
+ "openYourBrowserCreated": "브라우저에서 열까요?\n\n{{createdPrWarning}}",
+ "open": "열기",
+ "discard": "버리기"
+ },
+ "mobileSourceControlPanel": {
+ "retry": "다시 시도",
+ "unable": "로드할 수 없습니다",
+ "source": "소스 제어를 사용할 수 없음"
+ },
+ "mobileSourceControlPrChip": {
+ "create": "PR 생성",
+ "loadingPullRequest": "PR 로드 중…",
+ "pullRequestPull": "PR #{{pullRequestNumber}}, {{stateLabel}}, {{checkSummary}}{{commentSummary}}. PR을 엽니다.",
+ "pullRequestUnavailable": "PR을 사용할 수 없음: {{summaryMessage}}",
+ "loadingPullRequestMessage": "PR 로드 중"
+ },
+ "mobileBranchCompare": {
+ "committed": "브랜치에 Commit 됨",
+ "changedFileCountFile": "{{changedFileCount}} 파일",
+ "changedFileCountFiles": "{{changedFileCount}} 파일",
+ "vs": "대 {{baseRef}}"
+ },
+ "mobileCommitMessageAi": {
+ "failed": "commit 메시지를 생성하지 못했습니다.",
+ "no": "commit 메시지가 생성되지 않았습니다."
+ },
+ "mobileCreatePrAction": {
+ "createPull": "PR 생성",
+ "branch": "이 브랜치는 아직 {{reviewType}}을(를) 만들 준비가 되지 않았습니다.",
+ "createReview": "{{reviewType}} 만들기"
+ },
+ "mobileHostedReviewCreateIntent": {
+ "branch": "PR를 준비하는 동안 브랜치가 변경되었습니다.",
+ "could": "commit 메시지를 생성할 수 없습니다. 소스 제어에 하나를 추가한 후 다시 시도하세요.",
+ "resolveStage": "PR을 생성하기 전에 변경 사항을 해결하거나 준비하세요.",
+ "resolveConflicts": "PR을 생성하기 전에 충돌을 해결하세요.",
+ "creating": "리뷰 작성 중...",
+ "force": "임대로 강제 추진 중...",
+ "pushing": "commits 푸시 중...",
+ "publishing": "브랜치 게시 중...",
+ "committing": "변경사항을 커밋하는 중...",
+ "generating": "commit 메시지 생성 중...",
+ "staging": "변경 사항을 스테이징하는 중...",
+ "failed": "변경 사항을 단계화하지 못했습니다."
+ },
+ "mobileHostedReviewService": {
+ "pushFailed": "푸시에 실패했습니다. 푸시 오류를 해결한 후 다시 시도하세요.",
+ "pushSucceeded": "푸시는 성공했지만 {{reviewType}} 생성에 실패했습니다: {{errorMessage}}",
+ "failed": "PR을 생성하지 못했습니다."
+ },
+ "mobileSourceControlActions": {
+ "switch": "브랜치 전환",
+ "rebase": "베이스에 리베이스",
+ "publishBranch": "브랜치 게시",
+ "fetch": "가져오기",
+ "pushCreate": "푸시 및 PR 생성",
+ "create": "PR 생성",
+ "commitSync": "Commit 및 동기화",
+ "commitPush": "Commit 및 푸시",
+ "pullRequests": "이 repo에는 PR을 사용할 수 없습니다.",
+ "checking": "브랜치 상태 확인 중...",
+ "publishBranchFirst": "먼저 Branch 게시",
+ "enter": "commit 메시지를 입력하세요.",
+ "stage": "하나 이상의 파일을 준비합니다.",
+ "local": "로컬 커밋이 손실됩니다. 대신 풀하세요",
+ "nothingFast": "빨리 감을 항목이 없습니다.",
+ "fastForward": "빨리감기",
+ "fastForwardBehind": "빨리 감기({{behindCommitCount}})",
+ "branchAlready": "브랜치이 이미 게시되었습니다.",
+ "branchUp": "브랜치이 최신 상태입니다.",
+ "sync": "동기화",
+ "syncBehind": "동기화(↓{{behindCommitCount}} ↑{{aheadCommitCount}})",
+ "nothingPull": "당길 게 하나도 없어",
+ "pull": "풀",
+ "pullBehind": "당기기({{behindCommitCount}})",
+ "nothingPush": "밀어붙일 게 하나도 없어",
+ "push": "푸시",
+ "pushAhead": "푸시({{aheadCommitCount}})"
+ },
+ "useMobileCommitFailureRecovery": {
+ "failed": "agent를 시작하지 못했습니다.",
+ "waiting": "데스크톱을 기다리는 중..."
+ },
+ "useMobileCommitMessageGeneration": {
+ "failed": "commit 메시지를 생성하지 못했습니다."
+ },
+ "useMobileCreatePrRunner": {
+ "check": "PR을 생성하기 전에 브랜치를 확인하세요."
+ },
+ "useMobileSourceControlLoaders": {
+ "update": "모바일에서 소스 제어를 사용하려면 Orca 데스크톱을 업데이트하세요.",
+ "unableResolve": "비교를 위해 기본 브랜치를 확인할 수 없습니다.",
+ "unableLoadSource": "소스 제어를 로드할 수 없습니다.",
+ "unableLoadCommitted": "커밋된 변경 사항을 로드할 수 없습니다.",
+ "waiting": "데스크톱을 기다리는 중...",
+ "connecting": "데스크톱에 연결하는 중..."
+ },
+ "useMobileSourceControlOpeners": {
+ "waiting": "데스크톱을 기다리는 중...",
+ "unableOpen": "차이점을 열 수 없습니다.",
+ "unableLoad": "커밋된 diff를 로드할 수 없습니다.",
+ "binary": "모바일에서는 바이너리 브랜치 diff 미리보기를 사용할 수 없습니다."
+ },
+ "useMobileSourceControlRunners": {
+ "source": "소스 제어 작업이 실패했습니다."
+ },
+ "useMobileSourceControlCommitRunners": {
+ "source": "소스 제어 작업이 실패했습니다.",
+ "commit": "Commit 실패"
+ },
+ "mobileSourceControlScreenState": {
+ "noUpstream": "업스트림 없음",
+ "ahead": "앞에 {{aheadCommitCount}}, 뒤에 {{behindCommitCount}}",
+ "noBranch": "브랜치 없음"
+ },
+ "mobileSourceControlConflictAbort": {
+ "abortMerge": "병합 중단",
+ "abortRebase": "리베이스 중단",
+ "aborting": "중단 중…"
+ },
+ "mobilePrChipSummary": {
+ "failing": "{{failingCheckCount}} 실패",
+ "no": "체크 없음",
+ "unresolved": "해결되지 않은 체크"
+ },
+ "mobilePrCreate": {
+ "branch": "이 브랜치는 아직 {{reviewType}}을(를) 만들 준비가 되지 않았습니다.",
+ "push": "{{reviewType}}을 생성하기 전에 기본 브랜치를 푸시하세요.",
+ "creatingReviewTypeFork": "이 포크에서 {{reviewType}}을 생성하는 것은 지원되지 않습니다.",
+ "reviewTypeAlreadyExists": "이 브랜치에는 {{reviewType}}이 이미 존재합니다.",
+ "creatingReviewTypeS": "이 repo에서는 {{reviewType}} 생성이 지원되지 않습니다.",
+ "authenticate": "{{reviewType}}을(를) 만들기 전에 인증하세요.",
+ "sync": "{{reviewType}}을(를) 만들기 전에 이 브랜치를 동기화하세요.",
+ "publish": "{{reviewType}}을(를) 만들기 전에 commits을 게시하세요.",
+ "switch": "{{reviewType}}을 생성하기 전에 기능 브랜치로 전환하세요.",
+ "check": "{{reviewType}}을(를) 만들기 전에 브랜치를 체크아웃하세요.",
+ "commit": "{{reviewType}}을(를) 만들기 전에 변경 사항을 Commit 하세요.",
+ "orca": "Orca는 이 브랜치에 이미 {{reviewType}}이 있는지 확인할 수 없습니다. 잠시 후에 다시 시도해 보세요.",
+ "reviewTypeCreated": "{{reviewType}}이(가) 생성되었지만 Orca가 아직 새로 고칠 수 없습니다.",
+ "reviewTypePull": "{{reviewType}} #{{pullRequestNumber}}은(는) 이미 열려 있습니다.",
+ "reviewTypeAlreadyOpen": "{{reviewType}}은(는) 이미 열려 있습니다."
+ },
+ "mobileSourceControlPrimaryAction": {
+ "nothing": "commit 할 항목이 없습니다. 브랜치가 최신 상태입니다.",
+ "push": "푸시",
+ "pull": "풀",
+ "forcePushLease": "원격 브랜치를 업데이트하려면 임대를 통해 강제로 푸시하세요.",
+ "publishBranchOrigin": "이 브랜치를 원본에 게시합니다.",
+ "check": "commits을 게시하기 전에 브랜치를 체크아웃하세요.",
+ "stageLeast": "commit 할 파일을 하나 이상 준비하세요.",
+ "stageAllChanges": "모든 변경 사항을 준비합니다.",
+ "enter": "commit 할 commit 메시지를 입력하세요.",
+ "commitStaged": "단계적 변경 사항을 Commit 합니다.",
+ "resolve": "커밋하기 전에 충돌을 해결하세요.",
+ "try": "원격 작업이 완료되면 다시 시도하세요.",
+ "remote": "원격 작업이 진행 중입니다.",
+ "forcePushProgress": "강제 푸시가 진행 중입니다.",
+ "commitProgress": "Commit이 진행 중입니다.",
+ "publishBranch": "브랜치 게시",
+ "sync": "동기화",
+ "stageAll": "모두 스테이지",
+ "forcePush": "강제 푸시",
+ "pullBehind": "{{behindCommitCount}}을 당기고, {{aheadCommitCount}}을 누르세요.",
+ "pullCommitCountCommit": "{{commitCount}} commit을 가져옵니다.",
+ "pullCommitCountCommits": "{{commitCount}} commits을 가져옵니다.",
+ "pushCommitCountCommit": "{{commitCount}} commit을 푸시합니다.",
+ "pushCommitCountCommits": "{{commitCount}} commits을 푸시합니다."
+ },
+ "mobileHostedReviewGitPreparation": {
+ "commit": "Commit 실패",
+ "unable": "소스 제어를 새로 고칠 수 없습니다"
+ },
+ "mobilePrLink": {
+ "failedUpdateLinkedReview": "연결된 리뷰를 업데이트하지 못했습니다.",
+ "failedUpdateLinkedPull": "연결된 PR을 업데이트하지 못했습니다."
+ },
+ "hostedReviewCopy": {
+ "mergeRequestTitle": "머지 리퀘스트",
+ "mergeRequest": "MR",
+ "pullRequestTitle": "PR",
+ "pullRequest": "PR"
+ },
+ "mobileGitHistory": {
+ "months": "{{months}}월",
+ "just": "방금 전",
+ "failed": "commit 기록을 로드하지 못했습니다."
+ },
+ "mobileGitStatus": {
+ "staged": "스테이징된 변경 사항",
+ "untracked": "추적되지 않은 파일",
+ "changes": "변경 사항"
+ },
+ "mobileHostedReviewRemotePrerequisite": {
+ "failedForce": "임대를 강제로 푸시하지 못했습니다.",
+ "failedPush": "commits을 푸시하지 못했습니다.",
+ "failedPublish": "브랜치을 게시하지 못했습니다."
+ },
+ "mobileSourceControlHubTab": {
+ "pull": "PR",
+ "changes": "변경 사항"
+ },
+ "prComposeValidation": {
+ "base": "베이스 브랜치는 head 브랜치와 달라야 합니다.",
+ "choose": "베이스 브랜치를 선택하세요.",
+ "enter": "{{reviewType}} 제목을 입력하세요.",
+ "wait": "생성이 완료될 때까지 기다립니다."
+ },
+ "mobileBranchBaseRef": {
+ "unable": "브랜치 기반을 확인할 수 없습니다."
+ },
+ "useMobileGitRequests": {
+ "branch": "브랜치 상태를 확인할 수 없습니다",
+ "commit": "Commit 실패",
+ "source": "소스 제어 작업이 실패했습니다.",
+ "waiting": "데스크톱을 기다리는 중..."
+ },
+ "useMobileSourceControlActionSheetRunners": {
+ "no": "리베이스할 기본 브랜치가 없습니다.",
+ "waiting": "데스크톱을 기다리는 중..."
+ },
+ "mobileAgentWorkingIndicator": {
+ "agent": "Agent가 작업 중입니다."
+ },
+ "mobileBrowserTabActionSheet": {
+ "reload": "새로고침",
+ "forward": "포워드",
+ "back": "뒤로",
+ "browser": "브라우저"
+ },
+ "mobileNativeChatAsk": {
+ "next": "다음",
+ "send": "답변 보내기",
+ "cancel": "취소",
+ "type": "답변을 입력하세요",
+ "other": "다른…",
+ "step": "{{stepNumber}} 단계"
+ },
+ "mobileNativeChatComposer": {
+ "send": "메시지 보내기",
+ "dictate": "명령",
+ "stop": "받아쓰기 중지",
+ "attach": "이미지 첨부",
+ "remove": "이미지 삭제",
+ "message": "메시지, @files, /명령"
+ },
+ "mobileNativeChatMessage": {
+ "queued": "대기 중",
+ "scroll": "이 메시지를 맨 위로 스크롤",
+ "copy": "메시지 복사",
+ "remaining": "… {{remainingToolCallCount}} 추가 도구 호출",
+ "image": "영상",
+ "attached": "첨부된 이미지",
+ "callCountToolCall": "{{callCount}} 도구 호출",
+ "callCountToolCalls": "{{callCount}} 도구 호출"
+ },
+ "mobileNativeChatQuestion": {
+ "send": "답장 보내기",
+ "typeYour": "답장을 입력하세요…",
+ "typeReply": "아니면 답장을 입력하세요...",
+ "submitSelectedOptions": "선택한 옵션 제출",
+ "submitSelectedCommand": "제출{{selectedCommandCount}}",
+ "choose": "옵션을 선택하세요"
+ },
+ "mobileNativeChatView": {
+ "message": "메시지, @files, /명령",
+ "waiting": "terminal을 기다리는 중…",
+ "reconnecting": "다시 연결 중…",
+ "stop": "중지",
+ "stopAgent": "agent 중지",
+ "tools": "도구",
+ "collapse": "접기",
+ "scroll": "최신으로 스크롤",
+ "load": "이전 메시지 로드"
+ },
+ "mobileSessionHeaderMoreActionsSheet": {
+ "checks": "체크",
+ "agent": "Agent 기록",
+ "open": "PR 확인 열기",
+ "browse": "agent 세션 찾아보기 및 재개"
+ },
+ "mobileTerminalInputActions": {
+ "start": "음성 받아쓰기 시작",
+ "starting": "음성 받아쓰기 시작",
+ "cancel": "음성 받아쓰기 취소",
+ "stop": "음성 받아쓰기 중지",
+ "long": "대신 파일을 첨부하려면 길게 누르세요.",
+ "attach": "사진 첨부",
+ "sending": "이미지 전송 중"
+ },
+ "quickCommandEditorForm": {
+ "add": "빠른 명령 추가",
+ "save": "저장",
+ "cancel": "취소",
+ "project": "프로젝트",
+ "global": "글로벌",
+ "scope": "범위",
+ "submit": "텍스트만 삽입하지 않고 즉시 제출합니다.",
+ "append": "Enter 추가",
+ "advanced": "고급",
+ "supports": "기술, 파일 경로 및 내장 명령을 지원합니다.",
+ "ask": "agent에게 이 워크스페이스를 조사하도록 요청하세요.",
+ "command": "명령 텍스트",
+ "prompt": "프롬프트",
+ "choose": "agent 선택",
+ "action": "작업",
+ "start": "개발 서버 시작",
+ "label": "레이블",
+ "agentPrompt": "Agent 프롬프트",
+ "terminal": "Terminal 명령"
+ },
+ "quickCommandsList": {
+ "edit": "{{commandLabel}} 편집",
+ "run": "{{commandLabel}} 실행",
+ "quick": "빠른 명령 제한에 도달했습니다.",
+ "new": "새로운 빠른 명령",
+ "global": "글로벌",
+ "project": "이 프로젝트",
+ "noMatching": "일치하는 빠른 명령이 없습니다.",
+ "noQuick": "아직 빠른 명령이 없습니다.",
+ "search": "빠른 명령 검색..."
+ },
+ "quickCommandsSheet": {
+ "save": "빠른 액세스를 위해 terminal 명령이나 agent 프롬프트를 저장하세요.",
+ "back": "뒤로",
+ "quickCommand": "이 빠른 명령은 저장된 목록에서 제거됩니다.",
+ "deleteDelete": "'{{deleteLabel}}'을 삭제하시겠습니까?",
+ "quickCommands": "빠른 명령어",
+ "choose": "Agent 선택",
+ "add": "빠른 명령 추가",
+ "edit": "빠른 명령 편집",
+ "delete": "삭제",
+ "cancel": "취소",
+ "untitled": "제목 없음"
+ },
+ "githubPr": {
+ "failedUpdateReview": "리뷰 스레드를 업데이트하지 못했습니다.",
+ "failedUpdateTitle": "제목을 업데이트하지 못했습니다.",
+ "requestFailedRequest": "요청 실패: {{requestMethod}}",
+ "requestFailedGithubResolve": "요청 실패: github.resolveReviewThread",
+ "requestFailedGithubUpdate": "요청 실패: github.updatePRTitle"
+ },
+ "mobileBulkCloseSheetActions": {
+ "close": "닫기"
+ },
+ "mobileDiffReviewLoaders": {
+ "update": "모바일에서 변경 사항을 리뷰하려면 Orca 데스크톱을 업데이트하세요.",
+ "committedChangesResponse": "커밋된 변경사항 응답이 잘못되었습니다.",
+ "committedChangesFailed": "커밋된 변경 사항이 실패했습니다.",
+ "committedChangesUnavailable": "커밋된 변경 사항을 사용할 수 없습니다.",
+ "committedDiff": "커밋된 diff를 사용할 수 없습니다.",
+ "diff": "Diff 응답이 잘못되었습니다.",
+ "unableLoadDiff": "차이점을 로드할 수 없습니다.",
+ "unableLoadReview": "리뷰 메모를 로드할 수 없습니다.",
+ "source": "소스 제어 응답이 잘못되었습니다.",
+ "unableLoadChanges": "변경사항을 로드할 수 없습니다."
+ },
+ "mobileDiffReviewQueue": {
+ "committed": "브랜치에서 커밋됨",
+ "unstaged": "스테이징되지 않음",
+ "staged": "스테이징됨"
+ },
+ "mobileNativeChatPermission": {
+ "permission": "권한이 요청되었습니다",
+ "allowAlways": "항상 허용",
+ "deny": "부인하다",
+ "allow": "허용하다",
+ "allowPermission": "{{permissionName}}을(를) 허용하시겠습니까?"
+ },
+ "mobileTabCloseSelection": {
+ "closeTabsRight": "오른쪽 탭 닫기",
+ "closeTabsLeft": "왼쪽 탭 닫기",
+ "closeOther": "다른 탭 닫기"
+ },
+ "mobileTerminalActionSheetActions": {
+ "close": "닫기",
+ "clear": "Terminal 지우기",
+ "rename": "이름 바꾸기",
+ "switchPhone": "전화로 전환",
+ "switchDesktop": "데스크톱으로 전환"
+ },
+ "prActionsEngine": {
+ "failedMerge": "PR을 병합하지 못했습니다.",
+ "failedRefresh": "PR을 새로고침하지 못했습니다."
+ },
+ "useMobileAttachmentInputLeaseGate": {
+ "attach": "연결 실패(다시 연결 중)"
+ },
+ "useMobileDiffReviewCommentActions": {
+ "failedSaveReview": "리뷰를 저장하지 못했습니다.",
+ "failedSaveReviewState": "검토 상태를 저장하지 못했습니다.",
+ "waiting": "데스크톱을 기다리는 중..."
+ },
+ "diffReview": {
+ "waiting": "데스크톱을 기다리는 중...",
+ "missing": "누락된 작업 트리",
+ "unableLoadDiff": "차이점을 로드할 수 없습니다.",
+ "unableLoadReview": "리뷰를 로드할 수 없습니다."
+ },
+ "useMobileDiffReviewGitActions": {
+ "stagedFile": "{{stagedFileCount}}개 스테이징됨, {{failedFileCount}}개 실패",
+ "waiting": "데스크톱을 기다리는 중...",
+ "source": "소스 제어 작업이 실패했습니다.",
+ "stagedReviewedFile": "검토된 파일 {{staged}}개 스테이징됨",
+ "stagedReviewedFiles": "검토된 파일 {{staged}}개 스테이징됨"
+ },
+ "useMobileDiffReviewSendActions": {
+ "waiting": "데스크톱을 기다리는 중...",
+ "reviewNotesSent": "보낸 검토 메모",
+ "reviewNotesCopied": "검토 메모가 복사되었습니다.",
+ "unable": "agent 세션을 로드할 수 없습니다.",
+ "created": "생성된 terminal 응답이 잘못되었습니다.",
+ "failedCreate": "terminal을 생성하지 못했습니다.",
+ "terminal": "Terminal 입력이 잠겨 있습니다.",
+ "failedSend": "메모를 보내지 못했습니다."
+ },
+ "useMobileImageAttachment": {
+ "attachFailed": "첨부 실패",
+ "image": "이미지가 너무 커서 첨부할 수 없습니다.",
+ "photo": "사진 허가가 거부되었습니다",
+ "attachFailedDisconnected": "연결 실패(연결 끊김)"
+ },
+ "useMobileNativeChatImageAttachments": {
+ "attachFailed": "첨부 실패",
+ "image": "이미지가 너무 커서 첨부할 수 없습니다.",
+ "photo": "사진 허가가 거부되었습니다",
+ "attachFailedDisconnected": "연결 실패(연결 끊김)",
+ "messageNotSent": "메시지가 전송되지 않았습니다.",
+ "messageNotSentDisconnected": "메시지가 전송되지 않음(연결이 끊김)"
+ },
+ "useMobilePrActions": {
+ "not": "연결되지 않음"
+ },
+ "useMobilePrAiTriage": {
+ "failed": "agent를 시작하지 못했습니다.",
+ "waiting": "데스크톱을 기다리는 중…"
+ },
+ "useMobilePrCommentActions": {
+ "comment": "댓글 작업 실패"
+ },
+ "useMobilePrTitleAction": {
+ "failed": "제목을 업데이트하지 못했습니다.",
+ "not": "데스크톱에 연결되지 않았습니다."
+ },
+ "useMobileTerminalPaste": {
+ "pasteFailed": "붙여넣기 실패",
+ "image": "붙여넣기에는 이미지가 너무 큽니다.",
+ "pasteFailedDisconnected": "붙여넣기 실패(연결 끊김)",
+ "pasteToo": "붙여넣기가 너무 큼(최대 256KiB)",
+ "failed": "크기가 조정된 클립보드 이미지를 인코딩하지 못했습니다."
+ },
+ "useQuickCommands": {
+ "failedLoad": "빠른 명령을 로드하지 못했습니다.",
+ "failedSave": "빠른 명령을 저장하지 못했습니다."
+ },
+ "mobileDiffReviewScreenModel": {
+ "all": "모두",
+ "unstaged": "스테이징되지 않음",
+ "staged": "스테이징됨",
+ "branch": "브랜치",
+ "unsent": "보내지 않은 메모 {{unsentCount}}개",
+ "noteCountNote": "메모 {{noteCount}}개",
+ "noteCountNotes": "메모 {{noteCount}}개",
+ "unreviewed": "검토 안 됨",
+ "notes": "메모"
+ },
+ "mobileTerminalLiveInputStatus": {
+ "live": "실시간 입력",
+ "starting": "마이크 시작 중",
+ "processing": "처리",
+ "listening": "청취",
+ "tapShow": "키보드를 표시하려면 탭하세요.",
+ "uploading": "호스트에 이미지 업로드 중",
+ "preparing": "마이크 준비 중",
+ "transcribing": "데스크톱에서 스크립트 작성",
+ "tapMic": "중지하려면 마이크를 탭하세요."
+ },
+ "mobileNativeChatRenderData": {
+ "agent": "에이전트"
+ },
+ "useMobileDiffReviewInteractions": {
+ "unable": "세션에서 열 수 없습니다."
+ },
+ "mobileTerminalTabAgent": {
+ "file": "파일",
+ "browser": "브라우저",
+ "new": "새 브라우저"
+ },
+ "worktreeLabel": {
+ "worktree": "워크트리"
+ },
+ "floatingWorkspace": {
+ "floating": "플로팅 워크스페이스"
+ },
+ "githubPrRpc": {
+ "request": "요청 실패: {{requestMethod}}"
+ },
+ "mobileNativeChatStreamFrame": {
+ "transcript": "스크립트 스트림 실패"
+ },
+ "mobileNativeChatToggleAction": {
+ "switchChat": "채팅 보기로 전환",
+ "switchTerminal": "terminal 보기로 전환"
+ },
+ "mobileNativeChatPermissionSend": {
+ "responseNotSent": "응답이 전송되지 않았습니다.",
+ "responseUnconfirmed": "응답이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
+ "responseNotSentDisconnected": "응답이 전송되지 않음(연결 끊김)"
+ },
+ "mobilePrSidebarState": {
+ "unable": "PR을 로드할 수 없습니다."
+ },
+ "mobileSessionRouteHelpers": {
+ "pairing": "페어링이 잘못되었습니다.",
+ "reconnecting": "다시 연결 중",
+ "disconnected": "연결 끊김",
+ "connected": "연결됨",
+ "securing": "보안",
+ "connecting": "연결 중"
+ },
+ "useMobileNativeChatAnswerSend": {
+ "answerNotSent": "답변이 전송되지 않았습니다.",
+ "answerUnconfirmed": "답변이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
+ "answerPartly": "답변이 부분적으로 전송되었습니다. 다시 시도하기 전에 채팅을 확인하세요.",
+ "answerNotSentDisconnected": "답변이 전송되지 않음(연결이 끊김)"
+ },
+ "useMobileNativeChatCancelAsk": {
+ "cancelNotSent": "취소가 전송되지 않았습니다.",
+ "cancelUnconfirmed": "확인되지 않은 취소 - 다시 시도하기 전에 채팅을 확인하세요.",
+ "cancelNotSentDisconnected": "취소가 전송되지 않음(연결이 끊김)"
+ },
+ "useMobileNativeChatMessageSend": {
+ "messageNotSent": "메시지가 전송되지 않았습니다.",
+ "delivery": "배송이 확인되지 않았습니다. 다시 시도하기 전에 채팅을 확인하세요.",
+ "messageNotSentDisconnected": "메시지가 전송되지 않음(연결이 끊김)"
+ },
+ "useMobileNativeChatStop": {
+ "stopNotSent": "중지가 전송되지 않았습니다.",
+ "stopUnconfirmed": "확인되지 않은 중지 - 다시 시도하기 전에 채팅을 확인하세요.",
+ "stopNotSentTerminal": "중지가 전송되지 않음(terminal이 준비되지 않음)"
+ },
+ "aiVaultResumeLaunch": {
+ "terminal": "Terminal 입력이 잠겨 있습니다.",
+ "failedSend": "재개 명령을 보내지 못했습니다.",
+ "created": "생성된 terminal 응답이 잘못되었습니다.",
+ "failedCreate": "terminal을 생성하지 못했습니다."
+ },
+ "aiVaultResumePreparation": {
+ "could": "이 레거시 Codex 세션을 준비할 수 없습니다. 이력서를 다시 시도하세요."
+ },
+ "mobileClipboardImage": {
+ "clipboard": "클립보드 이미지 콘텐츠는 base64여야 합니다."
+ },
+ "prAiTriageLaunch": {
+ "terminal": "Terminal 입력이 잠겨 있습니다.",
+ "failedSend": "메시지를 보내지 못했습니다.",
+ "created": "생성된 terminal 응답이 잘못되었습니다.",
+ "failedCreate": "terminal을 생성하지 못했습니다."
+ },
+ "voiceModelList": {
+ "delete": "{{commandLabel}} 삭제",
+ "useMessage": "사용",
+ "use": "사용 중",
+ "set": "데스크톱에서 설정",
+ "api": "API 키 세트",
+ "recommended": "권장"
+ },
+ "authFailedBanner": {
+ "remove": "제거",
+ "re": "수리하다",
+ "retry": "다시 시도",
+ "authentication": "인증 실패 — 먼저 다시 연결해 보십시오. 계속 실패하면 데스크톱에서 다시 페어링하세요."
+ },
+ "codexResetCreditAction": {
+ "useReset": "재설정 사용",
+ "resetting": "재설정 중…",
+ "usesOneEarnedResetActive": "활성 Codex 계정에 대해 한 번의 재설정을 사용합니다.",
+ "usesOneEarnedResetScope": "{{scopeLabel}}에 대해 1회 획득한 재설정을 사용합니다.",
+ "useCodex": "Codex 비율 제한 재설정 사용",
+ "resettingCodex": "Codex 속도 제한 재설정",
+ "earned": "Codex 비율 제한 재설정을 획득했습니다."
+ },
+ "customKeyModal": {
+ "addShortcut": "바로가기 추가",
+ "press": "Enter 키를 누르세요",
+ "command": "명령",
+ "label": "레이블",
+ "add": "추가",
+ "more": "추가 키 — 탭, 화살표, F1~F12…",
+ "key": "키",
+ "modifiers": "수정자",
+ "show": "바로가기 키 표시, 숨기기 또는 재정렬",
+ "manage": "바로가기 관리",
+ "send": "사용자 정의 텍스트 명령 보내기",
+ "text": "텍스트 매크로",
+ "build": "Ctrl, Alt, Shift 키 코드 만들기",
+ "shortcut": "바로가기 콤보",
+ "back": "뒤로",
+ "function": "기능",
+ "navigation": "탐색",
+ "editing": "편집",
+ "eGPnpm": "예: pnpm build",
+ "eGBuild": "예를 들어 짓다",
+ "pick": "키를 선택하세요"
+ },
+ "dragReorderList": {
+ "moveDown": "아래로 이동",
+ "moveUp": "위로 이동",
+ "use": "드래그하지 않고 순서를 변경하려면 위로 이동 및 아래로 이동 작업을 사용하세요.",
+ "drag": "드래그하여 재정렬하세요."
+ },
+ "hostProtocolGate": {
+ "checking": "호스트 호환성 확인",
+ "use": "useHostProtocolGates는 내부에서 사용해야 합니다."
+ },
+ "mobileDictationSetupSheet": {
+ "download": "다운로드",
+ "useMessage": "사용",
+ "use": "사용 중",
+ "setUpDesktop": "데스크톱에서 설정",
+ "api": "API 키 세트",
+ "extracting": "· 추출 중…",
+ "open": "오픈AI API",
+ "recommended": "권장",
+ "dictation": "받아쓰기 활성화됨",
+ "setupInstructions": "모델을 다운로드하고 데스크톱에서 받아쓰기를 활성화하세요. 모두 여기에서 가능합니다.",
+ "setUpVoice": "음성 받아쓰기 설정",
+ "couldNotUpdate": "업데이트할 수 없습니다.",
+ "couldNotSelect": "모델을 선택할 수 없습니다",
+ "failed": "로드하지 못했습니다."
+ },
+ "mobileDiffReviewBody": {
+ "retry": "다시 시도",
+ "retryLoading": "리뷰 로드를 다시 시도하세요.",
+ "diffTruncated": "모바일 미리보기에서는 차이가 잘렸습니다.",
+ "loadingDiff": "차이점 로드 중...",
+ "try": "다른 리뷰 필터를 사용해 보세요.",
+ "no": "검토 가능한 변경사항 없음",
+ "unable": "리뷰를 로드할 수 없습니다.",
+ "review": "검토할 수 없음",
+ "loadingReview": "리뷰 로드 중...",
+ "diffUnavailable": "차이점을 사용할 수 없음",
+ "deleted": "삭제된 파일",
+ "diffTooLarge": "차이가 너무 큼",
+ "binary": "바이너리 차이",
+ "select": "검토할 파일을 선택하세요.",
+ "fileDeleted": "이 파일은 삭제되었습니다. 파일 메모를 추가하거나 검토한 것으로 표시하세요.",
+ "diffTooLargeMobile": "이 차이는 모바일 미리보기에 비해 너무 큽니다.",
+ "fileCannot": "이 파일은 모바일에서 텍스트로 렌더링될 수 없습니다."
+ },
+ "mobileDiffReviewDrawers": {
+ "sendNotes": "메모 보내기",
+ "sendNotesAgent": "agent에게 메모 보내기",
+ "stageReviewed": "검토된 단계",
+ "stageReviewedFilesAccessibility": "검토된 파일 스테이지",
+ "reviewComplete": "검토 완료",
+ "save": "저장",
+ "delete": "삭제",
+ "deleteNote": "메모 삭제",
+ "reviewNote": "리뷰 노트",
+ "cancel": "메모 취소",
+ "file": "파일 노트",
+ "line": "라인 {{lineNumber}}",
+ "add": "메모 추가",
+ "edit": "메모 편집",
+ "open": "세션에서 열기",
+ "mark": "검토되지 않은 것으로 표시",
+ "stageReviewedFiles": "단계 검토 파일",
+ "clear": "보낸 메모 지우기",
+ "sendUnsent": "보내지 않은 메모 보내기",
+ "copy": "메모 복사",
+ "new": "신규 Agent 세션",
+ "discardChanges": "'{{filePath}}'에 대한 변경사항을 취소하시겠습니까? 이 작업은 취소할 수 없습니다.",
+ "discardFile": "파일 삭제",
+ "reviewedFileCountReviewed": "{{reviewedFileCount}} 검토된 스테이지되지 않은 파일을 스테이지할 수 있음",
+ "reviewActions": "검토 작업",
+ "saveNote": "{{lineNumber}} 라인에 메모 저장",
+ "unsent": "{{unsentCommentCount}} 보내지 않은 메모",
+ "loading": "agent 세션 로드 중...",
+ "reviewedFileCountFileReviewedNoteCountNote": "{{reviewedFileCount}} 파일이 검토됨, {{noteCount}} 메모",
+ "reviewedFileCountFileReviewedNoteCountNotes": "{{reviewedFileCount}} 파일 검토됨, {{noteCount}} 메모",
+ "reviewedFileCountFilesReviewedNoteCountNote": "{{reviewedFileCount}} 파일 검토됨, {{noteCount}} 메모",
+ "reviewedFileCountFilesReviewedNoteCountNotes": "{{reviewedFileCount}}개 파일이 검토됨, {{noteCount}}개 메모",
+ "discard": "버리기"
+ },
+ "mobileDiffReviewFileSummary": {
+ "hunk": "큰 덩어리",
+ "next": "다음 덩어리",
+ "previous": "이전 덩어리",
+ "stale": "탁한",
+ "edit": "파일 메모 편집",
+ "changed": "변경됨",
+ "reviewed": "검토됨",
+ "old": "{{oldPath}}에서",
+ "staleNote": "{{staleNoteCount}} 오래됨"
+ },
+ "mobileDiffReviewFooter": {
+ "next": "다음 파일",
+ "markReviewed": "마크가 검토됨",
+ "reviewed": "검토됨",
+ "markFile": "파일을 검토한 것으로 표시",
+ "note": "메모",
+ "add": "파일 메모 추가",
+ "previous": "이전 파일",
+ "discard": "버리기",
+ "discardFile": "파일 삭제",
+ "unstage": "언스테이지",
+ "unstageFile": "언스테이지 파일",
+ "stage": "스테이지",
+ "stageFile": "파일 스테이징"
+ },
+ "mobileDiffReviewHeader": {
+ "show": "{{mobileReviewFilterLabel}} 리뷰 파일 표시",
+ "openReview": "검토 작업 열기",
+ "openPull": "PR 사이드바 열기",
+ "changes": "변경 사항",
+ "back": "뒤로",
+ "reviewed": "{{reviewedCount}}/{{queueLength}}이(가) 검토됨"
+ },
+ "mobileDiffReviewLine": {
+ "edit": "{{lineNumber}}행에서 메모 수정",
+ "add": "{{newLineNumber}}행에 메모 추가",
+ "context": "문맥",
+ "deleted": "삭제됨",
+ "added": "추가됨",
+ "lineLabelLineLine": "{{lineLabel}} 라인 {{lineNumber}}",
+ "lineLabelLine": "{{lineLabel}} 라인"
+ },
+ "mobileHostCard": {
+ "update": "데스크톱 Orca를 업데이트하고 로그인하여 어디서나 연결하세요",
+ "worktreeCountWorktree": "{{worktreeCount}} 작업 트리",
+ "worktreeCountWorktrees": "워크트리 {{worktreeCount}}개",
+ "active": "{{activeWorktreeCount}} 활성"
+ },
+ "mobileHtmlPreview": {
+ "source": "소스",
+ "view": "HTML 소스 보기",
+ "preview": "미리보기",
+ "previewRendered": "렌더링된 HTML 미리보기"
+ },
+ "mobileMarkdown": {
+ "x": "[엑스]",
+ "hiddenColumn": "{{hiddenColumnCount}}개 열 더보기",
+ "hiddenRow": "{{hiddenRowCount}} 행 추가",
+ "open": "이미지 열기",
+ "image": "영상"
+ },
+ "mobilePrsidebar": {
+ "retry": "다시 시도",
+ "retryLoading": "PR 로드 재시도",
+ "loading": "PR 로드 중…",
+ "not": "허용되지 않음 - GitHub 계정이 연결되어 있지 않습니다.",
+ "something": "문제가 발생했습니다."
+ },
+ "mobileRichMarkdownEditor": {
+ "code": "코드 블록",
+ "inline": "인라인 코드",
+ "image": "이미지",
+ "link": "링크",
+ "quote": "인용",
+ "checklist": "체크리스트",
+ "numbered": "번호가 매겨진 목록",
+ "bullet": "글머리 기호 목록",
+ "strike": "취소선",
+ "italic": "기울임",
+ "bold": "굵게",
+ "body": "몸"
+ },
+ "mobileWorkspaceNameInput": {
+ "workspace": "워크스페이스 이름"
+ },
+ "newWorkspaceFab": {
+ "new": "새로운 워크스페이스"
+ },
+ "newWorktreeModal": {
+ "repository": "리포지토리",
+ "create": "워크스페이스 만들기",
+ "connectRepository": "저장소 연결",
+ "runSetup": "설정 명령 실행",
+ "skip": "건너뛰기",
+ "run": "실행",
+ "setup": "설정 스크립트",
+ "note": "메모",
+ "advanced": "고급",
+ "connectRepositoryFirst": "먼저 저장소를 연결하세요",
+ "connect": "연결",
+ "connecting": "연결 중...",
+ "ssh": "SSH 연결",
+ "workspace": "워크스페이스 이름",
+ "name": "이름 또는 '다음에서 만들기'",
+ "no": "저장소를 찾을 수 없습니다.",
+ "pick": "새 워크스페이스를 가동하려면 저장소와 agent를 선택하세요.",
+ "failedTrust": "설정 스크립트를 신뢰하지 못했습니다.",
+ "failedCreate": "워크스페이스를 생성하지 못했습니다.",
+ "choose": "설정 스크립트를 실행할지 여부를 선택합니다.",
+ "selected": "선택한 agent가 비활성화되었습니다. 생성하기 전에 활성화된 agent를 선택하세요.",
+ "write": "메모 쓰기",
+ "remote": "원격 저장소",
+ "select": "저장소 선택",
+ "failedConnect": "SSH 저장소에 연결하지 못했습니다.",
+ "failedRead": "SSH 연결 상태를 읽지 못했습니다.",
+ "connectDisplay": "워크스페이스를 만들기 전에 {{displayName}}을(를) 연결하세요."
+ },
+ "protocolBlockScreen": {
+ "back": "호스트로 돌아가기",
+ "openGit": "GitHub 릴리스 열기",
+ "openApp": "앱 스토어 열기",
+ "updateOrcaYour": "컴퓨터에서 Orca를 업데이트하세요.",
+ "updateOrcaMobile": "Orca 모바일 업데이트"
+ },
+ "setupHookTrustDrawer": {
+ "do": "실행 안 함",
+ "always": "항상 믿고 달려가세요",
+ "runHooks": "후크 실행",
+ "setup": "설정 스크립트",
+ "new": "새로운 설정 스크립트",
+ "repositorys": "이 저장소의 orca.yaml은 워크스페이스가 시작되기 전에 실행됩니다. 이 저장소를 신뢰하는 경우에만 실행하세요.",
+ "runSetup": "{{repoName}}에서 설정을 실행하시겠습니까?",
+ "repo": "{{repoName}}의 설정 스크립트가 변경되었습니다."
+ },
+ "smartWorkspaceAdvancedFields": {
+ "derived": "이름에서 파생됨",
+ "branch": "브랜치 이름",
+ "workspace": "워크스페이스 이름",
+ "name": "이름",
+ "reuse": "“{{reuseEligibleBranch}}” 브랜치 재사용"
+ },
+ "smartWorkspaceSourceDrawer": {
+ "typeName": "이름을 입력하거나 출처를 검색하세요.",
+ "typeWorkspace": "아래 필드에 워크스페이스 이름을 입력하세요.",
+ "ssh": "이 SSH repo에는 문제와 PR을 나열하려면 GitHub 원격이 필요합니다.",
+ "connect": "저장소를 검색 소스에 연결합니다.",
+ "cancel": "취소",
+ "done": "완료",
+ "name": "이름 또는 '다음에서 만들기'",
+ "item": "이 항목은 {{owner}}/ {{repo}}에 있습니다.",
+ "switch": "{{displayName}}(으)로 전환",
+ "no": "검색된 결과가 없습니다."
+ },
+ "smartWorkspaceSourceField": {
+ "type": "이름을 입력하거나 출처를 검색하세요.",
+ "optional": "[선택 사항]"
+ },
+ "smartWorkspaceSourceRow": {
+ "new": "새로운 브랜치",
+ "create": "\"{{rowName}}\" 브랜치 생성",
+ "name": "이 워크스페이스의 이름을 지정하세요.",
+ "use": "\"{{rowName}}\"을(를) 사용하세요",
+ "issue": "이슈 #",
+ "pr": "PR 번호"
+ },
+ "terminalShortcutSettings": {
+ "create": "키 콤보 또는 텍스트 매크로 만들기",
+ "add": "사용자 정의 바로가기 추가…",
+ "no": "아직 정의된 맞춤 단축키가 없습니다.",
+ "custom": "맞춤 단축키",
+ "show": "모든 내장 단축키를 원래 순서대로 표시",
+ "reset": "기본값 재설정",
+ "toggle": "키를 표시하거나 숨기려면 키를 전환하고, terminal 바로가기 표시줄에서 원하는 순서로 키를 드래그하려면 그립을 누르세요.",
+ "shortcut": "바로가기 바"
+ },
+ "textInputModal": {
+ "cancel": "취소",
+ "save": "저장"
+ },
+ "workspaceDetailPlaceholder": {
+ "pick": "사이드바에서 워크스페이스를 선택하여 여기에서 terminal을 엽니다.",
+ "no": "열려 있는 워크스페이스가 없습니다."
+ },
+ "worktreeListRow": {
+ "child": "하위",
+ "folder": "폴더"
+ },
+ "accountsSnapshot": {
+ "inactiveCodex": "비활성 Codex 제한이 잘못된 공급자 ID를 사용합니다.",
+ "inactiveClaude": "비활성 Claude 한도가 잘못된 공급자 ID를 사용함",
+ "codex": "Codex 제한이 잘못된 공급자 ID를 사용합니다.",
+ "claude": "Claude 제한이 잘못된 공급자 ID를 사용함",
+ "wslCodex": "WSL Codex 계정에는 정확한 배포판이 필요합니다.",
+ "hostCodex": "Host Codex 계정은 WSL 배포판의 이름을 지정할 수 없습니다.",
+ "wslRate": "WSL 비율 제한 목표에는 정확한 배포판이 필요합니다.",
+ "hostRate": "호스트 속도 제한 대상은 WSL 배포판의 이름을 지정할 수 없습니다.",
+ "invalid": "호스트의 잘못된 계정 스냅샷"
+ },
+ "codexResetCredit": {
+ "account": "이 계정에는 사용 가능한 재설정 크레딧이 없습니다.",
+ "noReset": "재설정 불가",
+ "noEligible": "적합한 Codex 속도 제한 기간이 소진되지 않습니다.",
+ "nothing": "재설정할 항목이 없습니다.",
+ "codex": "Codex 사용법이 새로 고쳐졌습니다.",
+ "resetAlready": "재설정이 이미 적용되었습니다.",
+ "rate": "비율 제한 재설정",
+ "resetCountResets": "재설정 {{resetCount}}회 사용 가능",
+ "resetCountReset": "재설정 {{resetCount}}회 사용 가능",
+ "expiresNow": "지금 만료",
+ "expiresDuration": "{{duration}} 후 만료",
+ "nextExpiresNow": "다음 항목이 지금 만료",
+ "nextExpiresDuration": "다음 만료까지 {{duration}}",
+ "invalid": "호스트의 잘못된 재설정 응답"
+ },
+ "mountedBottomDrawer": {
+ "dismiss": "창 닫기"
+ },
+ "newWorktreeAgentSelection": {
+ "blank": "빈 Terminal"
+ },
+ "useCodexResetCreditAction": {
+ "spends": "이렇게 하면 {{confirmedLabel}}에 대해 1번의 재설정이 소비되고 적격 속도 제한 기간이 즉시 재설정됩니다.",
+ "useRate": "속도 제한 재설정을 사용하시겠습니까?",
+ "could": "속도 제한을 재설정할 수 없습니다.",
+ "account": "호스트가 Codex에 연락하기 전에 계정 또는 재설정 제안이 변경되었습니다. 업데이트된 세부정보를 검토한 후 다시 확인하세요.{{cleanupWarning}}",
+ "reset": "재설정 세부정보가 변경됨",
+ "useReset": "재설정 사용",
+ "cancel": "취소",
+ "host": "호스트가 이 시도를 확인했지만 이 전화기는 재시도 기록을 지울 수 없습니다. 나중에 재시도하면 동일한 안전 작업 ID가 재사용됩니다.",
+ "phone": "이 휴대전화에서는 삭제된 재시도 기록을 삭제할 수 없습니다. 다시 시도하는 것은 안전하지만 이 계정에 대한 새로운 재설정을 확인하려면 먼저 기록을 지워야 합니다.",
+ "identityWsl": "WSL의 {{identity}} {{wslDistro}}",
+ "identityHost": "호스트의 {{identity}}"
+ },
+ "mobileLinkPrForm": {
+ "linkPull": "링크 PR",
+ "linkLinked": "링크 #{{linkedItemNumber}}",
+ "pull": "#123 또는 https://github.com/owner/repo/pull/123",
+ "pr": "PR 번호 또는 GitHub URL",
+ "cancel": "취소",
+ "linkExisting": "기존 PR 연결"
+ },
+ "mobilePrComposeForm": {
+ "createReview": "{{reviewType}} 만들기",
+ "createDraftReview": "초안 {{reviewType}} 만들기",
+ "pushCreateReview": "{{reviewType}} 푸시 및 생성",
+ "pushCreateDraft": "초안 푸시 및 생성 {{reviewType}}",
+ "createDraft": "초안으로 만들기",
+ "base": "베이스",
+ "generatingTitle": "제목 및 설명 생성 중…",
+ "reviewTypeDescription": "{{reviewType}} 설명",
+ "description": "설명(선택사항)",
+ "reviewTypeTitle": "{{reviewType}} 제목",
+ "title": "제목",
+ "cancel": "취소",
+ "generate": "생성",
+ "generating": "생성 중…",
+ "failed": "PR 필드를 생성하지 못했습니다.",
+ "new": "새 {{reviewType}}",
+ "generateReview": "AI로 {{reviewType}} 세부정보 생성"
+ },
+ "mobilePrViewPanel": {
+ "current": "현재 브랜치을 사용할 수 없습니다.",
+ "hosted": "이 제공업체에서는 호스팅 PR 패널을 사용할 수 없습니다."
+ },
+ "practionsSection": {
+ "unlink": "풀리다",
+ "unlinkPull": "PR 연결 해제",
+ "reopenPullRequestAccessibility": "PR 다시 열기",
+ "closePullRequestAccessibility": "PR 닫기",
+ "off": "끄기",
+ "on": "켜짐",
+ "toggle": "자동 병합 전환",
+ "auto": "준비되면 자동 병합",
+ "mergePullRequestAccessibility": "PR 병합",
+ "pullRequestNumberWillReopened": "#{{pullRequestNumber}}이(가) 다시 열립니다.",
+ "reopenPullRequest": "PR을 다시 열까요?",
+ "pullRequestNumberWillClosed": "#{{pullRequestNumber}}은(는) 병합되지 않고 폐쇄됩니다.",
+ "closePullRequest": "PR을 닫으시겠어요?",
+ "will": "그러면 #{{pullRequestNumber}}이 기본 브랜치로 병합됩니다.",
+ "mergePullRequest": "PR을 병합하시겠습니까?",
+ "failed": "PR 연결을 해제하지 못했습니다.",
+ "merge": "병합"
+ },
+ "prcheckDetail": {
+ "showingFirst100": "처음 100개 작업 표시",
+ "showingFirst20": "처음 20개의 주석 표시 중",
+ "annotations": "주석",
+ "no": "세부정보가 없습니다."
+ },
+ "prchecksSection": {
+ "open": "웹에서 {{checkName}} 열기",
+ "check": "{{checkName}} 세부정보 확인",
+ "fix": "수정",
+ "fixFailing": "AI로 실패한 검사 수정",
+ "inspect": "세부 정보를 검사하거나 AI 수정 패스를 시작하세요.",
+ "rerun": "실패한 검사 다시 실행",
+ "checks": "체크",
+ "failingCheckCountFailingCheck": "{{failingCheckCount}} 확인 실패",
+ "failingCheckCountFailingChecks": "{{failingCheckCount}} 검사 실패",
+ "failed": "수표 세부정보를 로드하지 못했습니다."
+ },
+ "prcommentCard": {
+ "permanently": "GitHub의 댓글이 영구적으로 삭제됩니다.",
+ "deleteCommentTitle": "댓글을 삭제하시겠습니까?",
+ "write": "답장을 쓰세요…",
+ "resolve": "해결",
+ "unresolve": "해결 취소",
+ "resolveThread": "스레드 해결",
+ "unresolveThread": "스레드 해결 취소",
+ "delete": "삭제",
+ "deleteComment": "댓글 삭제",
+ "edit": "편집",
+ "editCommentAccessibility": "댓글 수정",
+ "reply": "회신",
+ "replyComment": "댓글에 답장하기",
+ "editComment": "댓글 수정…",
+ "resolved": "해결됨",
+ "save": "저장"
+ },
+ "prcommentComposer": {
+ "cancel": "취소"
+ },
+ "prcommentsSection": {
+ "add": "댓글 추가…",
+ "noComments": "아직 댓글이 없습니다.",
+ "couldNotLoadComments": "댓글을 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
+ "comments": "댓글",
+ "noDescription": "설명이 제공되지 않았습니다.",
+ "couldNotLoadDescription": "설명을 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
+ "description": "설명",
+ "showVisible": "전체 {{remaining}}개 중 {{visibleCommentCount}}개 더 보기",
+ "showRemaining": "{{remainingCommentCount}}개 더 보기",
+ "resolvedThreadAuthor": "{{author}}님이 해결한 스레드",
+ "resolvedThreadAuthorReply": "{{author}}({{replyCount}})에 의해 해결된 스레드",
+ "resolvedCommentAuthor": "{{author}}님의 댓글이 해결되었습니다.",
+ "resolvedCommentAuthorReply": "{{author}}({{replyCount}})님의 댓글이 해결되었습니다.",
+ "comment": "댓글"
+ },
+ "prconflictingFilesSection": {
+ "resolve": "AI로 충돌 해결",
+ "conflicting": "충돌하는 파일",
+ "copied": "복사됨",
+ "copyMergeability": "병합 가능성 새로 고침 명령 복사",
+ "run": "이 워크트리에서 실행",
+ "branch": "이 브랜치에는 해결해야 할 충돌이 있습니다.",
+ "commitsBehindCommits": "{{commitsBehind}}개 커밋 뒤처짐 (기준 커밋:",
+ "commitsBehindCommit": "{{commitsBehind}}개 커밋 뒤처짐 (기준 커밋:",
+ "conflicts": "충돌"
+ },
+ "prreviewersSection": {
+ "remove": "{{login}} 제거",
+ "no": "요청된 리뷰어가 없습니다.",
+ "could": "리뷰어를 로드할 수 없습니다. 다시 시도하려면 새로고침을 탭하세요.",
+ "loading": "리뷰어 로드 중…",
+ "reviewers": "리뷰어",
+ "add": "리뷰어 추가 또는 제거"
+ },
+ "prsidebarHeader": {
+ "edit": "PR 제목 편집",
+ "save": "저장",
+ "saveTitle": "제목 저장",
+ "cancel": "취소",
+ "cancelEditing": "제목 수정 취소",
+ "open": "웹에서 PR #{{pullRequestNumber}} 열기"
+ },
+ "prSidebarCreateEmptyState": {
+ "linkExistingPr": "기존 PR 연결",
+ "linkExistingPull": "기존 PR 연결",
+ "current": "현재 브랜치는 공개 PR에 연결되어 있지 않습니다.",
+ "git": "{{gitBranch}}은(는) 공개 PR에 연결되어 있지 않습니다.",
+ "refreshCheck": "새로고침하여 다시 확인하거나 이 브랜치에 대한 새 PR을 생성하세요.",
+ "no": "공개 PR이 없습니다.",
+ "linked": "연결된 PR #{{pullRequestNumber}}을(를) 사용할 수 없습니다.",
+ "createPr": "PR 생성",
+ "createPull": "PR 생성",
+ "refreshPull": "PR 새로 고침",
+ "pull": "PR",
+ "failed": "PR을 생성하지 못했습니다.",
+ "check": "PR을 생성하기 전에 브랜치를 확인하세요."
+ },
+ "reviewerPickerDrawer": {
+ "no": "일치하는 사용자가 없습니다.",
+ "search": "사람 검색",
+ "reviewers": "리뷰어",
+ "failed": "사용자를 로드하지 못했습니다."
+ },
+ "prChecksPresentation": {
+ "reviewed": "검토됨",
+ "pending": "대기 중",
+ "dismissed": "해고됨",
+ "commented": "댓글이 달림",
+ "changes": "변경 요청됨",
+ "approved": "승인됨",
+ "no": "체크 없음",
+ "skipped": "건너뜀",
+ "neutral": "중립",
+ "timed": "시간 초과",
+ "cancelled": "취소됨",
+ "failed": "실패",
+ "successful": "성공적인",
+ "progress": "진행중",
+ "requested": "요청됨",
+ "closed": "닫힘",
+ "draft": "초안",
+ "merged": "병합됨",
+ "open": "열기"
+ },
+ "prCommentAudience": {
+ "bots": "봇",
+ "humans": "사람",
+ "all": "모두",
+ "noComments": "아직 댓글이 없습니다.",
+ "noHuman": "사람 댓글이 없습니다.",
+ "noBot": "봇 댓글이 없습니다."
+ },
+ "markdownBlocks": {
+ "details": "세부정보"
+ },
+ "prCheckDetailContent": {
+ "jobs": "작업",
+ "failed": "실패한 작업"
+ },
+ "prCommentTime": {
+ "years": "{{years}}년 전",
+ "months": "{{months}}개월 전",
+ "days": "{{days}}일 전",
+ "hours": "{{hours}}시간 전",
+ "minutes": "{{minutes}}분 전",
+ "just": "방금 전"
+ },
+ "confirmModal": {
+ "cancel": "취소",
+ "confirm": "확인"
+ },
+ "mobileSearchField": {
+ "clear": "검색 지우기"
+ },
+ "mobileOnboardingPage": {
+ "skip": "지금은 알림 건너뛰기",
+ "not": "나중에",
+ "enableAgent": "agent 알림 활성화",
+ "enableNotifications": "알림 활성화",
+ "openSessionsTerminal": "terminal에서 세션 열기",
+ "keep": "terminal 유지",
+ "openSessionsChat": "Chat UI에서 세션 열기",
+ "use": "채팅 UI 사용",
+ "get": "agent이 귀하의 입력을 필요로 하거나 작업을 완료하면 이 장치에서 알림을 받습니다.",
+ "choose": "지원되는 agent 세션이 이 장치의 terminal 또는 Chat UI에서 열릴지 선택합니다. 세션 탭을 길게 눌러 보기를 전환하거나 나중에 설정에서 기본값을 변경하세요.",
+ "stay": "자리를 비운 동안에도 최신 소식을 받아보세요",
+ "how": "세션은 어떻게 열리나요?"
+ },
+ "mobileFileExplorerPanel": {
+ "no": "파일을 찾을 수 없습니다",
+ "retry": "다시 시도",
+ "showing": "- 처음 5000개 표시",
+ "files": "파일",
+ "back": "세션으로 돌아가기",
+ "close": "파일 닫기",
+ "unable": "파일을 로드할 수 없습니다.",
+ "waiting": "데스크톱을 기다리는 중...",
+ "connecting": "데스크톱에 연결하는 중..."
+ },
+ "mobileFileMarkdownPreview": {
+ "viewRendered": "렌더링된 Markdown 미리보기 보기",
+ "viewMarkdown": "Markdown 소스 보기"
+ },
+ "mobileFilePreviewBody": {
+ "title": "{{title}} 이미지",
+ "empty": "빈 파일",
+ "retry": "다시 시도"
+ },
+ "mobileFilePreviewEditableSource": {
+ "title": "{{title}} 편집자"
+ },
+ "mobileFilePreviewScreen": {
+ "unableLoad": "미리보기를 로드할 수 없습니다.",
+ "save": "terminal 아티팩트 저장",
+ "back": "파일로 돌아가기",
+ "unsaved": "저장되지 않은 수정사항은 손실됩니다.",
+ "discardChanges": "변경사항을 삭제하시겠습니까?",
+ "loading": "미리보기 로드 중...",
+ "waiting": "데스크톱을 기다리는 중...",
+ "file": "파일",
+ "preview": "미리보기",
+ "discard": "버리기",
+ "stay": "머무르다",
+ "unableSave": "파일을 저장할 수 없습니다."
+ },
+ "mobileFilePreviewSourceText": {
+ "file": "파일 미리보기",
+ "preview": "미리보기가 잘렸습니다. 파일 크기: {{formatPreviewByteLength}}."
+ },
+ "mobileFileExplorerRow": {
+ "unavailable": "모바일에서는 사용할 수 없습니다.",
+ "preview": "미리보기 파일 {{itemName}}",
+ "item": "{{itemName}}은 모바일에서 사용할 수 없습니다.",
+ "open": "{{itemName}} 폴더 열기",
+ "retry": "다시 시도",
+ "retryLoading": "{{relativePath}} 로드를 다시 시도하세요.",
+ "loading": "로드 중...",
+ "unable": "폴더를 로드할 수 없습니다."
+ },
+ "mobileFilePreviewRequest": {
+ "file": "데스크탑에서 파일이 변경되었습니다. 저장하기 전에 미리보기를 다시 로드하세요."
+ },
+ "mobileFilePreviewResponse": {
+ "unableLoad": "미리보기를 로드할 수 없습니다.",
+ "fileNot": "파일을 찾을 수 없습니다",
+ "unableReach": "데스크톱 파일 시스템에 연결할 수 없습니다.",
+ "reload": "저장하기 전에 미리보기를 다시 로드하세요.",
+ "fileToo": "모바일 미리보기에 파일이 너무 큽니다.",
+ "binary": "바이너리 미리보기를 사용할 수 없습니다."
+ },
+ "mobileFilePreviewRoute": {
+ "unable": "미리보기를 로드할 수 없습니다."
+ },
+ "mobileFileMutationOwnership": {
+ "could": "SSH 연결을 확인할 수 없습니다. 호스트를 다시 연결하고 다시 시도하세요."
+ },
+ "troubleshootCommonIssues": {
+ "other": "기타 VPN 간섭",
+ "tailscale": "Tailscale 호스트에 연결할 수 없음",
+ "connection": "연결 시간 초과",
+ "desktop": "데스크탑 앱이 실행되지 않음",
+ "firewall": "방화벽 차단 포트 6768",
+ "different": "다양한 WiFi 네트워크",
+ "disable": "해당 VPN을 비활성화하거나 분할 터널링 / \"LAN 허용\"을 활성화하십시오.",
+ "non": "Tailscale이 아닌 VPN은 원격 서버를 통해 로컬 트래픽을 라우팅할 수 있습니다.",
+ "update": "Tailscale 앱을 업데이트하세요. 최근 릴리스에서는 재연결 버그가 수정되었습니다.",
+ "checkDesktop": "데스크탑이 활성화되어 있고 tailnet에 연결된 것으로 표시되는지 확인하십시오.",
+ "i": "iOS/Android는 터널을 자동으로 고정할 수 있습니다. Tailscale 앱에서 Tailscale을 껐다가 다시 켭니다.",
+ "host": "100.x.x.x 또는 *.ts.net과 같은 호스트 주소는 Tailscale을 통해 연결됩니다. 이를 ON으로 유지하세요.",
+ "restart": "시간 초과가 지속되면 두 앱을 모두 다시 시작하세요.",
+ "go": "호스트 목록으로 돌아가서 호스트를 탭하여 다시 시도하세요.",
+ "checkWi": "휴대폰에서 WiFi 신호 강도를 확인하세요.",
+ "after": "업데이트 후에는 QR 코드를 통해 다시 페어링해야 할 수도 있습니다.",
+ "tryRestarting": "Orca를 다시 시작해 보세요. 실행 시 컴패니언 서버가 시작됩니다.",
+ "orca": "연결을 수락하려면 데스크톱에서 Orca를 열어야 합니다.",
+ "corporate": "회사/학교 네트워크는 P2P를 차단할 수 있습니다. 개인 핫스팟을 사용해 보세요.",
+ "windows": "Windows: Defender Firewall → 앱 허용 — 개인 네트워크용 Orca를 활성화합니다.",
+ "mac": "macOS: 시스템 설정 → 네트워크 → 방화벽 — Orca를 허용합니다.",
+ "tryReconnecting": "두 장치 모두에서 Wi-Fi를 다시 연결해 보세요.",
+ "ethernet": "이더넷과 WiFi는 동일한 서브넷을 공유해야 합니다.",
+ "both": "두 장치 모두 동일한 LAN에 있어야 합니다(Tailscale을 통해 연결되지 않은 경우)."
+ },
+ "mobileBrowserPane": {
+ "send": "브라우저에 텍스트 보내기",
+ "type": "페이지에 입력…",
+ "ok": "좋아요",
+ "cancel": "취소",
+ "browserDialogMessage": "브라우저 대화 상자",
+ "reload": "새로고침",
+ "forward": "포워드",
+ "back": "뒤로",
+ "enter": "유효한 URL을 입력하세요.",
+ "browserStreamTimed": "브라우저 스트림 시간이 초과되었습니다.",
+ "browserPage": "브라우저 페이지는 아직 사용할 수 없습니다.",
+ "checking": "데스크톱 브라우저 스트리밍 지원을 확인하는 중입니다.",
+ "update": "모바일에서 브라우저 탭을 스트리밍하려면 데스크톱 Orca를 업데이트하세요.",
+ "browserStreamFailed": "브라우저 스트림이 실패했습니다.",
+ "browserDialog": "브라우저 대화상자",
+ "sent": "전송된",
+ "browserPointerUp": "브라우저 포인터 올리기 실패",
+ "browserPointerDown": "브라우저 포인터 다운 실패",
+ "browserPointerMove": "브라우저 포인터 이동 실패",
+ "browserScroll": "브라우저 스크롤 실패",
+ "browserCommand": "브라우저 명령이 실패했습니다.",
+ "right": "마우스 오른쪽 버튼을 클릭하세요."
+ },
+ "mobileBrowserPointerModifiers": {
+ "modifier": "{{modifierLabel}} 클릭 수정자",
+ "shift": "옮기다",
+ "ctrl": "Ctrl 키",
+ "cmd": "명령"
+ },
+ "mobileBrowserViewModeSwitch": {
+ "show": "{{browserLabel}} 웹사이트 보기 표시",
+ "mobile": "모바일",
+ "web": "웹"
+ },
+ "mobileAgentSessionHistoryList": {
+ "resume": "agent 세션 재개",
+ "current": "현재 워크트리",
+ "messages": "메시지",
+ "message": "메시지"
+ },
+ "agentHistory": {
+ "noPast": "이 범위에는 이전 agent 세션이 없습니다.",
+ "noSessions": "검색어와 일치하는 세션이 없습니다.",
+ "noAgent": "agent 세션 없음",
+ "search": "세션 검색, repo:, 경로:",
+ "retry": "다시 시도",
+ "unableLoad": "로드할 수 없습니다",
+ "update": "agent 세션 기록을 찾아보려면 이 호스트에서 Orca를 업데이트하세요.",
+ "agentSessionHistoryUnavailable": "Agent 세션 기록을 사용할 수 없습니다.",
+ "refresh": "agent 세션 새로 고침",
+ "agentSessionHistory": "Agent 세션 기록",
+ "back": "뒤로",
+ "failed": "세션을 재개하지 못했습니다.",
+ "agentSessionQueued": "Agent 세션이 대기 중입니다.",
+ "unableDetermine": "호스트 플랫폼을 확인할 수 없습니다.",
+ "session": "이 세션에 이력서 ID가 없습니다.",
+ "waiting": "호스트를 기다리는 중...",
+ "all": "모두",
+ "project": "프로젝트",
+ "workspace": "워크스페이스",
+ "issueCountTranscript": "{{issueCount}} 성적표를 건너뛰었습니다.",
+ "issueCountTranscripts": "{{issueCount}} 성적표를 건너뛰었습니다.",
+ "unableLoadWorkspace": "워크스페이스 메타데이터를 로드할 수 없습니다."
+ },
+ "useMobileAgentHistoryState": {
+ "waiting": "호스트를 기다리는 중…",
+ "unableLoad": "agent 세션을 로드할 수 없습니다.",
+ "unableReach": "호스트에 연결할 수 없습니다."
+ },
+ "worktreeNavigationActions": {
+ "agent": "Agent 세션 기록",
+ "source": "소스 제어"
+ },
+ "agentHistoryResumeTarget": {
+ "open": "세션을 재개하기 전에 로컬 워크스페이스를 여세요.",
+ "session": "이 세션은 호스트 시스템에 저장되므로 SSH 워크스페이스에서 재개될 수 없습니다. 이 프로젝트에 대한 로컬 워크스페이스를 엽니다.",
+ "resume": "런타임 호스팅 워크스페이스에서는 기록에서 재개를 사용할 수 없습니다."
+ },
+ "agentHistorySessionCard": {
+ "untitled": "제목 없는 세션"
+ },
+ "about": {
+ "open": "100x 빌더를 위한 오픈 소스 agent IDE",
+ "about": "에 대한"
+ },
+ "browserSettings": {
+ "openTerminal": "terminal 링크 열기",
+ "choose": "terminal 출력에서 탭한 HTTP(S) 링크가 열리는 위치를 선택합니다.",
+ "links": "링크",
+ "browser": "브라우저",
+ "openSafari": "이 휴대전화의 Safari, Chrome 또는 다른 브라우저에서 엽니다.",
+ "phone": "전화 브라우저",
+ "openStreamed": "페어링된 데스크톱의 스트리밍 브라우저에서 엽니다.",
+ "orca": "데스크톱의 Orca 브라우저"
+ },
+ "connectionLog": {
+ "noPaired": "페어링된 호스트가 없습니다.",
+ "noConnection": "이 세션에는 아직 연결 이벤트가 없습니다. 앱이 이 호스트에 전화를 걸면 이벤트가 나타납니다.",
+ "copy": "진단 복사",
+ "copied": "복사됨",
+ "attempt": "· {{reconnectAttempts}} 시도",
+ "connection": "연결 로그"
+ },
+ "home": {
+ "youre": "연결되었습니다",
+ "scan": "코드를 스캔하세요",
+ "openOrca": "Orca 데스크탑 열기",
+ "removeConfirm": "'{{confirmRemoveName}}'을(를) 삭제하시겠습니까? 나중에 다시 페어링할 수 있습니다.",
+ "removeHost": "호스트 제거",
+ "remove": "제거",
+ "edit": "호스트 수정",
+ "disconnect": "연결 해제",
+ "seven": "7일",
+ "account": "계정 사용량",
+ "new": "새 워크스페이스",
+ "pair": "데스크탑 페어링",
+ "quick": "빠른 작업",
+ "tasks": "작업",
+ "resume": "재개",
+ "desktops": "데스크탑",
+ "prs": "생성된 PR",
+ "agent": "Agent 시간",
+ "agents": "시작된 Agents",
+ "welcome": "다시 오신 것을 환영합니다",
+ "how": "작동 원리",
+ "pairingDescription": "컴퓨터에서 Orca와 페어링하여 agents를 확인하고, 모든 terminal로 이동하고, 휴대폰에서 작업을 수행하세요.",
+ "connectYour": "데스크탑을 연결하세요",
+ "please": "다시 시도해 주세요.",
+ "could": "호스트를 제거할 수 없습니다.",
+ "openTask": "{{taskProviderLabel}} 작업 열기",
+ "no": "연결된 작업 소스가 없습니다.",
+ "system": "시스템 기본값",
+ "your": "바탕 화면이 여기에 나타납니다. 모든 것이 엔드 투 엔드로 암호화됩니다.",
+ "tap": "위의 버튼을 탭하여 스캐너를 엽니다. 화면의 QR 코드를 가리킵니다.",
+ "go": "설정 → 모바일로 이동하여 페어링 QR 코드를 생성하세요.",
+ "connect": "연결",
+ "reconnect": "다시 연결"
+ },
+ "mobileOnboarding": {
+ "onboarding": "온보딩 진행",
+ "notification": "알림 설정을 업데이트할 수 없습니다. 다시 시도해 보세요.",
+ "your": "선택사항을 저장할 수 없습니다. 다시 시도해 보세요."
+ },
+ "nativeChatSettings": {
+ "open": "Chat UI에서 세션 열기",
+ "off": "끄기",
+ "on": "켜짐",
+ "choose": "이 장치에서 지원되는 agents 세션(Claude, Codex 및 기타 채팅 가능 agents)이 열리는 방식을 선택하세요. Terminal에는 원시 CLI가 표시됩니다. 채팅 UI는 데스크톱 앱과 같은 채팅 인터페이스를 보여줍니다. 길게 누르기 메뉴에서 개별 세션을 전환할 수 있습니다.",
+ "default": "기본 보기",
+ "back": "뒤로"
+ },
+ "notifications": {
+ "open": "설정 열기",
+ "agent": "Agent 알림",
+ "notifications": "알림",
+ "get": "agent이 귀하의 입력을 필요로 하거나 작업을 완료하면 이 장치에서 알림을 받습니다.",
+ "notificationsDisabled": "시스템 설정에서 알림이 비활성화되어 있습니다."
+ },
+ "pairConfirm": {
+ "back": "집으로 돌아가기",
+ "connecting": "연결 중…",
+ "cancel": "취소",
+ "pair": "쌍",
+ "confirmDesktopPairingLink": "데스크탑에서 페어링 링크를 열었습니다. 호스트에 추가하려면 확인하세요.",
+ "pairDesktop": "이 데스크탑과 페어링하시겠습니까?",
+ "pairingFailed": "페어링 실패: {{errorMessage}}",
+ "could": "{{pairingOverallTimeoutSeconds}}s 내에 연결할 수 없습니다. 중단된 위치는 아래 로그를 참조하세요.",
+ "pairingLog": "페어링 로그"
+ },
+ "pairScan": {
+ "copy": "컴퓨터의 QR 아래에 표시된 코드를 복사하세요.",
+ "pastePairingCode": "페어링 코드 붙여넣기",
+ "pasteCode": "대신 코드 붙여넣기",
+ "try": "다시 시도",
+ "connecting": "연결 중…",
+ "pastePairingCodeMessage": "또는 페어링 코드 붙여넣기",
+ "scan": "QR 코드를 스캔하세요",
+ "go": "설정 → 모바일로 이동하세요.",
+ "openOrca": "컴퓨터에서 Orca를 엽니다.",
+ "openSettings": "설정 열기",
+ "continue": "계속",
+ "enable": "설정에서 카메라 액세스를 활성화하거나 대신 페어링 코드를 붙여넣으세요.",
+ "scanOrPastePairingCode": "데스크톱의 Orca에서 QR 코드를 스캔하거나 대신 페어링 코드를 붙여넣으세요.",
+ "camera": "카메라 액세스 비활성화됨",
+ "pair": "데스크톱과 페어링",
+ "pairingFailed": "페어링 실패: {{errorMessage}}",
+ "could": "{{pairingOverallTimeoutSeconds}}s 내에 연결할 수 없습니다. 중단된 위치는 아래 로그를 참조하세요.",
+ "notValidPairing": "유효한 페어링 코드가 아닙니다. 컴퓨터에서 복사하여 다시 붙여넣으세요.",
+ "notValidOrca": "유효한 Orca QR 코드가 아닙니다.",
+ "pairingLog": "페어링 로그"
+ },
+ "pair": {
+ "back": "집으로 돌아가기",
+ "missing": "페어링 코드 누락"
+ },
+ "settings": {
+ "support": "지원",
+ "privacy": "개인 정보 보호 정책",
+ "retry": "다시 시도",
+ "retryClearing": "페어링 자격 증명 삭제를 다시 시도하세요.",
+ "couldNotCheck": "이 기기의 정리 상태를 확인할 수 없습니다. 안전하게 다시 시도하세요.",
+ "cleanup": "아직 정리를 확인할 수 없습니다. 나중에 다시 시도하세요.",
+ "pairing": "페어링 자격 증명 정리",
+ "about": "에 대한",
+ "troubleshooting": "문제 해결",
+ "notifications": "알림",
+ "voice": "음성",
+ "browser": "브라우저",
+ "settings": "설정",
+ "couldNotConfirmCleanupPendingCredentialCountCredential": "이 기기에서 {{pendingCredentialCount}} 사용자 인증 정보 정리를 확인할 수 없습니다.",
+ "couldNotConfirmCleanupPendingCredentialCountCredentials": "이 기기에서 {{pendingCredentialCount}} 사용자 인증 정보 정리를 확인할 수 없습니다."
+ },
+ "terminalSettings": {
+ "terminalText": "Terminal 텍스트 크기",
+ "restore": "{{pickerHostName}} 복원",
+ "off": "끄기",
+ "on": "켜짐",
+ "autocomplete": "자동 완성 및 자동 수정",
+ "autocompleteDescription": "terminal 명령 모음에서 전화 스타일 자동 완성, 자동 수정 및 맞춤법 제안을 활성화합니다. 기본적으로 꺼져 있으므로 키보드는 명령, 플래그 또는 경로를 다시 쓰지 않습니다. 직접 키보드 입력(키가 terminal로 바로 이동하는 경우)은 항상 원시 키 입력을 전송하므로 제안 사항이 적용되지 않습니다.",
+ "keyboard": "키보드 입력",
+ "textSizeMessage": "텍스트 크기",
+ "textScaleDescription": "terminal 텍스트의 크기를 조정합니다. 크기가 작을수록 측면 여백이 있는 더 많은 열에 적합합니다. 크기가 클수록 더 적은 수의 열이 표시됩니다. 옆으로 드래그하면 이동됩니다. 또한 terminal 자체를 핀치하여 확대하여 이 설정을 업데이트할 수도 있습니다. 장치별 표시만 가능합니다. 데스크탑 terminal을 변경하지 않습니다.",
+ "textSize": "텍스트 크기",
+ "no": "아직 페어링된 데스크톱이 없습니다. terminal 동작을 제어하려면 하나를 페어링하십시오.",
+ "resizeBehaviorDescription": "휴대폰에서 terminals을 사용하는 동안 Orca는 화면에 맞게 terminals을 축소합니다. 앱을 닫거나 다른 곳으로 전환하면 앱이 휴대폰 크기로 유지되는지(대화형 CLI 도구가 리플로우되지 않음) 또는 데스크탑으로 다시 크기가 조정되는지 여부가 제어됩니다. 언제든지 이 terminals 복원 또는 배너의 모든 terminals 복원을 사용하여 수동으로 크기를 조정할 수 있습니다.",
+ "when": "앱을 종료할 때",
+ "after30": "30분 후",
+ "after5": "5분 후",
+ "after1": "1분 후",
+ "keep": "휴대폰 크기로 유지(기본값)",
+ "largest": "최대 (200%)",
+ "larger": "더 크게(150%)",
+ "large": "대형 (125%)",
+ "default": "기본값(100%)",
+ "smaller": "작음(75%)",
+ "smallest": "최소(50%)",
+ "afterDuration": "{{durationSeconds}}초 후"
+ },
+ "troubleshoot": {
+ "common": "일반 문제",
+ "view": "연결 로그 보기",
+ "runDiagnostics": "진단 실행",
+ "runAgain": "다시 실행",
+ "running": "실행 중…",
+ "troubleshooting": "문제 해결",
+ "platform": "플랫폼",
+ "hosts": "호스트",
+ "internet": "인터넷",
+ "paired": "페어링된 호스트",
+ "couldNotTest": "테스트할 수 없음",
+ "no": "연결되지 않음",
+ "unexpected": "예상치 못한 반응",
+ "connected": "연결됨",
+ "couldNotRead": "호스트 데이터를 읽을 수 없습니다.",
+ "none": "없음 — QR을 스캔하여 페어링",
+ "host": "{{hostCount}} 페어링됨",
+ "reachable": "{{endpoint}}에서 연결 가능"
+ },
+ "voiceSettings": {
+ "speechModelMessage": "음성 모델",
+ "speechModel": "연설 모델",
+ "togglePress": "토글: 한 번 누르면 시작되고 다시 누르면 중지됩니다. 보류: 누르고 있는 동안 지시합니다.",
+ "dictationMode": "받아쓰기 모드",
+ "dictate": "데스크탑의 초점이 맞춰진 창에 텍스트를 받아쓰세요.",
+ "enable": "음성 받아쓰기 활성화",
+ "dictation": "받아쓰기",
+ "connect": "음성 설정을 관리하려면 데스크톱에 연결하세요.",
+ "voice": "음성",
+ "delete": "삭제 실패",
+ "couldNotSelect": "모델을 선택할 수 없습니다",
+ "couldNotUpdate": "업데이트할 수 없습니다.",
+ "failedLoadVoiceSettings": "음성 설정을 로드하지 못했습니다.",
+ "hold": "길게 누르기",
+ "toggle": "토글",
+ "failedLoadVoiceSettingsMessage": "음성 설정을 로드하지 못했습니다.",
+ "none": "선택한 항목 없음"
+ },
+ "mobileDictationPendingAudioBudget": {
+ "connection": "음성 받아쓰기를 하기에는 연결 속도가 너무 느립니다. 연결 상태가 좋아지면 다시 시도하세요."
+ },
+ "mobileDictationDesktopStart": {
+ "failed": "마이크 녹음을 시작하지 못했습니다."
+ },
+ "mobileDictationKeepAwake": {
+ "keep": "Keep-awake 기본 호출 시간이 초과되었습니다."
+ },
+ "useMobileDictation": {
+ "no": "음성이 감지되지 않았습니다.",
+ "failed": "마이크를 초기화하지 못했습니다.",
+ "microphone": "마이크 권한이 거부되었습니다."
+ },
+ "mobileDictationSetup": {
+ "update": "모바일 음성 설정을 사용하려면 페어링된 데스크톱 Orca 앱을 업데이트하세요.",
+ "failedUpdate": "음성기록 설정을 업데이트하지 못했습니다.",
+ "failedDelete": "모델을 삭제하지 못했습니다.",
+ "failedStart": "다운로드를 시작하지 못했습니다.",
+ "failedLoad": "음성기록 모델을 로드하지 못했습니다."
},
"prChecks": {
"summary": {
diff --git a/mobile/src/i18n/locales/zh.json b/mobile/src/i18n/locales/zh.json
index a000dc5d92d..e0105e91735 100644
--- a/mobile/src/i18n/locales/zh.json
+++ b/mobile/src/i18n/locales/zh.json
@@ -1,2177 +1,2471 @@
{
- "m": {
- "zWwi3-o": "待办",
- "hWeTdOM": "进行中",
- "mg8ozqs": "评审中",
- "EleEi2Q": "完成",
- "1Bc_S64": "PR 状态",
- "BX2Np3Y": "存储库",
- "oBZu0_c": "状态",
- "Iq3a5so": "无分组",
- "y1TvQWs": "服务器顺序",
- "FyGSYV4": "手动的",
- "yH1bPxU": "存储库,然后是工作区名称",
- "v5H1mJY": "Repo",
- "egkm8qI": "首先是最近的输出",
- "2xJ96AA": "最近的",
- "BaGIgrE": "按名字字母顺序排列",
- "tQqkyxI": "名称",
- "RcmL46Y": "需要关注的 Agents,然后是最近的活动",
- "6gEQgs0": "Agent 活动",
- "KbmpcZs": "正在重新连接...",
- "6_SeqME": "无法连接",
- "YAPgxBM": "无法到达桌面",
- "G6a1Jqk": "已断开连接",
- "I-waJyg": "正在连接…",
- "jgGsba4": "已连接",
- "0BvjSKA": "配对无效 — 与您的桌面重新配对",
- "HguWCpQ": "端口必须为 1–65535。",
- "dRmw4EQ": "缺少主机名。",
- "CshxztM": "不是有效地址。",
- "6lctDfQ": "不是有效的主机名。",
- "fX92Peg": "主机不得包含路径或查询。",
- "HQMAFdE": "使用 ws:// 或 wss:// (或主机:端口)。",
- "z85IfPo": "输入主机地址。",
- "lxKZMMw": "预计配置的中继元数据只有一个端点",
- "e-zCiAo": "中继主机身份不匹配",
- "CjbcG3A": "中继身份和端点必须共存",
- "HrWsdDM": "清除光标前的行",
- "sL5fKGQ": "Ctrl+U",
- "Bd9qfdk": "向后删除单词",
- "jVVj75Y": "Ctrl+W",
- "0VWtVO8": "行尾",
- "5m_ucwE": "Ctrl+E",
- "CKFp_QM": "行首",
- "u9q9lPQ": "Ctrl+A",
- "mcvHf4o": "反向搜索",
- "a2Cb3GE": "Ctrl+R",
- "hqWfNmA": "暂停进程",
- "NIdsbYo": "Ctrl+Z",
- "Eqaj8oY": "清晰的屏幕",
- "R6ZcIz8": "Ctrl+L",
- "PBPnPeQ": "发送文件尾",
- "vFYSo0s": "Ctrl+D",
- "AzHoQzM": "中断 terminal",
- "ke03J5M": "Ctrl+C",
- "v5WSGO0": "向右箭头",
- "RiGIavM": "向左箭头",
- "vVsy7qk": "向下箭头",
- "IwJi8TY": "向上箭头",
- "fNgDk9o": "转发删除",
- "gmy3A7M": "德尔",
- "6TRPiic": "退格键",
- "l6KJT3M": "空间",
- "p7_d2FU": "切换选项卡",
- "S9DH8y4": "Shift+Tab",
- "9KFo5zM": "进入",
- "hM5KUAw": "选项卡",
- "jHe6UUU": "逃脱",
- "bNejRmQ": "Esc键",
- "UnBBA1A": "重新加载",
- "p2soPzg": "Terminal 加载失败",
- "IwMISoQ": "全部",
- "J54idHw": "已关闭",
- "sKFSmrM": "合并",
- "dGRdl38": "进行中",
- "_NhxpRw": "名称",
- "efmLHxE": "分支",
- "JEQaLyM": "GitLab",
- "j6H-ZB8": "Linear",
- "fLijFJI": "GitHub",
- "0GQcyjg": "智能",
- "TgLMnDc": "使用 repo 相对目录,而不是根目录、绝对路径或父段。",
- "M0WKvoE": "添加至少一个目录。",
- "fCVCUqw": "WSL 重置范围需要精确的发行版",
- "TJPBpxE": "主机重置范围无法命名 WSL 发行版",
- "CgVIb2E": "差异因移动预览而被截断。",
- "mZj5XBY": "无法加载差异",
- "v6-Hc8I": "关闭提交的差异预览",
- "I6GjQO8": "致力于分支",
- "6lym-WQ": "{{value0}}..HEAD",
- "P2fbbug": "显示详情",
- "eysP-fI": "隐藏详情",
- "6Pb0W84": "显示 commit 失败详细信息",
- "7eT5oiE": "隐藏 commit 失败详细信息",
- "-RbEI6M": "修复",
- "3iqxoCY": "使用 AI 修复 commit 失败",
- "Hol4rtI": "Commit 失败",
- "fcDHZ1U": "没有 commits。",
- "Qb3CogY": "重试",
- "kylGvPU": "等待桌面...",
- "y0bB4-s": "没有文件更改",
- "c_4jbTI": "加载历史记录失败",
- "O_0cF4M": "{{value0}} 已更改",
- "cLOWzDM": "已暂存 {{value0}} 个",
- "Dysvcf0": "分支上的 {{value0}}",
- "8tFmU9A": "使用 AI 生成 commit 信息",
- "PTohtCY": "取消 commit 消息生成",
- "uTRYt2U": "Commit 信息",
- "2X52pxU": "没有暂存文件",
- "ELJU7AQ": "Commit 消息已禁用。没有暂存文件。",
- "yKqTr9E": "工作树很干净。",
- "89qgAps": "没有本地更改",
- "8E6deJU": "开源控制措施",
- "DHXoi2A": "全部取消暂存",
- "9pCKA8U": "暂存全部",
- "o_TTJDk": "正在重新连接到桌面...",
- "PW__oVI": "打开已提交的变更 {{value0}}",
- "tZHFwCg": "正在加载提交的更改...",
- "m_C8jkI": "已提交的更改",
- "IET9hpI": "丢弃 {{value0}}",
- "WTkbKTE": "阶段{{value0}}",
- "9OoD7rs": "取消暂存 {{value0}}",
- "av_Mh7U": "未解决的冲突",
- "4a6Yo9s": "打开更改的文件 {{value0}}",
- "SrSDY0M": "来自 {{value0}}",
- "Pt1enm0": "刷新源代码控制",
- "5lXW9sQ": "在网络上打开拉取请求",
- "HUC1SZA": "在网络上打开拉取请求#{{value0}}",
- "PjA8ztc": "源代码控制",
- "OtpFc0w": "返回会话",
- "MDlHRa0": "关闭源代码控制",
- "84pwQsY": "在浏览器中打开它?",
- "4E80Be4": "拉取请求已创建",
- "n9UDFoo": "切换分支",
- "Oh7cEhY": "放弃对“{{value0}}”的更改?此操作无法撤消。",
- "7IMotMA": "放弃变更",
- "7p6X0C0": "源代码控制",
- "dggV318": "重试",
- "SlcSA9A": "无法加载",
- "UgUD08U": "源代码控制不可用",
- "Q1mHSX4": "创建拉取请求",
- "xoN_ZQM": "正在加载拉取请求...",
- "jrzi7yY": "已提交的更改",
- "cU7VGGA": "无法生成 commit 消息",
- "6N6POoY": "创建 PR",
- "8fhgeQQ": "准备拉取请求时分支发生了变化。",
- "zAg6hUc": "无法生成 commit 消息。在源代码管理中添加一个,然后重试。",
- "x1skfkY": "在创建拉取请求之前解决或暂存更改。",
- "695pbL4": "在创建拉取请求之前解决冲突。",
- "QeyCTxE": "推送失败。解决推送错误,然后重试。",
- "hjs2AB4": "Commits",
- "bOc3nUM": "切换分支",
- "ntik19Q": "重新建立基础",
- "r_MPRhE": "发布分支",
- "3blspe8": "fetch",
- "_Pq5EEw": "推动并创建 PR",
- "IgtghkE": "创建 PR",
- "ZFwznUg": "Commit 并同步",
- "4pU4zTo": "Commit&推送",
- "_Srm4Jk": "Commit",
- "s7LT0Wk": "启动 agent 失败",
- "Ngsl81c": "等待桌面...",
- "h4RNhQ0": "无法生成 commit 消息",
- "IhhRQcI": "在创建拉取请求之前检查分支。",
- "8lyq50g": "更新 Orca 桌面以在移动设备上使用源代码管理。",
- "v0PMFRE": "无法解析基础分支以进行比较。",
- "xLlZko0": "等待桌面...",
- "0MDy3xU": "无法打开差异",
- "iO0cooo": "源代码控制操作失败",
- "0EPx-aA": "Agent 正在工作",
- "vCnFzKQ": "关闭",
- "8xevGic": "重新加载",
- "m4hO2RY": "转发",
- "SKku3yE": "返回",
- "GZwtZCE": "浏览器",
- "EwbB5VI": "下一步",
- "ZEWq5OM": "发送回答",
- "yxcaJwo": "取消",
- "7nef7b0": "输入你的回答",
- "biG4V5Q": "其他…",
- "imHMT2Y": "发送消息",
- "0JFch-U": "听写",
- "r9MfglU": "停止听写",
- "o_uvOaw": "附上图片",
- "8VDRuNk": "删除图像",
- "lHpfBcs": "已排队",
- "85E7hns": "将此消息滚动到顶部",
- "m5GqFPc": "复制消息",
- "0bAYawM": "{{value0}}×",
- "0mLnbZ0": "… {{value0}} 更多工具调用",
- "O8aNMg0": "发送回复",
- "psOJLjQ": "输入您的回复...",
- "bSeVb4U": "或者输入回复...",
- "NR7KpaA": "提交选定的选项",
- "BcZ8-jY": "提交{{value0}}",
- "55yDVNk": "消息、@文件、/命令",
- "AXyDPsE": "等待 terminal…",
- "gFSApKE": "正在重新连接...",
- "X8_vuao": "停止",
- "1oeCDU8": "停止 agent",
- "J3nTi3Q": "工具",
- "HgMEzFE": "折叠",
- "MWJZkOQ": "滚动到最新",
- "AexlW6I": "加载更早的消息",
- "u8wilUo": "检查项",
- "6R8BWsw": "Agent 历史",
- "a4FTXPM": "开始语音听写",
- "4Bofttg": "开始语音听写",
- "467WHFs": "取消语音听写",
- "lmt1VYs": "停止语音听写",
- "diKZlw8": "长按可附加文件",
- "THy0254": "附上照片",
- "Vl7Dj48": "发送图像",
- "mr8N0cA": "添加快捷命令",
- "SZAlJoE": "保存",
- "z9Me_JI": "取消",
- "nB0fh-Q": "项目",
- "spBXyhw": "全局",
- "JVmE8Lo": "范围",
- "iAdHX2w": "立即提交,而不仅仅是插入文本。",
- "S9UUSi8": "追加输入",
- "MsJOHDg": "高级",
- "WFigoqY": "支持技能、文件路径和内置命令。",
- "YGxS8ck": "npm run dev",
- "j_uWjuQ": "要求 agent 调查此工作区",
- "2WUowpg": "命令文本",
- "v512Bqc": "提示词",
- "9D9oj64": "选择 agent",
- "th44i2A": "Agent",
- "AQ41agY": "操作",
- "pcq4xtU": "启动开发服务器",
- "GXMFUnA": "标签",
- "CQKw8CA": "Agent 提示",
- "9xkz8HQ": "Terminal 命令",
- "r6942Dw": "删除 {{value0}}",
- "N8k0x7U": "编辑 {{value0}}",
- "VrXVT_A": "运行 {{value0}}",
- "Jqxtf0c": "已达到快速命令限制",
- "LmWWV94": "新的快速命令",
- "YWp9eI8": "全局",
- "0ye1crk": "这个项目",
- "stjjcN4": "没有匹配的快速命令。",
- "WGZgVlw": "还没有快速命令。",
- "Mlzs2q8": "搜索快捷命令...",
- "c7kUeNA": "保存 terminal 命令或 agent 提示以便快速访问。",
- "XUyBgA4": "返回",
- "8mDod7I": "该快捷命令将从您保存的列表中删除。",
- "y7ppLrs": "删除“{{value0}}”?",
- "gz_v97k": "无法更新评论主题。",
- "ssoDq0g": "更新标题失败。",
- "fZbxiK0": "关闭",
- "9OSp60k": "更新 Orca 桌面以查看移动设备上的更改。",
- "RSAKe4M": "提交的更改响应无效",
- "hKX4q6A": "致力于分支",
- "LHMnD5o": "请求许可",
- "zqu69ik": "始终允许",
- "3EBdICM": "拒绝",
- "sjphObI": "允许",
- "QX9RTgc": "关闭右侧的选项卡",
- "_ijK2wo": "关闭左侧选项卡",
- "XxfyMlc": "关闭其他选项卡",
- "k32XW6w": "关闭",
- "5s4VNsw": "清除 Terminal",
- "2wFDKaY": "重命名",
- "umfRNkc": "合并拉取请求失败。",
- "vXd8YYA": "无法刷新拉取请求。",
- "Lq5nqds": "连接失败(重新连接)",
- "kOr-gVg": "无法保存评论",
- "AtE6oQA": "等待桌面...",
- "HkX9h2s": "缺少工作树",
- "-k-F-P0": "已暂存 {{value0}} 个",
- "tyXkf4g": "已暂存 {{value0}} 个,{{value1}} 个失败",
- "L-xz6vw": "等待桌面...",
- "MOtwYRI": "源代码控制操作失败",
- "x0Dr_H8": "等待桌面...",
- "U2LqmGk": "审阅已发送的笔记",
- "LtedJAM": "审阅已复制的笔记",
- "NSS4Or0": "附加失败",
- "hJYA7AQ": "图片太大无法附加",
- "JdGd1Ic": "照片许可被拒绝",
- "tu-qlN0": "连接失败(断开连接)",
- "JlNqDLA": "附加失败",
- "-YjNIcU": "图片太大无法附加",
- "jdkmIaw": "照片许可被拒绝",
- "Kc1O9hE": "连接失败(断开连接)",
- "AandnA4": "未连接",
- "62Wqvcg": "启动 agent 失败",
- "WXv-mcQ": "等待桌面...",
- "zchh0X0": "评论操作失败",
- "6VPjkF8": "更新标题失败。",
- "RqzbvDE": "未连接到桌面。",
- "weTQMew": "粘贴失败",
- "5dhlsXo": "图片太大无法粘贴",
- "gG0saX0": "粘贴失败(已断开连接)",
- "Ezj8Uog": "粘贴太大(最大 256 KiB)",
- "e1BO4eM": "无法加载快速命令",
- "K20RdWM": "暂时跳过通知",
- "KP3UPPY": "暂不",
- "sSrQIeg": "启用 agent 通知",
- "QM9B4lA": "启用通知",
- "B5cl_6I": "在 terminal 中打开会话",
- "9bF2iuQ": "保留 terminal",
- "tYyQCnY": "在聊天 UI 中打开会话",
- "KogvSYY": "使用聊天界面",
- "3vHqv6U": "当 agent 需要您的输入或完成任务时,您会在此设备上收到通知。",
- "dV8UVHg": "选择是否在此设备上的 terminal 或聊天 UI 中打开受支持的 agent 会话。按住会话选项卡可切换其视图,或稍后在“设置”中更改默认值。",
- "OmdgGNs": "外出时保持更新",
- "o9LxHPg": "会话应该如何开始?",
- "CaZB1fk": "没有找到文件",
- "LS0hOug": "重试",
- "UomXr8g": "- 显示前 5000 个",
- "8ojoNLo": "文件",
- "vT-EgZw": "返回会话",
- "A053H2s": "关闭文件",
- "ujEE5Aw": "查看渲染的 Markdown 预览",
- "12QKL8A": "查看 Markdown 源代码",
- "cDZy2i8": "{{value0}} 图像",
- "0U_34Zg": "空文件",
- "zqZaJJo": "重试",
- "yc-xh3U": "{{value0}} 编辑",
- "uLXt2Qs": "无法加载预览",
- "BnjL5Ho": "保存 terminal 神器",
- "nxnMGkU": "返回文件",
- "vXalblI": "未保存的编辑将会丢失。",
- "k969DeE": "放弃更改?",
- "Iqn4mt4": "正在加载预览...",
- "MCFjuu8": "等待桌面...",
- "1_VaWXc": "文件预览",
- "mGhZjxw": "预览被截断。文件大小:{{value0}}。",
- "m0QdE2U": "无法在移动设备上使用",
- "F2AHmFI": "预览文件 {{value0}}",
- "AnmS3ZU": "{{value0}} 在移动设备上不可用",
- "LuU4lSE": "打开文件夹 {{value0}}",
- "CGYoYAY": "重试",
- "v4sDG-8": "重试加载 {{value0}}",
- "t2QYxhU": "加载中...",
- "kYWeCgo": "桌面上的文件已更改。保存前重新加载预览",
- "nbgr4H0": "无法加载预览",
- "Jj_IDwY": "找不到文件",
- "X-whfMo": "无法访问桌面文件系统",
- "ktGDvZE": "保存前重新加载预览",
- "UFAFIP0": "文件太大,无法在移动设备上预览",
- "UfU4CAU": "二进制预览不可用",
- "2t0lh6U": "无法加载预览",
- "jLhPXXQ": "其他 VPN 干扰",
- "ngjn4tY": "Tailscale 主机无法访问",
- "AE3mc7A": "连接超时",
- "MED_8yU": "桌面应用程序未运行",
- "amY3iCs": "防火墙阻止端口 6768",
- "vuZn-_E": "不同的 WiFi 网络",
- "q-MNnd4": "移除",
- "KuqR8FY": "维修",
- "ujiecek": "重试",
- "IrfKQh8": "身份验证失败——先尝试重新连接;如果仍然失败,请从桌面重新配对。",
- "2LrOLw8": "使用重置",
- "LN50bQ0": "正在重置...",
- "8CLIWuE": "使用活动 Codex 帐户获得的一次重置",
- "Y2o7mgc": "使用一次为 {{value0}} 赢得的重置",
- "7uEIrNQ": "使用 Codex 速率限制重置",
- "fNZPjTQ": "重置 Codex 速率限制",
- "_g9qkig": "添加快捷方式",
- "N7UodPY": "按回车键",
- "YZWk8R4": "命令",
- "zkM-vYk": "标签",
- "ndVygIU": "添加",
- "GSrBito": "更多按键 — Tab、箭头、F1–F12...",
- "QlB11DI": "标识",
- "9jQVv-8": "修饰符",
- "w7YJ0Kw": "显示、隐藏或重新排序快捷键",
- "BFsLjpc": "管理快捷键",
- "I-Rlhvc": "发送自定义文本命令",
- "fNBP1Us": "文本宏",
- "Y7zDQOM": "构建 Ctrl、Alt 和 Shift 键和弦",
- "Lr_GVFQ": "快捷组合",
- "v1Nn-IY": "返回",
- "WwKbTEk": "功能",
- "ClgDZUM": "导航",
- "1RunS2Y": "编辑",
- "Dl9mAnI": "转移",
- "Mz-qIO4": "替代",
- "OZLCEBo": "控制键",
- "uGHhnC0": "下移",
- "ee4D14o": "向上移动",
- "T-H1CUQ": "使用上移和下移操作重新排序,无需拖动",
- "-lwE4Q0": "拖动以重新排序",
- "qvnQ47I": "检查主机兼容性",
- "oJ3sUM4": "下载",
- "N18umz0": "使用",
- "ri8swSc": "使用中",
- "qf7IWvA": "在桌面上设置",
- "D90AZhs": "API密钥集",
- "PG_Pfbo": "· 提取...",
- "bh_QQps": "开放人工智能API",
- "TJd8_nE": "推荐",
- "6WwF0_8": "启用听写",
- "D5YFHLU": "下载模型并在桌面上启用听写 - 一切都从这里开始。",
- "13hFHO4": "设置语音听写",
- "kocNlo8": "无法更新",
- "jX7Yn3E": "无法选择型号",
- "0rsS1Dw": "下载失败",
- "lUsptPY": "加载失败",
- "GWwDGTE": "重试",
- "RF7UWwo": "重试加载评论",
- "W6MLNo0": "差异因移动预览而被截断。",
- "e6R_IPM": "加载差异...",
- "Ku2wK-g": "尝试不同的评论过滤器。",
- "3-RMeIo": "没有可审查的变更",
- "e5sIbV0": "无法加载评论",
- "r-dK9lI": "无法评论",
- "On0H_JY": "正在加载评论...",
- "voLBMwU": "发送注释",
- "XNffV5A": "向 agent 发送注释",
- "a1hiCFE": "阶段审查",
- "XhmaYgY": "阶段审查文件",
- "du7kB18": "审核完成",
- "ls_e0g8": "保存",
- "-bToH9I": "删除",
- "7BEb-8o": "删除注释",
- "2lwuEDc": "审查备注",
- "cy6hF-c": "取消备注",
- "K4ExXj0": "文件注释",
- "YlMekyY": "行 {{value0}}",
- "SqSZ_D4": "添加注释",
- "vX8hCPw": "编辑备注",
- "QyPs23A": "在会话中打开",
- "lDOi4xI": "标记为未审核",
- "9YSL2XY": "阶段审核文件",
- "AMn9p6c": "清除已发送的注释",
- "bboDcz4": "发送未发送的注释",
- "SGgu3t8": "复印笔记",
- "qljZwNc": "新 Agent 会话",
- "ajcWpiI": "放弃对“{{value0}}”的更改?此操作无法撤消。",
- "1V8B5pc": "丢弃文件",
- "_TCuNKQ": "{{value0}} 已审核的未暂存文件可以暂存",
- "oCVOA0w": "审查行动",
- "cq6J0Qk": "{{value0}} 已审核,{{value1}}",
- "N0W7j-Y": "猛男",
- "-v8Njek": "下一个猛男",
- "co1PXQY": "上一个帅哥",
- "PpqbMu4": "陈旧",
- "6NQSDSg": "编辑文件注释",
- "cV_5zt0": "改变了",
- "TGeBFA8": "已审核",
- "Tqe6zfQ": "来自 {{value0}}",
- "OAIsqbU": "{{value0}} 陈旧",
- "n5_ZJMM": "下一个文件",
- "gLGElnY": "标记已审核",
- "gUbQPjk": "已审核",
- "a2xZWo8": "标记文件已审核",
- "vRhESp0": "备注",
- "e_IyR5Y": "添加文件注释",
- "0CC3Pjk": "上一个文件",
- "lL_q8JA": "放弃",
- "TpLj1K8": "丢弃文件",
- "v58oW_E": "取消暂存",
- "VZPK0FM": "取消暂存文件",
- "JiM1DAU": "暂存",
- "SzcIpKs": "暂存文件",
- "r-agX-k": "全部",
- "qcWQKWI": "显示 {{value0}} 审阅文件",
- "LU8BxDQ": "开放审查行动",
- "GAXIVbU": "打开拉取请求侧边栏",
- "1lIaLfU": "更改",
- "Xot6WdE": "返回",
- "fEoGCmQ": "{{value0}}/{{value1}} 已审核",
- "mIZ0_V0": "编辑第 {{value0}} 行的注释",
- "mCd0V4A": "在 {{value0}} 行添加注释",
- "4bPe4Ao": "更新桌面 Orca 并登录以从任何地方进行连接",
- "HdJ9GVY": "Source",
- "BE93iOI": "查看 HTML 源代码",
- "bvUfBWI": "预览",
- "-FhPMsI": "预览渲染的 HTML",
- "ywMqsWY": "[x]",
- "kijMg1M": "{{value0}} 更多列",
- "Jmh-3ik": "{{value0}} 更多行",
- "viizK3M": "重试",
- "Re9yZkw": "重试加载拉取请求",
- "-ZCN2f0": "正在加载拉取请求...",
- "O3OecWo": "main",
- "sLMnsJA": "代码块",
- "h1ikg-I": "内联代码",
- "fT3N_UQ": "图像",
- "eLAtZAk": "关联",
- "dQOT7tM": "引用",
- "jPlQhig": "清单",
- "_79TK6I": "编号列表",
- "hKyID9A": "项目符号列表",
- "wwdkeIc": "删除线",
- "zwoUjcU": "斜体",
- "TcUIfHg": "粗体",
- "qpILEoE": "H3",
- "T0-0mLw": "氢2",
- "Tkw-XG4": "H1",
- "3Ph2vuM": "身体",
- "UIMZetU": "工作区名称",
- "ybPEhxk": "新工作区",
- "VEK8Z7E": "Agent",
- "38lAWJQ": "存储库",
- "ZK7Il8w": "创建工作区",
- "g5YUeP0": "连接存储库",
- "obLmzkw": "运行设置命令",
- "sZHa-TU": "跳过",
- "0qYyICI": "执行",
- "0cbkbTE": "设置脚本",
- "LMAqKNQ": "备注",
- "ATo76K0": "高级",
- "M2A4pJA": "首先连接存储库",
- "O93svfk": "连接",
- "oroOvnM": "正在连接...",
- "JNDDz3c": "SSH 连接",
- "EFTSrpI": "工作区名称",
- "yymZMiQ": "名称或创建来源",
- "osrkufA": "未找到存储库",
- "sMWTBAA": "选择一个存储库和 agent 来启动新的工作区。",
- "C8UjQk0": "无法信任安装脚本。",
- "jSxyaws": "创建工作区失败",
- "rwQDraY": "选择是否运行安装脚本。",
- "F1iAV4A": "所选 agent 已禁用。创建之前选择启用的 agent。",
- "kA_OuTE": "返回主机",
- "h3ZwGv0": "打开 GitHub 版本",
- "oxg5VTs": "打开应用商店",
- "Pe9Dmhc": "别跑",
- "hUSRq7I": "永远信任并奔跑",
- "wOCs5LA": "运行钩子",
- "m7jxYm8": "设置脚本",
- "gxXtGpI": "新的设置脚本",
- "JU7DVfY": "此存储库的 orca.yaml 在工作区启动之前运行。仅当您信任此存储库时才运行它。",
- "SSMlLr8": "从 {{value0}} 运行安装程序?",
- "egQ-qgQ": "{{value0}} 的设置脚本已更改",
- "Lkm1Ms4": "源自名字",
- "CATZTEM": "分支名称",
- "MJ_zXUU": "工作区名称",
- "jueQw6Q": "名称",
- "Yz166iM": "重用分支“{{value0}}”",
- "qOsqJv0": "输入名称或搜索来源",
- "qNPX_ws": "在下面的字段中输入工作区名称。",
- "LbOI-wE": "此 SSH repo 需要 GitHub 远程来列出问题和 PR。",
- "2sNZWLI": "将存储库连接到搜索源。",
- "h8XKauY": "取消",
- "A6zs-7I": "完成",
- "J6XOFqM": "名称或“创建自”",
- "WDddFyg": "该项目位于 {{value0}}/ {{value1}} 中。",
- "FLDQvbE": "切换到 {{value0}}",
- "HHq8Y80": "输入名称或搜索来源",
- "eMl2uLM": "[可选]",
- "zTK803o": "新分行",
- "dDSXnKk": "创建分支“{{value0}}”",
- "Z7csSYQ": "命名此工作区",
- "uK2T1OQ": "使用“{{value0}}”",
- "CgJBkqk": "创建组合键或文本宏",
- "d-64Q0E": "添加自定义快捷方式...",
- "AwkMohI": "尚未定义自定义快捷键。",
- "EGxWrwk": "自定义快捷键",
- "_YyvrjM": "按原始顺序显示每个内置快捷键",
- "P0qiUsA": "重置默认值",
- "Odmd4jg": "切换按键以显示或隐藏它们,并按住夹点将按键拖到 terminal 快捷栏上所需的顺序。",
- "u1ZHouk": "快捷栏",
- "NOYO7QE": "取消",
- "8Zue0js": "下载",
- "jCov6Mc": "删除",
- "EorN5mI": "使用",
- "kg-vs7o": "使用中",
- "j2yOGiA": "在桌面上设置",
- "JnTRemk": "API密钥集",
- "B45mQIQ": "推荐",
- "6qylM4Q": "从侧边栏中选择一个工作区以在此处打开其 terminal。",
- "qe5Mx6E": "没有打开工作区",
- "JLc6yd4": "孩子们",
- "ugLQfPg": "孩子",
- "lCIVZpI": "孩子",
- "uQ24VuE": "文件夹",
- "CkCg0Xk": "非活动 Codex 限制使用错误的提供商身份",
- "4NLLG4A": "不活跃的 Claude 限制使用错误的提供者身份",
- "N8kYEP4": "Codex 限制使用错误的提供者身份",
- "OWfo7Qc": "Claude 限制使用错误的提供者身份",
- "95Xks08": "WSL Codex 帐户需要精确的发行版",
- "OZiafyo": "Host Codex 帐户无法命名 WSL 发行版",
- "ZlNO6fQ": "WSL 速率限制目标需要精确的发行版",
- "EIhMdN0": "主机速率限制目标无法命名 WSL 发行版",
- "zFyydp8": "此帐户没有可用的重置积分。",
- "_-grAdc": "无法重置",
- "Um-XfOo": "符合条件的 Codex 速率限制窗口未用尽。",
- "JMEauuw": "没有什么可以重置的",
- "3qHVa1w": "Codex 用法已刷新。",
- "9b3h0Pg": "重置已应用",
- "QiJiFeQ": "速率限制重置",
- "V9XaZZ8": "关闭抽屉",
- "84CVutM": "空白 Terminal",
- "5hDxS58": "这会花费一次 {{value0}} 的重置,并立即重置符合条件的速率限制窗口。",
- "EzPa9ek": "使用速率限制重置?",
- "TKIeXbw": "无法重置速率限制",
- "rii7ZAs": "在主持人联系 Codex 之前,帐户或重置优惠已发生更改。查看更新的详细信息,然后再次确认。{{value0}}",
- "4DQGAog": "重置详细信息已更改",
- "W6bmrY4": "mermaid",
- "kPLcd1A": "链接拉取请求",
- "UzLJy8Q": "链接#{{value0}}",
- "5tB7Tdg": "#123 或 https://github.com/owner/repo/pull/123",
- "D2wJo3U": "PR 号或 GitHub URL",
- "ZLWuIYo": "取消",
- "f8ZsL9k": "链接现有拉取请求",
- "T0kbQLc": "创建 {{value0}}",
- "zouGGt0": "创建草稿 {{value0}}",
- "YpkfCr0": "推送并创建 {{value0}}",
- "aUTTsqg": "推送并创建草稿 {{value0}}",
- "3Yb2tD4": "创建为草稿",
- "oPjbjuk": "根据",
- "UsM_A3E": "正在生成标题和描述...",
- "-QF2aQc": "{{value0}} 描述",
- "-uhp5Eo": "说明(可选)",
- "CYW43ss": "{{value0}} 标题",
- "JnixruY": "标题",
- "56ar5ss": "取消",
- "w4jN8ic": "生成",
- "E5u75yA": "生成…",
- "Tf6JzYM": "无法生成 PR 字段",
- "gTT3Qik": "新建 {{value0}}",
- "LINjP1k": "当前分支不可用。",
- "_svp6us": "该提供商无法托管评审小组。",
- "nO4i6C8": "取消链接",
- "ZqSwRWA": "取消链接拉取请求",
- "zRLzboM": "重新打开",
- "gL1buuY": "关闭",
- "2xdqaDc": "重新打开拉取请求",
- "Pz82S8w": "关闭 PR",
- "Al6-RQA": "关",
- "oSg4C5A": "开",
- "X0q7qvA": "切换自动合并",
- "0J91CIk": "准备好后自动合并",
- "8xiSsiA": "合并拉取请求",
- "3XhqaKU": "#{{value0}} 将重新打开。",
- "oCXRjL8": "重新打开拉取请求?",
- "b_7nPgo": "#{{value0}} 将关闭而不合并。",
- "02Qj2V4": "关闭拉取请求?",
- "zNuHY-c": "这会将 #{{value0}} 合并到其基础分支中。",
- "_0lAHWg": "合并拉取请求?",
- "uLhV2xU": "无法取消链接拉取请求。",
- "q6iGz3o": "显示前 100 个作业",
- "HW_qZBo": "显示前 20 个注释",
- "x1QqPYg": "注释",
- "xJbH0vA": "没有详细信息。",
- "WPX7hnI": "在网络上打开 {{value0}}",
- "wKKGPQ8": "{{value0}} 查看详细信息",
- "QiC7wz8": "修复",
- "O95nvcA": "使用 AI 修复失败的检查",
- "t67jzCk": "检查详细信息或启动 AI 修复过程。",
- "TkRK-a4": "重新运行失败的检查",
- "hyZyn8M": "检查项",
- "XfucVi0": "{{value0}} 检查失败{{value1}}",
- "W8A4HvA": "这将永久删除 GitHub 上的评论。",
- "xGeFr98": "删除评论?",
- "p4p6sek": "写回复...",
- "7oybC2M": "解决",
- "A6XXe-4": "未解决",
- "2PITe20": "解决线程",
- "mkEkYMY": "未解决的线程",
- "4idOoK8": "删除",
- "u9hUgiY": "删除评论",
- "wS1VT0I": "编辑",
- "Fs36PXM": "编辑评论",
- "Ragn9hY": "回复",
- "s3o5DeE": "回复评论",
- "Bnwan2Q": "编辑评论...",
- "FKCKtAo": "在 GitHub 上打开评论",
- "C_gXfCo": "已解决",
- "EXMnl_4": "取消",
- "2Mrfqx0": "添加评论...",
- "xX8eZhc": "还没有评论。",
- "FVdefgc": "无法加载评论。点击刷新重试。",
- "_l0TaO0": "评论",
- "vdfQtbs": "没有提供描述。",
- "hO2eecI": "无法加载描述。点击刷新重试。",
- "6VkqcQk": "描述",
- "vV46Tns": "共 {{value1}} 条,再显示 {{value0}} 条",
- "cHoCGwY": "再显示 {{value0}} 条",
- "wAwFDJY": "由 {{value1}} {{value2}} 解决 {{value0}}",
- "zrerXGc": "解决与AI的冲突",
- "w2WcFns": "冲突的文件",
- "KuLUlYc": "复制命令",
- "7E56l1g": "已复制",
- "6TXtA4Q": "复制可合并性刷新命令",
- "39Nl8mw": "从此工作树运行",
- "7Qv5eYo": "该分支存在必须解决的冲突",
- "93sCYQo": "落后 {{value0}} 个提交 (基础提交:",
- "ngn4NjA": "落后 {{value0}} 个提交 (基础提交:",
- "mTbAh0Q": "commit",
- "DnSMHG0": "冲突",
- "8Est-xI": "删除 {{value0}}",
- "jBToX-I": "没有要求评审人",
- "T5Uc4Ao": "无法加载评审人。点击刷新重试。",
- "Ryr3DCQ": "正在加载评审人...",
- "fX2uAEU": "评审人",
- "E5rQqRQ": "添加或删除评审人",
- "E2VHius": "编辑拉取请求标题",
- "oBmCrB8": "保存",
- "xOwofss": "保存标题",
- "UgBLL4w": "取消",
- "D-7jM08": "取消编辑标题",
- "nbfmLgg": "在网络上打开拉取请求#{{value0}}",
- "eNX9Nmo": "链接现有 PR",
- "_mT5R7M": "链接现有拉取请求",
- "SRr0o4U": "当前分支未链接到开放的 PR。",
- "CmpszXU": "{{value0}} 未链接到开放的 PR。",
- "maf-eds": "刷新再次检查,或者为此分支创建新的 PR。",
- "G2BaE-Y": "没有开放的拉取请求",
- "I3xSuPA": "链接 PR #{{value0}} 不可用",
- "5kE-iVM": "创建 PR",
- "Y_NnJ9M": "创建拉取请求",
- "YZFe3Qg": "刷新拉取请求",
- "TSDVcKU": "PR",
- "tca0V2E": "无法创建拉取请求。",
- "EMFMGnw": "在创建拉取请求之前检查分支。",
- "6OYLM7w": "没有匹配的人",
- "Ne-d-yA": "搜人",
- "K34xo24": "评审人",
- "dVs-M9I": "加载人员失败",
- "_IeDTL8": "已审核",
- "NEg29tM": "待办的",
- "dmAcep8": "被解雇",
- "bF0aphw": "评论过",
- "rjj84-Y": "要求更改",
- "IloG18k": "已批准",
- "hCKjn9A": "没有检查项",
- "_RfDeuw": "机器人",
- "4fGywsA": "人类",
- "rkpE-Mg": "全部",
- "u8NH0Xk": "Esc键",
- "rfYWlSA": "发送文本到浏览器",
- "g3GvsOs": "在页面上输入...",
- "48esWoc": "好的",
- "RXEfHVA": "取消",
- "z1nkBLw": "浏览器对话框",
- "-00MlTU": "网址",
- "GVCAd00": "重新加载",
- "-YMBg9U": "转发",
- "a_PEZW8": "返回",
- "5dQ6Hbc": "输入有效的 URL。",
- "ZoS2fOc": "浏览器流超时。",
- "YmwDAcU": "浏览器页面尚不可用。",
- "lBu6FGw": "检查桌面浏览器流支持。",
- "X2WJPN4": "更新桌面 Orca 以在移动设备上流式传输浏览器选项卡。",
- "gZUBadw": "{{value0}} 点击修饰符",
- "GTbLYFM": "转移",
- "fP87QIY": "替代",
- "EqW8StQ": "控制键",
- "IW8xp4k": "命令",
- "lV607bI": "显示 {{value0}} 网站视图",
- "eJJUzYE": "移动端",
- "3TuUR-s": "网络",
- "p7fz5tw": "恢复 agent 会话",
- "f1-v-HM": "当前工作树",
- "tL7Cy3c": "消息",
- "fZXkGhQ": "信息",
- "L_8qprI": "此范围内没有过去的 agent 会话。",
- "X8748Hs": "没有会话符合您的搜索。",
- "KkgSO8k": "无 agent 会话",
- "Uc72mxE": "搜索会话、repo:、路径:",
- "7OL03t8": "重试",
- "IFh38kk": "无法加载",
- "D1lHtt4": "在此主机上更新 Orca 以浏览 agent 会话历史记录。",
- "yRlsHYk": "Agent 会话历史记录不可用",
- "Qvd5WD0": "刷新 agent 会话",
- "z2KOXZE": "Agent 会话历史",
- "bGNaHw8": "返回",
- "HsI5rsc": "无法恢复会话。",
- "sibM7yE": "Agent 会话已排队。",
- "ADvyKkM": "无法确定主机平台。",
- "8fvhHmw": "此会话缺少简历 ID。",
- "BLr07Ao": "等待主人...",
- "rcPfxtE": "全部",
- "dhgeP_o": "项目",
- "0k6Zchk": "工作区",
- "E5PTzrk": "{{value0}} {{value1}} 已跳过",
- "nSh69OQ": "等待主人...",
- "Au06U2c": "Agent 会话历史",
- "XjyxBLA": "源代码控制",
- "pBOdX2k": "@orca_build",
- "qfIlnqY": "stablyai/orca",
- "1sjQKuE": "onOrca.dev",
- "wRf8z4A": "适用于 100x 构建器的开源 agent IDE",
- "o1zkACA": "Orca",
- "qBqOdtg": "关于",
- "wdyLCXU": "打开 terminal 链接",
- "K6VU-6c": "选择 terminal 输出中点击的 HTTP(S) 链接的打开位置。",
- "gh7VaTc": "链接",
- "GJwMNak": "浏览器",
- "Wj6QRnE": "在此手机上使用 Safari、Chrome 或其他浏览器打开。",
- "hIo6XgE": "手机浏览器",
- "Z49nZqQ": "从配对桌面在流式浏览器中打开。",
- "OcnHGtE": "桌面版 Orca 浏览器",
- "POUjxlM": "没有配对的主机。",
- "FX9lUwo": "本次会话还没有连接事件。当应用程序拨打该主机时,会出现事件。",
- "GiZXYb8": "复制诊断",
- "DYy9eRs": "已复制",
- "mu5iayg": "· 尝试{{value0}}",
- "x43FzPs": "连接日志",
- "rqAbU9s": "您已连接",
- "bKwbnYs": "扫码",
- "N1Ra8Og": "打开 Orca 桌面",
- "o8-uNXo": "删除“{{value0}}”?您可以稍后重新配对。",
- "yOJT3HY": "删除主机",
- "t1m0jcA": "移除",
- "dqjXxV8": "编辑主机",
- "RwT781U": "断开连接",
- "JnIDr0Y": "7天",
- "_KqkyAU": "5小时",
- "VXpHvL4": "账户使用情况",
- "8CNCPA8": "新工作区",
- "lWqrsbM": "配对桌面",
- "1St5QBU": "快捷操作",
- "y7w0hIs": "任务",
- "ROZQW2U": "恢复",
- "81Qrbno": "台式机",
- "TPknwrs": "已创建 PR",
- "4uJ9yUY": "Agent 时间",
- "qFFbXcQ": "已启动 Agents",
- "9i5ZhFo": "欢迎回来",
- "9HldFAc": "它是如何运作的",
- "QT_H7rk": "与计算机上的 Orca 配对,检查您的 agents,跳入任何 terminal,并通过手机推动工作。",
- "8vieqXE": "连接您的桌面",
- "VjaDNq0": "Orca",
- "GLgoz1s": "请再试一次。",
- "U7WlIpo": "无法删除主机",
- "tNj4XnM": "打开 {{value0}} 任务",
- "1_sz9cs": "未连接任务源",
- "aOm3VN4": "入职进度",
- "mB8kw4M": "Orca",
- "6vGSxlM": "无法更新通知设置。再试一次。",
- "Dl9ttFI": "无法保存您的选择。再试一次。",
- "LutlQWg": "在聊天 UI 中打开会话",
- "p0ydSMw": "关",
- "OXcAS68": "开",
- "sW_6PG4": "选择受支持的 agents 会话(Claude、Codex 和其他支持聊天的 agents)在此设备上打开的方式。Terminal 显示原始 CLI;聊天 UI 显示类似于桌面应用程序的聊天界面。您仍然可以通过长按菜单切换任何单个会话。",
- "R7mksio": "默认视图",
- "ao09T48": "Chat UI",
- "yTJLwao": "返回",
- "x7lqDGA": "打开设置",
- "aXWuT8I": "Agent 通知",
- "GIjQvDw": "通知",
- "sKiKFEI": "回到家",
- "zDZEMlw": "正在连接…",
- "gZ1SfD8": "取消",
- "V-NORJA": "一对",
- "3LfZ8xU": "您从桌面打开了配对链接。确认将其添加到您的主机中。",
- "ymuJ-Uc": "与此桌面配对吗?",
- "AHFOidY": "配对失败:{{value0}}",
- "uZiEDJ8": "无法在 {{value0}}s 内连接 — 请参阅下面的日志以了解它停止的位置",
- "-jAAi0E": "orca://pair?code=... or paste the code",
- "G-MJBZU": "将二维码下显示的代码复制到您的计算机上。",
- "klFU7hQ": "粘贴配对码",
- "Q_qrUNw": "粘贴代码代替",
- "_C6l3j4": "重试",
- "T3HZLEU": "正在连接…",
- "U_fkYz4": "或者粘贴配对码",
- "dTFolus": "扫描二维码",
- "mPdpsdo": "前往设置 → 移动设备",
- "dFxLHEw": "在计算机上打开 Orca",
- "wvDgXHk": "打开设置",
- "Scz67W0": "继续",
- "b6n4c_8": "在“设置”中启用相机访问权限,或粘贴配对代码。",
- "InfekMg": "扫描桌面上 Orca 的二维码,或粘贴配对码。",
- "sBkGoYA": "相机访问已禁用",
- "0VOtRkg": "与桌面配对",
- "HVl7cpc": "配对失败:{{value0}}",
- "zyTFKp4": "无法在 {{value0}}s 内连接 — 请参阅下面的日志以了解它停止的位置",
- "feaDGg4": "不是有效的配对码 - 从计算机中复制并再次粘贴",
- "iHaWj50": "不是有效的 Orca 二维码",
- "AIhB-fM": "回到家",
- "eQE_ziw": "缺少配对代码",
- "cFPanOU": "支持",
- "7jufUfc": "隐私政策",
- "EJmGYjM": "重试",
- "ks7el1o": "重试清除配对凭据",
- "kiQMppk": "无法检查此设备上的清理状态。重试以确保安全。",
- "Wh-JD8U": "无法确认此设备上 {{value0}} 凭据{{value1}} 的清理。",
- "K-uhruk": "清理工作仍无法确认。稍后再试。",
- "BFrWnfA": "配对凭证清理",
- "EELdtVU": "关于",
- "0aipMZQ": "故障排除",
- "i8QR0SY": "通知",
- "rm30Zkg": "语音",
- "ttAM7Ds": "浏览器",
- "-aB74WM": "Chat UI",
- "QlyWJyY": "Terminal",
- "0cOgjik": "设置",
- "lfAeAOI": "Terminal 文字大小",
- "nN25Xmo": "恢复 {{value0}}",
- "rE4IiF8": "关",
- "qR5mpHo": "开",
- "AsTLd6A": "自动完成和自动更正",
- "mK_kCfI": "在 terminal 命令栏中启用手机式自动完成、自动更正和拼写建议。默认情况下处于关闭状态,因此键盘永远不会重写命令、标志或路径。直接键盘输入(当按键直接进入 terminal 时)始终发送原始击键,因此建议不适用于此处。",
- "18J3yr0": "键盘输入",
- "QcL6LT4": "文字大小",
- "nzfG92c": "缩放 terminal 文本。较小的尺寸适合更多带有侧边距的列;尺寸越大,显示的列越少 - 向侧面拖动即可平移。您还可以捏合放大 terminal 本身,这会更新此设置。仅按设备显示;不会更改桌面 terminal。",
- "OS-rNTI": "文字大小",
- "U2mtyZg": "尚未配对的桌面。配对一个来控制 terminal 行为。",
- "-fV3Ce8": "当您在手机上使用 terminals 时,Orca 会将其缩小以适合您的屏幕。当您关闭应用程序或切换离开时,这可以控制它是保持手机大小(因此交互式 CLI 工具不会回流)还是将大小调整回桌面。您始终可以使用横幅上的“恢复此 terminals”或“恢复所有 terminals”来手动调整大小。",
- "f9vgUHc": "当您离开应用程序时",
- "kJj5Z2g": "Terminal",
- "rU9qdt0": "30分钟后",
- "p2EWmRg": "5分钟后",
- "gBGOsCI": "1分钟后",
- "q6VQcZE": "保持手机尺寸(默认)",
- "75Kr_24": "最大(200%)",
- "tAn81tY": "更大(150%)",
- "HqP6IBw": "大 (125%)",
- "0OKOsKY": "默认(100%)",
- "CAs8oUM": "较小 (75%)",
- "hiouM1M": "最小(50%)",
- "2J8vm70": "常见问题",
- "bwJLtK4": "查看连接日志",
- "5xQU6vw": "运行诊断",
- "B5C2aso": "再次运行",
- "dQs8-jc": "正在运行…",
- "DIEmGuM": "故障排除",
- "8sOFcoA": "平台",
- "Ie918PM": "主机",
- "3gA9qeo": "互联网",
- "_IfUZ2s": "配对主机",
- "C-t7pm8": "语音模型",
- "n-BJK-c": "语音模型",
- "uwVWBGE": "切换:按一次启动,再按一次停止。按住:按住时听写。",
- "Jh4zuEU": "听写模式",
- "4g1gMYA": "将文本听写到桌面上的任何聚焦窗格中。",
- "23v3WVE": "启用语音听写",
- "L4c5Sxw": "听写",
- "pJrwjt0": "连接到桌面以管理语音设置。",
- "pSmQbNo": "语音",
- "Wgx1aTY": "删除失败",
- "O-GK4L4": "下载失败",
- "cpL32fY": "无法选择型号",
- "PiXz3AQ": "无法更新",
- "wFKD2Es": "无法加载语音设置",
- "hYUl_w0": "抓住",
- "yxHp0Uc": "切换",
- "fO2nz88": "PR",
- "AcEIxcI": "更改",
- "atubgYk": "Agent 会话历史",
- "MZqxT8s": "源代码控制",
- "wtxV_i4": "Terminal",
- "YTfV9-o": "任务",
- "KVY3pfk": "账户",
- "0zcPPW8": "编辑主机",
- "esqB5TM": "主机",
- "lXRU_hQ": "从桌面设置 → 帐户添加或重新验证帐户。",
- "z0N4v1Y": "正在加载帐户...",
- "XheJ_p8": "账户",
- "08ocQGs": "7天",
- "YmnN8fw": "5小时",
- "rjJXJpg": "使用 agent 自己的登录",
- "uuo9M60": "系统默认",
- "5TVCgEg": "无法切换帐户",
- "nnr0WpI": "找不到主机",
- "Cop_m2o": "来自主机的无效帐户快照",
- "sqHaM-Q": "正在连接到 {{value0}}...",
- "dYplni8": "接受 IP、主机:端口或 ws:// / wss://。缺少的端口默认为当前端口(或 6768)。",
- "kMmtf5E": "地址",
- "jHccG1s": "主机名",
- "wLjwLQg": "名称",
- "KytWtss": "更改显示名称或连接地址。地址编辑仅切换此手机连接的位置 - 它们不会重新配对。当可以通过不同的 IP 访问同一桌面时(例如家庭 LAN 与 Tailscale),请使用此选项。",
- "LS3NecQ": "返回",
- "OOhGw28": "保存",
- "ugYhCr4": "保存主机",
- "NKISHlY": "编辑主机",
- "K8w9o8U": "返回",
- "sI26LXo": "保存主机失败。",
- "7UECNUc": "输入名称。",
- "koyS6Oc": "无法加载主机。",
- "T_ULLfI": "该主机已从此手机中删除。",
- "yLNjPPk": "缺少主人。",
- "eB5hKE4": "连接到 {{value0}}",
- "HbMqJ5k": "删除“{{value0}}”?您可以稍后重新配对。",
- "tndsmJE": "删除主机",
- "PCaw7X8": "删除",
- "7b05QJE": "睡觉",
- "jQgIadE": "取消",
- "sCHpXNI": "删除工作树",
- "aCNuYPE": "存储库",
- "MFWDh4g": "隐藏默认分支",
- "1w-t3vQ": "隐藏休眠项",
- "bd8B2ME": "工作区",
- "5IYckMg": "清除筛选",
- "S8jJ9v4": "筛选",
- "fVWdjBk": "分组依据",
- "hFsVshM": "排序方式",
- "sUx-id0": "PR",
- "CzGUIP8": "Repo",
- "GAUYfWk": "状态",
- "mZ5NlSU": "分组",
- "LgVSSVY": "搜索工作区",
- "AYkrJs8": "关闭搜索",
- "LIEbwVI": "新工作区",
- "qs3IfgE": "浮动工作区",
- "V5DOCOQ": "任务",
- "CVlu0tE": "账户",
- "KYYIQO4": "群组工作区",
- "jZR1hFw": "按 {{value0}} 排序",
- "kz_Kdkw": "过滤工作区",
- "6oNXq-k": "过滤工作区,1 个过滤器已启用",
- "DxBfvEc": "过滤工作区,{{value0}} 个过滤器已启用",
- "Iq0v42M": "隐藏侧边栏",
- "2FFC6Og": "重新连接",
- "IDkp2AI": "返回主机",
- "QHBQ8yI": "请再试一次。",
- "P_OTj14": "无法删除主机",
- "2FRJWFs": "找不到主机",
- "2hirWvg": "过滤器{{value0}}",
- "asTmnrM": "删除“{{value0}}”({{value1}})?",
- "ZhTpuGQ": "更新项目",
- "sSNY3pg": "合并拉取请求",
- "cR4zEEM": "合并请求",
- "l77C_aI": "选择如何合并此拉取请求。",
- "AxbwZZ0": "选择如何合并此合并请求。",
- "ax5V10c": "合并方法",
- "ZDweAzI": "改变状态",
- "Fc7HS-c": "合并合并请求",
- "QnAsBMo": "GitHub 报告合并冲突。",
- "MPMGVuk": "合并拉取请求",
- "vW7-nd4": "复制 GitHub 链接",
- "xD9cVOU": "已复制",
- "tS4SSLM": "复制 Linear 链接",
- "14O3-ys": "创建工作区",
- "ftImAuc": "创建中...",
- "D7U7kB4": "暂无评论。",
- "AXmMT_g": "讨论",
- "z1ts1Vw": "添加子问题",
- "G6AAKyI": "子议题标题",
- "czxJ7iQ": "进行中",
- "8MKn4Lk": "没有子问题。",
- "yIapPk8": "子问题",
- "-uupizo": "此 MR 没有运行任何管道。",
- "pzBhZI4": "没有任何",
- "re5Bmac": "{{value0}} 职位",
- "iaudYyQ": "管道",
- "XLoI3kU": "文件内容不可用。",
- "jh3_4KI": "二进制文件。",
- "DtNbEWc": "标记已查看",
- "11IaYcI": "标记为未查看",
- "PYs8iJY": "查看",
- "_Qr_OQY": "隐藏",
- "WhM0uCg": "已更改文件",
- "Ct4OwyY": "没有找到检查。",
- "Hhu9oHM": "重新运行全部",
- "jphAkJQ": "重新运行失败",
- "ruk6BoQ": "刷新",
- "XlbT3Zg": "检查项",
- "KoPjVCY": "请求审核",
- "WTd49qc": "请求评审人",
- "k2ppyKs": "未找到评审人建议。",
- "Re-pmxo": "正在加载评审人...",
- "ifA4snA": "未请求评审人",
- "hDVISbQ": "评审人",
- "FQRH8fY": "更新负责人",
- "X_A_K1Q": "删除用户名,以逗号分隔",
- "K9otrEQ": "添加用户名,以逗号分隔",
- "--H0boQ": "找不到此存储库的可分配用户。",
- "gX4WIW4": "正在加载负责人...",
- "oL0nsd4": "负责人",
- "K9OxCfg": "更新标签",
- "gyu0Q6w": "删除标签,逗号分隔",
- "ByJ_aqM": "添加标签,以逗号分隔",
- "ySDu5JQ": "此存储库中没有标签。",
- "vYfgNJ8": "正在加载标签...",
- "GhHLbBA": "标签",
- "OOzqk6Q": "保存标题",
- "6b2exyc": "标题",
- "bmXEQhk": "保存描述",
- "xX2Cp7c": "描述",
- "iM5LG78": "项目",
- "b3RSkG0": "负责人",
- "Fa6K7yI": "状态",
- "o2-QUvU": "类型",
- "mDTZEr4": "刷新详情",
- "bS5_420": "合并需要 Orca 中的此存储库。",
- "9bffkjg": "关闭项目",
- "vegmy2w": "重新打开项目",
- "jKf3DPI": "在 GitHub 中打开",
- "fngWtc4": "工作区只能从 GitHub 议题和拉取请求创建。",
- "MVHK0qg": "删除",
- "BhSglbo": "编辑",
- "2MyR_iQ": "回复",
- "Rjjl1iA": "解决线程",
- "qEc1OYo": "重新打开线程",
- "Fv7ly30": "取消",
- "xxWLKS8": "保存",
- "loMCIgM": "编辑评论",
- "z1fMPAI": "显示",
- "Uv1hPbA": "{{value0}} 条评论",
- "GKSPk20": "清晰的视野",
- "akD0kZQ": "保存字段",
- "5gzka0E": "文字",
- "1jNZjFQ": "数字",
- "KulyzJY": "年-月-日",
- "CXQp8Pw": "没有可用的迭代。",
- "6tQv41I": "输入 YYYY-MM-DD 格式的日期。",
- "DqtxPEI": "输入有效号码。",
- "JV1Xsds": "项目领域",
- "3p4QMPc": "透明型",
- "5DEGuK4": "没有为此存储库配置议题类型。",
- "w23rmTc": "正在加载议题类型...",
- "1YuDgI8": "议题类型",
- "NnYhRJs": "项目项目",
- "jGZods8": "草案问题",
- "xcg6mvE": "议题",
- "Bawm-QY": "PR",
- "eGT8LNM": "复制存储库",
- "p3aCd2Y": "存储库不在 Orca 中",
- "eNyNmbU": "别跑",
- "llz-FzM": "永远信任并奔跑",
- "520CKU4": "无法信任安装脚本。",
- "m-fVevQ": "运行钩子",
- "XPutx64": "设置脚本",
- "vtdIQWU": "新的设置脚本",
- "Q3oUbk4": "该存储库的 orca.yaml 在工作区启动之前在您的计算机上运行。仅当您信任此存储库时才运行它。",
- "M_Pqsow": "从 {{value0}} 运行安装程序?",
- "QetdCKc": "{{value0}} 的设置脚本已更改",
- "xd1VuYs": "跳过设置并创建",
- "b0Ah5tg": "运行安装程序并创建",
- "N0pQdfg": "运行安装脚本?",
- "g2mP3mE": "src/渲染器包/ui",
- "chkWwSI": "目录",
- "oh8k9MM": "渲染器用户界面",
- "7dCN6Lk": "名称",
- "al2hOTo": "编辑稀疏预设",
- "m6fKanI": "新的稀疏预设",
- "6-gKCU8": "新预设",
- "m38OFiM": "使用整个存储库",
- "0fqNjoo": "完整检出",
- "6xj6dHo": "稀疏结帐",
- "uwfc5JU": "没有分支匹配。",
- "ajFYYlY": "使用此存储库的配置基础",
- "tJhJMIQ": "默认分支",
- "ww9236A": "搜索分支",
- "O0AHKnE": "选择一个现有的分支或参考。",
- "vqofDcI": "开始于",
- "wD7tyKU": "Agent",
- "RBS8OI4": "存储库",
- "SWOSFtY": "连接存储库",
- "phVPn2Q": "检测剂...",
- "4F__ZBY": "未找到存储库。",
- "6kKiG2U": "在创建 Linear 工作区之前添加 Git 存储库。",
- "naggWL4": "开始于",
- "8PDq1d4": "高级",
- "SRP0mzk": "首先连接存储库",
- "5URSVzY": "[可选]",
- "nr-rmnA": "工作区名称",
- "eDrVQno": "连接",
- "HIci8AI": "正在连接...",
- "hcl0Sms": "SSH 连接",
- "UHWW7sY": "创建工作区于",
- "8aaa0oM": "您的密钥通过主机操作系统钥匙串加密并存储在本地。",
- "KV_5X9g": "Linear 设置/安全/新 API 密钥",
- "CCoHJhM": "lin_api_...",
- "a4vIye8": "个人API密钥",
- "6EAEvD4": "粘贴个人 API 密钥以浏览该工作区中的问题。",
- "jbMHil8": "连接 Linear 工作区",
- "Xg1P3sw": "Linear 团队",
- "wSJtlQc": "创建议题",
- "cnRpEac": "添加上下文",
- "dxkQ090": "任务标题",
- "GbFyuJM": "origin",
- "CF9OlC4": "上游",
- "3U3WMlI": "议题来源",
- "czBdX7w": "团队",
- "ZXVz3A4": "在选定的 Linear 团队中创建议题。",
- "V9yDSos": "在选定的存储库中创建议题。",
- "QoLelVI": "排序任务",
- "Jhimi1k": "显示属性",
- "skslBcE": "阶 Linear 议题",
- "4wjHjFU": "群 Linear 议题",
- "59_okJI": "Linear 视图",
- "GpSeJMA": "没有可用的状态",
- "_mQhK7g": "加载状态...",
- "xw1L5lQ": "更改状态",
- "dEIGNBo": "所有团队",
- "UL55j-A": "选择任务中显示的团队。",
- "ZnNVwOs": "Linear 团队",
- "nLSftbc": "切换工作区失败",
- "3Nokros": "Linear 工作区",
- "jnRj_2I": "Linear 滤波器",
- "EQxa0Qk": "隐藏在卡片中",
- "p0Rtsu4": "显示在卡片上",
- "nOtNSyE": "该视图没有额外的字段可显示。",
- "3YhoII8": "选择项目卡上显示的项目字段。",
- "kqKUAww": "项目领域",
- "TcKUEto": "项目排序",
- "pTwUfTs": "Orca 尚不支持此 GitHub 项目布局。",
- "E_vNSwU": "项目视图",
- "4KsU0uw": "选择项目视图",
- "RzP96Tg": "没有更多的项目了。",
- "HH8i3aE": "没有匹配的项目。",
- "yJYA52k": "浏览全部",
- "2BAkBs4": "浏览全部(加载中...)",
- "70mLMDk": "固定",
- "d2YMdrw": "最近的",
- "6WVhiZM": "移除",
- "Rn74bFA": "已固定",
- "0Dc-Ym0": "点击重试。",
- "dbO6elU": "没有加载项目",
- "wpUutIo": "无法加载项目",
- "9srv5vA": "使用“按 URL 添加”来访问缺失的项目。",
- "x8yvGR0": "某些组织未加载 ({{value0}})。",
- "rTimB6Y": "无法从 {{value0}} 加载项目。",
- "25-g19E": "添加",
- "i7LVjnE": "添加...",
- "Qyb0AbI": "通过 URL 或所有者/号码添加",
- "gBglOLc": "搜索项目",
- "6e87BT8": "选择“任务”页面的项目视图。",
- "4pG_Id0": "GitHub 项目",
- "5kq0ekc": "加载较旧的结果",
- "cR6luW0": "已加载",
- "K80V7xk": "跳转到已加载或可用的结果页面。",
- "Zpsg1Hk": "GitHub 页面",
- "41d4YcM": "议题",
- "sQ-iS-M": "请求请求",
- "LkEKGa8": "GitHub 查看",
- "a5ldOMU": "没有可用的替代议题来源。",
- "LGWybvE": "选择每个存储库是否从上游或源查询和创建工作。",
- "aqrdcoU": "GitHub 议题来源",
- "FohFTKc": "所有仓库",
- "ec9l6fo": "选择要查询的存储库。",
- "pMWEK5w": "存储库",
- "JAnflBU": "任务来源",
- "7L6hVV8": "前往下一页",
- "7aV6RlU": "第{{value0}}页",
- "mDUXZ5M": "选择页面,页面{{value0}}",
- "eLSyiVk": "前往上一页",
- "SlWRC8A": "从 {{value0}} 更改状态",
- "XHZQUAc": "没有项目项目",
- "F7DoZNU": "浏览项目",
- "UqRLwDk": "选择一个 GitHub 项目",
- "IQp4SP8": "连接 Linear",
- "42DYBxM": "直接从任务中浏览并开始处理分配给您的 Linear 议题。",
- "L9oPTag": "连接您的 Linear 账户",
- "J73iv2w": "此移动任务视图需要更新的桌面运行时。",
- "iUDJtXI": "更新 Orca 桌面",
- "KQkXL08": "您的 token 无法获取子议题数据。",
- "yF0bGcQ": "重试",
- "aCzhUtY": "正在重试...",
- "QU-Uflw": "重试从 {{value0}}/{{value1}} 加载问题",
- "91ACsJY": "无法加载议题,来源",
- "7WH7i2M": "搜索 {{value0}} 任务...",
- "RzsrKAc": "搜索项目视图...",
- "niMSGwc": "展示",
- "_TeSdI8": "任务",
- "-Qqso-0": "所有工作区",
- "Hs-i62I": "查看订单",
- "UhoT2i4": "发送评论",
- "_I4A15k": "添加评论",
- "piHodso": "无法更新议题来源",
- "XuKemqY": "创建任务失败",
- "Sni1IDk": "无法创建 Linear 子问题",
- "GdZdv18": "无法加载 Linear 子问题",
- "YpcHVvo": "添加 Linear 注释失败",
- "gNpYapQ": "Linear 更新失败的问题",
- "_t92UNY": "合并失败",
- "wPJymlU": "GitHub 报告合并冲突。在 GitHub 中打开以继续。",
- "k4ojp0Y": "未能回复",
- "jRm4RmA": "添加评论失败",
- "4Si7jXY": "没有 PR head SHA 就无法发表评论。",
- "b6obzk0": "无法加载文件内容",
- "7sESNDQ": "无法加载此拉取请求的文件内容。",
- "Akq8bGo": "无法更新评论主题",
- "3JBRDbM": "无法更新查看状态",
- "HCcPUIo": "无法同步此拉取请求的查看状态。",
- "ppWaFdk": "无法重新运行检查",
- "_sMIbrI": "刷新检查失败",
- "eYVZBag": "未能请求评审人",
- "4-krOeE": "复制文本失败",
- "Y45YlXw": "复制链接失败",
- "-bXRzXk": "添加评论失败",
- "nOlVFQ0": "无法更新 GitLab 项目",
- "PA_I94w": "无法更新 GitHub 拉取请求",
- "aulxiV4": "更新 GitHub 失败问题",
- "BvA66yA": "更新状态失败",
- "qVRnj6M": "合并 PR 失败",
- "QKHONdI": "无法更新议题类型",
- "Z7UA1fA": "无法通过移动设备编辑此项目议题类型。",
- "QbIagpk": "无法更新项目字段",
- "TE3rsP8": "更新项目失败",
- "2lpu738": "无法通过移动设备编辑此项目项。",
- "UbvF6N4": "删除评论失败",
- "22DpbZo": "该项目评论无法从手机中删除。",
- "Lw1c31w": "无法编辑评论",
- "fToZEE4": "该项目评论无法通过移动设备进行编辑。",
- "aCTe1aA": "在创建工作区之前将项目项存储库添加到 Orca。",
- "8r702TY": "创建工作区失败",
- "xWmoUM8": "无法保存稀疏预设。",
- "MNvx1_M": "搜索分支失败。",
- "f8dRWFk": "无法加载稀疏预设。",
- "WG-yXgM": "打开一个外壳",
- "0uj422Y": "无法加载议题类型",
- "quO-aRc": "无法加载负责人",
- "661kq0E": "加载标签失败",
- "BRtGSdQ": "无法加载详细信息",
- "us3-SEs": "无法加载 Linear 上下文",
- "-QPTwEw": "添加项目失败。",
- "W2b7E0I": "需要项目 URL 或所有者/编号。",
- "6aqSQa0": "无法选择项目",
- "XhuO-88": "无法加载项目视图",
- "y6brnh8": "无法加载更多 GitHub 任务",
- "bMml9Hw": "连接失败",
- "eVVS8u4": "任务加载失败",
- "jxeDUBI": "无法加载任务设置",
- "AmP4Z_A": "更新 Orca 桌面以在移动设备上使用任务。",
- "_SIoB4k": "添加评审评论",
- "T2C3fss": "未发现文本更改。",
- "_96Solc": "按存储库分组,然后是最新活动",
- "45bce5E": "最新活动优先",
- "43utnp4": "已更新",
- "ncl7fEY": "待处理的 GitLab 待办事项",
- "uLI9QAU": "我的待办事项",
- "CNrYYPU": "按存储库合并请求和问题",
- "fxhXe98": "项目 MR",
- "Vejw8iE": "审核分配给您的请求",
- "ox2Q3X4": "待评审",
- "Qcb2h_k": "您编写的拉取请求",
- "DitaVA4": "我的",
- "4q-Iqts": "打开拉取请求",
- "90lx_rw": "分配给您的未解决问题",
- "NeeUliY": "分配给我",
- "4HZ7SXw": "打开 GitHub 议题",
- "QNj7rUo": "GitHub 项目视图",
- "LB-QyhM": "项目",
- "RU009FY": "GitHub 拉取请求",
- "Xj-3fdg": "PR",
- "PAK8mwc": "GitHub 议题",
- "ISISlFo": "优先事项",
- "kpxCp5s": "标识符",
- "Dd-TzXA": "没有分组",
- "JKx6Gd0": "分组列",
- "uoATjeA": "看板",
- "6GAUUa8": "紧凑的问题行",
- "tIgX1ak": "列表",
- "CW8el5g": "最近完成的问题",
- "HauqL5Y": "已完成",
- "kRDldqg": "您创建的问题",
- "o_j-FoE": "创建时间",
- "eNsBySI": "分配给您的问题",
- "pP-07nE": "我的问题",
- "_kT7uQE": "跨互联工作区的开放问题",
- "gIF8518": "全部",
- "Svu67QM": "任何 GitLab 状态",
- "m5Y69Pc": "已关闭的问题和合并请求",
- "BpviSSw": "已关闭",
- "fM4vagY": "合并的合并请求",
- "GtruncU": "合并",
- "Dm3BEDs": "未决问题和合并请求",
- "L9I1oLA": "分配和团队问题",
- "R_7ye6M": "Linear",
- "cBPoyj8": "问题和合并请求",
- "BaXOO9M": "GitLab",
- "monYp5Q": "问题和拉取请求",
- "gcczsRA": "GitHub",
- "fCKRINY": "显示 {{value1}} 差异行的第一个 {{value0}}。",
- "0WWDhS8": "对 {{value0}} 行进行评论",
- "LJbwLTk": "由 {{value1}} 解决 {{value0}}",
- "3fJQdKo": "来源:{{value0}}",
- "F0yrwZ0": "排序:{{value0}}",
- "ntCXZ5E": "字段:{{value0}}",
- "rkPw0BI": "组:{{value0}}",
- "KPrnw08": "订单:{{value0}}",
- "p08Gdhs": "{{value0}} 的首选议题源上游不可用。使用原点。",
- "3-41cjc": "+{{value0}} 字段",
- "g8lrpKM": "进入 {{value0}}",
- "2x3FfB8": "查询 {{value0}}",
- "T-_RK2o": "第{{value0}}页",
- "AHMKHtc": "{{value0}} 团队",
- "GRCIny0": "新 {{value0}} 问题",
- "z7RLmIM": "文件在 {{value0}} 中",
- "Cb83OoQ": "从 {{value0}} 创建",
- "Fg7BUfE": "分支名称:{{value0}}",
- "Cx8BTNg": "在创建此工作区之前,{{value0}} 需要进行设置选择。",
- "-1cVb10": "Orca 中未添加 {{value0}}/{{value1}}。从桌面应用程序添加此存储库,然后刷新移动任务。",
- "TLa90Qg": "GitHub 项目 · {{value0}} {{value1}}",
- "sNIGIT0": "{{value0}} · {{value1}} · {{value2}}d",
- "Y1upIE8": "快速命令",
- "j34FFK4": "移除",
- "RLWvqn8": "删除这个自定义快捷方式吗?",
- "PKSYVds": "https://example.com",
- "ZabOoVw": "输入 URL,或为新选项卡留空。",
- "tKOmSkM": "新浏览器",
- "pg8WJ-k": "Terminal 名称",
- "gKi8D7w": "重命名 Terminal",
- "gahpqR8": "用最新的桌面文件替换手机草稿?",
- "tMSSoFA": "放弃更改",
- "psn3klQ": "丢弃并离开",
- "IytTrKE": "全部复制并离开",
- "knjkJaM": "离开前复印或丢弃手机草稿。",
- "28Q3TbY": "未保存的 markdown 更改",
- "a6FBCvM": "刷新",
- "a79zJAw": "复制路径",
- "_VDitck": "复印笔记",
- "-So6IQg": "为当前笔记选择一个 agent 会话。",
- "eBYSC7A": "发送评论注释",
- "c_XP7YM": "Markdown 笔记",
- "vL8HgZo": "浏览器",
- "1ELofI0": "Terminal",
- "-95LQlw": "新标签",
- "UDf4wts": "粘贴",
- "IdjCS0U": "创建选项卡",
- "S2Yv1rU": "创建中...",
- "Xb4fMs0": "此会话中没有选项卡",
- "jBv9pDk": "关闭工作区创建警告",
- "uDcv4AM": "更多会话操作",
- "zUxrlPw": "重新连接到桌面",
- "z6d7HxM": "返回工作树",
- "m6V9ozk": "Agent 预设不可用",
- "yBLhh9Y": "没有启用 Agents",
- "pUeIX0M": "检测剂",
- "Ggr0PGg": "浏览器页面尚不可用。",
- "xdJzAj8": "移动浏览器流媒体需要桌面更新",
- "6kcq1T8": "在运行之前编辑此快速命令",
- "BYmvBAo": "选择已清除(滚动出缓冲区)",
- "_0rBKLA": "无法复制",
- "A6mZ2G0": "已复制",
- "m332RRE": "无法清除 terminal",
- "8hc6lac": "Terminal 已清除",
- "528pc28": "输入太大(最大 256 KiB)",
- "RJlcmtM": "在主机上打开 Orca 以唤醒休眠 agents。",
- "JnDupXg": "已保存",
- "XIoxeds": "无法复制笔记",
- "dl26MWM": "已复制注释",
- "TDYOpzk": "删除笔记失败",
- "ya3rgTk": "保存笔记失败",
- "TX0YgPk": "添加注释",
- "ElSO0Bs": "无法加载 markdown",
- "eIqJOeA": "{{value0}} 预览",
- "GF9YPY8": "{{value0}} 图像",
- "yHsoXLM": "发送",
- "Kvcps20": "向 AI 发送评审笔记",
- "i7mE8Wc": "复制",
- "G46090U": "复制评审笔记",
- "o0woxZM": "{{value0}} 评论 {{value1}}",
- "bjh73HM": "没有评论笔记",
- "bNrgw7Q": "保存备注",
- "AJOY4oY": "取消",
- "vCc2hyw": "添加评论注释",
- "AMX0qpI": "删除第 {{value0}} 行的注释",
- "XjRhzvI": "在 {{value0}} 行添加注释",
- "7su6EMM": "{{value0}} 差异线 {{value1}}",
- "fAJsFIg": "保存",
- "Hy2xmeg": "放弃",
- "8Uro2f0": "重试",
- "HtCuTmQ": "行 {{value0}}",
- "qrdoHLM": "Commit 失败。",
- "Qpl1k5o": "提交的更改不可用。",
- "aqSqtLI": "步骤 {{value0}}",
- "XfBogi0": "{{value0}} 工具 {{value1}}",
- "WL3i_AY": "图像",
- "tSzSq0U": "附图",
- "9kO5k1s": "文件",
- "76ELAmA": "预览",
- "dZsgG-M": "无法加载文件夹",
- "wA_0d2E": "已获得 Codex 速率限制重置",
- "CiFc9DQ": "例如:pnpm build",
- "d0JpJz4": "例如建造",
- "rMV0BMU": "选择一把钥匙",
- "fTbhbgg": "打开图片",
- "oitC92A": "图像",
- "8ckUTUg": "挂钩",
- "hiRz7rE": "ORCA.YAML",
- "by8gktU": "写备注",
- "AmkPWYA": "远程存储库",
- "2Kl8BY4": "选择一个存储库",
- "QjSzvc4": "没有找到结果。",
- "RIaVSo8": "根据",
- "IOLibYw": "系统默认",
- "2r4Wqzo": "配对日志",
- "G_n7Zxg": "配对日志",
- "Fbnf310": "无法加载语音设置。",
- "4HGax2g": "没有工作树",
- "oRXGJpo": "没有工作树匹配过滤器",
- "d-FojRM": "没有匹配的工作树",
- "Y4yzly8": "搜索工作树",
- "ThGUKR8": "搜索工作树...",
- "3GdsXVQ": "主机",
- "I0vv7aw": "无类型",
- "pjrxOkU": "{{value0}} 目录",
- "DvuAE90": "1 个目录",
- "EmJ0ZpA": "远程存储库",
- "mDtuNkA": "选择一个存储库",
- "kbZvL2g": "Linear 议题",
- "Wg2C-lo": "项目",
- "ybs6rJE": "在 GitHub 中打开视图",
- "KVqCyig": "捷径",
- "WaegjuQ": "文件",
- "Dy-chOU": "Markdown",
- "ps5grWg": "发送命令",
- "XNw0eg0": "输入命令...",
- "Rddk0Io": "输入的文本直接发送到活动 terminal",
- "JQAVlGc": "显示实时 terminal 输入的键盘",
- "WbNNU2M": "添加自定义快捷方式",
- "UjbgRFg": "从剪贴板粘贴",
- "g0S-mpY": "切换到实时 terminal 输入",
- "LNjU0eA": "切换到缓冲命令输入",
- "CAFCbk0": "切换到手机模式",
- "QB6eVqs": "切换到桌面模式",
- "jbJql9k": "隐藏软件键盘并保持当前 terminal 会话打开。",
- "O4uFjyM": "关闭键盘",
- "1Ef6jA8": "装货码头",
- "5g1_I7Y": "检查桌面功能 - 稍后重试",
- "UoNS0D4": "快速命令需要更新桌面",
- "7IGdkR0": "新标签页",
- "Td8lqm0": "开源控制",
- "8NqLc0E": "打开文件资源管理器",
- "OcU2d6s": "无法发送笔记",
- "4BJ8B0k": "已发送注释",
- "SM7vigo": "{{value0}} 文件",
- "Dwq_r1o": "{{value0}} 文件",
- "mLbULQw": "{{value0}} commit",
- "TWTFkY0": "{{value0}} commits",
- "t2Awy1s": "与 {{value0}}",
- "B2yGeak": "连接中断",
- "TI9qKn0": "未知的 terminal 错误",
- "R0VwXOs": "没有生成 commit 消息",
- "-CpqM4g": "此分支尚未准备好创建 {{value0}}。",
- "aDtTv18": "创建 {{value0}}",
- "8TO561E": "拉取请求不适用于此 repo",
- "Xh63VTo": "检查分支状态...",
- "o8ul7Iw": "首先发布分支",
- "9tlos5E": "输入 commit 消息",
- "jzI4z6s": "暂存至少一个文件",
- "Pej4iSQ": "源代码控制操作失败",
- "67FHeO0": "无法加载源代码管理",
- "Z4IRqv4": "无法加载已提交的更改",
- "GXYBPqk": "无上游",
- "1YRKLD4": "{{value0}} 领先,{{value1}} 落后",
- "kbozpKo": "实时输入",
- "_MGGD5E": "启动麦克风",
- "Q7SP9fo": "加工",
- "y6GQnVA": "听力",
- "vXUuukQ": "快捷命令",
- "1rvpPn4": "选择 Agent",
- "SbxgQXc": "添加快捷命令",
- "gaaVrjY": "编辑快捷命令",
- "uVgCcno": "删除",
- "jmIvPBQ": "取消",
- "0dIGtV8": "行: {{value0}}",
- "ZueS87g": "行: {{value0}}-{{value1}}",
- "hLNcWyo": "范围:文件",
- "57DUHqU": "智能体",
- "0hhZYns": "无法在会话中打开",
- "1Z6vya0": "无法加载文件",
- "FuhqCI4": "等待桌面...",
- "vu5sSQI": "正在连接到桌面...",
- "MpjZorw": "放弃",
- "5cnTshE": "停留",
- "jogAQ98": "无法保存文件",
- "Rajm1co": "差异不可用",
- "9Sv7Jb4": "已删除的文件",
- "BrE_aCg": "差异太大",
- "Cku_aRM": "二进制差异",
- "9FhY-Sk": "上下文",
- "0l1OykU": "已删除",
- "bnfXRLU": "额外",
- "eiEI8yY": "· {{value0}} 活跃",
- "qNgdEE0": "{{value0}} 工作树{{value1}}{{value2}}",
- "UL6zDWw": "不允许 - 您的 GitHub 帐户未连接。",
- "nfDKqg4": "出了点问题。",
- "amP19yQ": "在您的计算机上更新 Orca",
- "NkNSfjQ": "更新 Orca 移动版",
- "VWnR13E": "使用重置",
- "_nuDzHY": "取消",
- "rXScUPU": "主机确认了本次尝试,但该手机无法清除其重试记录。稍后重试将重用相同的安全操作 ID。",
- "d5V00qM": "该话机无法清除丢弃的重试记录。重试是安全的,但必须先清除记录,然后才能确认此帐户的新重置。",
- "B0fOGkI": "详情",
- "21rrqn0": "浏览器流失败。",
- "ukxwfJ8": "无法加载 agent 会话",
- "dVAzjOs": "当 agent 需要您的输入或完成任务时,您会在此设备上收到通知。",
- "uzWRFSg": "系统设置中禁用通知。",
- "J055vls": "未选择",
- "qVCBvFg": "最近的",
- "uGLg5VY": "无 Linear 任务",
- "ifuEhog": "没有 GitLab 任务",
- "haGU2eY": "没有 GitHub 任务",
- "OCkeuqU": "没有匹配的任务",
- "Q9YN3Hk": "连接主机加载任务",
- "inyDHB0": "选择项目",
- "73-jDqg": "{{value0}} 团队",
- "rqyU6Yo": "1 队",
- "5U1KC3A": "工作区",
- "DiuXQZo": "领域",
- "BJUllKs": "{{value0}}/{{value1}} 字段",
- "qzEC9yM": "升序",
- "2IFEfeA": "降序",
- "zrhQGaA": "{{value0}} 个代码库",
- "nt1k3hc": "{{value0}} 个代码库",
- "qzhASv0": "{{value0}} 个代码库",
- "dBmZ43Q": "所有代码库",
- "yX2I5Qc": "{{value0}} 来源",
- "x8ioLCA": "选择目标",
- "OR0Rh2U": "“{{value0}}”已经存在。",
- "jBhX2v4": "名称不得超过 80 个字符。",
- "RT1HPds": "姓名为必填项。",
- "TxiIlg0": "无法复制草稿",
- "HimYt6k": "已复制路径",
- "S6RbGW8": "{{value0}} — 点击重试",
- "-4K4pmw": "{{value0}} 选项卡",
- "KRxO3Ug": "1 个选项卡",
- "vFcOLlo": "正在加载标签",
- "6P8BtkA": "浏览器命令失败",
- "sYGlLWQ": "创建浏览器失败",
- "HyIWUac": "输入有效的网址",
- "6oL3kaQ": "创建 Markdown 笔记失败",
- "sgQvHe0": "快速命令",
- "BphZ5Gw": "创建 terminal 失败",
- "DKTAFXw": "保存失败",
- "qIT8ceU": "无法加载文件预览",
- "XD1EPRc": "无法加载差异预览",
- "sJ7CwDw": "文件太大,无法在移动设备上预览",
- "8Ho6nkA": "二进制预览不可用",
- "X1e46P4": "插入听写",
- "V4EVATY": "桌面上已更改",
- "RwIU_9I": "只读",
- "hPnnpWc": "直连·局域网",
- "f3Si3vU": "直接·Tailscale",
- "Lo_8ioI": "Orca Relay",
- "QNvTsRo": "没有 {{value0}}",
- "nDyX2e8": "空白 Terminal",
- "7wOLCCY": "已断开连接",
- "FZM-PD0": "连接失败",
- "wOY1nLM": "重新连接失败",
- "55lbvEs": "认证失败",
- "uEprraQ": "正在重新连接",
- "XpcB6Lk": "部署中继",
- "Y4pY3mY": "正在连接",
- "GyhUU1I": "已连接",
- "VtNQIUo": "推送成功,但创建 {{value0}} 失败:{{value1}}",
- "3fVn1VI": "中止合并",
- "S5cNB0c": "中止变基",
- "wFxT3pM": "正在中止...",
- "wL23gbE": "无分行",
- "EiCMRDA": "未暂存",
- "YcfLGog": "已暂存",
- "ZnNoGOU": "分支",
- "ubcC1kU": "Terminal",
- "nMoq2GI": "文件",
- "oS6AL4Y": "Markdown",
- "YHLAtbk": "浏览器",
- "tgyhT8Q": "新浏览器",
- "bdYtRH8": "工作树",
- "972Qfrg": "在线 {{value0}} 上保存注释",
- "5Rc0T-w": "{{value0}} 未发送的笔记",
- "VuvuQv0": "{{value0}} 条未发送备注",
- "2KfV5_M": "{{value0}} 条备注",
- "87GezVA": "{{value0}} 条备注",
- "ZGxcUL4": "未审阅",
- "08Yk1Go": "备注",
- "ycKwNOI": "正在加载 agent 会话...",
- "FjJb7Lo": "{{value0}} 线 {{value1}}",
- "sDDLSuM": "WSL {{value1}} 上的 {{value0}}",
- "TUCQXxI": "主机上的 {{value0}}",
- "mWMZ-dk": "恢复会话前请先打开一个本地工作区。",
- "eTFpmzo": "此会话存储在主机上,因此无法在 SSH 工作区中恢复。为此项目打开本地工作区。",
- "GLFjyPk": "从历史记录中恢复在运行时托管的工作区中不可用。",
- "WVNYnak": "{{value0}}s 之后",
- "xYaQ41Y": "存储库挂钩",
- "EJg7NQU": "本地挂钩",
- "BeBymFk": "orca.yaml",
- "px-yCeQ": "{{value0}} 条评论",
- "24Kgyy4": "还没有评论",
- "PAtCwbU": "顶级评论",
- "br73014": "评论主题",
- "Ak34AMw": "已解决的审核线程",
- "oj0ltFk": "评审",
- "BWgU598": "已解决的审核",
- "6rtcg5s": "在 Linear 中打开",
- "N_IsXzY": "在 GitLab 中打开",
- "SpAtwKU": "Linear 票",
- "MKTNAHg": "{{value0}} 待办事项",
- "mYLUh0s": "合并请求",
- "PoPA1vA": "空的",
- "cAXZUp4": "合并 PR #{{value0}}?",
- "X5VvyPQ": "变基并合并 PR #{{value0}}?",
- "LCOEY5w": "压缩并合并 PR #{{value0}}?",
- "1Shau08": "压缩合并",
- "psZ6Lys": "PR",
- "xLFr_Co": "合并请求",
- "PAnLDcM": "创建合并 commit",
- "b9yLdBs": "变基和合并",
- "6MEByr4": "未知",
- "cbIMuqY": "可以合并",
- "YEiNYxU": "已阻塞",
- "OXTehpM": "在后面",
- "hIW5XEU": "冲突",
- "AXgAxVM": "合并",
- "Sos7PxI": "{{value0}}/{{value1}} 通过",
- "Uc3hFHs": "{{value0}} 待处理",
- "L37iq1E": "{{value0}} 失败",
- "X9M1AcA": "没有检查项",
- "kjZMz_U": "锁定",
- "1WEmdBA": "草稿",
- "BbDPGbM": "已编辑",
- "qJU9f5Q": "{{value0}} 评论笔记",
- "QGcvPOc": "{{value0}} 条审查备注",
- "kYCT6qM": "由 {{value0}} 解决的线程",
- "ahIRbHk": "{{value0}} 已解决的评论",
- "qcFeMQM": "当前和即将推出的",
- "DCkRqC8": "无法确认此设备上 {{value0}} 凭据的清理。",
- "XStfhOk": "无法确认此设备上 {{value0}} 凭据的清理。",
- "xnvhKbA": "{{value0}} 成绩单被跳过",
- "UXXYuws": "{{value0}} 成绩单被跳过",
- "QlrZNys": "{{value0}} 文件已审核,{{value1}} 注释",
- "J7M3gnY": "{{value0}} 文件已审核,{{value1}} 注释",
- "uM2_gxc": "{{value0}} 文件已审核,{{value1}} 注释",
- "JrNt3Dk": "{{value0}} 文件已审核,{{value1}} 注释",
- "Id8zorY": "{{value0}} 工作树",
- "t4PccRo": "{{value0}} 个工作树",
- "AYqemqw": "{{value0}} 活跃",
- "lXLSjWw": "{{value0}} 检查失败",
- "N7XOlnE": "{{value0}} 检查失败",
- "dG4O1e4": "由 {{value0}} 解决的线程",
- "lXnGpvs": "由 {{value0}} ({{value1}}) 解决的线程",
- "njd-pFg": "{{value0}} 已解决的评论",
- "tQONwOQ": "{{value0}} ({{value1}}) 已解决的评论",
- "uxZVTz8": "{{value0}} 工具调用",
- "IlwwqQs": "{{value0}} 工具调用",
- "OLmV45U": "无题",
- "S-avV-Y": "已暂存 {{value0}} 个已审查文件",
- "IPu47z8": "已暂存 {{value0}} 个已审查文件",
- "TxG95wU": "检查 Tailscale",
- "oBMMuM8": "GitHub 工作项需要 SSH 存储库的 GitHub 远程",
- "m4LECc4": "浮动工作区",
- "ueRRwRg": "连接速度太慢,无法进行语音听写。当连接改善时重试。",
- "hf0yXVE": "无法验证 SSH 连接。重新连接主机并重试。",
- "XOHYcMw": "更新配对的桌面 Orca 应用程序以使用移动语音设置。",
- "cuSNE9k": "Idle",
- "cfFE9JM": "完成",
- "eSniHCo": "被打断",
- "clLXJRk": "等待输入",
- "CeMk5QY": "已阻塞",
- "xLtCpIk": "Working",
- "RvLuxao": "拉取请求 #{{value0}}、{{value1}}、{{value2}}{{value3}}。打开拉取请求。",
- "oDQaC0g": "拉取请求不可用:{{value0}}",
- "MkY5xK4": "加载拉取请求",
- "qE1-68U": "正在创建评论...",
- "JokOS5o": "用租约强制推动...",
- "0BMXLfE": "推动 commits...",
- "PnL-W2o": "正在发布分支...",
- "uN9IaYI": "正在提交更改...",
- "us6yszU": "正在生成 commit 消息...",
- "eCa7Me8": "正在暂存更改...",
- "Kdbzhtg": "此分支尚未准备好创建 {{value0}}。",
- "eeoaUzE": "在创建 {{value0}} 之前推送基础分支。",
- "dhReg-4": "不支持从此分叉创建 {{value0}}。",
- "UNrSqqU": "此分支已存在 {{value0}}。",
- "CMzOREY": "此 repo 不支持创建 {{value0}}s。",
- "i65iwXo": "在创建 {{value0}} 之前进行身份验证。",
- "h5c6qGM": "在创建 {{value0}} 之前同步此分支。",
- "aDj0ISs": "在创建 {{value0}} 之前发布 commits。",
- "J6J02jo": "在创建 {{value0}} 之前切换到功能分支。",
- "eL3YqZQ": "在创建 {{value0}} 之前检出一个分支。",
- "fS2uz3k": "在创建 {{value0}} 之前 Commit 更改。",
- "YnkDu_A": "Orca 无法确认该分支是否已经有 {{value0}}。稍后再试一次。",
- "nUw7_cE": "{{value0}} 已创建,但 Orca 尚无法刷新它。",
- "89Qhlf4": "{{value0}} #{{value1}} 已开放。",
- "G0fuKJo": "没有可 commit 的内容。分支已是最新状态。",
- "qgmf_L8": "推",
- "0OsPYDw": "拉",
- "gSinyKw": "使用租约强制推送以更新远程分支。",
- "5MUJYGA": "将此分支发布到原点。",
- "5OKMsK4": "请先检出分支再发布 commits。",
- "eSJfk9k": "暂存至少一个要 commit 的文件。",
- "MM3ixxY": "暂存所有变更。",
- "YnDfQwA": "输入要 commit 的 commit 消息。",
- "sJ8R-8c": "Commit 分阶段的更改。",
- "lBQzq_8": "在提交之前解决冲突。",
- "aIqyvoY": "远程操作完成后重试。",
- "YkxQqGg": "远程操作正在进行中。",
- "cOOTv9E": "正在进行强制推送。",
- "GqPiXjg": "正在进行中。",
- "6Z1Zr78": "发布分支",
- "gqhNZGI": "同步",
- "AvE0E2k": "暂存全部",
- "7HjRY3c": "Commit",
- "koj5rtA": "强力推",
- "63siVQ8": "请求失败:{{value0}}",
- "8I2nZuQ": "已跳过",
- "Ba1jOdE": "Neutral",
- "lyHptRM": "已超时",
- "thrHxG4": "已取消",
- "NO0ZjtQ": "失败",
- "6lXfNVk": "成功的",
- "9XDJxdU": "进行中",
- "AXw1J4E": "还没有评论。",
- "znwGBr8": "没有人类评论。",
- "BvW_4OE": "没有机器人评论。",
- "jG05lVM": "{{value1}} 的 {{value0}} 加载失败。",
- "zrt1n24": "没有评审人",
- "yMw_C-k": "要求更改",
- "O3Knlx4": "已批准",
- "ziWbd9A": "打开拉取请求检查",
- "z4-dCLM": "浏览并恢复 agent 会话",
- "td40qOY": "您的桌面将出现在此处。一切都经过端到端加密。",
- "-SigWBo": "点击上面的按钮打开扫描仪。指向屏幕上的二维码。",
- "aCJTiqw": "进入设置 → 手机并生成配对二维码。",
- "_wFCKE8": "无法测试",
- "gdHptko": "无连接",
- "DxL3QsM": "意外的反应",
- "O1SHffI": "已连接",
- "uJRC49k": "无法读取主机数据",
- "AtwKjZ4": "无 — 扫描二维码进行配对",
- "OCWSDG0": "{{value0}} 配对",
- "s5C2oPk": "没有描述。",
- "AnvMzjI": "而是复制笔记",
- "0IFqHX0": "新 agent 会话",
- "k5E-6Qo": "检查主机连接",
- "AXVCL9g": "迭代",
- "G_aoVj8": "创建工作区失败",
- "2t3siE4": "当前",
- "X4spS84": "Commit 失败",
- "Cqqzv8U": "无法刷新源代码管理",
- "8Tx_eZw": "无法创建拉取请求",
- "DIh5pvA": "无法更新链接的评论",
- "D8-XyhU": "无法更新链接的拉取请求",
- "GaTugx8": "本地提交将丢失;请改用拉取",
- "qajmB_0": "没有什么可以快进的",
- "fp_5pjo": "快进",
- "UWyesQ8": "快进 ({{value0}})",
- "qq_p9K0": "分支已经发布",
- "5Vkd48o": "分支已更新",
- "N0HpMMg": "同步",
- "26SoVIw": "同步(↓{{value0}} ↑{{value1}})",
- "Ia0aBfU": "没什么可拉的",
- "0pGBpyQ": "拉",
- "oCECucM": "拉 ({{value0}})",
- "zgbzIDs": "没什么可推的",
- "eBZzWkw": "推",
- "9Xtk0Pg": "推 ({{value0}})",
- "cBrXr-8": "Commit 失败",
- "5jVDzOo": "等待桌面...",
- "cIZvHNg": "正在连接到桌面...",
- "zniLwck": "无法加载提交的差异",
- "NJJe3ZA": "请求失败:github.resolveReviewThread",
- "xWj8WHk": "请求失败:github.updatePRTitle",
- "o-JIJFg": "请求失败:{{value0}}",
- "jdt98Vo": "请求失败:{{value0}}",
- "aLzpW3w": "提交的更改失败",
- "nKp2Mj0": "提交的更改不可用",
- "FJnzL9Y": "未暂存",
- "senOKG4": "已暂存",
- "OtjVKog": "Terminal",
- "tod-ra0": "转录流失败",
- "GmBjriA": "切换到聊天视图",
- "dqKsMqY": "切换到 terminal 视图",
- "502R_mE": "切换到手机",
- "0XbzIAs": "切换到桌面",
- "BGT_JFw": "Terminal",
- "MOOmRCc": "无法加载差异",
- "1ymIBpg": "无法加载评论",
- "vMHt0l8": "无法加载 agent 会话",
- "4GOORsg": "Terminal",
- "FYj9qCM": "无法连接到 SSH 存储库。",
- "Gli-J-E": "无法读取 SSH 连接状态。",
- "17Ky5K0": "Linear",
- "kWDpsSU": "问题 #",
- "G_t8Rjg": "MR !",
- "Jq988q0": "PR 号#",
- "a6UgDc8": "浏览器对话框",
- "VgO3m0E": "无标题会话",
- "X0HdEQ0": "连接",
- "Ho177Ac": "重新连接",
- "ImyX3J0": "可通过 {{value0}} 联系",
- "JwcgRbU": "固定",
- "dgZsiv8": "取消固定",
- "TNd6PjA": "默认",
- "dXnxHU4": "{{value0}} · 默认",
- "dMUK4L8": "移动设备上不支持的布局",
- "hy_B4J8": "查看#{{value0}}",
- "yvbNVZo": "升序排序",
- "YKWIedk": "当前 {{value0}} · 点击 {{value1}}",
- "P-ZWamw": "使用 GitHub 排名顺序",
- "fERYVNg": "使用 {{value0}} {{value1}}",
- "iD-UhpY": "无法创建 Linear 议题",
- "T_YfEh0": "首先选择一个 Linear 团队。",
- "ffJZE1A": "无法创建 {{value0}} 问题",
- "C3TiEsc": "在创建 {{value0}} 问题之前添加 Git 存储库。",
- "2cHUFuY": "创建子议题失败",
- "KcjImC4": "未找到子问题",
- "ct__F0Q": "无法重新打开线程",
- "LVc8Fk0": "无法解析线程",
- "fpX38uo": "无法将查看的状态与 GitHub 同步。",
- "lanbga8": "无效检查响应",
- "lSNLJ4s": "无法更新 GitHub 状态",
- "8U28lt8": "无法更新 GitHub 项目",
- "QI7iJCw": "所选 agent 已禁用。创建之前选择启用的 agent。",
- "AGIjbJU": "在创建工作区之前连接 {{value0}}。",
- "eCcpIL4": "无法连接到 SSH 存储库。",
- "CyTKwng": "无法读取 SSH 连接状态。",
- "cTL2xfk": "空白的",
- "-JNPw2M": "未找到详细信息",
- "s_tAbdk": "该项目没有受支持的视图。",
- "caw13Gk": "连接 Linear 失败",
- "bNtRw1Q": "无法加载 GitLab 任务",
- "Bt_rGOI": "无法加载 GitHub 任务",
- "ObzOf3Y": "迭代",
- "7wx0uDo": "未分配",
- "14_Cpwk": "无法创建无标题的 Markdown 笔记",
- "1s8dFXg": "Terminal 输入被另一个客户端锁定。",
- "v-nMJVc": "发送笔记失败",
- "5GHrSsw": "无法保存评论笔记",
- "-0DsFBU": "等待桌面...",
- "I4VlaAs": "无法读取 markdown",
- "65j23gQ": "发送 {{value0}}",
- "3ivaga8": "编辑 {{value0}}",
- "9ZRI2cs": "在创建工作区之前连接 {{value0}}。",
- "h8LEFjY": "使用 AI 生成 {{value0}} 详细信息",
- "rOYT-0U": "允许 {{value0}}?",
- "671hHtA": "在浏览器中打开它?\n\n{{value0}}",
- "dTuoCp0": "挤压并合并 {{value0}} #{{value1}}?",
- "M2j9mpc": "{{value0}} 评论",
- "xZ4TQL8": "选择页面,第 {{value0}} 页,共 {{value1}} 页",
- "7LorW8k": "第 {{value0}} 页(共 {{value1}})",
- "CKtsHVY": "{{value0}} 线",
- "ACQh2cM": "{{value0}} 已经开放。",
- "al8M9-M": "拉 {{value0}},推 {{value1}}。",
- "UIMnif0": "拉动 {{value0}} commit。",
- "35baKac": "拉动 {{value0}} commits。",
- "y7z5WcU": "推送 {{value0}} commit。",
- "0yFIngw": "推送 {{value0}} commits。",
- "gx2zC4w": "不是有效的配对码",
- "WABgCvg": "缺少配对代码",
- "_c5oKe0": "进行中",
- "aalP-X8": "放弃",
- "cTkYeR8": "合并请求",
- "OpWJNnA": "合并请求",
- "BWWtnQM": "MR",
- "GqNlrAs": "PR",
- "rUwwMh4": "PR",
- "Qic_Aa4": "PR",
- "-YeAYjI": "放弃",
- "myZTLv0": "可用 {{value0}} 次重置",
- "CfvCAaE": "可用 {{value0}} 次重置",
- "aaZ_2qE": "立即过期",
- "1neVPtc": "{{value0}}后过期",
- "nH5aDJ4": "下一项立即过期",
- "fA_ezvI": "下一项将在{{value0}}后过期",
- "4DTdO1w": "合并",
- "pZ3OPxE": "保存",
- "eVLkMyE": "评论",
- "g0JLO88": "任务",
- "OJSrr6g": "失败的工作",
- "RfH2kOg": "已请求",
- "EaX2_X8": "移除",
- "y2BBXrA": "确认",
- "7RncVJk": "已请求",
- "6BZSEjI": "进行中",
- "3OzvpCE": "刚刚",
- "sC5iGOA": "已关闭",
- "epStUOc": "进行中",
- "sMpsrkY": "审查中",
- "LEXdDEk": "完成",
- "QESpnhs": "Terminal WebView 渲染过程结束",
- "9IP25z8": "Terminal WebView HTTP 错误",
- "GY53tDU": "Terminal WebView 加载失败",
- "_dDm4ic": "F12",
- "T7RTOC4": "F11",
- "d6orzBg": "F10",
- "rI3MEx0": "F9",
- "DR9i7SU": "F8",
- "EbNp-x4": "F7",
- "xOj4ngY": "F6",
- "MmdqLFU": "F5",
- "dMpOhHI": "F4",
- "fNbslzw": "F3",
- "5OQeDMc": "F2",
- "wPNSaMQ": "F1",
- "Z-W6Rzg": "向下翻页",
- "1n1QZYk": "向上翻页",
- "6UajMWQ": "结尾",
- "r2L-IvQ": "家",
- "EvEE7WE": "向右箭头",
- "1TJf6c4": "向左箭头",
- "jB50jh8": "向下箭头",
- "S_D2PxQ": "向上箭头",
- "JAhWIZE": "插入",
- "Wt9qvqo": "前列腺素",
- "1qkhXPI": "上页",
- "bh9E9Gk": "INS",
- "lCZrWn4": "转移",
- "zN_6g9g": "替代",
- "mthhwXw": "控制键",
- "fpKzlOM": "OpenClaw",
- "rZEdz3o": "Devin",
- "Lrz_Jb8": "Hermes",
- "tNRBWNU": "Rovo Dev",
- "X7ZF7JI": "Qwen Code",
- "yUpY07s": "Mistral Vibe",
- "HG6jBAg": "Kimi",
- "uvSF6-U": "Droid",
- "Vly29R0": "Cursor",
- "dSfrwic": "Continue",
- "WeGqDrY": "Command Code",
- "fm231VU": "Codebuff",
- "Vqp3lvY": "Cline",
- "RCPC-L0": "Autohand Code",
- "ufugQXE": "Auggie",
- "6Y3GKfY": "Charm",
- "kej-9Lc": "Kiro",
- "FYcf7kI": "Kilocode",
- "njg39j4": "Amp",
- "Gqznj90": "Goose",
- "FWr_S8c": "Aider",
- "tkhwBEU": "Antigravity",
- "qcMaCQk": "Gemini",
- "GovXMeA": "OMP",
- "BWhYVOA": "Pi",
- "STuGb5Q": "Trae",
- "Y9bn4gA": "Ante",
- "imGLJZs": "MiMo Code",
- "qar2VvQ": "OpenCode",
- "7u-Lga4": "GitHub Copilot",
- "58N2Zh8": "Grok",
- "Tvbh_c4": "Codex",
- "4os-vWc": "OpenClaude",
- "cUAuG8c": "Claude Agent Teams",
- "OZJxvKQ": "Claude",
- "x04i9ik": "无法解析基础分支。",
- "vuFM3_E": "{{value0}}月",
- "m8V_LQQ": "刚刚",
- "-DRFeFw": "已暂存的更改",
- "cdicUlU": "未跟踪文件",
- "cbaJlCE": "更改",
- "knjcZG0": "无法暂存更改",
- "2m5o9w0": "无法通过租约强制推送",
- "I8tYYd4": "推送 commits 失败",
- "HtBxXOI": "发布分支失败",
- "r9Wy-Q8": "Commits",
- "Xawq6ME": "PR",
- "TMv0RaY": "更改",
- "tKcJoxk": "基础分支必须与 head 分支不同。",
- "yBuJIFU": "请选择基础分支。",
- "b89N2ws": "请输入 {{value0}} 标题。",
- "E7yK5NU": "等待生成完成。",
- "DAVoau0": "消息、@文件、/命令",
- "zGX7CcI": "回复未发送",
- "v7vfn5Q": "响应未确认 - 在重试之前检查聊天",
- "6dxPsys": "未发送响应(已断开连接)",
- "sxVCOxI": "选择一个选项",
- "-D7_HMY": "无法加载拉取请求",
- "xEMYAIw": "配对无效",
- "G1BrrUQ": "正在重新连接",
- "7mbOxzE": "已断开连接",
- "Fr9Rdq8": "已连接",
- "yqEocVY": "固定",
- "S_1cAME": "正在连接",
- "eOcfBcE": "答复未发送",
- "ukuLb_A": "回答未确认 — 在重试之前检查聊天记录",
- "UnHHxag": "答复已部分发送 — 在重试之前检查聊天记录",
- "O2gcQk0": "答复未发送(已断开连接)",
- "htcCRsA": "取消未发送",
- "chT2Z44": "取消未确认 — 在重试之前检查聊天记录",
- "Z_x_TcE": "取消未发送(断开连接)",
- "c6Kd_Ps": "消息未发送",
- "4Xgw97k": "消息未发送(已断开连接)",
- "ZkABdzg": "消息未发送",
- "klTsRAk": "交货未确认 - 在重试之前检查聊天记录",
- "t_qfHRA": "消息未发送(已断开连接)",
- "S9MYUPk": "停止未发送",
- "i8UxPTM": "停止未经确认 - 在重试之前检查聊天记录",
- "ZhefrDE": "停止未发送(terminal 未准备好)",
- "QVUePYc": "取消",
- "OxB9eF0": "确认",
- "PpZpLWw": "选择要查看的文件。",
- "Em5nLwQ": "该文件已被删除。添加文件注释或将其标记为已审阅。",
- "YeQabYs": "对于移动预览而言,此差异太大。",
- "FdOHIhk": "该文件无法在移动设备上呈现为文本。",
- "5GRCze0": "清除搜索",
- "GbS1Gw0": "保存",
- "tNw1xEA": "已关闭",
- "QYCFjQw": "草稿",
- "AF7gJFU": "合并",
- "sbQ_yBw": "进行中",
- "rBMjMUM": "{{value0}} 年前",
- "5mTslyc": "{{value0}} 个月前",
- "3u9-Kuw": "{{value0}} 天前",
- "J9EQWOE": "{{value0}} 小时前",
- "XG7ieU0": "{{value0}} 分钟前",
- "xbjFHYU": "刚刚",
- "aJGSaVI": "发送",
- "_ax72Jw": "浏览器指针向上失败",
- "oaarOD4": "浏览器指针向下失败",
- "A-4DgN0": "浏览器指针移动失败",
- "yrjs9M0": "浏览器滚动失败",
- "9E99YI8": "浏览器命令失败",
- "kZGbeC4": "Linear",
- "fvIr9H8": "GitLab",
- "TH4OaOM": "GitHub",
- "xPjEgDM": "低的",
- "7LgwgJM": "中等的",
- "_pcc0Zw": "高的",
- "e3kayEE": "紧迫的",
- "X1FYz1o": "右键单击",
- "AX4IXS0": "意外的 Linear 任务响应",
- "SX56B0U": "无法解析分支基础",
- "f-93Rxs": "无法加载 commit 历史记录",
- "O6Amqhs": "分支状态不可用",
- "9AhI4NI": "Commit 失败",
- "D2XJD5Q": "源代码控制操作失败",
- "1yTzUoY": "等待桌面...",
- "aNYrFtc": "没有可以重新建立基础的基础分支",
- "rF-O-TA": "等待桌面...",
- "q53ZKds": "二进制分支差异预览在移动设备上不可用",
- "AAVqwEI": "Terminal 输入被锁定",
- "kiGJQl0": "发送恢复命令失败",
- "n6zBfFc": "创建的 terminal 响应无效",
- "GWephQg": "创建 terminal 失败",
- "KEeLFyA": "无法准备此旧 Codex 会话。重试恢复。",
- "64b63WI": "剪贴板图像内容必须是base64",
- "Oht8bkc": "剪贴板图像太大",
- "u_SAyGc": "提交的差异不可用",
- "qK2AOt0": "差异响应无效",
- "47q1BdE": "无法加载差异",
- "1eue8fY": "无法加载评论笔记",
- "EgST0cw": "源代码管理响应无效",
- "9Z6xNzo": "无法加载更改",
- "kyy8tNA": "Terminal 输入被锁定",
- "-j2Yzyc": "发送提示失败",
- "8WPx578": "创建的 terminal 响应无效",
- "p20YlWo": "创建 terminal 失败",
- "dzoAXdg": "无法保存审阅状态",
- "a3rNaLA": "等待桌面...",
- "LYAe0FE": "创建的 terminal 响应无效",
- "NhC30K0": "创建 terminal 失败",
- "-NMYOgc": "Terminal 输入被锁定",
- "tpf9SfA": "发送笔记失败",
- "eH92OqQ": "无法对调整大小的剪贴板图像进行编码",
- "qYK5Ouo": "保存快速命令失败",
- "LuqBIhs": "无法开始麦克风录音",
- "oQrz0NI": "保持唤醒本机调用超时",
- "qiXFVWc": "未检测到语音。",
- "Pwq6G9w": "麦克风初始化失败",
- "InUuqhA": "麦克风权限被拒绝",
- "CdTon5s": "无法更新听写设置",
- "9VJGb2s": "删除模型失败",
- "hkwxfd0": "无法开始下载",
- "jcVunZ4": "无法加载听写模型",
- "3cWf_os": "useHostProtocolGates 必须在 内部使用",
- "l0xDyns": "来自主机的无效帐户快照",
- "dWotxRU": "来自主机的无效重置响应",
- "hIvuhiQ": "无法加载检查详细信息",
- "hRiZhQg": "无法加载工作区元数据。",
- "THbZzp4": "无法连接到主机",
- "MJ1SglY": "禁用该 VPN 或启用分割隧道/“允许 LAN”。",
- "n-WXtiA": "非 Tailscale VPN 可以通过远程服务器路由本地流量。",
- "PxeuBQc": "更新 Tailscale 应用程序 - 最新版本修复了重新连接错误。",
- "j0KeldQ": "检查桌面是否已唤醒并在尾网中显示为已连接。",
- "rmMn9Xc": "iOS/Android 可以默默地楔入隧道:在 Tailscale 应用程序中关闭并重新打开 Tailscale。",
- "T6EL0oM": "100.x.x.x 或 *.ts.net 等主机地址通过 Tailscale 连接 - 保持打开状态。",
- "S9tNuKw": "如果超时持续存在,请重新启动这两个应用程序。",
- "gvS1F3o": "返回主机列表并点击您的主机以重试。",
- "uGWzUrE": "检查手机上的 WiFi 信号强度。",
- "neP0TKg": "更新后,您可能需要通过二维码重新配对。",
- "WkJ-I-g": "尝试重新启动 Orca — 配套服务器在启动时启动。",
- "i4fV_jk": "Orca 必须在桌面上打开才能接受连接。",
- "rtC8ngI": "公司/学校网络可能会阻止 P2P — 尝试使用个人热点。",
- "401zg0M": "Linux: sudo ufw allow 6768",
- "ayekp1A": "Windows:Defender 防火墙 → 允许应用程序 — 为专用网络启用 Orca。",
- "REilmMs": "macOS:系统设置 → 网络 → 防火墙 — 允许 Orca。",
- "jEL8NQc": "尝试在两台设备上重新连接 WiFi。",
- "h6u3Ajc": "以太网和 WiFi 必须共享同一子网。",
- "DFWK1QU": "两个设备必须位于同一 LAN 上(除非通过 Tailscale 连接)。",
- "q1Pbqtk": "已选择",
- "p2fnv7c": "{{value0}} {{value1}}",
- "nEDriRI": "Terminal 未初始化 - Terminal 视图中没有就绪信号",
- "7IfxObc": "点击以显示键盘",
- "quM4RwQ": "上传图片到主机",
- "ha7j7qM": "准备麦克风",
- "_-dmI2A": "在桌面上转录",
- "GGXoono": "点击麦克风即可停止",
- "97h575A": "需要评审",
- "39Q08OU": "{{value0}} 位评审人",
- "d8cyKVY": "{{value0}} 位评审人",
- "UMqLjMs": "未解决的检查"
+ "mobileWorkspaceStatuses": {
+ "todo": "待办",
+ "progress": "进行中",
+ "review": "评审中",
+ "done": "完成"
+ },
+ "workspaceListPickerOptions": {
+ "pr": "PR 状态",
+ "status": "状态",
+ "no": "无分组",
+ "server": "服务器顺序",
+ "manual": "手动的",
+ "repository": "存储库,然后是工作区名称",
+ "most": "首先是最近的输出",
+ "recent": "最近的",
+ "alphabetical": "按名字字母顺序排列",
+ "name": "名称",
+ "agents": "需要关注的 Agents,然后是最近的活动",
+ "agent": "Agent 活动"
+ },
+ "agentRowDisplay": {
+ "done": "完成",
+ "interrupted": "被打断",
+ "waiting": "等待输入",
+ "blocked": "已阻塞",
+ "just": "刚刚"
+ },
+ "workspacePrStatusGroups": {
+ "closed": "已关闭",
+ "progress": "进行中",
+ "review": "审查中",
+ "done": "完成"
+ },
+ "task": {
+ "repository": "存储库",
+ "close": "关闭",
+ "reopen": "重新打开",
+ "pullRequest": "PR",
+ "updateItem": "更新项目",
+ "mergePullRequestTitle": "合并拉取请求",
+ "mergeRequestTitle": "合并请求",
+ "chooseHowPull": "选择如何合并此拉取请求。",
+ "chooseHowMerge": "选择如何合并此合并请求。",
+ "mergeMethod": "合并方法",
+ "changeStatusMessage": "改变状态",
+ "mergeMerge": "合并合并请求",
+ "gitHubReportsMergeConflicts": "GitHub 报告合并冲突。",
+ "mergePullRequest": "合并拉取请求",
+ "copyGit": "复制 GitHub 链接",
+ "copied": "已复制",
+ "copyLinear": "复制 Linear 链接",
+ "createWorkspaceMessage": "创建工作区",
+ "creating": "创建中...",
+ "noComments": "暂无评论。",
+ "discussion": "讨论",
+ "addSub": "添加子问题",
+ "subIssueTitle": "子议题标题",
+ "open": "进行中",
+ "noSub": "没有子问题。",
+ "subIssues": "子问题",
+ "noPipeline": "此 MR 没有运行任何管道。",
+ "none": "没有任何",
+ "pipelineJob": "{{pipelineJobCount}} 职位",
+ "pipeline": "管道",
+ "fileContents": "文件内容不可用。",
+ "binary": "二进制文件。",
+ "markViewed": "标记已查看",
+ "markUnviewed": "标记为未查看",
+ "view": "查看",
+ "hide": "隐藏",
+ "changed": "已更改文件",
+ "noChecks": "没有找到检查。",
+ "rerunAll": "重新运行全部",
+ "rerunFailed": "重新运行失败",
+ "refresh": "刷新",
+ "checks": "检查项",
+ "requestReview": "请求审核",
+ "requestReviewers": "请求评审人",
+ "noReviewer": "未找到评审人建议。",
+ "loadingReviewers": "正在加载评审人...",
+ "noReviewersRequested": "未请求评审人",
+ "reviewers": "评审人",
+ "updateAssignees": "更新负责人",
+ "removeUsernames": "删除用户名,以逗号分隔",
+ "addUsernames": "添加用户名,以逗号分隔",
+ "noAssignable": "找不到此存储库的可分配用户。",
+ "loadingAssignees": "正在加载负责人...",
+ "assignees": "负责人",
+ "updateLabels": "更新标签",
+ "removeLabels": "删除标签,逗号分隔",
+ "addLabels": "添加标签,以逗号分隔",
+ "noLabels": "此存储库中没有标签。",
+ "loadingLabels": "正在加载标签...",
+ "labels": "标签",
+ "saveTitle": "保存标题",
+ "title": "标题",
+ "saveDescription": "保存描述",
+ "description": "描述",
+ "project": "项目",
+ "assignee": "负责人",
+ "status": "状态",
+ "type": "类型",
+ "refreshDetails": "刷新详情",
+ "mergeRequires": "合并需要 Orca 中的此存储库。",
+ "closeItem": "关闭项目",
+ "reopenItem": "重新打开项目",
+ "openGitHub": "在 GitHub 中打开",
+ "workspaces": "工作区只能从 GitHub 议题和拉取请求创建。",
+ "delete": "删除",
+ "edit": "编辑",
+ "reply": "回复",
+ "resolve": "解决线程",
+ "reopenThread": "重新打开线程",
+ "cancel": "取消",
+ "save": "保存",
+ "editComment": "编辑评论",
+ "show": "显示",
+ "commentCountComments": "{{commentCount}} 条评论",
+ "clearField": "清晰的视野",
+ "saveField": "保存字段",
+ "text": "文字",
+ "number": "数字",
+ "yyyy": "年-月-日",
+ "noIterations": "没有可用的迭代。",
+ "enterDate": "输入 YYYY-MM-DD 格式的日期。",
+ "enterValid": "输入有效号码。",
+ "projectFieldsMessage": "项目领域",
+ "clearType": "透明型",
+ "noIssue": "没有为此存储库配置议题类型。",
+ "loadingIssue": "正在加载议题类型...",
+ "issueType": "议题类型",
+ "projectItem": "项目项目",
+ "draftIssue": "草案问题",
+ "issue": "议题",
+ "pullRequestMessage": "PR",
+ "copyRepository": "复制存储库",
+ "repositoryNotOrca": "存储库不在 Orca 中",
+ "do": "别跑",
+ "always": "永远信任并奔跑",
+ "failedTrust": "无法信任安装脚本。",
+ "runHooks": "运行钩子",
+ "setup": "设置脚本",
+ "newSetup": "新的设置脚本",
+ "orcaYamlTrustWarning": "该存储库的 orca.yaml 在工作区启动之前在您的计算机上运行。仅当您信任此存储库时才运行它。",
+ "runSetupRepo": "从 {{repoName}} 运行安装程序?",
+ "repoNameS": "{{repoName}} 的设置脚本已更改",
+ "skip": "跳过设置并创建",
+ "runSetupCreate": "运行安装程序并创建",
+ "runSetupScript": "运行安装脚本?",
+ "src": "src/渲染器包/ui",
+ "directories": "目录",
+ "renderer": "渲染器用户界面",
+ "name": "名称",
+ "editSparse": "编辑稀疏预设",
+ "newSparse": "新的稀疏预设",
+ "newPreset": "新预设",
+ "useWhole": "使用整个存储库",
+ "full": "完整检出",
+ "sparse": "稀疏结帐",
+ "noBranches": "没有分支匹配。",
+ "useRepositorys": "使用此存储库的配置基础",
+ "defaultBranch": "默认分支",
+ "searchBranches": "搜索分支",
+ "pick": "选择一个现有的分支或参考。",
+ "startMessage": "开始于",
+ "connectRepository": "连接存储库",
+ "detecting": "正在检测智能体...",
+ "repositoryNotFound": "未找到存储库。",
+ "addGitRepositoryBeforeCreatingLinear": "在创建 Linear 工作区之前添加 Git 存储库。",
+ "start": "开始于",
+ "advanced": "高级",
+ "connectRepositoryFirst": "首先连接存储库",
+ "optional": "[可选]",
+ "workspaceName": "工作区名称",
+ "connect": "连接",
+ "connecting": "正在连接...",
+ "ssh": "SSH 连接",
+ "createWorkspace": "创建工作区于",
+ "your": "您的密钥通过主机操作系统钥匙串加密并存储在本地。",
+ "linearSettings": "Linear 设置/安全/新 API 密钥",
+ "personal": "个人API密钥",
+ "paste": "粘贴个人 API 密钥以浏览该工作区中的问题。",
+ "connectLinearWorkspace": "连接 Linear 工作区",
+ "linearTeam": "Linear 团队",
+ "createIssue": "创建议题",
+ "addContext": "添加上下文",
+ "taskTitle": "任务标题",
+ "origin": "origin",
+ "upstream": "上游",
+ "issueSource": "议题来源",
+ "team": "团队",
+ "createIssueSelectedLinear": "在选定的 Linear 团队中创建议题。",
+ "createIssueSelectedRepository": "在选定的存储库中创建议题。",
+ "sortTasks": "排序任务",
+ "displayProperties": "显示属性",
+ "orderLinearIssues": "阶 Linear 议题",
+ "groupLinearIssues": "群 Linear 议题",
+ "linearView": "Linear 视图",
+ "noStates": "没有可用的状态",
+ "loadingStates": "加载状态...",
+ "changeStatus": "更改状态",
+ "allTeams": "所有团队",
+ "chooseWhichTeams": "选择任务中显示的团队。",
+ "linearTeams": "Linear 团队",
+ "failedSwitch": "切换工作区失败",
+ "linearWorkspace": "Linear 工作区",
+ "linearFilter": "Linear 滤波器",
+ "hidden": "隐藏在卡片中",
+ "shown": "显示在卡片上",
+ "viewHas": "该视图没有额外的字段可显示。",
+ "chooseWhichProject": "选择项目卡上显示的项目字段。",
+ "projectFields": "项目领域",
+ "projectSort": "项目排序",
+ "orcaDoes": "Orca 尚不支持此 GitHub 项目布局。",
+ "projectView": "项目视图",
+ "chooseProjectView": "选择项目视图",
+ "noMore": "没有更多的项目了。",
+ "noMatchingProjects": "没有匹配的项目。",
+ "browseAll": "浏览全部",
+ "browseAllLoading": "浏览全部(加载中...)",
+ "pin": "固定",
+ "recent": "最近的",
+ "remove": "移除",
+ "pinned": "已固定",
+ "tap": "点击重试。",
+ "noProjects": "没有加载项目",
+ "failedLoadProjects": "无法加载项目",
+ "useAdd": "使用“按 URL 添加”来访问缺失的项目。",
+ "some": "某些组织未加载 ({{githubProjectPartialFailureCount}})。",
+ "couldNotLoadProjects": "无法从 {{owner}} 加载项目。",
+ "add": "添加",
+ "adding": "添加...",
+ "addUrl": "通过 URL 或所有者/号码添加",
+ "searchProjects": "搜索项目",
+ "chooseProjectViewTasks": "选择“任务”页面的项目视图。",
+ "gitHubProjects": "GitHub 项目",
+ "loads": "加载较旧的结果",
+ "loaded": "已加载",
+ "jump": "跳转到已加载或可用的结果页面。",
+ "gitHubPages": "GitHub 页面",
+ "issues": "议题",
+ "pullRequests": "请求请求",
+ "gitHubView": "GitHub 查看",
+ "noAlternate": "没有可用的替代议题来源。",
+ "chooseWhether": "选择每个存储库是否从上游或源查询和创建工作。",
+ "gitHubIssue": "GitHub 议题来源",
+ "allRepositories": "所有仓库",
+ "chooseWhichRepositories": "选择要查询的存储库。",
+ "repositories": "存储库",
+ "taskSource": "任务来源",
+ "next": "前往下一页",
+ "pagePage": "第{{pageNumber}}页",
+ "selectPagePageGithubCurrentPage": "选择页面,页面{{githubCurrentPage}}",
+ "previous": "前往上一页",
+ "changeStatusName": "从 {{fromName}} 更改状态",
+ "noProject": "没有项目项目",
+ "browseProjects": "浏览项目",
+ "chooseGit": "选择一个 GitHub 项目",
+ "connectLinear": "连接 Linear",
+ "browseStart": "直接从任务中浏览并开始处理分配给您的 Linear 议题。",
+ "connectYour": "连接您的 Linear 账户",
+ "mobile": "此移动任务视图需要更新的桌面运行时。",
+ "updateOrcaDesktop": "更新 Orca 桌面",
+ "subIssueData": "您的 token 无法获取子议题数据。",
+ "retry": "重试",
+ "retrying": "正在重试...",
+ "retryLoading": "重试从 {{owner}}/{{repo}} 加载问题",
+ "couldNotLoadIssues": "无法加载议题,来源",
+ "searchProvider": "搜索 {{providerLabel}} 任务...",
+ "searchProject": "搜索项目视图...",
+ "display": "展示",
+ "tasks": "任务",
+ "allWorkspaces": "所有工作区",
+ "viewOrder": "查看订单",
+ "send": "发送评论",
+ "addComment": "添加评论",
+ "failedUpdateIssueSource": "无法更新议题来源",
+ "failedCreateTask": "创建任务失败",
+ "failedCreateLinearSub": "无法创建 Linear 子问题",
+ "failedLoadLinearSub": "无法加载 Linear 子问题",
+ "failedAddLinear": "添加 Linear 注释失败",
+ "failedUpdateLinear": "Linear 更新失败的问题",
+ "failedMerge": "合并失败",
+ "gitHubReportsMergeConflictsOpen": "GitHub 报告合并冲突。在 GitHub 中打开以继续。",
+ "failedReply": "未能回复",
+ "failedAddReview": "添加评论失败",
+ "unableComment": "没有 PR head SHA 就无法发表评论。",
+ "failedLoadFile": "无法加载文件内容",
+ "unableLoad": "无法加载此拉取请求的文件内容。",
+ "failedUpdateReview": "无法更新评论主题",
+ "failedUpdateViewed": "无法更新查看状态",
+ "unableSync": "无法同步此拉取请求的查看状态。",
+ "failedRerun": "无法重新运行检查",
+ "failedRefresh": "刷新检查失败",
+ "failedRequest": "未能请求评审人",
+ "failedCopyText": "复制文本失败",
+ "failedCopyLink": "复制链接失败",
+ "failedAddComment": "添加评论失败",
+ "failedUpdateGitLab": "无法更新 GitLab 项目",
+ "failedUpdateGitHubPull": "无法更新 GitHub 拉取请求",
+ "failedUpdateGitHubIssue": "更新 GitHub 失败问题",
+ "failedUpdateStatus": "更新状态失败",
+ "failedMergePull": "合并 PR 失败",
+ "failedUpdateIssueType": "无法更新议题类型",
+ "projectIssue": "无法通过移动设备编辑此项目议题类型。",
+ "failedUpdateProject": "无法更新项目字段",
+ "failedUpdateItem": "更新项目失败",
+ "projectItemCannot": "无法通过移动设备编辑此项目项。",
+ "failedDelete": "删除评论失败",
+ "projectCommentCannotDeleted": "该项目评论无法从手机中删除。",
+ "failedEdit": "无法编辑评论",
+ "projectCommentCannotEdited": "该项目评论无法通过移动设备进行编辑。",
+ "addProject": "在创建工作区之前将项目项存储库添加到 Orca。",
+ "failedCreateWorkspace": "创建工作区失败",
+ "failedSave": "无法保存稀疏预设。",
+ "failedSearch": "搜索分支失败。",
+ "failedLoadSparse": "无法加载稀疏预设。",
+ "openShell": "打开一个外壳",
+ "failedLoadIssue": "无法加载议题类型",
+ "failedLoadAssignees": "无法加载负责人",
+ "failedLoadLabels": "加载标签失败",
+ "failedLoadDetails": "无法加载详细信息",
+ "failedLoadLinearContext": "无法加载 Linear 上下文",
+ "failedAddProject": "添加项目失败。",
+ "expected": "需要项目 URL 或所有者/编号。",
+ "failedSelect": "无法选择项目",
+ "failedLoadProject": "无法加载项目视图",
+ "failedLoadMore": "无法加载更多 GitHub 任务",
+ "connection": "连接失败",
+ "failedLoadTasks": "任务加载失败",
+ "failedLoadTasksSettings": "无法加载任务设置",
+ "updateOrcaDesktopUse": "更新 Orca 桌面以在移动设备上使用任务。",
+ "addReview": "添加评审评论",
+ "noText": "未发现文本更改。",
+ "groupRepository": "按存储库分组,然后是最新活动",
+ "newest": "最新活动优先",
+ "updated": "已更新",
+ "pending": "待处理的 GitLab 待办事项",
+ "myTodos": "我的待办事项",
+ "mergeRequests": "按存储库合并请求和问题",
+ "projectMrs": "项目 MR",
+ "reviewRequests": "审核分配给您的请求",
+ "needs": "待评审",
+ "pullRequestsAuthored": "您编写的拉取请求",
+ "mine": "我的",
+ "openPull": "打开拉取请求",
+ "openIssuesAssigned": "分配给您的未解决问题",
+ "assignedMe": "分配给我",
+ "openGitHubIssues": "打开 GitHub 议题",
+ "gitHubProjectsViews": "GitHub 项目视图",
+ "projects": "项目",
+ "gitHubPull": "GitHub 拉取请求",
+ "prs": "PR",
+ "gitHubIssues": "GitHub 议题",
+ "priority": "优先事项",
+ "identifier": "标识符",
+ "noGrouping": "没有分组",
+ "grouped": "分组列",
+ "board": "看板",
+ "compact": "紧凑的问题行",
+ "list": "列表",
+ "recently": "最近完成的问题",
+ "completed": "已完成",
+ "issuesCreated": "您创建的问题",
+ "created": "创建时间",
+ "issuesAssigned": "分配给您的问题",
+ "myIssues": "我的问题",
+ "openIssuesAcross": "跨互联工作区的开放问题",
+ "all": "全部",
+ "any": "任何 GitLab 状态",
+ "closedIssues": "已关闭的问题和合并请求",
+ "closed": "已关闭",
+ "mergedMerge": "合并的合并请求",
+ "merged": "合并",
+ "openIssuesMerge": "未决问题和合并请求",
+ "assignedTeam": "分配和团队问题",
+ "issuesMerge": "问题和合并请求",
+ "issuesPull": "问题和拉取请求",
+ "diffPreviewTruncated": "显示 {{totalLineCount}} 差异行的第一个 {{maxRenderedPrDiffLines}}。",
+ "commentLine": "对 {{commentLine}} 行进行评论",
+ "source": "来源:{{githubIssueSourceLabel}}",
+ "sortGithub": "排序:{{githubProjectSortLabel}}",
+ "fieldsGithub": "字段:{{githubProjectFieldsLabel}}",
+ "groupLinearGroup": "组:{{linearGroupLabel}}",
+ "orderLinearOrder": "订单:{{linearOrderLabel}}",
+ "preferred": "{{repoName}} 的首选议题源上游不可用。使用原点。",
+ "plus": "+{{githubProjectSummaryFieldCount}} 字段",
+ "baseBranch": "进入 {{baseBranch}}",
+ "querying": "查询 {{prs}}",
+ "teamCount": "{{teamCount}} 团队",
+ "newProvider": "新 {{providerLabel}} 问题",
+ "fileIssue": "文件在 {{issueSource}} 中",
+ "createRef": "从 {{refName}} 创建",
+ "branch": "分支名称:{{localBranchName}}",
+ "repoNameRequires": "在创建此工作区之前,{{repoName}} 需要进行设置选择。",
+ "owner": "Orca 中未添加 {{owner}}/{{repo}}。从桌面应用程序添加此存储库,然后刷新移动任务。",
+ "gitHubProject": "GitHub 项目 · {{repository}} {{projectNumber}}",
+ "base": "根据",
+ "noType": "无类型",
+ "directory": "{{directoryCount}} 目录",
+ "oneDirectory": "1 个目录",
+ "remote": "远程存储库",
+ "selectRepository": "选择一个存储库",
+ "linearIssue": "Linear 议题",
+ "items": "项目",
+ "openView": "在 GitHub 中打开视图",
+ "noLinear": "无 Linear 任务",
+ "noGitLab": "没有 GitLab 任务",
+ "noGitHub": "没有 GitHub 任务",
+ "noMatchingTasks": "没有匹配的任务",
+ "connectHost": "连接主机加载任务",
+ "chooseProject": "选择项目",
+ "oneTeam": "1 队",
+ "workspace": "工作区",
+ "fields": "领域",
+ "githubProject": "{{githubProjectSummaryFieldCount}}/{{githubProjectAvailableSummaryFieldCount}} 字段",
+ "ascending": "升序",
+ "descending": "降序",
+ "selectedHosted": "{{selectedHostedRepoCount}} 个代码库",
+ "repositoryCountRepository": "{{repositoryCount}} 个代码库",
+ "repositoryCountRepositories": "{{repositoryCount}} 个代码库",
+ "allRepos": "所有代码库",
+ "githubIssue": "{{githubIssueSourceRowCount}} 来源",
+ "selectTarget": "选择目标",
+ "workspaceSparse": "“{{workspaceSparseDraftNameCollisionName}}”已经存在。",
+ "nameMust": "名称不得超过 80 个字符。",
+ "nameRequired": "姓名为必填项。",
+ "repositoryHooks": "存储库挂钩",
+ "local": "本地挂钩",
+ "commentCountComment": "{{commentCount}} 条评论",
+ "noCommentsYet": "还没有评论",
+ "top": "顶级评论",
+ "reviewThread": "评论主题",
+ "resolvedReviewThread": "已解决的审核线程",
+ "review": "评审",
+ "resolvedReview": "已解决的审核",
+ "openLinear": "在 Linear 中打开",
+ "openGitLab": "在 GitLab 中打开",
+ "linearTicket": "Linear 票",
+ "todo": "{{todoTarget}} 待办事项",
+ "mergeRequest": "合并请求",
+ "empty": "空的",
+ "mergePr": "合并 PR #{{pullRequestNumber}}?",
+ "rebaseMergePr": "变基并合并 PR #{{pullRequestNumber}}?",
+ "squashMergePr": "压缩并合并 PR #{{pullRequestNumber}}?",
+ "squashMerge": "压缩合并",
+ "mergeRequestMessage": "合并请求",
+ "createMerge": "创建合并 commit",
+ "rebaseMerge": "变基和合并",
+ "unknown": "未知",
+ "able": "可以合并",
+ "blocked": "已阻塞",
+ "behind": "在后面",
+ "conflicts": "冲突",
+ "merge": "合并",
+ "locked": "锁定",
+ "draft": "草稿",
+ "redacted": "已编辑",
+ "resolvedThread": "由 {{commentAuthor}} 解决的线程",
+ "resolvedComment": "{{commentAuthor}} 已解决的评论",
+ "current": "当前和即将推出的",
+ "failedCount": "{{repositoryCount}} 的 {{failedCount}} 加载失败。",
+ "noReviewers": "没有评审人",
+ "changes": "要求更改",
+ "approved": "已批准",
+ "noDescription": "没有描述。",
+ "default": "默认",
+ "subtitle": "{{subtitle}} · 默认",
+ "unsupported": "移动设备上不支持的布局",
+ "viewProject": "查看#{{projectViewNumber}}",
+ "sortAscending": "升序排序",
+ "currently": "当前 {{currentSortDirection}} · 点击 {{nextSortDirection}}",
+ "usesGit": "使用 GitHub 排名顺序",
+ "usesSort": "使用 {{sortFieldName}} {{sortDirection}}",
+ "failedCreateLinearIssue": "无法创建 Linear 议题",
+ "selectLinear": "首先选择一个 Linear 团队。",
+ "failedCreateProvider": "无法创建 {{provider}} 问题",
+ "addGitRepositoryBeforeCreatingProvider": "在创建 {{provider}} 问题之前添加 Git 存储库。",
+ "failedCreateSub": "创建子议题失败",
+ "subIssueNot": "未找到子问题",
+ "failedReopen": "无法重新打开线程",
+ "failedResolve": "无法解析线程",
+ "failedSync": "无法将查看的状态与 GitHub 同步。",
+ "invalid": "无效检查响应",
+ "failedUpdateGitHubStatus": "无法更新 GitHub 状态",
+ "failedUpdateGitHubItem": "无法更新 GitHub 项目",
+ "selectedAgent": "所选 agent 已禁用。创建之前选择启用的 agent。",
+ "connectDisplay": "在创建工作区之前连接 {{displayName}}。",
+ "failedConnectSsh": "无法连接到 SSH 存储库。",
+ "failedRead": "无法读取 SSH 连接状态。",
+ "details": "未找到详细信息",
+ "projectHas": "该项目没有受支持的视图。",
+ "failedConnectLinear": "连接 Linear 失败",
+ "failedLoadGitLab": "无法加载 GitLab 任务",
+ "failedLoadGitHub": "无法加载 GitHub 任务",
+ "iteration": "迭代",
+ "unassigned": "未分配",
+ "editPreset": "编辑 {{presetName}}",
+ "squashMergeConfirmation": "挤压并合并 {{reviewType}} #{{pullRequestNumber}}?",
+ "discussionComment": "{{commentCount}} 评论",
+ "selectPagePageGithubCurrentPageGithub": "选择页面,第 {{githubCurrentPage}} 页,共 {{githubTotalPages}} 页",
+ "pageGithub": "第 {{githubCurrentPage}} 页(共 {{githubTotalPages}})",
+ "confirm": "确认",
+ "requested": "已请求",
+ "low": "低的",
+ "medium": "中等的",
+ "high": "高的",
+ "urgent": "紧迫的",
+ "selected": "已选择"
+ },
+ "accounts": {
+ "host": "主机",
+ "add": "从桌面设置 → 帐户添加或重新验证帐户。",
+ "loading": "正在加载帐户...",
+ "accounts": "账户",
+ "seven": "7天",
+ "five": "5小时",
+ "use": "使用 agent 自己的登录",
+ "system": "系统默认",
+ "could": "无法切换帐户",
+ "hostNot": "找不到主机",
+ "invalid": "来自主机的无效帐户快照",
+ "connecting": "正在连接到 {{hostName}}..."
+ },
+ "edit": {
+ "accepts": "接受 IP、主机:端口或 ws:// / wss://。缺少的端口默认为当前端口(或 6768)。",
+ "address": "地址",
+ "hostName": "主机名",
+ "name": "名称",
+ "connectionAddressDescription": "更改显示名称或连接地址。地址编辑仅切换此手机连接的位置 - 它们不会重新配对。当可以通过不同的 IP 访问同一桌面时(例如家庭 LAN 与 Tailscale),请使用此选项。",
+ "go": "返回",
+ "save": "保存",
+ "saveHost": "保存主机",
+ "edit": "编辑主机",
+ "back": "返回",
+ "failedSave": "保存主机失败。",
+ "enter": "输入名称。",
+ "failedLoad": "无法加载主机。",
+ "hostRemoved": "该主机已从此手机中删除。",
+ "missing": "缺少主机。",
+ "connects": "连接到 {{endpoint}}"
+ },
+ "host": {
+ "removeHostName": "删除“{{hostName}}”?您可以稍后重新配对。",
+ "removeHost": "删除主机",
+ "delete": "删除",
+ "sleep": "睡觉",
+ "cancel": "取消",
+ "deleteWorktree": "删除工作树",
+ "repositories": "存储库",
+ "hideDefault": "隐藏默认分支",
+ "hideSleeping": "隐藏休眠项",
+ "workspaces": "工作区",
+ "clear": "清除筛选",
+ "filter": "筛选",
+ "groupTitle": "分组依据",
+ "sort": "排序方式",
+ "status": "状态",
+ "group": "分组",
+ "searchWorkspaces": "搜索工作区",
+ "close": "关闭搜索",
+ "new": "新工作区",
+ "floating": "浮动工作区",
+ "tasks": "任务",
+ "accounts": "账户",
+ "groupWorkspaces": "群组工作区",
+ "sortSelected": "按 {{selectedSortLabel}} 排序",
+ "filterWorkspaces": "过滤工作区",
+ "filterWorkspaces1": "过滤工作区,1 个过滤器已启用",
+ "filterWorkspacesActive": "过滤工作区,{{activeFilterCount}} 个过滤器已启用",
+ "hideSidebar": "隐藏侧边栏",
+ "reconnect": "重新连接",
+ "back": "返回主机",
+ "please": "请再试一次。",
+ "could": "无法删除主机",
+ "hostNot": "找不到主机",
+ "filterActive": "过滤器{{activeFilterCount}}",
+ "deleteDisplay": "删除“{{displayName}}”({{branch}})?",
+ "noWorktrees": "没有工作树",
+ "noWorktreesMatch": "没有工作树匹配过滤器",
+ "noMatching": "没有匹配的工作树",
+ "searchWorktreesAccessibility": "搜索工作树",
+ "searchWorktrees": "搜索工作树...",
+ "host": "主机",
+ "recent": "最近的",
+ "pin": "固定",
+ "unpin": "取消固定",
+ "remove": "移除"
+ },
+ "quickCommandsTabButton": {
+ "quick": "快速命令"
+ },
+ "worktreeId": {
+ "remove": "移除",
+ "removeCustom": "删除这个自定义快捷方式吗?",
+ "enterUrl": "输入 URL,或为新选项卡留空。",
+ "newBrowser": "新浏览器",
+ "terminalName": "Terminal 名称",
+ "rename": "重命名 Terminal",
+ "replace": "用最新的桌面文件替换手机草稿?",
+ "discardChanges": "放弃更改",
+ "discardLeave": "丢弃并离开",
+ "copyAll": "全部复制并离开",
+ "copyDiscard": "离开前复印或丢弃手机草稿。",
+ "unsaved": "未保存的 markdown 更改",
+ "refresh": "刷新",
+ "copyPath": "复制路径",
+ "copyNotes": "复印笔记",
+ "choose": "为当前笔记选择一个 agent 会话。",
+ "sendReviewNotes": "发送评论注释",
+ "markdownNote": "Markdown 笔记",
+ "browser": "浏览器",
+ "newTabTitle": "新标签",
+ "paste": "粘贴",
+ "create": "创建选项卡",
+ "creating": "创建中...",
+ "noTabs": "此会话中没有选项卡",
+ "dismissWorkspace": "关闭工作区创建警告",
+ "more": "更多会话操作",
+ "reconnect": "重新连接到桌面",
+ "back": "返回工作树",
+ "agent": "Agent 预设不可用",
+ "noEnabled": "没有启用 Agents",
+ "detecting": "正在检测智能体",
+ "browserPage": "浏览器页面尚不可用。",
+ "desktopUpdateRequiredMobile": "移动浏览器流媒体需要桌面更新",
+ "edit": "在运行之前编辑此快速命令",
+ "selection": "选择已清除(滚动出缓冲区)",
+ "couldNotCopy": "无法复制",
+ "copied": "已复制",
+ "couldNotClear": "无法清除 terminal",
+ "terminalCleared": "Terminal 已清除",
+ "input": "输入太大(最大 256 KiB)",
+ "openOrca": "在主机上打开 Orca 以唤醒休眠 agents。",
+ "saved": "已保存",
+ "couldNotCopyNotes": "无法复制笔记",
+ "notesCopied": "已复制注释",
+ "failedDelete": "删除笔记失败",
+ "failedSaveNote": "保存笔记失败",
+ "note": "添加注释",
+ "couldNotLoadMarkdown": "无法加载 markdown",
+ "titlePreview": "{{title}} 预览",
+ "titleImage": "{{title}} 图像",
+ "send": "发送",
+ "sendReviewNotesAi": "向 AI 发送评审笔记",
+ "copy": "复制",
+ "copyReview": "复制评审笔记",
+ "noReview": "没有评论笔记",
+ "saveNote": "保存备注",
+ "cancel": "取消",
+ "addReview": "添加评论注释",
+ "delete": "删除第 {{lineNumber}} 行的注释",
+ "addNote": "在 {{commentLine}} 行添加注释",
+ "titleDiff": "{{title}} 差异线 {{lineNumber}}",
+ "save": "保存",
+ "discard": "放弃",
+ "retry": "重试",
+ "line": "行 {{lineNumber}}",
+ "shortcut": "捷径",
+ "file": "文件",
+ "sendCommand": "发送命令",
+ "type": "输入命令...",
+ "typed": "输入的文本直接发送到活动 terminal",
+ "show": "显示实时 terminal 输入的键盘",
+ "addCustom": "添加自定义快捷方式",
+ "pasteClipboard": "从剪贴板粘贴",
+ "switchLive": "切换到实时 terminal 输入",
+ "switchBuffered": "切换到缓冲命令输入",
+ "switchPhone": "切换到手机模式",
+ "switchDesktop": "切换到桌面模式",
+ "hides": "隐藏软件键盘并保持当前 terminal 会话打开。",
+ "dismissKeyboard": "关闭键盘",
+ "loadingTerminal": "装货码头",
+ "checking": "检查桌面功能 - 稍后重试",
+ "desktopUpdateRequiredQuick": "快速命令需要更新桌面",
+ "newTab": "新标签页",
+ "openSource": "开源控制",
+ "openFile": "打开文件资源管理器",
+ "couldNotSend": "无法发送笔记",
+ "notesSent": "已发送注释",
+ "couldNotCopyDrafts": "无法复制草稿",
+ "path": "已复制路径",
+ "verdict": "{{verdictDisplayLabel}} — 点击重试",
+ "visible": "{{visibleTabCount}} 选项卡",
+ "one": "1 个选项卡",
+ "loadingTabs": "正在加载标签",
+ "browserCommand": "浏览器命令失败",
+ "failedCreateBrowser": "创建浏览器失败",
+ "enterValid": "输入有效的网址",
+ "failedCreateMarkdown": "创建 Markdown 笔记失败",
+ "quick": "快速命令",
+ "failedCreateTerminal": "创建 terminal 失败",
+ "saveFailed": "保存失败",
+ "couldNotLoadFile": "无法加载文件预览",
+ "couldNotLoadDiff": "无法加载差异预览",
+ "fileToo": "文件太大,无法在移动设备上预览",
+ "binary": "二进制预览不可用",
+ "dictation": "插入听写",
+ "changed": "桌面上已更改",
+ "read": "只读",
+ "commentCountReviewNote": "{{commentCount}} 评论笔记",
+ "commentCountReviewNotes": "{{commentCount}} 条审查备注",
+ "copyNotesInstead": "而是复制笔记",
+ "newAgent": "新 agent 会话",
+ "check": "检查主机连接",
+ "unableCreate": "无法创建无标题的 Markdown 笔记",
+ "terminalInput": "Terminal 输入被另一个客户端锁定。",
+ "failedSend": "发送笔记失败",
+ "failedSaveReview": "无法保存评论笔记",
+ "waiting": "等待桌面...",
+ "unableRead": "无法读取 markdown",
+ "sendKey": "发送 {{keyLabel}}",
+ "open": "进行中"
+ },
+ "layout": {
+ "changes": "更改",
+ "agent": "Agent 会话历史",
+ "source": "源代码控制",
+ "tasks": "任务",
+ "accounts": "账户",
+ "edit": "编辑主机"
+ },
+ "connectionHealth": {
+ "reconnecting": "正在重新连接...",
+ "cannotConnect": "无法连接",
+ "cannotReach": "无法到达桌面",
+ "disconnected": "已断开连接",
+ "connecting": "正在连接…",
+ "connected": "已连接",
+ "pairing": "配对无效 — 与您的桌面重新配对",
+ "check": "检查 Tailscale"
+ },
+ "hostEndpoint": {
+ "port": "端口必须为 1–65535。",
+ "missing": "缺少主机名。",
+ "notValidAddress": "不是有效地址。",
+ "notValidHostname": "不是有效的主机名。",
+ "host": "主机不得包含路径或查询。",
+ "use": "使用 ws:// 或 wss:// (或主机:端口)。",
+ "enter": "输入主机地址。"
+ },
+ "mobileRelayHostOverlay": {
+ "expected": "预计配置的中继元数据只有一个端点",
+ "relayHost": "中继主机身份不匹配",
+ "relayIdentity": "中继身份和端点必须共存"
+ },
+ "mobileRelayRpcStreams": {
+ "connection": "连接中断"
+ },
+ "mobileConnectionPathLabel": {
+ "directLan": "直连·局域网",
+ "directTailscale": "直接·Tailscale"
+ },
+ "pairConfirmState": {
+ "not": "不是有效的配对码",
+ "missing": "缺少配对代码"
+ },
+ "terminalAccessoryKeyCatalog": {
+ "clearLine": "清除光标前的行",
+ "delete": "向后删除单词",
+ "end": "行尾",
+ "start": "行首",
+ "reverse": "反向搜索",
+ "suspend": "暂停进程",
+ "clearScreen": "清晰的屏幕",
+ "send": "发送文件尾",
+ "interrupt": "中断 terminal",
+ "arrowRight": "向右箭头",
+ "arrowLeft": "向左箭头",
+ "arrowDown": "向下箭头",
+ "arrowUp": "向上箭头",
+ "forward": "转发删除",
+ "del": "德尔",
+ "backspace": "退格键",
+ "space": "空间",
+ "shiftTab": "切换选项卡",
+ "enter": "进入",
+ "tab": "选项卡",
+ "escape": "逃脱",
+ "esc": "Esc键"
+ },
+ "terminalWebviewEngineErrorState": {
+ "reload": "重新加载",
+ "terminal": "Terminal 加载失败"
+ },
+ "terminalWebviewNotificationDispatch": {
+ "unknown": "未知的 terminal 错误"
+ },
+ "terminalWebView": {
+ "terminalWebViewRender": "Terminal WebView 渲染过程结束",
+ "terminalWebViewHttp": "Terminal WebView HTTP 错误",
+ "terminalWebViewLoad": "Terminal WebView 加载失败"
+ },
+ "terminalAccessoryKeys": {
+ "pageDown": "向下翻页",
+ "pageUp": "向上翻页",
+ "end": "结尾",
+ "home": "家",
+ "arrowRight": "向右箭头",
+ "arrowLeft": "向左箭头",
+ "arrowDown": "向下箭头",
+ "arrowUp": "向上箭头",
+ "insert": "插入",
+ "pgDn": "前列腺素",
+ "pgUp": "上页",
+ "ins": "INS",
+ "shift": "转移",
+ "alt": "替代",
+ "ctrl": "控制键"
+ },
+ "terminalWebviewReadyWatchdog": {
+ "terminal": "Terminal 未初始化 - Terminal 视图中没有就绪信号"
+ },
+ "mobileSmartSourceModes": {
+ "all": "全部",
+ "closed": "已关闭",
+ "merged": "合并",
+ "open": "进行中",
+ "name": "名称",
+ "branch": "分支",
+ "smart": "智能"
+ },
+ "sparsePresetDraft": {
+ "use": "使用 repo 相对目录,而不是根目录、绝对路径或父段。",
+ "add": "添加至少一个目录。"
+ },
+ "mobileGithubProjectGroupSort": {
+ "no": "没有 {{fieldName}}",
+ "iteration": "迭代"
+ },
+ "workspaceAgentSelection": {
+ "blank": "空白 Terminal"
+ },
+ "workspaceSshGate": {
+ "disconnected": "已断开连接",
+ "connection": "连接失败",
+ "reconnect": "重新连接失败",
+ "authentication": "认证失败",
+ "reconnecting": "正在重新连接",
+ "deploying": "部署中继",
+ "connecting": "正在连接",
+ "connected": "已连接"
+ },
+ "mobileHostedCheckStatus": {
+ "passed": "{{passedCheckCount}}/{{totalCheckCount}} 通过",
+ "pending": "{{pendingCheckCount}} 待处理",
+ "review": "需要评审",
+ "reviewerCountReviewer": "{{reviewerCount}} 位评审人",
+ "reviewerCountReviewers": "{{reviewerCount}} 位评审人"
+ },
+ "worktreeCreateRetry": {
+ "failed": "创建工作区失败"
+ },
+ "useMobileComposerSource": {
+ "failed": "无法解析基础分支。"
+ },
+ "linearMobileIssueRead": {
+ "unexpected": "意外的 Linear 任务响应"
+ },
+ "codexResetAttemptJournal": {
+ "wsl": "WSL 重置范围需要精确的发行版",
+ "host": "主机重置范围无法命名 WSL 发行版"
+ },
+ "mobileBranchDiffPreviewDrawer": {
+ "diff": "差异因移动预览而被截断。",
+ "unable": "无法加载差异",
+ "close": "关闭提交的差异预览",
+ "committed": "致力于分支"
+ },
+ "mobileCommitFailurePanel": {
+ "showDetails": "显示详情",
+ "hideDetails": "隐藏详情",
+ "showCommit": "显示 commit 失败详细信息",
+ "hideCommit": "隐藏 commit 失败详细信息",
+ "fix": "修复",
+ "fixCommit": "使用 AI 修复 commit 失败",
+ "commitFailed": "Commit 失败",
+ "commitFailedMessage": "Commit 失败。"
+ },
+ "mobileGitHistoryList": {
+ "noCommits": "没有 commits。",
+ "retry": "重试",
+ "waiting": "等待桌面...",
+ "noFile": "没有文件更改",
+ "failed": "加载历史记录失败"
+ },
+ "mobileSourceControlBranchCard": {
+ "unstaged": "{{unstagedCount}} 已更改",
+ "staged": "已暂存 {{stagedCount}} 个",
+ "branch": "分支上的 {{branchCount}}"
+ },
+ "mobileSourceControlContent": {
+ "generate": "使用 AI 生成 commit 信息",
+ "cancel": "取消 commit 消息生成",
+ "commitMessage": "Commit 信息",
+ "noStaged": "没有暂存文件",
+ "commitMessageDisabled": "Commit 消息已禁用。没有暂存文件。",
+ "working": "工作树很干净。",
+ "noLocal": "没有本地更改",
+ "open": "开源控制措施",
+ "unstage": "全部取消暂存",
+ "stage": "暂存全部",
+ "reconnecting": "正在重新连接到桌面..."
+ },
+ "mobileSourceControlFileRows": {
+ "openCommitted": "打开已提交的变更 {{filePath}}",
+ "loading": "正在加载提交的更改...",
+ "committedBranch": "已提交的更改",
+ "discard": "丢弃 {{path}}",
+ "stage": "阶段{{path}}",
+ "unstage": "取消暂存 {{path}}",
+ "unresolved": "未解决的冲突",
+ "openChanged": "打开更改的文件 {{path}}",
+ "old": "来自 {{oldPath}}",
+ "committedChanges": "提交的更改不可用。"
+ },
+ "mobileSourceControlHeader": {
+ "refresh": "刷新源代码控制",
+ "openPullRequestWeb": "在网络上打开拉取请求",
+ "openPullRequestPull": "在网络上打开拉取请求#{{pullRequestNumber}}",
+ "source": "源代码控制",
+ "back": "返回会话",
+ "close": "关闭源代码控制"
+ },
+ "mobileSourceControlModals": {
+ "openYourBrowser": "在浏览器中打开它?",
+ "pull": "拉取请求已创建",
+ "switch": "切换分支",
+ "discardChanges": "放弃对“{{path}}”的更改?此操作无法撤消。",
+ "discardChange": "放弃变更",
+ "source": "源代码控制",
+ "current": "当前",
+ "openYourBrowserCreated": "在浏览器中打开它?\n\n{{createdPrWarning}}",
+ "open": "进行中",
+ "discard": "放弃"
+ },
+ "mobileSourceControlPanel": {
+ "retry": "重试",
+ "unable": "无法加载",
+ "source": "源代码控制不可用"
+ },
+ "mobileSourceControlPrChip": {
+ "create": "创建拉取请求",
+ "loadingPullRequest": "正在加载拉取请求...",
+ "pullRequestPull": "拉取请求 #{{pullRequestNumber}}、{{stateLabel}}、{{checkSummary}}{{commentSummary}}。打开拉取请求。",
+ "pullRequestUnavailable": "拉取请求不可用:{{summaryMessage}}",
+ "loadingPullRequestMessage": "加载拉取请求"
+ },
+ "mobileBranchCompare": {
+ "committed": "已提交的更改",
+ "changedFileCountFile": "{{changedFileCount}} 文件",
+ "changedFileCountFiles": "{{changedFileCount}} 文件",
+ "vs": "与 {{baseRef}}"
+ },
+ "mobileCommitMessageAi": {
+ "failed": "无法生成 commit 消息",
+ "no": "没有生成 commit 消息"
+ },
+ "mobileCreatePrAction": {
+ "createPull": "创建 PR",
+ "branch": "此分支尚未准备好创建 {{reviewType}}。",
+ "createReview": "创建 {{reviewType}}"
+ },
+ "mobileHostedReviewCreateIntent": {
+ "branch": "准备拉取请求时分支发生了变化。",
+ "could": "无法生成 commit 消息。在源代码管理中添加一个,然后重试。",
+ "resolveStage": "在创建拉取请求之前解决或暂存更改。",
+ "resolveConflicts": "在创建拉取请求之前解决冲突。",
+ "creating": "正在创建评论...",
+ "force": "用租约强制推动...",
+ "pushing": "推动 commits...",
+ "publishing": "正在发布分支...",
+ "committing": "正在提交更改...",
+ "generating": "正在生成 commit 消息...",
+ "staging": "正在暂存更改...",
+ "failed": "无法暂存更改"
+ },
+ "mobileHostedReviewService": {
+ "pushFailed": "推送失败。解决推送错误,然后重试。",
+ "pushSucceeded": "推送成功,但创建 {{reviewType}} 失败:{{errorMessage}}",
+ "failed": "无法创建拉取请求"
+ },
+ "mobileSourceControlActions": {
+ "switch": "切换分支",
+ "rebase": "重新建立基础",
+ "publishBranch": "发布分支",
+ "fetch": "fetch",
+ "pushCreate": "推动并创建 PR",
+ "create": "创建 PR",
+ "commitSync": "Commit 并同步",
+ "commitPush": "Commit&推送",
+ "pullRequests": "拉取请求不适用于此 repo",
+ "checking": "检查分支状态...",
+ "publishBranchFirst": "首先发布分支",
+ "enter": "输入 commit 消息",
+ "stage": "暂存至少一个文件",
+ "local": "本地提交将丢失;请改用拉取",
+ "nothingFast": "没有什么可以快进的",
+ "fastForward": "快进",
+ "fastForwardBehind": "快进 ({{behindCommitCount}})",
+ "branchAlready": "分支已经发布",
+ "branchUp": "分支已更新",
+ "sync": "同步",
+ "syncBehind": "同步(↓{{behindCommitCount}} ↑{{aheadCommitCount}})",
+ "nothingPull": "没什么可拉的",
+ "pull": "拉",
+ "pullBehind": "拉 ({{behindCommitCount}})",
+ "nothingPush": "没什么可推的",
+ "push": "推",
+ "pushAhead": "推 ({{aheadCommitCount}})"
+ },
+ "useMobileCommitFailureRecovery": {
+ "failed": "启动 agent 失败",
+ "waiting": "等待桌面..."
+ },
+ "useMobileCommitMessageGeneration": {
+ "failed": "无法生成 commit 消息"
+ },
+ "useMobileCreatePrRunner": {
+ "check": "在创建拉取请求之前检查分支。"
+ },
+ "useMobileSourceControlLoaders": {
+ "update": "更新 Orca 桌面以在移动设备上使用源代码管理。",
+ "unableResolve": "无法解析基础分支以进行比较。",
+ "unableLoadSource": "无法加载源代码管理",
+ "unableLoadCommitted": "无法加载已提交的更改",
+ "waiting": "等待桌面...",
+ "connecting": "正在连接到桌面..."
+ },
+ "useMobileSourceControlOpeners": {
+ "waiting": "等待桌面...",
+ "unableOpen": "无法打开差异",
+ "unableLoad": "无法加载提交的差异",
+ "binary": "二进制分支差异预览在移动设备上不可用"
+ },
+ "useMobileSourceControlRunners": {
+ "source": "源代码控制操作失败"
+ },
+ "useMobileSourceControlCommitRunners": {
+ "source": "源代码控制操作失败",
+ "commit": "Commit 失败"
+ },
+ "mobileSourceControlScreenState": {
+ "noUpstream": "无上游",
+ "ahead": "{{aheadCommitCount}} 领先,{{behindCommitCount}} 落后",
+ "noBranch": "无分行"
+ },
+ "mobileSourceControlConflictAbort": {
+ "abortMerge": "中止合并",
+ "abortRebase": "中止变基",
+ "aborting": "正在中止..."
+ },
+ "mobilePrChipSummary": {
+ "failing": "{{failingCheckCount}} 失败",
+ "no": "没有检查项",
+ "unresolved": "未解决的检查"
+ },
+ "mobilePrCreate": {
+ "branch": "此分支尚未准备好创建 {{reviewType}}。",
+ "push": "在创建 {{reviewType}} 之前推送基础分支。",
+ "creatingReviewTypeFork": "不支持从此分叉创建 {{reviewType}}。",
+ "reviewTypeAlreadyExists": "此分支已存在 {{reviewType}}。",
+ "creatingReviewTypeS": "此 repo 不支持创建 {{reviewType}}s。",
+ "authenticate": "在创建 {{reviewType}} 之前进行身份验证。",
+ "sync": "在创建 {{reviewType}} 之前同步此分支。",
+ "publish": "在创建 {{reviewType}} 之前发布 commits。",
+ "switch": "在创建 {{reviewType}} 之前切换到功能分支。",
+ "check": "在创建 {{reviewType}} 之前检出一个分支。",
+ "commit": "在创建 {{reviewType}} 之前 Commit 更改。",
+ "orca": "Orca 无法确认该分支是否已经有 {{reviewType}}。稍后再试一次。",
+ "reviewTypeCreated": "{{reviewType}} 已创建,但 Orca 尚无法刷新它。",
+ "reviewTypePull": "{{reviewType}} #{{pullRequestNumber}} 已开放。",
+ "reviewTypeAlreadyOpen": "{{reviewType}} 已经开放。"
+ },
+ "mobileSourceControlPrimaryAction": {
+ "nothing": "没有可 commit 的内容。分支已是最新状态。",
+ "push": "推",
+ "pull": "拉",
+ "forcePushLease": "使用租约强制推送以更新远程分支。",
+ "publishBranchOrigin": "将此分支发布到原点。",
+ "check": "请先检出分支再发布 commits。",
+ "stageLeast": "暂存至少一个要 commit 的文件。",
+ "stageAllChanges": "暂存所有变更。",
+ "enter": "输入要 commit 的 commit 消息。",
+ "commitStaged": "Commit 分阶段的更改。",
+ "resolve": "在提交之前解决冲突。",
+ "try": "远程操作完成后重试。",
+ "remote": "远程操作正在进行中。",
+ "forcePushProgress": "正在进行强制推送。",
+ "commitProgress": "正在进行中。",
+ "publishBranch": "发布分支",
+ "sync": "同步",
+ "stageAll": "暂存全部",
+ "forcePush": "强力推",
+ "pullBehind": "拉 {{behindCommitCount}},推 {{aheadCommitCount}}。",
+ "pullCommitCountCommit": "拉动 {{commitCount}} commit。",
+ "pullCommitCountCommits": "拉动 {{commitCount}} commits。",
+ "pushCommitCountCommit": "推送 {{commitCount}} commit。",
+ "pushCommitCountCommits": "推送 {{commitCount}} commits。"
+ },
+ "mobileHostedReviewGitPreparation": {
+ "commit": "Commit 失败",
+ "unable": "无法刷新源代码管理"
+ },
+ "mobilePrLink": {
+ "failedUpdateLinkedReview": "无法更新链接的评论",
+ "failedUpdateLinkedPull": "无法更新链接的拉取请求"
+ },
+ "hostedReviewCopy": {
+ "mergeRequestTitle": "合并请求",
+ "mergeRequest": "合并请求",
+ "pullRequestTitle": "PR",
+ "pullRequest": "PR"
+ },
+ "mobileGitHistory": {
+ "months": "{{months}}月",
+ "just": "刚刚",
+ "failed": "无法加载 commit 历史记录"
+ },
+ "mobileGitStatus": {
+ "staged": "已暂存的更改",
+ "untracked": "未跟踪文件",
+ "changes": "更改"
+ },
+ "mobileHostedReviewRemotePrerequisite": {
+ "failedForce": "无法通过租约强制推送",
+ "failedPush": "推送 commits 失败",
+ "failedPublish": "发布分支失败"
+ },
+ "mobileSourceControlHubTab": {
+ "pull": "PR",
+ "changes": "更改"
+ },
+ "prComposeValidation": {
+ "base": "基础分支必须与 head 分支不同。",
+ "choose": "请选择基础分支。",
+ "enter": "请输入 {{reviewType}} 标题。",
+ "wait": "等待生成完成。"
+ },
+ "mobileBranchBaseRef": {
+ "unable": "无法解析分支基础"
+ },
+ "useMobileGitRequests": {
+ "branch": "分支状态不可用",
+ "commit": "Commit 失败",
+ "source": "源代码控制操作失败",
+ "waiting": "等待桌面..."
+ },
+ "useMobileSourceControlActionSheetRunners": {
+ "no": "没有可以重新建立基础的基础分支",
+ "waiting": "等待桌面..."
+ },
+ "mobileAgentWorkingIndicator": {
+ "agent": "Agent 正在工作"
+ },
+ "mobileBrowserTabActionSheet": {
+ "reload": "重新加载",
+ "forward": "转发",
+ "back": "返回",
+ "browser": "浏览器"
+ },
+ "mobileNativeChatAsk": {
+ "next": "下一步",
+ "send": "发送回答",
+ "cancel": "取消",
+ "type": "输入你的回答",
+ "other": "其他…",
+ "step": "步骤 {{stepNumber}}"
+ },
+ "mobileNativeChatComposer": {
+ "send": "发送消息",
+ "dictate": "听写",
+ "stop": "停止听写",
+ "attach": "附上图片",
+ "remove": "删除图像",
+ "message": "消息、@文件、/命令"
+ },
+ "mobileNativeChatMessage": {
+ "queued": "已排队",
+ "scroll": "将此消息滚动到顶部",
+ "copy": "复制消息",
+ "remaining": "… {{remainingToolCallCount}} 更多工具调用",
+ "image": "图像",
+ "attached": "附图",
+ "callCountToolCall": "{{callCount}} 工具调用",
+ "callCountToolCalls": "{{callCount}} 工具调用"
+ },
+ "mobileNativeChatQuestion": {
+ "send": "发送回复",
+ "typeYour": "输入您的回复...",
+ "typeReply": "或者输入回复...",
+ "submitSelectedOptions": "提交选定的选项",
+ "submitSelectedCommand": "提交{{selectedCommandCount}}",
+ "choose": "选择一个选项"
+ },
+ "mobileNativeChatView": {
+ "message": "消息、@文件、/命令",
+ "waiting": "等待 terminal…",
+ "reconnecting": "正在重新连接...",
+ "stop": "停止",
+ "stopAgent": "停止 agent",
+ "tools": "工具",
+ "collapse": "折叠",
+ "scroll": "滚动到最新",
+ "load": "加载更早的消息"
+ },
+ "mobileSessionHeaderMoreActionsSheet": {
+ "checks": "检查项",
+ "agent": "Agent 历史",
+ "open": "打开拉取请求检查",
+ "browse": "浏览并恢复 agent 会话"
+ },
+ "mobileTerminalInputActions": {
+ "start": "开始语音听写",
+ "starting": "开始语音听写",
+ "cancel": "取消语音听写",
+ "stop": "停止语音听写",
+ "long": "长按可附加文件",
+ "attach": "附上照片",
+ "sending": "发送图像"
+ },
+ "quickCommandEditorForm": {
+ "add": "添加快捷命令",
+ "save": "保存",
+ "cancel": "取消",
+ "project": "项目",
+ "global": "全局",
+ "scope": "范围",
+ "submit": "立即提交,而不仅仅是插入文本。",
+ "append": "追加输入",
+ "advanced": "高级",
+ "supports": "支持技能、文件路径和内置命令。",
+ "ask": "要求 agent 调查此工作区",
+ "command": "命令文本",
+ "prompt": "提示词",
+ "choose": "选择 agent",
+ "action": "操作",
+ "start": "启动开发服务器",
+ "label": "标签",
+ "agentPrompt": "Agent 提示",
+ "terminal": "Terminal 命令"
+ },
+ "quickCommandsList": {
+ "edit": "编辑 {{commandLabel}}",
+ "run": "运行 {{commandLabel}}",
+ "quick": "已达到快速命令限制",
+ "new": "新的快速命令",
+ "global": "全局",
+ "project": "这个项目",
+ "noMatching": "没有匹配的快速命令。",
+ "noQuick": "还没有快速命令。",
+ "search": "搜索快捷命令..."
+ },
+ "quickCommandsSheet": {
+ "save": "保存 terminal 命令或 agent 提示以便快速访问。",
+ "back": "返回",
+ "quickCommand": "该快捷命令将从您保存的列表中删除。",
+ "deleteDelete": "删除“{{deleteLabel}}”?",
+ "quickCommands": "快捷命令",
+ "choose": "选择 Agent",
+ "add": "添加快捷命令",
+ "edit": "编辑快捷命令",
+ "delete": "删除",
+ "cancel": "取消",
+ "untitled": "无题"
+ },
+ "githubPr": {
+ "failedUpdateReview": "无法更新评论主题。",
+ "failedUpdateTitle": "更新标题失败。",
+ "requestFailedRequest": "请求失败:{{requestMethod}}",
+ "requestFailedGithubResolve": "请求失败:github.resolveReviewThread",
+ "requestFailedGithubUpdate": "请求失败:github.updatePRTitle"
+ },
+ "mobileBulkCloseSheetActions": {
+ "close": "关闭"
+ },
+ "mobileDiffReviewLoaders": {
+ "update": "更新 Orca 桌面以查看移动设备上的更改。",
+ "committedChangesResponse": "提交的更改响应无效",
+ "committedChangesFailed": "提交的更改失败",
+ "committedChangesUnavailable": "提交的更改不可用",
+ "committedDiff": "提交的差异不可用",
+ "diff": "差异响应无效",
+ "unableLoadDiff": "无法加载差异",
+ "unableLoadReview": "无法加载评论笔记",
+ "source": "源代码管理响应无效",
+ "unableLoadChanges": "无法加载更改"
+ },
+ "mobileDiffReviewQueue": {
+ "committed": "致力于分支",
+ "unstaged": "未暂存",
+ "staged": "已暂存"
+ },
+ "mobileNativeChatPermission": {
+ "permission": "请求许可",
+ "allowAlways": "始终允许",
+ "deny": "拒绝",
+ "allow": "允许",
+ "allowPermission": "允许 {{permissionName}}?"
+ },
+ "mobileTabCloseSelection": {
+ "closeTabsRight": "关闭右侧的选项卡",
+ "closeTabsLeft": "关闭左侧选项卡",
+ "closeOther": "关闭其他选项卡"
+ },
+ "mobileTerminalActionSheetActions": {
+ "close": "关闭",
+ "clear": "清除 Terminal",
+ "rename": "重命名",
+ "switchPhone": "切换到手机",
+ "switchDesktop": "切换到桌面"
+ },
+ "prActionsEngine": {
+ "failedMerge": "合并拉取请求失败。",
+ "failedRefresh": "无法刷新拉取请求。"
+ },
+ "useMobileAttachmentInputLeaseGate": {
+ "attach": "连接失败(重新连接)"
+ },
+ "useMobileDiffReviewCommentActions": {
+ "failedSaveReview": "无法保存评论",
+ "failedSaveReviewState": "无法保存审阅状态",
+ "waiting": "等待桌面..."
+ },
+ "diffReview": {
+ "waiting": "等待桌面...",
+ "missing": "缺少工作树",
+ "unableLoadDiff": "无法加载差异",
+ "unableLoadReview": "无法加载评论"
+ },
+ "useMobileDiffReviewGitActions": {
+ "stagedFile": "已暂存 {{stagedFileCount}} 个,{{failedFileCount}} 个失败",
+ "waiting": "等待桌面...",
+ "source": "源代码控制操作失败",
+ "stagedReviewedFile": "已暂存 {{staged}} 个已审查文件",
+ "stagedReviewedFiles": "已暂存 {{staged}} 个已审查文件"
+ },
+ "useMobileDiffReviewSendActions": {
+ "waiting": "等待桌面...",
+ "reviewNotesSent": "审阅已发送的笔记",
+ "reviewNotesCopied": "审阅已复制的笔记",
+ "unable": "无法加载 agent 会话",
+ "created": "创建的 terminal 响应无效",
+ "failedCreate": "创建 terminal 失败",
+ "terminal": "Terminal 输入被锁定",
+ "failedSend": "发送笔记失败"
+ },
+ "useMobileImageAttachment": {
+ "attachFailed": "附加失败",
+ "image": "图片太大无法附加",
+ "photo": "照片许可被拒绝",
+ "attachFailedDisconnected": "连接失败(断开连接)"
+ },
+ "useMobileNativeChatImageAttachments": {
+ "attachFailed": "附加失败",
+ "image": "图片太大无法附加",
+ "photo": "照片许可被拒绝",
+ "attachFailedDisconnected": "连接失败(断开连接)",
+ "messageNotSent": "消息未发送",
+ "messageNotSentDisconnected": "消息未发送(已断开连接)"
+ },
+ "useMobilePrActions": {
+ "not": "未连接"
+ },
+ "useMobilePrAiTriage": {
+ "failed": "启动 agent 失败",
+ "waiting": "等待桌面..."
+ },
+ "useMobilePrCommentActions": {
+ "comment": "评论操作失败"
+ },
+ "useMobilePrTitleAction": {
+ "failed": "更新标题失败。",
+ "not": "未连接到桌面。"
+ },
+ "useMobileTerminalPaste": {
+ "pasteFailed": "粘贴失败",
+ "image": "图片太大无法粘贴",
+ "pasteFailedDisconnected": "粘贴失败(已断开连接)",
+ "pasteToo": "粘贴太大(最大 256 KiB)",
+ "failed": "无法对调整大小的剪贴板图像进行编码"
+ },
+ "useQuickCommands": {
+ "failedLoad": "无法加载快速命令",
+ "failedSave": "保存快速命令失败"
+ },
+ "mobileDiffReviewScreenModel": {
+ "all": "全部",
+ "unstaged": "未暂存",
+ "staged": "已暂存",
+ "branch": "分支",
+ "unsent": "{{unsentCount}} 条未发送备注",
+ "noteCountNote": "{{noteCount}} 条备注",
+ "noteCountNotes": "{{noteCount}} 条备注",
+ "unreviewed": "未审阅",
+ "notes": "备注"
+ },
+ "mobileTerminalLiveInputStatus": {
+ "live": "实时输入",
+ "starting": "启动麦克风",
+ "processing": "加工",
+ "listening": "听力",
+ "tapShow": "点击以显示键盘",
+ "uploading": "上传图片到主机",
+ "preparing": "准备麦克风",
+ "transcribing": "在桌面上转录",
+ "tapMic": "点击麦克风即可停止"
+ },
+ "mobileNativeChatRenderData": {
+ "agent": "智能体"
+ },
+ "useMobileDiffReviewInteractions": {
+ "unable": "无法在会话中打开"
+ },
+ "mobileTerminalTabAgent": {
+ "file": "文件",
+ "browser": "浏览器",
+ "new": "新浏览器"
+ },
+ "worktreeLabel": {
+ "worktree": "工作树"
+ },
+ "floatingWorkspace": {
+ "floating": "浮动工作区"
+ },
+ "githubPrRpc": {
+ "request": "请求失败:{{requestMethod}}"
+ },
+ "mobileNativeChatStreamFrame": {
+ "transcript": "转录流失败"
+ },
+ "mobileNativeChatToggleAction": {
+ "switchChat": "切换到聊天视图",
+ "switchTerminal": "切换到 terminal 视图"
+ },
+ "mobileNativeChatPermissionSend": {
+ "responseNotSent": "回复未发送",
+ "responseUnconfirmed": "响应未确认 - 在重试之前检查聊天",
+ "responseNotSentDisconnected": "未发送响应(已断开连接)"
+ },
+ "mobilePrSidebarState": {
+ "unable": "无法加载拉取请求"
+ },
+ "mobileSessionRouteHelpers": {
+ "pairing": "配对无效",
+ "reconnecting": "正在重新连接",
+ "disconnected": "已断开连接",
+ "connected": "已连接",
+ "securing": "固定",
+ "connecting": "正在连接"
+ },
+ "useMobileNativeChatAnswerSend": {
+ "answerNotSent": "答复未发送",
+ "answerUnconfirmed": "回答未确认 — 在重试之前检查聊天记录",
+ "answerPartly": "答复已部分发送 — 在重试之前检查聊天记录",
+ "answerNotSentDisconnected": "答复未发送(已断开连接)"
+ },
+ "useMobileNativeChatCancelAsk": {
+ "cancelNotSent": "取消未发送",
+ "cancelUnconfirmed": "取消未确认 — 在重试之前检查聊天记录",
+ "cancelNotSentDisconnected": "取消未发送(断开连接)"
+ },
+ "useMobileNativeChatMessageSend": {
+ "messageNotSent": "消息未发送",
+ "delivery": "交货未确认 - 在重试之前检查聊天记录",
+ "messageNotSentDisconnected": "消息未发送(已断开连接)"
+ },
+ "useMobileNativeChatStop": {
+ "stopNotSent": "停止未发送",
+ "stopUnconfirmed": "停止未经确认 - 在重试之前检查聊天记录",
+ "stopNotSentTerminal": "停止未发送(terminal 未准备好)"
+ },
+ "aiVaultResumeLaunch": {
+ "terminal": "Terminal 输入被锁定",
+ "failedSend": "发送恢复命令失败",
+ "created": "创建的 terminal 响应无效",
+ "failedCreate": "创建 terminal 失败"
+ },
+ "aiVaultResumePreparation": {
+ "could": "无法准备此旧 Codex 会话。重试恢复。"
+ },
+ "mobileClipboardImage": {
+ "clipboard": "剪贴板图像内容必须是base64"
+ },
+ "prAiTriageLaunch": {
+ "terminal": "Terminal 输入被锁定",
+ "failedSend": "发送提示失败",
+ "created": "创建的 terminal 响应无效",
+ "failedCreate": "创建 terminal 失败"
+ },
+ "voiceModelList": {
+ "delete": "删除 {{commandLabel}}",
+ "useMessage": "使用",
+ "use": "使用中",
+ "set": "在桌面上设置",
+ "api": "API密钥集",
+ "recommended": "推荐"
+ },
+ "authFailedBanner": {
+ "remove": "移除",
+ "re": "维修",
+ "retry": "重试",
+ "authentication": "身份验证失败——先尝试重新连接;如果仍然失败,请从桌面重新配对。"
+ },
+ "codexResetCreditAction": {
+ "useReset": "使用重置",
+ "resetting": "正在重置...",
+ "usesOneEarnedResetActive": "使用活动 Codex 帐户获得的一次重置",
+ "usesOneEarnedResetScope": "使用一次为 {{scopeLabel}} 赢得的重置",
+ "useCodex": "使用 Codex 速率限制重置",
+ "resettingCodex": "重置 Codex 速率限制",
+ "earned": "已获得 Codex 速率限制重置"
+ },
+ "customKeyModal": {
+ "addShortcut": "添加快捷方式",
+ "press": "按回车键",
+ "command": "命令",
+ "label": "标签",
+ "add": "添加",
+ "more": "更多按键 — Tab、箭头、F1–F12...",
+ "key": "标识",
+ "modifiers": "修饰符",
+ "show": "显示、隐藏或重新排序快捷键",
+ "manage": "管理快捷键",
+ "send": "发送自定义文本命令",
+ "text": "文本宏",
+ "build": "构建 Ctrl、Alt 和 Shift 键和弦",
+ "shortcut": "快捷组合",
+ "back": "返回",
+ "function": "功能",
+ "navigation": "导航",
+ "editing": "编辑",
+ "eGPnpm": "例如:pnpm build",
+ "eGBuild": "例如建造",
+ "pick": "选择一把钥匙"
+ },
+ "dragReorderList": {
+ "moveDown": "下移",
+ "moveUp": "向上移动",
+ "use": "使用上移和下移操作重新排序,无需拖动",
+ "drag": "拖动以重新排序"
+ },
+ "hostProtocolGate": {
+ "checking": "检查主机兼容性",
+ "use": "useHostProtocolGates 必须在 内部使用"
+ },
+ "mobileDictationSetupSheet": {
+ "download": "下载",
+ "useMessage": "使用",
+ "use": "使用中",
+ "setUpDesktop": "在桌面上设置",
+ "api": "API密钥集",
+ "extracting": "· 提取...",
+ "open": "开放人工智能API",
+ "recommended": "推荐",
+ "dictation": "启用听写",
+ "setupInstructions": "下载模型并在桌面上启用听写 - 一切都从这里开始。",
+ "setUpVoice": "设置语音听写",
+ "couldNotUpdate": "无法更新",
+ "couldNotSelect": "无法选择型号",
+ "downloadFailed": "下载失败",
+ "failed": "加载失败"
+ },
+ "mobileDiffReviewBody": {
+ "retry": "重试",
+ "retryLoading": "重试加载评论",
+ "diffTruncated": "差异因移动预览而被截断。",
+ "loadingDiff": "加载差异...",
+ "try": "尝试不同的评论过滤器。",
+ "no": "没有可审查的变更",
+ "unable": "无法加载评论",
+ "review": "无法评论",
+ "loadingReview": "正在加载评论...",
+ "diffUnavailable": "差异不可用",
+ "deleted": "已删除的文件",
+ "diffTooLarge": "差异太大",
+ "binary": "二进制差异",
+ "select": "选择要查看的文件。",
+ "fileDeleted": "该文件已被删除。添加文件注释或将其标记为已审阅。",
+ "diffTooLargeMobile": "对于移动预览而言,此差异太大。",
+ "fileCannot": "该文件无法在移动设备上呈现为文本。"
+ },
+ "mobileDiffReviewDrawers": {
+ "sendNotes": "发送注释",
+ "sendNotesAgent": "向 agent 发送注释",
+ "stageReviewed": "阶段审查",
+ "stageReviewedFilesAccessibility": "阶段审查文件",
+ "reviewComplete": "审核完成",
+ "save": "保存",
+ "delete": "删除",
+ "deleteNote": "删除注释",
+ "reviewNote": "审查备注",
+ "cancel": "取消备注",
+ "file": "文件注释",
+ "line": "行 {{lineNumber}}",
+ "add": "添加注释",
+ "edit": "编辑备注",
+ "open": "在会话中打开",
+ "mark": "标记为未审核",
+ "stageReviewedFiles": "阶段审核文件",
+ "clear": "清除已发送的注释",
+ "sendUnsent": "发送未发送的注释",
+ "copy": "复印笔记",
+ "new": "新 Agent 会话",
+ "discardChanges": "放弃对“{{filePath}}”的更改?此操作无法撤消。",
+ "discardFile": "丢弃文件",
+ "reviewedFileCountReviewed": "{{reviewedFileCount}} 已审核的未暂存文件可以暂存",
+ "reviewActions": "审查行动",
+ "saveNote": "在线 {{lineNumber}} 上保存注释",
+ "unsent": "{{unsentCommentCount}} 未发送的笔记",
+ "loading": "正在加载 agent 会话...",
+ "reviewedFileCountFileReviewedNoteCountNote": "{{reviewedFileCount}} 文件已审核,{{noteCount}} 注释",
+ "reviewedFileCountFileReviewedNoteCountNotes": "{{reviewedFileCount}} 文件已审核,{{noteCount}} 注释",
+ "reviewedFileCountFilesReviewedNoteCountNote": "{{reviewedFileCount}} 文件已审核,{{noteCount}} 注释",
+ "reviewedFileCountFilesReviewedNoteCountNotes": "{{reviewedFileCount}} 文件已审核,{{noteCount}} 注释",
+ "discard": "放弃"
+ },
+ "mobileDiffReviewFileSummary": {
+ "hunk": "猛男",
+ "next": "下一个猛男",
+ "previous": "上一个帅哥",
+ "stale": "陈旧",
+ "edit": "编辑文件注释",
+ "changed": "改变了",
+ "reviewed": "已审核",
+ "old": "来自 {{oldPath}}",
+ "staleNote": "{{staleNoteCount}} 陈旧"
+ },
+ "mobileDiffReviewFooter": {
+ "next": "下一个文件",
+ "markReviewed": "标记已审核",
+ "reviewed": "已审核",
+ "markFile": "标记文件已审核",
+ "note": "备注",
+ "add": "添加文件注释",
+ "previous": "上一个文件",
+ "discard": "放弃",
+ "discardFile": "丢弃文件",
+ "unstage": "取消暂存",
+ "unstageFile": "取消暂存文件",
+ "stage": "暂存",
+ "stageFile": "暂存文件"
+ },
+ "mobileDiffReviewHeader": {
+ "show": "显示 {{mobileReviewFilterLabel}} 审阅文件",
+ "openReview": "开放审查行动",
+ "openPull": "打开拉取请求侧边栏",
+ "changes": "更改",
+ "back": "返回",
+ "reviewed": "{{reviewedCount}}/{{queueLength}} 已审核"
+ },
+ "mobileDiffReviewLine": {
+ "edit": "编辑第 {{lineNumber}} 行的注释",
+ "add": "在 {{newLineNumber}} 行添加注释",
+ "context": "上下文",
+ "deleted": "已删除",
+ "added": "额外",
+ "lineLabelLineLine": "{{lineLabel}} 线 {{lineNumber}}",
+ "lineLabelLine": "{{lineLabel}} 线"
+ },
+ "mobileHostCard": {
+ "update": "更新桌面 Orca 并登录以从任何地方进行连接",
+ "worktreeCountWorktree": "{{worktreeCount}} 工作树",
+ "worktreeCountWorktrees": "{{worktreeCount}} 个工作树",
+ "active": "{{activeWorktreeCount}} 活跃"
+ },
+ "mobileHtmlPreview": {
+ "view": "查看 HTML 源代码",
+ "preview": "预览",
+ "previewRendered": "预览渲染的 HTML"
+ },
+ "mobileMarkdown": {
+ "hiddenColumn": "{{hiddenColumnCount}} 更多列",
+ "hiddenRow": "{{hiddenRowCount}} 更多行",
+ "open": "打开图片",
+ "image": "图像"
+ },
+ "mobilePrsidebar": {
+ "retry": "重试",
+ "retryLoading": "重试加载拉取请求",
+ "loading": "正在加载拉取请求...",
+ "not": "不允许 - 您的 GitHub 帐户未连接。",
+ "something": "出了点问题。"
+ },
+ "mobileRichMarkdownEditor": {
+ "code": "代码块",
+ "inline": "内联代码",
+ "image": "图像",
+ "link": "关联",
+ "quote": "引用",
+ "checklist": "清单",
+ "numbered": "编号列表",
+ "bullet": "项目符号列表",
+ "strike": "删除线",
+ "italic": "斜体",
+ "bold": "粗体",
+ "h2": "氢2",
+ "body": "身体"
+ },
+ "mobileWorkspaceNameInput": {
+ "workspace": "工作区名称"
+ },
+ "newWorkspaceFab": {
+ "new": "新工作区"
+ },
+ "newWorktreeModal": {
+ "repository": "存储库",
+ "create": "创建工作区",
+ "connectRepository": "连接存储库",
+ "runSetup": "运行设置命令",
+ "skip": "跳过",
+ "run": "执行",
+ "setup": "设置脚本",
+ "note": "备注",
+ "advanced": "高级",
+ "connectRepositoryFirst": "首先连接存储库",
+ "connect": "连接",
+ "connecting": "正在连接...",
+ "ssh": "SSH 连接",
+ "workspace": "工作区名称",
+ "name": "名称或创建来源",
+ "no": "未找到存储库",
+ "pick": "选择一个存储库和 agent 来启动新的工作区。",
+ "failedTrust": "无法信任安装脚本。",
+ "failedCreate": "创建工作区失败",
+ "choose": "选择是否运行安装脚本。",
+ "selected": "所选 agent 已禁用。创建之前选择启用的 agent。",
+ "write": "写备注",
+ "remote": "远程存储库",
+ "select": "选择一个存储库",
+ "failedConnect": "无法连接到 SSH 存储库。",
+ "failedRead": "无法读取 SSH 连接状态。",
+ "connectDisplay": "在创建工作区之前连接 {{displayName}}。"
+ },
+ "protocolBlockScreen": {
+ "back": "返回主机",
+ "openGit": "打开 GitHub 版本",
+ "openApp": "打开应用商店",
+ "updateOrcaYour": "在您的计算机上更新 Orca",
+ "updateOrcaMobile": "更新 Orca 移动版"
+ },
+ "setupHookTrustDrawer": {
+ "do": "别跑",
+ "always": "永远信任并奔跑",
+ "runHooks": "运行钩子",
+ "setup": "设置脚本",
+ "new": "新的设置脚本",
+ "repositorys": "此存储库的 orca.yaml 在工作区启动之前运行。仅当您信任此存储库时才运行它。",
+ "runSetup": "从 {{repoName}} 运行安装程序?",
+ "repo": "{{repoName}} 的设置脚本已更改"
+ },
+ "smartWorkspaceAdvancedFields": {
+ "derived": "源自名字",
+ "branch": "分支名称",
+ "workspace": "工作区名称",
+ "name": "名称",
+ "reuse": "重用分支“{{reuseEligibleBranch}}”"
+ },
+ "smartWorkspaceSourceDrawer": {
+ "typeName": "输入名称或搜索来源",
+ "typeWorkspace": "在下面的字段中输入工作区名称。",
+ "ssh": "此 SSH repo 需要 GitHub 远程来列出问题和 PR。",
+ "connect": "将存储库连接到搜索源。",
+ "cancel": "取消",
+ "done": "完成",
+ "name": "名称或“创建自”",
+ "item": "该项目位于 {{owner}}/ {{repo}} 中。",
+ "switch": "切换到 {{displayName}}",
+ "no": "没有找到结果。"
+ },
+ "smartWorkspaceSourceField": {
+ "type": "输入名称或搜索来源",
+ "optional": "[可选]"
+ },
+ "smartWorkspaceSourceRow": {
+ "new": "新分行",
+ "create": "创建分支“{{rowName}}”",
+ "name": "命名此工作区",
+ "use": "使用“{{rowName}}”",
+ "issue": "问题 #",
+ "pr": "PR 号#"
+ },
+ "terminalShortcutSettings": {
+ "create": "创建组合键或文本宏",
+ "add": "添加自定义快捷方式...",
+ "no": "尚未定义自定义快捷键。",
+ "custom": "自定义快捷键",
+ "show": "按原始顺序显示每个内置快捷键",
+ "reset": "重置默认值",
+ "toggle": "切换按键以显示或隐藏它们,并按住夹点将按键拖到 terminal 快捷栏上所需的顺序。",
+ "shortcut": "快捷栏"
+ },
+ "textInputModal": {
+ "cancel": "取消",
+ "save": "保存"
+ },
+ "workspaceDetailPlaceholder": {
+ "pick": "从侧边栏中选择一个工作区以在此处打开其 terminal。",
+ "no": "没有打开工作区"
+ },
+ "worktreeListRow": {
+ "child": "孩子",
+ "folder": "文件夹"
+ },
+ "accountsSnapshot": {
+ "inactiveCodex": "非活动 Codex 限制使用错误的提供商身份",
+ "inactiveClaude": "不活跃的 Claude 限制使用错误的提供者身份",
+ "codex": "Codex 限制使用错误的提供者身份",
+ "claude": "Claude 限制使用错误的提供者身份",
+ "wslCodex": "WSL Codex 帐户需要精确的发行版",
+ "hostCodex": "Host Codex 帐户无法命名 WSL 发行版",
+ "wslRate": "WSL 速率限制目标需要精确的发行版",
+ "hostRate": "主机速率限制目标无法命名 WSL 发行版",
+ "invalid": "来自主机的无效帐户快照"
+ },
+ "codexResetCredit": {
+ "account": "此帐户没有可用的重置积分。",
+ "noReset": "无法重置",
+ "noEligible": "符合条件的 Codex 速率限制窗口未用尽。",
+ "nothing": "没有什么可以重置的",
+ "codex": "Codex 用法已刷新。",
+ "resetAlready": "重置已应用",
+ "rate": "速率限制重置",
+ "resetCountResets": "可用 {{resetCount}} 次重置",
+ "resetCountReset": "可用 {{resetCount}} 次重置",
+ "expiresNow": "立即过期",
+ "expiresDuration": "{{duration}}后过期",
+ "nextExpiresNow": "下一项立即过期",
+ "nextExpiresDuration": "下一项将在{{duration}}后过期",
+ "invalid": "来自主机的无效重置响应"
+ },
+ "mountedBottomDrawer": {
+ "dismiss": "关闭抽屉"
+ },
+ "newWorktreeAgentSelection": {
+ "blank": "空白 Terminal"
+ },
+ "useCodexResetCreditAction": {
+ "spends": "这会花费一次 {{confirmedLabel}} 的重置,并立即重置符合条件的速率限制窗口。",
+ "useRate": "使用速率限制重置?",
+ "could": "无法重置速率限制",
+ "account": "在主持人联系 Codex 之前,帐户或重置优惠已发生更改。查看更新的详细信息,然后再次确认。{{cleanupWarning}}",
+ "reset": "重置详细信息已更改",
+ "useReset": "使用重置",
+ "cancel": "取消",
+ "host": "主机确认了本次尝试,但该手机无法清除其重试记录。稍后重试将重用相同的安全操作 ID。",
+ "phone": "该话机无法清除丢弃的重试记录。重试是安全的,但必须先清除记录,然后才能确认此帐户的新重置。",
+ "identityWsl": "WSL {{wslDistro}} 上的 {{identity}}",
+ "identityHost": "主机上的 {{identity}}"
+ },
+ "mobileLinkPrForm": {
+ "linkPull": "链接拉取请求",
+ "linkLinked": "链接#{{linkedItemNumber}}",
+ "pull": "#123 或 https://github.com/owner/repo/pull/123",
+ "pr": "PR 号或 GitHub URL",
+ "cancel": "取消",
+ "linkExisting": "链接现有拉取请求"
+ },
+ "mobilePrComposeForm": {
+ "createReview": "创建 {{reviewType}}",
+ "createDraftReview": "创建草稿 {{reviewType}}",
+ "pushCreateReview": "推送并创建 {{reviewType}}",
+ "pushCreateDraft": "推送并创建草稿 {{reviewType}}",
+ "createDraft": "创建为草稿",
+ "base": "根据",
+ "generatingTitle": "正在生成标题和描述...",
+ "reviewTypeDescription": "{{reviewType}} 描述",
+ "description": "说明(可选)",
+ "reviewTypeTitle": "{{reviewType}} 标题",
+ "title": "标题",
+ "cancel": "取消",
+ "generate": "生成",
+ "generating": "生成…",
+ "failed": "无法生成 PR 字段",
+ "new": "新建 {{reviewType}}",
+ "generateReview": "使用 AI 生成 {{reviewType}} 详细信息"
+ },
+ "mobilePrViewPanel": {
+ "current": "当前分支不可用。",
+ "hosted": "该提供商无法托管评审小组。"
+ },
+ "practionsSection": {
+ "unlink": "取消链接",
+ "unlinkPull": "取消链接拉取请求",
+ "reopenPullRequestAccessibility": "重新打开拉取请求",
+ "closePullRequestAccessibility": "关闭 PR",
+ "off": "关",
+ "on": "开",
+ "toggle": "切换自动合并",
+ "auto": "准备好后自动合并",
+ "mergePullRequestAccessibility": "合并拉取请求",
+ "pullRequestNumberWillReopened": "#{{pullRequestNumber}} 将重新打开。",
+ "reopenPullRequest": "重新打开拉取请求?",
+ "pullRequestNumberWillClosed": "#{{pullRequestNumber}} 将关闭而不合并。",
+ "closePullRequest": "关闭拉取请求?",
+ "will": "这会将 #{{pullRequestNumber}} 合并到其基础分支中。",
+ "mergePullRequest": "合并拉取请求?",
+ "failed": "无法取消链接拉取请求。",
+ "merge": "合并"
+ },
+ "prcheckDetail": {
+ "showingFirst100": "显示前 100 个作业",
+ "showingFirst20": "显示前 20 个注释",
+ "annotations": "注释",
+ "no": "没有详细信息。"
+ },
+ "prchecksSection": {
+ "open": "在网络上打开 {{checkName}}",
+ "check": "{{checkName}} 查看详细信息",
+ "fix": "修复",
+ "fixFailing": "使用 AI 修复失败的检查",
+ "inspect": "检查详细信息或启动 AI 修复过程。",
+ "rerun": "重新运行失败的检查",
+ "checks": "检查项",
+ "failingCheckCountFailingCheck": "{{failingCheckCount}} 检查失败",
+ "failingCheckCountFailingChecks": "{{failingCheckCount}} 检查失败",
+ "failed": "无法加载检查详细信息"
+ },
+ "prcommentCard": {
+ "permanently": "这将永久删除 GitHub 上的评论。",
+ "deleteCommentTitle": "删除评论?",
+ "write": "写回复...",
+ "resolve": "解决",
+ "unresolve": "未解决",
+ "resolveThread": "解决线程",
+ "unresolveThread": "未解决的线程",
+ "delete": "删除",
+ "deleteComment": "删除评论",
+ "edit": "编辑",
+ "editCommentAccessibility": "编辑评论",
+ "reply": "回复",
+ "replyComment": "回复评论",
+ "editComment": "编辑评论...",
+ "resolved": "已解决",
+ "save": "保存"
+ },
+ "prcommentComposer": {
+ "cancel": "取消"
+ },
+ "prcommentsSection": {
+ "add": "添加评论...",
+ "noComments": "还没有评论。",
+ "couldNotLoadComments": "无法加载评论。点击刷新重试。",
+ "comments": "评论",
+ "noDescription": "没有提供描述。",
+ "couldNotLoadDescription": "无法加载描述。点击刷新重试。",
+ "description": "描述",
+ "showVisible": "共 {{remaining}} 条,再显示 {{visibleCommentCount}} 条",
+ "showRemaining": "再显示 {{remainingCommentCount}} 条",
+ "resolvedThreadAuthor": "由 {{author}} 解决的线程",
+ "resolvedThreadAuthorReply": "由 {{author}} ({{replyCount}}) 解决的线程",
+ "resolvedCommentAuthor": "{{author}} 已解决的评论",
+ "resolvedCommentAuthorReply": "{{author}} ({{replyCount}}) 已解决的评论",
+ "comment": "评论"
+ },
+ "prconflictingFilesSection": {
+ "resolve": "解决与AI的冲突",
+ "conflicting": "冲突的文件",
+ "copyCommands": "复制命令",
+ "copied": "已复制",
+ "copyMergeability": "复制可合并性刷新命令",
+ "run": "从此工作树运行",
+ "branch": "该分支存在必须解决的冲突",
+ "commitsBehindCommits": "落后 {{commitsBehind}} 个提交 (基础提交:",
+ "commitsBehindCommit": "落后 {{commitsBehind}} 个提交 (基础提交:",
+ "conflicts": "冲突"
+ },
+ "prreviewersSection": {
+ "remove": "删除 {{login}}",
+ "no": "没有要求评审人",
+ "could": "无法加载评审人。点击刷新重试。",
+ "loading": "正在加载评审人...",
+ "reviewers": "评审人",
+ "add": "添加或删除评审人"
+ },
+ "prsidebarHeader": {
+ "edit": "编辑拉取请求标题",
+ "save": "保存",
+ "saveTitle": "保存标题",
+ "cancel": "取消",
+ "cancelEditing": "取消编辑标题",
+ "open": "在网络上打开拉取请求#{{pullRequestNumber}}"
+ },
+ "prSidebarCreateEmptyState": {
+ "linkExistingPr": "链接现有 PR",
+ "linkExistingPull": "链接现有拉取请求",
+ "current": "当前分支未链接到开放的 PR。",
+ "git": "{{gitBranch}} 未链接到开放的 PR。",
+ "refreshCheck": "刷新再次检查,或者为此分支创建新的 PR。",
+ "no": "没有开放的拉取请求",
+ "linked": "链接 PR #{{pullRequestNumber}} 不可用",
+ "createPr": "创建 PR",
+ "createPull": "创建拉取请求",
+ "refreshPull": "刷新拉取请求",
+ "pull": "PR",
+ "failed": "无法创建拉取请求。",
+ "check": "在创建拉取请求之前检查分支。"
+ },
+ "reviewerPickerDrawer": {
+ "no": "没有匹配的人",
+ "search": "搜人",
+ "reviewers": "评审人",
+ "failed": "加载人员失败"
+ },
+ "prChecksPresentation": {
+ "reviewed": "已审核",
+ "pending": "待办的",
+ "dismissed": "被解雇",
+ "commented": "评论过",
+ "changes": "要求更改",
+ "approved": "已批准",
+ "no": "没有检查项",
+ "skipped": "已跳过",
+ "timed": "已超时",
+ "cancelled": "已取消",
+ "failed": "失败",
+ "successful": "成功的",
+ "progress": "进行中",
+ "requested": "已请求",
+ "closed": "已关闭",
+ "draft": "草稿",
+ "merged": "合并",
+ "open": "进行中"
+ },
+ "prCommentAudience": {
+ "bots": "机器人",
+ "humans": "人类",
+ "all": "全部",
+ "noComments": "还没有评论。",
+ "noHuman": "没有人类评论。",
+ "noBot": "没有机器人评论。"
+ },
+ "markdownBlocks": {
+ "details": "详情"
+ },
+ "prCheckDetailContent": {
+ "jobs": "任务",
+ "failed": "失败的工作"
+ },
+ "prCommentTime": {
+ "years": "{{years}} 年前",
+ "months": "{{months}} 个月前",
+ "days": "{{days}} 天前",
+ "hours": "{{hours}} 小时前",
+ "minutes": "{{minutes}} 分钟前",
+ "just": "刚刚"
+ },
+ "confirmModal": {
+ "cancel": "取消",
+ "confirm": "确认"
+ },
+ "mobileSearchField": {
+ "clear": "清除搜索"
+ },
+ "mobileOnboardingPage": {
+ "skip": "暂时跳过通知",
+ "not": "暂不",
+ "enableAgent": "启用 agent 通知",
+ "enableNotifications": "启用通知",
+ "openSessionsTerminal": "在 terminal 中打开会话",
+ "keep": "保留 terminal",
+ "openSessionsChat": "在聊天 UI 中打开会话",
+ "use": "使用聊天界面",
+ "get": "当 agent 需要您的输入或完成任务时,您会在此设备上收到通知。",
+ "choose": "选择是否在此设备上的 terminal 或聊天 UI 中打开受支持的 agent 会话。按住会话选项卡可切换其视图,或稍后在“设置”中更改默认值。",
+ "stay": "外出时保持更新",
+ "how": "会话应该如何开始?"
+ },
+ "mobileFileExplorerPanel": {
+ "no": "没有找到文件",
+ "retry": "重试",
+ "showing": "- 显示前 5000 个",
+ "files": "文件",
+ "back": "返回会话",
+ "close": "关闭文件",
+ "unable": "无法加载文件",
+ "waiting": "等待桌面...",
+ "connecting": "正在连接到桌面..."
+ },
+ "mobileFileMarkdownPreview": {
+ "viewRendered": "查看渲染的 Markdown 预览",
+ "viewMarkdown": "查看 Markdown 源代码"
+ },
+ "mobileFilePreviewBody": {
+ "title": "{{title}} 图像",
+ "empty": "空文件",
+ "retry": "重试"
+ },
+ "mobileFilePreviewEditableSource": {
+ "title": "{{title}} 编辑"
+ },
+ "mobileFilePreviewScreen": {
+ "unableLoad": "无法加载预览",
+ "save": "保存 terminal 神器",
+ "back": "返回文件",
+ "unsaved": "未保存的编辑将会丢失。",
+ "discardChanges": "放弃更改?",
+ "loading": "正在加载预览...",
+ "waiting": "等待桌面...",
+ "file": "文件",
+ "preview": "预览",
+ "discard": "放弃",
+ "stay": "停留",
+ "unableSave": "无法保存文件"
+ },
+ "mobileFilePreviewSourceText": {
+ "file": "文件预览",
+ "preview": "预览被截断。文件大小:{{formatPreviewByteLength}}。"
+ },
+ "mobileFileExplorerRow": {
+ "unavailable": "无法在移动设备上使用",
+ "preview": "预览文件 {{itemName}}",
+ "item": "{{itemName}} 在移动设备上不可用",
+ "open": "打开文件夹 {{itemName}}",
+ "retry": "重试",
+ "retryLoading": "重试加载 {{relativePath}}",
+ "loading": "加载中...",
+ "unable": "无法加载文件夹"
+ },
+ "mobileFilePreviewRequest": {
+ "file": "桌面上的文件已更改。保存前重新加载预览"
+ },
+ "mobileFilePreviewResponse": {
+ "unableLoad": "无法加载预览",
+ "fileNot": "找不到文件",
+ "unableReach": "无法访问桌面文件系统",
+ "reload": "保存前重新加载预览",
+ "fileToo": "文件太大,无法在移动设备上预览",
+ "binary": "二进制预览不可用"
+ },
+ "mobileFilePreviewRoute": {
+ "unable": "无法加载预览"
+ },
+ "mobileFileMutationOwnership": {
+ "could": "无法验证 SSH 连接。重新连接主机并重试。"
+ },
+ "troubleshootCommonIssues": {
+ "other": "其他 VPN 干扰",
+ "tailscale": "Tailscale 主机无法访问",
+ "connection": "连接超时",
+ "desktop": "桌面应用程序未运行",
+ "firewall": "防火墙阻止端口 6768",
+ "different": "不同的 WiFi 网络",
+ "disable": "禁用该 VPN 或启用分割隧道/“允许 LAN”。",
+ "non": "非 Tailscale VPN 可以通过远程服务器路由本地流量。",
+ "update": "更新 Tailscale 应用程序 - 最新版本修复了重新连接错误。",
+ "checkDesktop": "检查桌面是否已唤醒并在尾网中显示为已连接。",
+ "i": "iOS/Android 可以默默地楔入隧道:在 Tailscale 应用程序中关闭并重新打开 Tailscale。",
+ "host": "100.x.x.x 或 *.ts.net 等主机地址通过 Tailscale 连接 - 保持打开状态。",
+ "restart": "如果超时持续存在,请重新启动这两个应用程序。",
+ "go": "返回主机列表并点击您的主机以重试。",
+ "checkWi": "检查手机上的 WiFi 信号强度。",
+ "after": "更新后,您可能需要通过二维码重新配对。",
+ "tryRestarting": "尝试重新启动 Orca — 配套服务器在启动时启动。",
+ "orca": "Orca 必须在桌面上打开才能接受连接。",
+ "corporate": "公司/学校网络可能会阻止 P2P — 尝试使用个人热点。",
+ "windows": "Windows:Defender 防火墙 → 允许应用程序 — 为专用网络启用 Orca。",
+ "mac": "macOS:系统设置 → 网络 → 防火墙 — 允许 Orca。",
+ "tryReconnecting": "尝试在两台设备上重新连接 WiFi。",
+ "ethernet": "以太网和 WiFi 必须共享同一子网。",
+ "both": "两个设备必须位于同一 LAN 上(除非通过 Tailscale 连接)。"
+ },
+ "mobileBrowserKeyRow": {
+ "esc": "Esc键"
+ },
+ "mobileBrowserPane": {
+ "send": "发送文本到浏览器",
+ "type": "在页面上输入...",
+ "ok": "好的",
+ "cancel": "取消",
+ "browserDialogMessage": "浏览器对话框",
+ "url": "网址",
+ "reload": "重新加载",
+ "forward": "转发",
+ "back": "返回",
+ "enter": "输入有效的 URL。",
+ "browserStreamTimed": "浏览器流超时。",
+ "browserPage": "浏览器页面尚不可用。",
+ "checking": "检查桌面浏览器流支持。",
+ "update": "更新桌面 Orca 以在移动设备上流式传输浏览器选项卡。",
+ "browserStreamFailed": "浏览器流失败。",
+ "browserDialog": "浏览器对话框",
+ "sent": "发送",
+ "browserPointerUp": "浏览器指针向上失败",
+ "browserPointerDown": "浏览器指针向下失败",
+ "browserPointerMove": "浏览器指针移动失败",
+ "browserScroll": "浏览器滚动失败",
+ "browserCommand": "浏览器命令失败",
+ "right": "右键单击"
+ },
+ "mobileBrowserPointerModifiers": {
+ "modifier": "{{modifierLabel}} 点击修饰符",
+ "shift": "转移",
+ "alt": "替代",
+ "ctrl": "控制键",
+ "cmd": "命令"
+ },
+ "mobileBrowserViewModeSwitch": {
+ "show": "显示 {{browserLabel}} 网站视图",
+ "mobile": "移动端",
+ "web": "网络"
+ },
+ "mobileAgentSessionHistoryList": {
+ "resume": "恢复 agent 会话",
+ "current": "当前工作树",
+ "messages": "消息",
+ "message": "信息"
+ },
+ "agentHistory": {
+ "noPast": "此范围内没有过去的 agent 会话。",
+ "noSessions": "没有会话符合您的搜索。",
+ "noAgent": "无 agent 会话",
+ "search": "搜索会话、repo:、路径:",
+ "retry": "重试",
+ "unableLoad": "无法加载",
+ "update": "在此主机上更新 Orca 以浏览 agent 会话历史记录。",
+ "agentSessionHistoryUnavailable": "Agent 会话历史记录不可用",
+ "refresh": "刷新 agent 会话",
+ "agentSessionHistory": "Agent 会话历史",
+ "back": "返回",
+ "failed": "无法恢复会话。",
+ "agentSessionQueued": "Agent 会话已排队。",
+ "unableDetermine": "无法确定主机平台。",
+ "session": "此会话缺少简历 ID。",
+ "waiting": "等待主机...",
+ "all": "全部",
+ "project": "项目",
+ "workspace": "工作区",
+ "issueCountTranscript": "{{issueCount}} 成绩单被跳过",
+ "issueCountTranscripts": "{{issueCount}} 成绩单被跳过",
+ "unableLoadWorkspace": "无法加载工作区元数据。"
+ },
+ "useMobileAgentHistoryState": {
+ "waiting": "等待主机...",
+ "unableLoad": "无法加载 agent 会话",
+ "unableReach": "无法连接到主机"
+ },
+ "worktreeNavigationActions": {
+ "agent": "Agent 会话历史",
+ "source": "源代码控制"
+ },
+ "agentHistoryResumeTarget": {
+ "open": "恢复会话前请先打开一个本地工作区。",
+ "session": "此会话存储在主机上,因此无法在 SSH 工作区中恢复。为此项目打开本地工作区。",
+ "resume": "从历史记录中恢复在运行时托管的工作区中不可用。"
+ },
+ "agentHistorySessionCard": {
+ "untitled": "无标题会话"
+ },
+ "about": {
+ "open": "适用于 100x 构建器的开源 agent IDE",
+ "about": "关于"
+ },
+ "browserSettings": {
+ "openTerminal": "打开 terminal 链接",
+ "choose": "选择 terminal 输出中点击的 HTTP(S) 链接的打开位置。",
+ "links": "链接",
+ "browser": "浏览器",
+ "openSafari": "在此手机上使用 Safari、Chrome 或其他浏览器打开。",
+ "phone": "手机浏览器",
+ "openStreamed": "从配对桌面在流式浏览器中打开。",
+ "orca": "桌面版 Orca 浏览器"
+ },
+ "connectionLog": {
+ "noPaired": "没有配对的主机。",
+ "noConnection": "本次会话还没有连接事件。当应用程序拨打该主机时,会出现事件。",
+ "copy": "复制诊断",
+ "copied": "已复制",
+ "attempt": "· 尝试{{reconnectAttempts}}",
+ "connection": "连接日志"
+ },
+ "home": {
+ "youre": "您已连接",
+ "scan": "扫码",
+ "openOrca": "打开 Orca 桌面",
+ "removeConfirm": "删除“{{confirmRemoveName}}”?您可以稍后重新配对。",
+ "removeHost": "删除主机",
+ "remove": "移除",
+ "edit": "编辑主机",
+ "disconnect": "断开连接",
+ "seven": "7天",
+ "five": "5小时",
+ "account": "账户使用情况",
+ "new": "新工作区",
+ "pair": "配对桌面",
+ "quick": "快捷操作",
+ "tasks": "任务",
+ "resume": "恢复",
+ "desktops": "台式机",
+ "prs": "已创建 PR",
+ "agent": "Agent 时间",
+ "agents": "已启动 Agents",
+ "welcome": "欢迎回来",
+ "how": "它是如何运作的",
+ "pairingDescription": "与计算机上的 Orca 配对,检查您的 agents,跳入任何 terminal,并通过手机推动工作。",
+ "connectYour": "连接您的桌面",
+ "please": "请再试一次。",
+ "could": "无法删除主机",
+ "openTask": "打开 {{taskProviderLabel}} 任务",
+ "no": "未连接任务源",
+ "system": "系统默认",
+ "your": "您的桌面将出现在此处。一切都经过端到端加密。",
+ "tap": "点击上面的按钮打开扫描仪。指向屏幕上的二维码。",
+ "go": "进入设置 → 手机并生成配对二维码。",
+ "connect": "连接",
+ "reconnect": "重新连接"
+ },
+ "mobileOnboarding": {
+ "onboarding": "入职进度",
+ "notification": "无法更新通知设置。再试一次。",
+ "your": "无法保存您的选择。再试一次。"
+ },
+ "nativeChatSettings": {
+ "open": "在聊天 UI 中打开会话",
+ "off": "关",
+ "on": "开",
+ "choose": "选择受支持的 agents 会话(Claude、Codex 和其他支持聊天的 agents)在此设备上打开的方式。Terminal 显示原始 CLI;聊天 UI 显示类似于桌面应用程序的聊天界面。您仍然可以通过长按菜单切换任何单个会话。",
+ "default": "默认视图",
+ "back": "返回"
+ },
+ "notifications": {
+ "open": "打开设置",
+ "agent": "Agent 通知",
+ "notifications": "通知",
+ "get": "当 agent 需要您的输入或完成任务时,您会在此设备上收到通知。",
+ "notificationsDisabled": "系统设置中禁用通知。"
+ },
+ "pairConfirm": {
+ "back": "回到家",
+ "connecting": "正在连接…",
+ "cancel": "取消",
+ "pair": "一对",
+ "confirmDesktopPairingLink": "您从桌面打开了配对链接。确认将其添加到您的主机中。",
+ "pairDesktop": "与此桌面配对吗?",
+ "pairingFailed": "配对失败:{{errorMessage}}",
+ "could": "无法在 {{pairingOverallTimeoutSeconds}}s 内连接 — 请参阅下面的日志以了解它停止的位置",
+ "pairingLog": "配对日志"
+ },
+ "pairScan": {
+ "copy": "将二维码下显示的代码复制到您的计算机上。",
+ "pastePairingCode": "粘贴配对码",
+ "pasteCode": "粘贴代码代替",
+ "try": "重试",
+ "connecting": "正在连接…",
+ "pastePairingCodeMessage": "或者粘贴配对码",
+ "scan": "扫描二维码",
+ "go": "前往设置 → 移动设备",
+ "openOrca": "在计算机上打开 Orca",
+ "openSettings": "打开设置",
+ "continue": "继续",
+ "enable": "在“设置”中启用相机访问权限,或粘贴配对代码。",
+ "scanOrPastePairingCode": "扫描桌面上 Orca 的二维码,或粘贴配对码。",
+ "camera": "相机访问已禁用",
+ "pair": "与桌面配对",
+ "pairingFailed": "配对失败:{{errorMessage}}",
+ "could": "无法在 {{pairingOverallTimeoutSeconds}}s 内连接 — 请参阅下面的日志以了解它停止的位置",
+ "notValidPairing": "不是有效的配对码 - 从计算机中复制并再次粘贴",
+ "notValidOrca": "不是有效的 Orca 二维码",
+ "pairingLog": "配对日志"
+ },
+ "pair": {
+ "back": "回到家",
+ "missing": "缺少配对代码"
+ },
+ "settings": {
+ "support": "支持",
+ "privacy": "隐私政策",
+ "retry": "重试",
+ "retryClearing": "重试清除配对凭据",
+ "couldNotCheck": "无法检查此设备上的清理状态。重试以确保安全。",
+ "cleanup": "清理工作仍无法确认。稍后再试。",
+ "pairing": "配对凭证清理",
+ "about": "关于",
+ "troubleshooting": "故障排除",
+ "notifications": "通知",
+ "voice": "语音",
+ "browser": "浏览器",
+ "settings": "设置",
+ "couldNotConfirmCleanupPendingCredentialCountCredential": "无法确认此设备上 {{pendingCredentialCount}} 凭据的清理。",
+ "couldNotConfirmCleanupPendingCredentialCountCredentials": "无法确认此设备上 {{pendingCredentialCount}} 凭据的清理。"
+ },
+ "terminalSettings": {
+ "terminalText": "Terminal 文字大小",
+ "restore": "恢复 {{pickerHostName}}",
+ "off": "关",
+ "on": "开",
+ "autocomplete": "自动完成和自动更正",
+ "autocompleteDescription": "在 terminal 命令栏中启用手机式自动完成、自动更正和拼写建议。默认情况下处于关闭状态,因此键盘永远不会重写命令、标志或路径。直接键盘输入(当按键直接进入 terminal 时)始终发送原始击键,因此建议不适用于此处。",
+ "keyboard": "键盘输入",
+ "textSizeMessage": "文字大小",
+ "textScaleDescription": "缩放 terminal 文本。较小的尺寸适合更多带有侧边距的列;尺寸越大,显示的列越少 - 向侧面拖动即可平移。您还可以捏合放大 terminal 本身,这会更新此设置。仅按设备显示;不会更改桌面 terminal。",
+ "textSize": "文字大小",
+ "no": "尚未配对的桌面。配对一个来控制 terminal 行为。",
+ "resizeBehaviorDescription": "当您在手机上使用 terminals 时,Orca 会将其缩小以适合您的屏幕。当您关闭应用程序或切换离开时,这可以控制它是保持手机大小(因此交互式 CLI 工具不会回流)还是将大小调整回桌面。您始终可以使用横幅上的“恢复此 terminals”或“恢复所有 terminals”来手动调整大小。",
+ "when": "当您离开应用程序时",
+ "after30": "30分钟后",
+ "after5": "5分钟后",
+ "after1": "1分钟后",
+ "keep": "保持手机尺寸(默认)",
+ "largest": "最大(200%)",
+ "larger": "更大(150%)",
+ "large": "大 (125%)",
+ "default": "默认(100%)",
+ "smaller": "较小 (75%)",
+ "smallest": "最小(50%)",
+ "afterDuration": "{{durationSeconds}}s 之后"
+ },
+ "troubleshoot": {
+ "common": "常见问题",
+ "view": "查看连接日志",
+ "runDiagnostics": "运行诊断",
+ "runAgain": "再次运行",
+ "running": "正在运行…",
+ "troubleshooting": "故障排除",
+ "platform": "平台",
+ "hosts": "主机",
+ "internet": "互联网",
+ "paired": "配对主机",
+ "couldNotTest": "无法测试",
+ "no": "无连接",
+ "unexpected": "意外的反应",
+ "connected": "已连接",
+ "couldNotRead": "无法读取主机数据",
+ "none": "无 — 扫描二维码进行配对",
+ "host": "{{hostCount}} 配对",
+ "reachable": "可通过 {{endpoint}} 联系"
+ },
+ "voiceSettings": {
+ "speechModelMessage": "语音模型",
+ "speechModel": "语音模型",
+ "togglePress": "切换:按一次启动,再按一次停止。按住:按住时听写。",
+ "dictationMode": "听写模式",
+ "dictate": "将文本听写到桌面上的任何聚焦窗格中。",
+ "enable": "启用语音听写",
+ "dictation": "听写",
+ "connect": "连接到桌面以管理语音设置。",
+ "voice": "语音",
+ "delete": "删除失败",
+ "download": "下载失败",
+ "couldNotSelect": "无法选择型号",
+ "couldNotUpdate": "无法更新",
+ "failedLoadVoiceSettings": "无法加载语音设置",
+ "hold": "抓住",
+ "toggle": "切换",
+ "failedLoadVoiceSettingsMessage": "无法加载语音设置。",
+ "none": "未选择"
+ },
+ "mobileDictationPendingAudioBudget": {
+ "connection": "连接速度太慢,无法进行语音听写。当连接改善时重试。"
+ },
+ "mobileDictationDesktopStart": {
+ "failed": "无法开始麦克风录音"
+ },
+ "mobileDictationKeepAwake": {
+ "keep": "保持唤醒本机调用超时"
+ },
+ "useMobileDictation": {
+ "no": "未检测到语音。",
+ "failed": "麦克风初始化失败",
+ "microphone": "麦克风权限被拒绝"
+ },
+ "mobileDictationSetup": {
+ "update": "更新配对的桌面 Orca 应用程序以使用移动语音设置。",
+ "failedUpdate": "无法更新听写设置",
+ "failedDelete": "删除模型失败",
+ "failedStart": "无法开始下载",
+ "failedLoad": "无法加载听写模型"
},
"prChecks": {
"summary": {
diff --git a/mobile/src/i18n/mobile-i18n.test.ts b/mobile/src/i18n/mobile-i18n.test.ts
index 506c7bbfa0a..55ec9cc0e6f 100644
--- a/mobile/src/i18n/mobile-i18n.test.ts
+++ b/mobile/src/i18n/mobile-i18n.test.ts
@@ -2,6 +2,7 @@ import { afterEach, describe, expect, it } from 'vitest'
import appConfig from '../../app.json'
import {
+ createMobileTranslator,
mobileI18n,
normalizeMobileUiLocale,
selectPreferredMobileUiLocale,
@@ -42,7 +43,16 @@ describe('mobile i18n', () => {
it('reads and interpolates the English catalog', async () => {
await mobileI18n.changeLanguage('en')
- expect(t('m.rOYT-0U', { value0: 'Camera' })).toBe('Allow Camera?')
+ expect(
+ t('mobileNativeChatPermission.allowPermission', {
+ permissionName: 'Camera'
+ })
+ ).toBe('Allow Camera?')
+ })
+
+ it('keeps prefixed translators on the active locale', async () => {
+ await mobileI18n.changeLanguage('es')
+ expect(createMobileTranslator('task')('gitHub')).toBe('GitHub')
})
it('enables localized native metadata on iOS', () => {
@@ -58,13 +68,13 @@ describe('mobile i18n', () => {
'uses reviewed task-status copy in %s',
async (locale, expected) => {
await mobileI18n.changeLanguage(locale)
- expect(t('m.zWwi3-o')).toBe(expected)
+ expect(t('mobileWorkspaceStatuses.todo')).toBe(expected)
}
)
it('falls back from polluted Simplified Chinese GitLab copy', async () => {
await mobileI18n.changeLanguage('zh')
- expect([t('m.k98CNAU'), t('m.roI3I5g'), t('m.pmjWIDk')]).toEqual([
+ expect([t('task.gitLabFilter'), t('task.gitLabView'), t('task.gitLabTodo')]).toEqual([
'GitLab Filter',
'GitLab View',
'GitLab todo'
@@ -94,16 +104,30 @@ describe('mobile i18n', () => {
await mobileI18n.changeLanguage('ja')
expect([
- t('m.x1skfkY'),
- t('m.IhhRQcI'),
- t('m.-CpqM4g', { value0: 'PR' }),
- t('m.Kdbzhtg', { value0: 'PR' }),
- t('m.eeoaUzE', { value0: 'PR' }),
- t('m.i65iwXo', { value0: 'PR' }),
- t('m.h5c6qGM', { value0: 'PR' }),
- t('m.aDj0ISs', { value0: 'PR' }),
- t('m.eL3YqZQ', { value0: 'PR' }),
- t('m.fS2uz3k', { value0: 'PR' })
+ t('mobileHostedReviewCreateIntent.resolveStage'),
+ t('useMobileCreatePrRunner.check'),
+ t('mobileCreatePrAction.branch', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.branch', { reviewType: 'PR' }),
+ t('mobilePrCreate.push', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.authenticate', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.sync', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.publish', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.check', {
+ reviewType: 'PR'
+ }),
+ t('mobilePrCreate.commit', {
+ reviewType: 'PR'
+ })
]).toEqual([
'PR を作成する前に、変更を解決するかステージングしてください。',
'PR を作成する前にブランチをチェックアウトしてください。',
@@ -127,18 +151,21 @@ describe('mobile i18n', () => {
'%s uses Git operation terminology',
async (locale, expected) => {
await mobileI18n.changeLanguage(locale)
- expect([t('m.8I2nZuQ'), t('m.PnL-W2o')]).toEqual(expected)
+ expect([
+ t('prChecksPresentation.skipped'),
+ t('mobileHostedReviewCreateIntent.publishing')
+ ]).toEqual(expected)
}
)
it('uses Git push and pull terminology in Japanese', async () => {
await mobileI18n.changeLanguage('ja')
- expect([t('m.qgmf_L8'), t('m.0OsPYDw'), t('m.eBZzWkw'), t('m.0pGBpyQ')]).toEqual([
- 'プッシュ',
- 'プル',
- 'プッシュ',
- 'プル'
- ])
+ expect([
+ t('mobileSourceControlPrimaryAction.push'),
+ t('mobileSourceControlPrimaryAction.pull'),
+ t('mobileSourceControlActions.push'),
+ t('mobileSourceControlActions.pull')
+ ]).toEqual(['プッシュ', 'プル', 'プッシュ', 'プル'])
})
it.each([
@@ -150,7 +177,7 @@ describe('mobile i18n', () => {
'%s uses accurate checkout and pull terminology',
async (locale, expected) => {
await mobileI18n.changeLanguage(locale)
- expect([t('m.0fqNjoo'), t('m.GaTugx8')]).toEqual(expected)
+ expect([t('task.full'), t('mobileSourceControlActions.local')]).toEqual(expected)
}
)
@@ -163,7 +190,11 @@ describe('mobile i18n', () => {
'preserves source-control glossary terms in %s',
async (locale, expected) => {
await mobileI18n.changeLanguage(locale)
- expect([t('m.hCKjn9A'), t('m.senOKG4'), t('m.2lwuEDc')]).toEqual(expected)
+ expect([
+ t('prChecksPresentation.no'),
+ t('mobileDiffReviewQueue.staged'),
+ t('mobileDiffReviewDrawers.reviewNote')
+ ]).toEqual(expected)
}
)
})
diff --git a/mobile/src/i18n/mobile-i18n.ts b/mobile/src/i18n/mobile-i18n.ts
index 08b37798563..4ab71b6419c 100644
--- a/mobile/src/i18n/mobile-i18n.ts
+++ b/mobile/src/i18n/mobile-i18n.ts
@@ -75,3 +75,7 @@ void mobileI18n.init({
export function t(key: string, options?: TOptions): string {
return mobileI18n.t(key, options)
}
+
+export function createMobileTranslator(keyPrefix: string) {
+ return (key: string, options?: TOptions): string => t(`${keyPrefix}.${key}`, options)
+}
diff --git a/mobile/src/i18n/use-mobile-locale-reload.test.ts b/mobile/src/i18n/use-mobile-locale-reload.test.ts
new file mode 100644
index 00000000000..7b0e1884a39
--- /dev/null
+++ b/mobile/src/i18n/use-mobile-locale-reload.test.ts
@@ -0,0 +1,59 @@
+import { createElement } from 'react'
+import { act, create, type ReactTestRenderer } from 'react-test-renderer'
+import { afterEach, beforeEach, describe, expect, it, vi, type MockInstance } from 'vitest'
+
+const { locales, reloadAppAsync } = vi.hoisted(() => ({
+ locales: [{ languageTag: 'es-MX' }],
+ reloadAppAsync: vi.fn<() => Promise>()
+}))
+
+vi.mock('expo', () => ({ reloadAppAsync }))
+vi.mock('expo-localization', () => ({
+ getLocales: () => [{ languageTag: 'en' }],
+ useLocales: () => locales
+}))
+
+import { useMobileLocaleReload } from './use-mobile-locale-reload'
+
+describe('useMobileLocaleReload', () => {
+ let renderer: ReactTestRenderer | null = null
+ let consoleSpy: MockInstance
+
+ function Harness(): null {
+ useMobileLocaleReload()
+ return null
+ }
+
+ beforeEach(() => {
+ vi.useFakeTimers()
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true
+ reloadAppAsync.mockReset()
+ const original = console.error
+ consoleSpy = vi.spyOn(console, 'error').mockImplementation((...args) => {
+ if (typeof args[0] === 'string' && args[0].includes('react-test-renderer is deprecated')) {
+ return
+ }
+ original(...args)
+ })
+ })
+
+ afterEach(() => {
+ act(() => renderer?.unmount())
+ renderer = null
+ vi.useRealTimers()
+ consoleSpy.mockRestore()
+ })
+
+ it('retries when the native reload request rejects', async () => {
+ reloadAppAsync.mockRejectedValue(new Error('reload unavailable'))
+ await act(async () => {
+ renderer = create(createElement(Harness))
+ })
+ expect(reloadAppAsync).toHaveBeenCalledTimes(1)
+
+ await act(async () => {
+ await vi.advanceTimersByTimeAsync(1_000)
+ })
+ expect(reloadAppAsync).toHaveBeenCalledTimes(2)
+ })
+})
diff --git a/mobile/src/i18n/use-mobile-locale-reload.ts b/mobile/src/i18n/use-mobile-locale-reload.ts
index 22c049ae893..96d9e9fd81b 100644
--- a/mobile/src/i18n/use-mobile-locale-reload.ts
+++ b/mobile/src/i18n/use-mobile-locale-reload.ts
@@ -1,11 +1,14 @@
import { reloadAppAsync } from 'expo'
import { useLocales } from 'expo-localization'
-import { useEffect, useRef } from 'react'
+import { useEffect, useRef, useState } from 'react'
import { mobileI18n, shouldReloadForMobileLocaleChange, type MobileUiLocale } from './mobile-i18n'
+const LOCALE_RELOAD_RETRY_MS = 1_000
+
export function useMobileLocaleReload(): void {
const locales = useLocales()
const reloadRequestedRef = useRef(false)
+ const [retryVersion, setRetryVersion] = useState(0)
useEffect(() => {
if (
@@ -18,8 +21,23 @@ export function useMobileLocaleReload(): void {
return
}
reloadRequestedRef.current = true
+ let active = true
+ let retryTimer: ReturnType | null = null
void reloadAppAsync('Mobile locale changed').catch(() => {
+ if (!active) {
+ return
+ }
reloadRequestedRef.current = false
+ retryTimer = setTimeout(
+ () => setRetryVersion((current) => current + 1),
+ LOCALE_RELOAD_RETRY_MS
+ )
})
- }, [locales])
+ return () => {
+ active = false
+ if (retryTimer) {
+ clearTimeout(retryTimer)
+ }
+ }
+ }, [locales, retryVersion])
}
diff --git a/mobile/src/onboarding/MobileOnboardingPage.tsx b/mobile/src/onboarding/MobileOnboardingPage.tsx
index 95790ef9c78..019c5b70d42 100644
--- a/mobile/src/onboarding/MobileOnboardingPage.tsx
+++ b/mobile/src/onboarding/MobileOnboardingPage.tsx
@@ -47,8 +47,12 @@ export function MobileOnboardingPage({
)}
- {isSessionView ? t('m.o9LxHPg') : t('m.OmdgGNs')}
- {isSessionView ? t('m.dV8UVHg') : t('m.3vHqv6U')}
+
+ {isSessionView ? t('mobileOnboardingPage.how') : t('mobileOnboardingPage.stay')}
+
+
+ {isSessionView ? t('mobileOnboardingPage.choose') : t('mobileOnboardingPage.get')}
+
@@ -83,16 +87,16 @@ function SessionViewChoices({
return (
<>
onChoice('chat')}
/>
onChoice('terminal')}
@@ -113,16 +117,16 @@ function NotificationChoices({
return (
<>
onChoice('enable')}
/>
onChoice('skip')}
diff --git a/mobile/src/session/MobileAgentWorkingIndicator.tsx b/mobile/src/session/MobileAgentWorkingIndicator.tsx
index dffb9fff7b3..b5226173011 100644
--- a/mobile/src/session/MobileAgentWorkingIndicator.tsx
+++ b/mobile/src/session/MobileAgentWorkingIndicator.tsx
@@ -29,7 +29,7 @@ export function MobileAgentWorkingIndicator(): React.JSX.Element {
return (
- {t('m.0EPx-aA')}
+ {t('mobileAgentWorkingIndicator.agent')}
{dots.map((dot, i) => (
diff --git a/mobile/src/session/MobileBrowserTabActionSheet.tsx b/mobile/src/session/MobileBrowserTabActionSheet.tsx
index c1e3b3cb22b..89a2df5f76a 100644
--- a/mobile/src/session/MobileBrowserTabActionSheet.tsx
+++ b/mobile/src/session/MobileBrowserTabActionSheet.tsx
@@ -22,12 +22,12 @@ export function MobileBrowserTabActionSheet(props: {
return (
{
const current = target
@@ -42,7 +42,7 @@ export function MobileBrowserTabActionSheet(props: {
...(target?.canGoForward
? [
{
- label: t('m.m4hO2RY'),
+ label: t('mobileBrowserTabActionSheet.forward'),
icon: ChevronRight,
onPress: () => {
const current = target
@@ -55,7 +55,7 @@ export function MobileBrowserTabActionSheet(props: {
]
: []),
{
- label: t('m.8xevGic'),
+ label: t('mobileBrowserTabActionSheet.reload'),
icon: RefreshCw,
onPress: () => {
const current = target
@@ -66,7 +66,7 @@ export function MobileBrowserTabActionSheet(props: {
}
},
{
- label: t('m.vCnFzKQ'),
+ label: t('task.close'),
destructive: true,
onPress: () => {
const current = target
diff --git a/mobile/src/session/MobileNativeChatAsk.tsx b/mobile/src/session/MobileNativeChatAsk.tsx
index dc25bcc2eaf..bde446ba284 100644
--- a/mobile/src/session/MobileNativeChatAsk.tsx
+++ b/mobile/src/session/MobileNativeChatAsk.tsx
@@ -116,7 +116,7 @@ export function MobileNativeChatAsk({ prompt, onAnswer, onCancel }: Props): Reac
onPress={() => setIndex(i)}
>
- {qq.header || t('m.aqSqtLI', { value0: i + 1 })}
+ {qq.header || t('mobileNativeChatAsk.step', { stepNumber: i + 1 })}
{isAnswered(i) ? (
@@ -139,7 +139,7 @@ export function MobileNativeChatAsk({ prompt, onAnswer, onCancel }: Props): Reac
/>
))}
toggle(index, OTHER, q.multiSelect)}
@@ -149,7 +149,7 @@ export function MobileNativeChatAsk({ prompt, onAnswer, onCancel }: Props): Reac
style={styles.input}
value={otherText[index]}
onChangeText={(v) => setOther(index, v)}
- placeholder={t('m.7nef7b0')}
+ placeholder={t('mobileNativeChatAsk.type')}
placeholderTextColor={colors.textMuted}
multiline
autoFocus
@@ -175,7 +175,7 @@ export function MobileNativeChatAsk({ prompt, onAnswer, onCancel }: Props): Reac
disabled={submitting}
hitSlop={8}
>
- {t('m.yxcaJwo')}
+ {t('mobileNativeChatAsk.cancel')}
{total > 1 ? (
@@ -188,7 +188,7 @@ export function MobileNativeChatAsk({ prompt, onAnswer, onCancel }: Props): Reac
disabled={!canAdvance}
>
- {isLast ? t('m.ZEWq5OM') : t('m.EwbB5VI')}
+ {isLast ? t('mobileNativeChatAsk.send') : t('mobileNativeChatAsk.next')}
diff --git a/mobile/src/session/MobileNativeChatComposer.tsx b/mobile/src/session/MobileNativeChatComposer.tsx
index 2fda025603d..4120f541426 100644
--- a/mobile/src/session/MobileNativeChatComposer.tsx
+++ b/mobile/src/session/MobileNativeChatComposer.tsx
@@ -72,7 +72,7 @@ export function MobileNativeChatComposer({
onMicPressIn,
onMicPressOut,
disabled = false,
- placeholder = t('m.DAVoau0'),
+ placeholder = t('mobileNativeChatComposer.message'),
filePaths = NO_FILE_PATHS,
onNeedFiles
}: Props): React.JSX.Element {
@@ -175,7 +175,7 @@ export function MobileNativeChatComposer({
/>
{onRemoveAttachment ? (
onRemoveAttachment(attachment.id)}
hitSlop={8}
@@ -190,7 +190,7 @@ export function MobileNativeChatComposer({
{onAttachImage ? (
[styles.iconButton, pressed && styles.pressed]}
onPress={onAttachImage}
disabled={isAttaching || disabled}
@@ -223,7 +223,9 @@ export function MobileNativeChatComposer({
/>
{onMicPress ? (
[styles.iconButton, pressed && styles.pressed]}
// Hold mode is walkie-talkie (press-in/out); toggle mode taps.
onPress={dictationMode === 'hold' ? undefined : onMicPress}
@@ -244,7 +246,7 @@ export function MobileNativeChatComposer({
) : null}
[
styles.sendButton,
!canSend && styles.sendButtonDisabled,
diff --git a/mobile/src/session/MobileNativeChatMessage.tsx b/mobile/src/session/MobileNativeChatMessage.tsx
index 7c0718495f5..1cabf75e043 100644
--- a/mobile/src/session/MobileNativeChatMessage.tsx
+++ b/mobile/src/session/MobileNativeChatMessage.tsx
@@ -171,13 +171,13 @@ function Prose({
source={{ uri }}
style={styles.imageThumb}
resizeMode="contain"
- accessibilityLabel={block.alt ?? t('m.tSzSq0U')}
+ accessibilityLabel={block.alt ?? t('mobileNativeChatMessage.attached')}
/>
)
}
return (
- 🖼 {block.alt ?? block.path ?? block.url ?? t('m.WL3i_AY')}
+ 🖼 {block.alt ?? block.path ?? block.url ?? t('mobileNativeChatMessage.image')}
)
}
@@ -218,9 +218,17 @@ function ToolRun({
) : (
)}
- {t('m.0bAYawM', { value0: callCount })}
+
+ {t('mobileNativeChatMessage.callCountTimes', { callCount: callCount })}
+
- {summary || t(callCount === 1 ? 'm.uxZVTz8' : 'm.IlwwqQs', { value0: callCount })}
+ {summary ||
+ t(
+ callCount === 1
+ ? 'mobileNativeChatMessage.callCountToolCall'
+ : 'mobileNativeChatMessage.callCountToolCalls',
+ { callCount: callCount }
+ )}
{trailing}
@@ -238,7 +246,9 @@ function ToolRun({
))}
{callCount > pairs.length ? (
- {t('m.0mLnbZ0', { value0: callCount - pairs.length })}
+ {t('mobileNativeChatMessage.remaining', {
+ remainingToolCallCount: callCount - pairs.length
+ })}
) : null}
@@ -262,7 +272,7 @@ function AgentControls({
style={({ pressed }) => [styles.controlButton, pressed && styles.controlPressed]}
onPress={onCopy}
hitSlop={8}
- accessibilityLabel={t('m.m5GqFPc')}
+ accessibilityLabel={t('mobileNativeChatMessage.copy')}
>
@@ -271,7 +281,7 @@ function AgentControls({
style={({ pressed }) => [styles.controlButton, pressed && styles.controlPressed]}
onPress={onScrollToTop}
hitSlop={8}
- accessibilityLabel={t('m.85E7hns')}
+ accessibilityLabel={t('mobileNativeChatMessage.scroll')}
>
@@ -348,7 +358,9 @@ function MobileNativeChatMessageImpl({
return (
- {isUser && queued ? {t('m.lHpfBcs')} : null}
+ {isUser && queued ? (
+ {t('mobileNativeChatMessage.queued')}
+ ) : null}
[
styles.submit,
!canSubmitMulti && styles.submitDisabled,
@@ -120,7 +120,9 @@ export function MobileNativeChatQuestion({ question, onAnswer }: Props): React.J
disabled={!canSubmitMulti}
>
- {t('m.BcZ8-jY', { value0: selected.length > 0 ? ` (${selected.length})` : '' })}
+ {t('mobileNativeChatQuestion.submitSelectedCommand', {
+ selectedCommandCount: selected.length > 0 ? ` (${selected.length})` : ''
+ })}
) : null}
@@ -130,7 +132,11 @@ export function MobileNativeChatQuestion({ question, onAnswer }: Props): React.J
style={styles.freeInput}
value={freeText}
onChangeText={setFreeText}
- placeholder={hasOptions ? t('m.bSeVb4U') : t('m.psOJLjQ')}
+ placeholder={
+ hasOptions
+ ? t('mobileNativeChatQuestion.typeReply')
+ : t('mobileNativeChatQuestion.typeYour')
+ }
placeholderTextColor={colors.textMuted}
selectionColor={colors.accentBlue}
onSubmitEditing={submitFreeText}
@@ -138,7 +144,7 @@ export function MobileNativeChatQuestion({ question, onAnswer }: Props): React.J
multiline
/>
[
styles.freeSend,
!canSendFreeText && styles.freeSendDisabled,
diff --git a/mobile/src/session/MobileNativeChatView.tsx b/mobile/src/session/MobileNativeChatView.tsx
index 9931cfceba1..e711838876c 100644
--- a/mobile/src/session/MobileNativeChatView.tsx
+++ b/mobile/src/session/MobileNativeChatView.tsx
@@ -305,7 +305,7 @@ export function MobileNativeChatView({
{loadingEarlier ? (
) : (
- {t('m.AexlW6I')}
+ {t('mobileNativeChatView.load')}
)}
) : null
@@ -324,7 +324,7 @@ export function MobileNativeChatView({
per-message (the up-arrow in each agent message's controls). */}
{!atBottom ? (
listRef.current?.scrollToEnd({ animated: true })}
>
@@ -383,7 +383,7 @@ export function MobileNativeChatView({
)}
- {toolsExpanded ? t('m.HgMEzFE') : t('m.J3nTi3Q')}
+ {toolsExpanded ? t('mobileNativeChatView.collapse') : t('mobileNativeChatView.tools')}
@@ -392,10 +392,10 @@ export function MobileNativeChatView({
style={({ pressed }) => [styles.stopButton, pressed && styles.pressed]}
onPress={onStop}
hitSlop={8}
- accessibilityLabel={t('m.1oeCDU8')}
+ accessibilityLabel={t('mobileNativeChatView.stopAgent')}
>
- {t('m.X8_vuao')}
+ {t('mobileNativeChatView.stop')}
) : null}
@@ -425,10 +425,10 @@ export function MobileNativeChatView({
disabled={lockReason !== null}
placeholder={
lockReason === 'disconnected'
- ? t('m.gFSApKE')
+ ? t('mobileNativeChatView.reconnecting')
: lockReason === 'waiting'
- ? t('m.AXyDPsE')
- : t('m.55yDVNk')
+ ? t('mobileNativeChatView.waiting')
+ : t('mobileNativeChatView.message')
}
filePaths={filePaths}
onNeedFiles={onNeedFiles}
diff --git a/mobile/src/session/MobileSessionHeaderMoreActionsSheet.tsx b/mobile/src/session/MobileSessionHeaderMoreActionsSheet.tsx
index 65b3ef7cf6d..4c963b95dd9 100644
--- a/mobile/src/session/MobileSessionHeaderMoreActionsSheet.tsx
+++ b/mobile/src/session/MobileSessionHeaderMoreActionsSheet.tsx
@@ -28,8 +28,8 @@ export function MobileSessionHeaderMoreActionsSheet({
...(showAgentSessionHistory
? [
{
- label: t('m.6R8BWsw'),
- hint: t('m.z4-dCLM'),
+ label: t('mobileSessionHeaderMoreActionsSheet.agent'),
+ hint: t('mobileSessionHeaderMoreActionsSheet.browse'),
renderIcon: () => (
{isAttaching ? (
@@ -79,12 +83,12 @@ export function MobileTerminalInputActions({
}
accessibilityLabel={
dictation.isRecording
- ? t('m.lmt1VYs')
+ ? t('mobileTerminalInputActions.stop')
: dictation.isProcessing
- ? t('m.467WHFs')
+ ? t('mobileTerminalInputActions.cancel')
: dictation.isStarting
- ? t('m.4Bofttg')
- : t('m.a4FTXPM')
+ ? t('mobileTerminalInputActions.starting')
+ : t('mobileTerminalInputActions.start')
}
>
{dictation.isProcessing ? (
diff --git a/mobile/src/session/MobileTerminalLiveInputStatus.tsx b/mobile/src/session/MobileTerminalLiveInputStatus.tsx
index 2471a4d3ff3..ecf67405896 100644
--- a/mobile/src/session/MobileTerminalLiveInputStatus.tsx
+++ b/mobile/src/session/MobileTerminalLiveInputStatus.tsx
@@ -18,21 +18,21 @@ export function MobileTerminalLiveInputStatus({
isAttaching
}: MobileTerminalLiveInputStatusProps) {
const title = dictation.isRecording
- ? t('m.y6GQnVA')
+ ? t('mobileTerminalLiveInputStatus.listening')
: dictation.isProcessing
- ? t('m.Q7SP9fo')
+ ? t('mobileTerminalLiveInputStatus.processing')
: dictation.isStarting
- ? t('m._MGGD5E')
- : t('m.kbozpKo')
+ ? t('mobileTerminalLiveInputStatus.starting')
+ : t('mobileTerminalLiveInputStatus.live')
const detail = dictation.isRecording
- ? t('m.GGXoono')
+ ? t('mobileTerminalLiveInputStatus.tapMic')
: dictation.isProcessing
- ? t('m._-dmI2A')
+ ? t('mobileTerminalLiveInputStatus.transcribing')
: dictation.isStarting
- ? t('m.ha7j7qM')
+ ? t('mobileTerminalLiveInputStatus.preparing')
: isAttaching
- ? t('m.quM4RwQ')
- : t('m.7IfxObc')
+ ? t('mobileTerminalLiveInputStatus.uploading')
+ : t('mobileTerminalLiveInputStatus.tapShow')
return (
diff --git a/mobile/src/session/QuickCommandEditorForm.tsx b/mobile/src/session/QuickCommandEditorForm.tsx
index f38a8491e84..86d760e9f3d 100644
--- a/mobile/src/session/QuickCommandEditorForm.tsx
+++ b/mobile/src/session/QuickCommandEditorForm.tsx
@@ -52,7 +52,9 @@ function ActionToggle({
accessibilityState={{ selected }}
>
- {action === 'terminal-command' ? t('m.9xkz8HQ') : t('m.CQKw8CA')}
+ {action === 'terminal-command'
+ ? t('quickCommandEditorForm.terminal')
+ : t('quickCommandEditorForm.agentPrompt')}
)
@@ -81,12 +83,12 @@ export function QuickCommandEditorForm({
return (
- {t('m.GXMFUnA')}
+ {t('quickCommandEditorForm.label')}
onChange({ label })}
- placeholder={t('m.pcq4xtU')}
+ placeholder={t('quickCommandEditorForm.start')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -95,13 +97,13 @@ export function QuickCommandEditorForm({
- {t('m.AQ41agY')}
+ {t('quickCommandEditorForm.action')}
onChange({ action })} />
{isAgent ? (
- {t('m.th44i2A')}
+ {t('quickCommandEditorForm.agent')}
[styles.select, pressed && styles.pressed]}
onPress={onOpenAgentPicker}
@@ -113,7 +115,7 @@ export function QuickCommandEditorForm({
{getQuickCommandAgentLabel(draft.agent)}
) : (
- {t('m.9D9oj64')}
+ {t('quickCommandEditorForm.choose')}
)}
@@ -121,12 +123,14 @@ export function QuickCommandEditorForm({
) : null}
- {isAgent ? t('m.v512Bqc') : t('m.2WUowpg')}
+
+ {isAgent ? t('quickCommandEditorForm.prompt') : t('quickCommandEditorForm.command')}
+
onChange(isAgent ? { prompt: text } : { command: text })}
- placeholder={isAgent ? t('m.j_uWjuQ') : t('m.YGxS8ck')}
+ placeholder={isAgent ? t('quickCommandEditorForm.ask') : t('quickCommandEditorForm.npm')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -135,7 +139,7 @@ export function QuickCommandEditorForm({
isAgent ? MAX_QUICK_COMMAND_AGENT_PROMPT_LENGTH : MAX_QUICK_COMMAND_TERMINAL_TEXT_LENGTH
}
/>
- {isAgent ? {t('m.WFigoqY')} : null}
+ {isAgent ? {t('quickCommandEditorForm.supports')} : null}
@@ -150,7 +154,7 @@ export function QuickCommandEditorForm({
) : (
)}
- {t('m.MsJOHDg')}
+ {t('quickCommandEditorForm.advanced')}
{advancedOpen ? (
@@ -158,8 +162,8 @@ export function QuickCommandEditorForm({
{!isAgent ? (
- {t('m.S9UUSi8')}
- {t('m.iAdHX2w')}
+ {t('quickCommandEditorForm.append')}
+ {t('quickCommandEditorForm.submit')}
- {t('m.JVmE8Lo')}
+ {t('quickCommandEditorForm.scope')}
{(['global', 'repo'] as const).map((scopeType) => {
const selected = draft.scope.type === scopeType
@@ -198,7 +202,9 @@ export function QuickCommandEditorForm({
accessibilityState={{ selected, disabled }}
>
- {scopeType === 'global' ? t('m.spBXyhw') : t('m.nB0fh-Q')}
+ {scopeType === 'global'
+ ? t('quickCommandEditorForm.global')
+ : t('quickCommandEditorForm.project')}
)
@@ -220,7 +226,7 @@ export function QuickCommandEditorForm({
onPress={onCancel}
accessibilityRole="button"
>
- {t('m.z9Me_JI')}
+ {t('quickCommandEditorForm.cancel')}
- {mode === 'edit' ? t('m.SZAlJoE') : t('m.mr8N0cA')}
+ {mode === 'edit' ? t('quickCommandEditorForm.save') : t('quickCommandEditorForm.add')}
diff --git a/mobile/src/session/QuickCommandsList.tsx b/mobile/src/session/QuickCommandsList.tsx
index 6694bef5378..88774d881a4 100644
--- a/mobile/src/session/QuickCommandsList.tsx
+++ b/mobile/src/session/QuickCommandsList.tsx
@@ -62,7 +62,7 @@ export function QuickCommandsList({
style={styles.searchInput}
value={query}
onChangeText={onQueryChange}
- placeholder={t('m.Mlzs2q8')}
+ placeholder={t('quickCommandsList.search')}
placeholderTextColor={colors.textMuted}
autoCapitalize="none"
autoCorrect={false}
@@ -79,15 +79,17 @@ export function QuickCommandsList({
) : null}
- {!loading && totalCount === 0 ? {t('m.WGZgVlw')} : null}
+ {!loading && totalCount === 0 ? (
+ {t('quickCommandsList.noQuick')}
+ ) : null}
{!loading && totalCount > 0 && !hasVisible ? (
- {t('m.stjjcN4')}
+ {t('quickCommandsList.noMatching')}
) : null}
{repoCommands.length > 0 ? (
0 ? (
- {canAdd ? t('m.LmWWV94') : t('m.Jqxtf0c')}
+
+ {canAdd ? t('quickCommandsList.new') : t('quickCommandsList.quick')}
+
)
@@ -182,7 +186,9 @@ function QuickCommandRow({
disabled={disabled}
onPress={() => onLaunch(command)}
accessibilityRole="button"
- accessibilityLabel={t('m.VrXVT_A', { value0: command.label })}
+ accessibilityLabel={t('quickCommandsList.run', {
+ commandLabel: command.label
+ })}
>
{isAgent ? (
@@ -204,7 +210,9 @@ function QuickCommandRow({
style={({ pressed }) => [styles.rowAction, pressed && !disabled && styles.pressed]}
disabled={disabled}
onPress={() => onEdit(command)}
- accessibilityLabel={t('m.N8k0x7U', { value0: command.label })}
+ accessibilityLabel={t('quickCommandsList.edit', {
+ commandLabel: command.label
+ })}
>
@@ -212,7 +220,9 @@ function QuickCommandRow({
style={({ pressed }) => [styles.rowAction, pressed && !disabled && styles.pressed]}
disabled={disabled}
onPress={() => onDelete(command)}
- accessibilityLabel={t('m.r6942Dw', { value0: command.label })}
+ accessibilityLabel={t('voiceModelList.delete', {
+ commandLabel: command.label
+ })}
>
diff --git a/mobile/src/session/QuickCommandsSheet.tsx b/mobile/src/session/QuickCommandsSheet.tsx
index 06a3a240111..5318ba08c9e 100644
--- a/mobile/src/session/QuickCommandsSheet.tsx
+++ b/mobile/src/session/QuickCommandsSheet.tsx
@@ -104,16 +104,22 @@ export function QuickCommandsSheet({
const handleDelete = (command: TerminalQuickCommand) => {
// Why: quick commands sync with desktop, so an accidental one-tap delete
// removes shared data rather than only dismissing a local row.
- Alert.alert(t('m.y7ppLrs', { value0: command.label || t('m.OLmV45U') }), t('m.8mDod7I'), [
- { text: t('m.jmIvPBQ'), style: 'cancel' },
- {
- text: t('m.uVgCcno'),
- style: 'destructive',
- onPress: () => {
- void persist({ type: 'delete', id: command.id })
+ Alert.alert(
+ t('quickCommandsSheet.deleteDelete', {
+ deleteLabel: command.label || t('quickCommandsSheet.untitled')
+ }),
+ t('quickCommandsSheet.quickCommand'),
+ [
+ { text: t('quickCommandsSheet.cancel'), style: 'cancel' },
+ {
+ text: t('quickCommandsSheet.delete'),
+ style: 'destructive',
+ onPress: () => {
+ void persist({ type: 'delete', id: command.id })
+ }
}
- }
- ])
+ ]
+ )
}
const handleSave = async () => {
@@ -142,11 +148,11 @@ export function QuickCommandsSheet({
const title =
view === 'editor'
? draft?.id
- ? t('m.gaaVrjY')
- : t('m.SbxgQXc')
+ ? t('quickCommandsSheet.edit')
+ : t('quickCommandsSheet.add')
: view === 'agent'
- ? t('m.1rvpPn4')
- : t('m.vXUuukQ')
+ ? t('quickCommandsSheet.choose')
+ : t('quickCommandsSheet.quickCommands')
return (
@@ -157,7 +163,7 @@ export function QuickCommandsSheet({
[styles.backButton, pressed && styles.pressed]}
onPress={() => setView(view === 'agent' ? 'editor' : 'list')}
- accessibilityLabel={t('m.XUyBgA4')}
+ accessibilityLabel={t('quickCommandsSheet.back')}
>
@@ -168,7 +174,7 @@ export function QuickCommandsSheet({
{view === 'editor' && draft ? (
- {t('m.c7kUeNA')}
+ {t('quickCommandsSheet.save')}
) : null}
diff --git a/mobile/src/session/ai-vault-resume-launch.ts b/mobile/src/session/ai-vault-resume-launch.ts
index b328253af0a..0595e159035 100644
--- a/mobile/src/session/ai-vault-resume-launch.ts
+++ b/mobile/src/session/ai-vault-resume-launch.ts
@@ -186,11 +186,11 @@ export async function resumeAiVaultSessionInTerminal(
{ timeoutMs: RESUME_RPC_TIMEOUT_MS }
)
if (!created.ok) {
- throw new Error(created.error?.message || t('m.GWephQg'))
+ throw new Error(created.error?.message || t('aiVaultResumeLaunch.failedCreate'))
}
const terminalTab = readMobileReviewCreatedTerminal(created.result)
if (!terminalTab) {
- throw new Error(t('m.n6zBfFc'))
+ throw new Error(t('aiVaultResumeLaunch.created'))
}
const sent = await client.sendRequest(
'terminal.send',
@@ -202,10 +202,10 @@ export async function resumeAiVaultSessionInTerminal(
{ timeoutMs: RESUME_RPC_TIMEOUT_MS }
)
if (!sent.ok) {
- throw new Error(sent.error?.message || t('m.kiGJQl0'))
+ throw new Error(sent.error?.message || t('aiVaultResumeLaunch.failedSend'))
}
if (!readMobileReviewTerminalSendAccepted(sent.result)) {
- throw new Error(t('m.AAVqwEI'))
+ throw new Error(t('aiVaultResumeLaunch.terminal'))
}
return terminalTab
}
diff --git a/mobile/src/session/ai-vault-resume-preparation.ts b/mobile/src/session/ai-vault-resume-preparation.ts
index 301ab903208..44f4bbb94ca 100644
--- a/mobile/src/session/ai-vault-resume-preparation.ts
+++ b/mobile/src/session/ai-vault-resume-preparation.ts
@@ -42,7 +42,7 @@ export async function prepareMobileAiVaultSessionResume(
// Why: older hosts cannot prepare, but their shared home still supports the legacy resume path.
return session
}
- throw new Error(response.error?.message || t('m.KEeLFyA'))
+ throw new Error(response.error?.message || t('aiVaultResumePreparation.could'))
}
const result = response.result as {
useRealCodexHome?: unknown
diff --git a/mobile/src/session/floating-workspace.ts b/mobile/src/session/floating-workspace.ts
index 4cd5a501eda..86e5ff8a66f 100644
--- a/mobile/src/session/floating-workspace.ts
+++ b/mobile/src/session/floating-workspace.ts
@@ -3,7 +3,7 @@ import { t } from '@/i18n/mobile-i18n'
// Floating Workspace's synthetic id (no backing repo/worktree; always local runtime).
export const FLOATING_WORKSPACE_WORKTREE_ID = 'global-floating-terminal'
-export const FLOATING_WORKSPACE_TITLE = t('m.m4LECc4')
+export const FLOATING_WORKSPACE_TITLE = t('floatingWorkspace.floating')
export function isFloatingWorkspaceWorktreeId(worktreeId: string | null | undefined): boolean {
return worktreeId === FLOATING_WORKSPACE_WORKTREE_ID
diff --git a/mobile/src/session/github-pr-mutations.ts b/mobile/src/session/github-pr-mutations.ts
index 5be129836a1..620e3d07935 100644
--- a/mobile/src/session/github-pr-mutations.ts
+++ b/mobile/src/session/github-pr-mutations.ts
@@ -1,7 +1,10 @@
import type { GitHubPRMergeMethod } from '../../../src/shared/types'
import type { RpcClient } from '../transport/rpc-client'
import { buildGithubPrParams, githubPrRepoSlugParam, type GitHubPrRepoSlug } from './github-pr-rpc'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator } from '@/i18n/mobile-i18n'
+
+const tr = createMobileTranslator('githubPr')
+const requestFailed = (method: string) => tr('requestFailedRequest', { requestMethod: method })
// Mutation wrappers for the github.* PR surface, split out so github-pr-rpc.ts
// stays under the max-lines budget. They mirror the read wrappers' shape but
@@ -23,13 +26,16 @@ async function sendRaw(
try {
const response = await client.sendRequest(method, params)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.o-JIJFg', { value0: method }) }
+ return {
+ ok: false,
+ error: response.error?.message || requestFailed(method)
+ }
}
return { ok: true, result: response.result }
} catch (err) {
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.o-JIJFg', { value0: method })
+ error: err instanceof Error ? err.message : requestFailed(method)
}
}
}
@@ -47,7 +53,7 @@ function extractMutationError(error: unknown, method: string): string {
return message
}
}
- return t('m.63siVQ8', { value0: method })
+ return requestFailed(method)
}
// The host returns the success/failure shape inside `result`; a transport-level
@@ -61,7 +67,10 @@ async function sendGithubPrMutation(
try {
const response = await client.sendRequest(method, params)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.o-JIJFg', { value0: method }) }
+ return {
+ ok: false,
+ error: response.error?.message || requestFailed(method)
+ }
}
const result = response.result
if (result && typeof result === 'object' && 'ok' in result) {
@@ -78,7 +87,7 @@ async function sendGithubPrMutation(
// to the `{ ok:false, error }` outcome the action engine routes on.
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.o-JIJFg', { value0: method })
+ error: err instanceof Error ? err.message : requestFailed(method)
}
}
}
@@ -114,12 +123,15 @@ export async function fetchUpdatePRTitle(
buildGithubPrParams('github.updatePRTitle', worktreeId, params, { prRepo: args.prRepo })
)
if (!response.ok) {
- return { ok: false, error: response.error || t('m.xWj8WHk') }
+ return {
+ ok: false,
+ error: response.error || tr('requestFailedGithubUpdate')
+ }
}
// Why: the host returns a bare `true` on success; a missing/undefined result is
// not a confirmed success, so require an explicit `=== true` rather than `!== false`.
if (response.result !== true) {
- return { ok: false, error: t('m.ssoDq0g') }
+ return { ok: false, error: tr('failedUpdateTitle') }
}
return { ok: true }
}
@@ -274,13 +286,13 @@ export async function fetchResolveReviewThread(
if (!response.ok) {
return {
ok: false,
- error: response.error || t('m.NJJe3ZA')
+ error: response.error || tr('requestFailedGithubResolve')
}
}
// Why: the host returns a bare `true` on success; a missing/undefined result is
// not a confirmed success, so require an explicit `=== true` rather than `!== false`.
if (response.result !== true) {
- return { ok: false, error: t('m.gz_v97k') }
+ return { ok: false, error: tr('failedUpdateReview') }
}
return { ok: true }
}
diff --git a/mobile/src/session/github-pr-rpc.ts b/mobile/src/session/github-pr-rpc.ts
index 282de9afc5a..6f59579e058 100644
--- a/mobile/src/session/github-pr-rpc.ts
+++ b/mobile/src/session/github-pr-rpc.ts
@@ -95,7 +95,10 @@ async function sendGithubPrRead(
try {
const response = await client.sendRequest(method, params)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.jdt98Vo', { value0: method }) }
+ return {
+ ok: false,
+ error: response.error?.message || t('githubPrRpc.request', { requestMethod: method })
+ }
}
return { ok: true, result: parse((response as RpcSuccess).result) }
} catch (err) {
@@ -103,7 +106,8 @@ async function sendGithubPrRead(
// rejection — normalize to the `{ ok:false, error }` contract callers expect.
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.jdt98Vo', { value0: method })
+ error:
+ err instanceof Error ? err.message : t('githubPrRpc.request', { requestMethod: method })
}
}
}
diff --git a/mobile/src/session/mobile-bulk-close-sheet-actions.ts b/mobile/src/session/mobile-bulk-close-sheet-actions.ts
index d094218472f..2729037f3da 100644
--- a/mobile/src/session/mobile-bulk-close-sheet-actions.ts
+++ b/mobile/src/session/mobile-bulk-close-sheet-actions.ts
@@ -83,7 +83,7 @@ export function createCloseWithBulkActions(
) {
return (target: MobileSessionTab | null, dismiss: () => void): ActionSheetAction[] => [
{
- label: t('m.fZbxiK0'),
+ label: t('mobileBulkCloseSheetActions.close'),
destructive: true,
onPress: () => {
dismiss()
diff --git a/mobile/src/session/mobile-clipboard-image.ts b/mobile/src/session/mobile-clipboard-image.ts
index ce03c4d9911..3c3cf772a73 100644
--- a/mobile/src/session/mobile-clipboard-image.ts
+++ b/mobile/src/session/mobile-clipboard-image.ts
@@ -22,7 +22,7 @@ export function normalizeMobileClipboardImageBase64(data: string): string {
throw new Error(CLIPBOARD_IMAGE_TOO_LARGE_ERROR)
}
if (contentBase64.length % 4 === 1 || !BASE64_PATTERN.test(contentBase64)) {
- throw new Error(t('m.64b63WI'))
+ throw new Error(t('mobileClipboardImage.clipboard'))
}
return contentBase64
}
diff --git a/mobile/src/session/mobile-diff-comments.test.ts b/mobile/src/session/mobile-diff-comments.test.ts
index bfa708c1687..0aa40c8f3fd 100644
--- a/mobile/src/session/mobile-diff-comments.test.ts
+++ b/mobile/src/session/mobile-diff-comments.test.ts
@@ -135,7 +135,11 @@ describe('mobile diff comments', () => {
const note = comment({ id: 'a', startLine: 2, lineNumber: 4 })
await mobileI18n.changeLanguage('es')
- expect(mobileI18n.t('m.ZueS87g', { value0: 2, value1: 4 })).toBe('Líneas: 2-4')
+ expect(
+ mobileI18n.t('pairConfirm.pairingFailed', {
+ errorMessage: 'fallo'
+ })
+ ).toBe('Error de emparejamiento: fallo')
expect(formatDiffComments([note])).toBe(formatDesktopDiffComment(note))
})
diff --git a/mobile/src/session/mobile-diff-review-controller-input.ts b/mobile/src/session/mobile-diff-review-controller-input.ts
new file mode 100644
index 00000000000..984db903192
--- /dev/null
+++ b/mobile/src/session/mobile-diff-review-controller-input.ts
@@ -0,0 +1,16 @@
+import type { ConnectionState } from '../transport/types'
+import type { RpcClient } from '../transport/rpc-client'
+import type { MobileDiffReviewQueueFilter } from './mobile-diff-review-queue'
+import type { MobileDiffReviewInitialTarget } from './mobile-diff-review-positioning'
+
+export type MobileDiffReviewControllerInput = {
+ client: RpcClient | null
+ connState: ConnectionState
+ hostId: string
+ worktreeId: string
+ name: string
+ initialFilter: MobileDiffReviewQueueFilter
+ initialTarget: MobileDiffReviewInitialTarget | null
+ onOpenSession: () => void
+ onReconnect: (hostId: string) => void | Promise
+}
diff --git a/mobile/src/session/mobile-diff-review-loaders.ts b/mobile/src/session/mobile-diff-review-loaders.ts
index cd163ea2f74..3f6c02091f4 100644
--- a/mobile/src/session/mobile-diff-review-loaders.ts
+++ b/mobile/src/session/mobile-diff-review-loaders.ts
@@ -54,12 +54,24 @@ export async function loadMobileDiffReviewBranchCompare(
if (isMobileGitUnavailable(response.error?.code, response.error?.message)) {
return { result: null }
}
- return { result: null, error: response.error?.message || t('m.nKp2Mj0') }
+ return {
+ result: null,
+ error: response.error?.message || t('mobileDiffReviewLoaders.committedChangesUnavailable')
+ }
}
const parsed = readMobileBranchCompareResult(response.result)
- return parsed ? { result: parsed } : { result: null, error: t('m.RSAKe4M') }
+ return parsed
+ ? { result: parsed }
+ : {
+ result: null,
+ error: t('mobileDiffReviewLoaders.committedChangesResponse')
+ }
} catch (err) {
- return { result: null, error: err instanceof Error ? err.message : t('m.aLzpW3w') }
+ return {
+ result: null,
+ error:
+ err instanceof Error ? err.message : t('mobileDiffReviewLoaders.committedChangesFailed')
+ }
}
}
@@ -70,13 +82,16 @@ export async function loadMobileDiffReviewSnapshot(
const statusResponse = await client.sendRequest('git.status', { worktree: `id:${worktreeId}` })
if (!statusResponse.ok) {
if (isMobileGitUnavailable(statusResponse.error?.code, statusResponse.error?.message)) {
- return { kind: 'unavailable', message: t('m.9OSp60k') }
+ return {
+ kind: 'unavailable',
+ message: t('mobileDiffReviewLoaders.update')
+ }
}
- throw new Error(statusResponse.error?.message || t('m.9Z6xNzo'))
+ throw new Error(statusResponse.error?.message || t('mobileDiffReviewLoaders.unableLoadChanges'))
}
const status = readMobileGitStatusResult(statusResponse.result)
if (!status) {
- throw new Error(t('m.EgST0cw'))
+ throw new Error(t('mobileDiffReviewLoaders.source'))
}
const [branch, worktreeResponse] = await Promise.all([
@@ -84,7 +99,9 @@ export async function loadMobileDiffReviewSnapshot(
client.sendRequest('worktree.show', { worktree: `id:${worktreeId}` })
])
if (!worktreeResponse.ok) {
- throw new Error(worktreeResponse.error?.message || t('m.1eue8fY'))
+ throw new Error(
+ worktreeResponse.error?.message || t('mobileDiffReviewLoaders.unableLoadReview')
+ )
}
const metadata = readMobileReviewWorktreeMetadata(worktreeResponse.result)
@@ -132,11 +149,11 @@ export async function loadMobileDiffReviewDiff(input: DiffLoadInput): Promise => {
const terminal = args.handleRef.current
if (!args.client || !terminal || !args.enabled) {
- args.onSendError(t('m.6dxPsys'))
+ args.onSendError(t('mobileNativeChatPermissionSend.responseNotSentDisconnected'))
return false
}
// No stale-input heal here (unlike the text/ask sends): a choice is an
@@ -49,9 +49,9 @@ export function useMobileNativeChatPermissionSend(args: {
if (outcome === 'unknown') {
// Why: the response may have been delivered (ack lost / path cutover) —
// a definite "not sent" would invite a double answer.
- args.onSendError(t('m.v7vfn5Q'))
+ args.onSendError(t('mobileNativeChatPermissionSend.responseUnconfirmed'))
} else if (outcome === 'rejected') {
- args.onSendError(t('m.zGX7CcI'))
+ args.onSendError(t('mobileNativeChatPermissionSend.responseNotSent'))
}
return outcome === 'accepted'
},
diff --git a/mobile/src/session/mobile-native-chat-permission.ts b/mobile/src/session/mobile-native-chat-permission.ts
index d12883a6f40..e6bf998bfbc 100644
--- a/mobile/src/session/mobile-native-chat-permission.ts
+++ b/mobile/src/session/mobile-native-chat-permission.ts
@@ -49,11 +49,13 @@ export function parseApprovalFromStatus(
}
const summary = (approval as { summary?: unknown }).summary
return {
- title: t('m.rOYT-0U', { value0: tool }),
+ title: t('mobileNativeChatPermission.allowPermission', {
+ permissionName: tool
+ }),
detail: typeof summary === 'string' && summary.length > 0 ? summary : undefined,
options: [
- { label: t('m.sjphObI'), send: '1' },
- { label: t('m.3EBdICM'), send: ESCAPE }
+ { label: t('mobileNativeChatPermission.allow'), send: '1' },
+ { label: t('mobileNativeChatPermission.deny'), send: ESCAPE }
]
}
}
@@ -126,7 +128,7 @@ function buildNumberedPermission(
detail: string | undefined
): MobileChatPermission {
return {
- title: t('m.LHMnD5o'),
+ title: t('mobileNativeChatPermission.permission'),
detail,
options: options.map((opt) => ({ label: shortLabel(opt.text), send: opt.num }))
}
@@ -169,12 +171,19 @@ export function detectAgentPermission(input: PermissionInput): MobileChatPermiss
// text actually offers a persistent option, to avoid sending a token the agent
// doesn't understand.
const options: MobileChatPermission['options'] = [
- { label: t('m.sjphObI'), send: 'y' },
- { label: t('m.3EBdICM'), send: 'n' }
+ { label: t('mobileNativeChatPermission.allow'), send: 'y' },
+ { label: t('mobileNativeChatPermission.deny'), send: 'n' }
]
if (isAlwaysLabel(text)) {
- options.splice(1, 0, { label: t('m.zqu69ik'), send: 'a' })
+ options.splice(1, 0, {
+ label: t('mobileNativeChatPermission.allowAlways'),
+ send: 'a'
+ })
}
- return { title: t('m.LHMnD5o'), detail, options }
+ return {
+ title: t('mobileNativeChatPermission.permission'),
+ detail,
+ options
+ }
}
diff --git a/mobile/src/session/mobile-native-chat-question.ts b/mobile/src/session/mobile-native-chat-question.ts
index 2eb45472821..e4b9bd3ff42 100644
--- a/mobile/src/session/mobile-native-chat-question.ts
+++ b/mobile/src/session/mobile-native-chat-question.ts
@@ -120,7 +120,8 @@ export function parseAgentQuestion(text: string): MobileChatQuestion | null {
const multiSelect = MULTI_SELECT_HINT.test(text) && options.length > 1
return {
- question: question.length > 0 ? cleanQuestionText(question) : t('m.sxVCOxI'),
+ question:
+ question.length > 0 ? cleanQuestionText(question) : t('mobileNativeChatQuestion.choose'),
options,
multiSelect,
optionTokens
diff --git a/mobile/src/session/mobile-native-chat-render-data.ts b/mobile/src/session/mobile-native-chat-render-data.ts
index 8418c8c32c1..d0cb1bb5090 100644
--- a/mobile/src/session/mobile-native-chat-render-data.ts
+++ b/mobile/src/session/mobile-native-chat-render-data.ts
@@ -16,7 +16,7 @@ export function mobileNativeChatEmptyState(
agent: string | null,
error?: string
): NativeChatEmptyStateCopy | null {
- const agentLabel = agent ? formatAgentTypeLabel(agent) : t('m.57DUHqU')
+ const agentLabel = agent ? formatAgentTypeLabel(agent) : t('mobileNativeChatRenderData.agent')
switch (status) {
// A live agent with no transcript yet — and a loaded-but-empty transcript —
// are both "start a chat"; invite the first message instead of implying the
diff --git a/mobile/src/session/mobile-native-chat-stream-frame.ts b/mobile/src/session/mobile-native-chat-stream-frame.ts
index 563f1c498ff..98ac35fe067 100644
--- a/mobile/src/session/mobile-native-chat-stream-frame.ts
+++ b/mobile/src/session/mobile-native-chat-stream-frame.ts
@@ -32,7 +32,10 @@ export function applyMobileNativeChatStreamFrame(args: {
}): AppliedMobileNativeChatFrame {
const { merger, frame, limit, replaceSnapshot } = args
if (frame.type === 'error') {
- return { kind: 'error', error: frame.message ?? frame.error ?? t('m.tod-ra0') }
+ return {
+ kind: 'error',
+ error: frame.message ?? frame.error ?? t('mobileNativeChatStreamFrame.transcript')
+ }
}
if (frame.type !== 'snapshot' && frame.type !== 'replacement' && frame.type !== 'appended') {
return { kind: 'ignored' }
diff --git a/mobile/src/session/mobile-native-chat-toggle-action.ts b/mobile/src/session/mobile-native-chat-toggle-action.ts
index a0cf7c818ea..f8259c596b2 100644
--- a/mobile/src/session/mobile-native-chat-toggle-action.ts
+++ b/mobile/src/session/mobile-native-chat-toggle-action.ts
@@ -27,7 +27,9 @@ export function getMobileNativeChatToggleActions(args: {
const isChat = isTabChatView(tab.id)
return [
{
- label: isChat ? t('m.dqKsMqY') : t('m.GmBjriA'),
+ label: isChat
+ ? t('mobileNativeChatToggleAction.switchTerminal')
+ : t('mobileNativeChatToggleAction.switchChat'),
icon: isChat ? SquareTerminal : MessageSquare,
onPress: () => {
onClose()
diff --git a/mobile/src/session/mobile-pr-sidebar-state.ts b/mobile/src/session/mobile-pr-sidebar-state.ts
index ac1f3bada97..9d198b54431 100644
--- a/mobile/src/session/mobile-pr-sidebar-state.ts
+++ b/mobile/src/session/mobile-pr-sidebar-state.ts
@@ -120,7 +120,7 @@ export async function loadPrSidebarData(
} catch (err) {
// Why: a dep that rejects (instead of returning `{ ok:false }`) must still
// resolve to an error state, not escape as an unhandled rejection.
- return failureState(err instanceof Error ? err.message : t('m.-D7_HMY'))
+ return failureState(err instanceof Error ? err.message : t('mobilePrSidebarState.unable'))
}
}
diff --git a/mobile/src/session/mobile-session-route-helpers.ts b/mobile/src/session/mobile-session-route-helpers.ts
index 6339469e44f..5916aaa0cfa 100644
--- a/mobile/src/session/mobile-session-route-helpers.ts
+++ b/mobile/src/session/mobile-session-route-helpers.ts
@@ -3,12 +3,12 @@ import type { ConnectionState } from '../transport/types'
import { t } from '@/i18n/mobile-i18n'
export const MOBILE_SESSION_STATUS_LABELS: Record = {
- connecting: t('m.S_1cAME'),
- handshaking: t('m.yqEocVY'),
- connected: t('m.Fr9Rdq8'),
- disconnected: t('m.7mbOxzE'),
- reconnecting: t('m.G1BrrUQ'),
- 'auth-failed': t('m.xEMYAIw')
+ connecting: t('mobileSessionRouteHelpers.connecting'),
+ handshaking: t('mobileSessionRouteHelpers.securing'),
+ connected: t('mobileSessionRouteHelpers.connected'),
+ disconnected: t('mobileSessionRouteHelpers.disconnected'),
+ reconnecting: t('mobileSessionRouteHelpers.reconnecting'),
+ 'auth-failed': t('mobileSessionRouteHelpers.pairing')
}
export const TERMINAL_GESTURE_INPUT_BUCKET_CAPACITY = 64
diff --git a/mobile/src/session/mobile-session-startup-source.test.ts b/mobile/src/session/mobile-session-startup-source.test.ts
index 54ce09f6a2f..b334763cffd 100644
--- a/mobile/src/session/mobile-session-startup-source.test.ts
+++ b/mobile/src/session/mobile-session-startup-source.test.ts
@@ -103,7 +103,7 @@ describe('mobile session startup', () => {
startupEffect.indexOf('await ensureSessionTabs()')
)
expect(startupEffect).toContain('headlessActivationNeedsHostRenderer(response.result)')
- expect(startupEffect).toContain("showToast(t('m.RJlcmtM'), 3000)")
+ expect(startupEffect).toContain("showToast(tr('openOrca'), 3000)")
})
it('fails runtime capability gates closed before probing a replacement client', () => {
@@ -175,18 +175,18 @@ describe('mobile session startup', () => {
it('keeps dynamic agent rows above fixed New Tab actions', () => {
const newTabActions = sliceBetween(
- "title={t('m.-95LQlw')}",
+ "title={tr('newTabTitle')}",
'onClose={() => setShowCreateTabDrawer'
)
expect(newTabActions.indexOf('...createTabAgentActions')).toBeLessThan(
- newTabActions.indexOf("label: t('m.1ELofI0')")
+ newTabActions.indexOf("label: tr('terminal')")
)
- expect(newTabActions.indexOf("label: t('m.1ELofI0')")).toBeLessThan(
- newTabActions.indexOf("label: t('m.vL8HgZo')")
+ expect(newTabActions.indexOf("label: tr('terminal')")).toBeLessThan(
+ newTabActions.indexOf("label: tr('browser')")
)
- expect(newTabActions.indexOf("label: t('m.vL8HgZo')")).toBeLessThan(
- newTabActions.indexOf("label: t('m.c_XP7YM')")
+ expect(newTabActions.indexOf("label: tr('browser')")).toBeLessThan(
+ newTabActions.indexOf("label: tr('markdownNote')")
)
})
})
diff --git a/mobile/src/session/mobile-tab-close-selection.ts b/mobile/src/session/mobile-tab-close-selection.ts
index 4f344185a14..b2dd3c65974 100644
--- a/mobile/src/session/mobile-tab-close-selection.ts
+++ b/mobile/src/session/mobile-tab-close-selection.ts
@@ -3,9 +3,9 @@ export type BulkTabCloseMode = 'others' | 'left' | 'right'
/** Long-press sheet entries, in display order. */
export const BULK_TAB_CLOSE_ACTIONS: { mode: BulkTabCloseMode; label: string }[] = [
- { mode: 'others', label: t('m.XxfyMlc') },
- { mode: 'left', label: t('m._ijK2wo') },
- { mode: 'right', label: t('m.QX9RTgc') }
+ { mode: 'others', label: t('mobileTabCloseSelection.closeOther') },
+ { mode: 'left', label: t('mobileTabCloseSelection.closeTabsLeft') },
+ { mode: 'right', label: t('mobileTabCloseSelection.closeTabsRight') }
]
type BulkClosableTab = {
diff --git a/mobile/src/session/mobile-terminal-action-sheet-actions.ts b/mobile/src/session/mobile-terminal-action-sheet-actions.ts
index f68cd32e4d2..8ea4f270a70 100644
--- a/mobile/src/session/mobile-terminal-action-sheet-actions.ts
+++ b/mobile/src/session/mobile-terminal-action-sheet-actions.ts
@@ -46,7 +46,9 @@ export function getMobileTerminalActionSheetActions<
onToggle: args.onToggleChat
}),
{
- label: phoneMode ? t('m.0XbzIAs') : t('m.502R_mE'),
+ label: phoneMode
+ ? t('mobileTerminalActionSheetActions.switchDesktop')
+ : t('mobileTerminalActionSheetActions.switchPhone'),
icon: phoneMode ? Monitor : Smartphone,
onPress: () => {
args.onDismiss()
@@ -54,14 +56,14 @@ export function getMobileTerminalActionSheetActions<
}
},
{
- label: t('m.2wFDKaY'),
+ label: t('mobileTerminalActionSheetActions.rename'),
closeBeforePress: true,
onPress: () => {
args.onRename(target)
}
},
{
- label: t('m.5s4VNsw'),
+ label: t('mobileTerminalActionSheetActions.clear'),
icon: Eraser,
onPress: () => {
args.onDismiss()
@@ -69,7 +71,7 @@ export function getMobileTerminalActionSheetActions<
}
},
{
- label: t('m.k32XW6w'),
+ label: t('mobileTerminalActionSheetActions.close'),
destructive: true,
onPress: () => {
args.onDismiss()
diff --git a/mobile/src/session/mobile-terminal-records.ts b/mobile/src/session/mobile-terminal-records.ts
index 1317989d51e..ddbd4c9fdda 100644
--- a/mobile/src/session/mobile-terminal-records.ts
+++ b/mobile/src/session/mobile-terminal-records.ts
@@ -175,7 +175,7 @@ export function getTerminalRecordsFromSessionTabs(
return [
{
handle: tab.terminal,
- title: tab.title || t('m.BGT_JFw'),
+ title: tab.title || t('mobileTerminalRecords.terminal'),
terminalTheme: tab.terminalTheme,
isActive: tab.isActive === true
}
diff --git a/mobile/src/session/mobile-terminal-tab-agent.ts b/mobile/src/session/mobile-terminal-tab-agent.ts
index c2fb45d478c..1b44ad0ffd8 100644
--- a/mobile/src/session/mobile-terminal-tab-agent.ts
+++ b/mobile/src/session/mobile-terminal-tab-agent.ts
@@ -38,21 +38,23 @@ export function getMobileSessionTabTitle(tab: MobileSessionTab): string {
return title
}
if (isBlankBrowserUrl(tab.url)) {
- return t('m.tgyhT8Q')
+ return t('mobileTerminalTabAgent.new')
}
- return t('m.YHLAtbk')
+ return t('mobileTerminalTabAgent.browser')
}
if (tab.type === 'markdown') {
- return tab.title || t('m.oS6AL4Y')
+ return tab.title || t('mobileTerminalTabAgent.markdown')
}
if (tab.type === 'file') {
- return tab.title || t('m.nMoq2GI')
+ return tab.title || t('mobileTerminalTabAgent.file')
}
// Why: strip the leading agent status glyph (✳ etc.) once the tab shows the
// provider icon. Mobile falls back for glyph-only titles because iOS can
// render the bare status glyph as a stray colored box beside the icon.
if (resolveMobileTerminalTabAgentId(tab)) {
- return stripLeadingAgentTitleDecorationOrEmpty(tab.title) || t('m.ubcC1kU')
+ return (
+ stripLeadingAgentTitleDecorationOrEmpty(tab.title) || t('mobileTerminalTabAgent.terminal')
+ )
}
- return tab.title || t('m.ubcC1kU')
+ return tab.title || t('mobileTerminalTabAgent.terminal')
}
diff --git a/mobile/src/session/pr-actions-engine.ts b/mobile/src/session/pr-actions-engine.ts
index 5b131fe36d5..41a8d3c3e62 100644
--- a/mobile/src/session/pr-actions-engine.ts
+++ b/mobile/src/session/pr-actions-engine.ts
@@ -167,7 +167,7 @@ export class PrActionsEngine {
await this.cfg.refetch()
} catch (err) {
if (this.identity === identity) {
- this.setError(err instanceof Error ? err.message : t('m.vXd8YYA'))
+ this.setError(err instanceof Error ? err.message : t('prActionsEngine.failedRefresh'))
}
}
return
@@ -196,7 +196,7 @@ export class PrActionsEngine {
await this.settle(identity, outcome, { onSuccess: () => {}, onRevert: () => {} })
} catch (err) {
if (this.identity === identity) {
- this.setError(err instanceof Error ? err.message : t('m.umfRNkc'))
+ this.setError(err instanceof Error ? err.message : t('prActionsEngine.failedMerge'))
}
} finally {
this.clearBusyIfOwned(identity, { kind: 'merge' })
diff --git a/mobile/src/session/pr-ai-triage-launch.ts b/mobile/src/session/pr-ai-triage-launch.ts
index f31bb273e72..200e888e58c 100644
--- a/mobile/src/session/pr-ai-triage-launch.ts
+++ b/mobile/src/session/pr-ai-triage-launch.ts
@@ -23,11 +23,11 @@ export async function createTerminalAndSendPrompt(
navigation: 'caller'
})
if (!created.ok) {
- throw new Error(created.error?.message || t('m.p20YlWo'))
+ throw new Error(created.error?.message || t('prAiTriageLaunch.failedCreate'))
}
const terminalTab = readMobileReviewCreatedTerminal(created.result)
if (!terminalTab) {
- throw new Error(t('m.8WPx578'))
+ throw new Error(t('prAiTriageLaunch.created'))
}
const sent = await client.sendRequest('terminal.send', {
terminal: terminalTab.terminal,
@@ -35,9 +35,9 @@ export async function createTerminalAndSendPrompt(
enter: true
})
if (!sent.ok) {
- throw new Error(sent.error?.message || t('m.-j2Yzyc'))
+ throw new Error(sent.error?.message || t('prAiTriageLaunch.failedSend'))
}
if (!readMobileReviewTerminalSendAccepted(sent.result)) {
- throw new Error(t('m.kyy8tNA'))
+ throw new Error(t('prAiTriageLaunch.terminal'))
}
}
diff --git a/mobile/src/session/quick-commands-tab-stability-source.test.ts b/mobile/src/session/quick-commands-tab-stability-source.test.ts
index ecc67054912..8c8e0eae6ea 100644
--- a/mobile/src/session/quick-commands-tab-stability-source.test.ts
+++ b/mobile/src/session/quick-commands-tab-stability-source.test.ts
@@ -30,7 +30,7 @@ function findQuickCommandsTabButtons(): ts.JsxSelfClosingElement[] {
}
function getQuickCommandsTabSource(): string {
- const start = source.indexOf("accessibilityLabel={t('m.7IGdkR0')}")
+ const start = source.indexOf("accessibilityLabel={tr('newTab')}")
expect(start).toBeGreaterThanOrEqual(0)
const end = source.indexOf('{/* Content-row host', start)
expect(end).toBeGreaterThan(start)
@@ -56,8 +56,8 @@ describe('quick-commands tab stability', () => {
expect(style?.initializer?.getText(sourceFile)).toBe('{styles.tabBar}')
expect(tabSource).toContain('if (quickCommandsSupported === true)')
expect(tabSource).toContain('setShowQuickCommands(true)')
- expect(tabSource).toContain("t('m.UoNS0D4')")
- expect(tabSource).toContain("t('m.5g1_I7Y')")
+ expect(tabSource).toContain("tr('desktopUpdateRequiredQuick')")
+ expect(tabSource).toContain("tr('checking')")
})
it('only presents the sheet after support is confirmed', () => {
diff --git a/mobile/src/session/use-mobile-attachment-input-lease-gate.ts b/mobile/src/session/use-mobile-attachment-input-lease-gate.ts
index 3d210cd1b0c..ce77d46659e 100644
--- a/mobile/src/session/use-mobile-attachment-input-lease-gate.ts
+++ b/mobile/src/session/use-mobile-attachment-input-lease-gate.ts
@@ -61,7 +61,7 @@ export function useMobileAttachmentInputLeaseGate({
if (nativeChatInputLeaseReadyRef.current) {
return true
}
- showToast(t('m.Lq5nqds'), 1500)
+ showToast(t('useMobileAttachmentInputLeaseGate.attach'), 1500)
return false
},
[
diff --git a/mobile/src/session/use-mobile-diff-review-comment-actions.ts b/mobile/src/session/use-mobile-diff-review-comment-actions.ts
index e80a5759c39..d8a7d3d8e6a 100644
--- a/mobile/src/session/use-mobile-diff-review-comment-actions.ts
+++ b/mobile/src/session/use-mobile-diff-review-comment-actions.ts
@@ -65,7 +65,7 @@ export function useMobileDiffReviewCommentActions(input: CommentActionsInput) {
const persistMetadata = useCallback(
async (comments: readonly DiffComment[], reviewState: MobileDiffReviewState) => {
if (!client || connState !== 'connected') {
- throw new Error(t('m.a3rNaLA'))
+ throw new Error(t('useMobileDiffReviewCommentActions.waiting'))
}
const response = await client.sendRequest('worktree.set', {
worktree: `id:${worktreeId}`,
@@ -73,7 +73,9 @@ export function useMobileDiffReviewCommentActions(input: CommentActionsInput) {
mobileDiffReview: reviewState
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.dzoAXdg'))
+ throw new Error(
+ response.error?.message || t('useMobileDiffReviewCommentActions.failedSaveReviewState')
+ )
}
},
[client, connState, worktreeId]
@@ -98,7 +100,11 @@ export function useMobileDiffReviewCommentActions(input: CommentActionsInput) {
setScreenState(previous)
}
triggerError()
- setActionError(err instanceof Error ? err.message : t('m.kOr-gVg'))
+ setActionError(
+ err instanceof Error
+ ? err.message
+ : t('useMobileDiffReviewCommentActions.failedSaveReview')
+ )
throw err
}
},
diff --git a/mobile/src/session/use-mobile-diff-review-controller.ts b/mobile/src/session/use-mobile-diff-review-controller.ts
index ad5ea71d4e0..e7f73d863be 100644
--- a/mobile/src/session/use-mobile-diff-review-controller.ts
+++ b/mobile/src/session/use-mobile-diff-review-controller.ts
@@ -1,8 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import type { FlatList } from 'react-native'
import type { DiffComment } from '../../../src/shared/types'
-import type { ConnectionState } from '../transport/types'
-import type { RpcClient } from '../transport/rpc-client'
import { getWorktreeLabel } from './worktree-label'
import { getUnsentMobileDiffComments } from './mobile-diff-comment-edit'
import {
@@ -12,10 +10,8 @@ import {
type MobileDiffReviewQueueFilter,
type MobileDiffReviewQueueItem
} from './mobile-diff-review-queue'
-import {
- findMobileDiffReviewInitialIndex,
- type MobileDiffReviewInitialTarget
-} from './mobile-diff-review-positioning'
+import { findMobileDiffReviewInitialIndex } from './mobile-diff-review-positioning'
+import type { MobileDiffReviewControllerInput } from './mobile-diff-review-controller-input'
import {
loadMobileDiffReviewDiff,
loadMobileDiffReviewSnapshot
@@ -30,21 +26,11 @@ import type {
} from './mobile-diff-review-screen-model'
import { useMobileDiffReviewInteractions } from './use-mobile-diff-review-interactions'
import { useMobilePrSidebarController } from './use-mobile-pr-sidebar-controller'
-import { t } from '@/i18n/mobile-i18n'
+import { createMobileTranslator } from '@/i18n/mobile-i18n'
-type ControllerInput = {
- client: RpcClient | null
- connState: ConnectionState
- hostId: string
- worktreeId: string
- name: string
- initialFilter: MobileDiffReviewQueueFilter
- initialTarget: MobileDiffReviewInitialTarget | null
- onOpenSession: () => void
- onReconnect: (hostId: string) => void | Promise
-}
+const tr = createMobileTranslator('diffReview')
-export function useMobileDiffReviewController(input: ControllerInput) {
+export function useMobileDiffReviewController(input: MobileDiffReviewControllerInput) {
const {
client,
connState,
@@ -80,11 +66,17 @@ export function useMobileDiffReviewController(input: ControllerInput) {
loadGenerationRef.current = generation
const isCurrent = () => generation === loadGenerationRef.current
if (!worktreeId) {
- setScreenState({ kind: 'error', message: t('m.HkX9h2s') })
+ setScreenState({
+ kind: 'error',
+ message: tr('missing')
+ })
return
}
if (!client || connState !== 'connected') {
- setScreenState({ kind: 'error', message: t('m.AtE6oQA') })
+ setScreenState({
+ kind: 'error',
+ message: tr('waiting')
+ })
return
}
setScreenState((prev) => (prev.kind === 'ready' ? prev : { kind: 'loading' }))
@@ -99,7 +91,7 @@ export function useMobileDiffReviewController(input: ControllerInput) {
if (isCurrent()) {
setScreenState({
kind: 'error',
- message: err instanceof Error ? err.message : t('m.1ymIBpg')
+ message: err instanceof Error ? err.message : tr('unableLoadReview')
})
}
}
@@ -168,7 +160,11 @@ export function useMobileDiffReviewController(input: ControllerInput) {
return
}
if (!client || connState !== 'connected') {
- setDiffState({ kind: 'error', itemKey: currentItem.key, message: t('m.AtE6oQA') })
+ setDiffState({
+ kind: 'error',
+ itemKey: currentItem.key,
+ message: tr('waiting')
+ })
return
}
let stale = false
@@ -189,7 +185,7 @@ export function useMobileDiffReviewController(input: ControllerInput) {
setDiffState({
kind: 'error',
itemKey: currentItem.key,
- message: err instanceof Error ? err.message : t('m.MOOmRCc')
+ message: err instanceof Error ? err.message : tr('unableLoadDiff')
})
}
})
diff --git a/mobile/src/session/use-mobile-diff-review-git-actions.ts b/mobile/src/session/use-mobile-diff-review-git-actions.ts
index a36883582f0..d7287e32d3c 100644
--- a/mobile/src/session/use-mobile-diff-review-git-actions.ts
+++ b/mobile/src/session/use-mobile-diff-review-git-actions.ts
@@ -23,7 +23,7 @@ export function useMobileDiffReviewGitActions(input: GitActionsInput) {
const runGitMutation = useCallback(
async (method: GitMutationMethod, item: MobileDiffReviewQueueItem) => {
if (!client || connState !== 'connected') {
- setActionError(t('m.L-xz6vw'))
+ setActionError(t('useMobileDiffReviewGitActions.waiting'))
return
}
setBusyAction(`${method}:${item.filePath}`)
@@ -34,13 +34,15 @@ export function useMobileDiffReviewGitActions(input: GitActionsInput) {
filePath: item.filePath
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.MOtwYRI'))
+ throw new Error(response.error?.message || t('useMobileDiffReviewGitActions.source'))
}
triggerSuccess()
await loadReviewData()
} catch (err) {
triggerError()
- setActionError(err instanceof Error ? err.message : t('m.MOtwYRI'))
+ setActionError(
+ err instanceof Error ? err.message : t('useMobileDiffReviewGitActions.source')
+ )
} finally {
setBusyAction(null)
}
@@ -50,7 +52,7 @@ export function useMobileDiffReviewGitActions(input: GitActionsInput) {
const stageReviewedFiles = useCallback(async () => {
if (!client || connState !== 'connected') {
- setActionError(t('m.L-xz6vw'))
+ setActionError(t('useMobileDiffReviewGitActions.waiting'))
return
}
const files = queue.filter(
@@ -78,8 +80,16 @@ export function useMobileDiffReviewGitActions(input: GitActionsInput) {
triggerSuccess()
setActionError(
failed > 0
- ? t('m.tyXkf4g', { value0: staged, value1: failed })
- : t(staged === 1 ? 'm.S-avV-Y' : 'm.IPu47z8', { value0: staged })
+ ? t('useMobileDiffReviewGitActions.stagedFile', {
+ stagedFileCount: staged,
+ failedFileCount: failed
+ })
+ : t(
+ staged === 1
+ ? 'useMobileDiffReviewGitActions.stagedReviewedFile'
+ : 'useMobileDiffReviewGitActions.stagedReviewedFiles',
+ { staged: staged }
+ )
)
await loadReviewData()
}, [client, connState, loadReviewData, queue, setActionError, setBusyAction, worktreeId])
diff --git a/mobile/src/session/use-mobile-diff-review-interactions.ts b/mobile/src/session/use-mobile-diff-review-interactions.ts
index 8fdc493e135..b199fb5efd8 100644
--- a/mobile/src/session/use-mobile-diff-review-interactions.ts
+++ b/mobile/src/session/use-mobile-diff-review-interactions.ts
@@ -189,7 +189,7 @@ export function useMobileDiffReviewInteractions(input: InteractionInput) {
staged: currentItem.scope === 'staged'
})
if (!response.ok) {
- setActionError(response.error?.message || t('m.0hhZYns'))
+ setActionError(response.error?.message || t('useMobileDiffReviewInteractions.unable'))
return
}
onOpenSession()
diff --git a/mobile/src/session/use-mobile-diff-review-send-actions.ts b/mobile/src/session/use-mobile-diff-review-send-actions.ts
index 609c2bac53f..ce94e7d7d8c 100644
--- a/mobile/src/session/use-mobile-diff-review-send-actions.ts
+++ b/mobile/src/session/use-mobile-diff-review-send-actions.ts
@@ -45,7 +45,7 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
}
await Clipboard.setStringAsync(formatDiffComments(screenState.comments))
triggerSuccess()
- setActionError(t('m.LtedJAM'))
+ setActionError(t('useMobileDiffReviewSendActions.reviewNotesCopied'))
}, [screenState, setActionError])
const clearSentNotes = useCallback(async () => {
@@ -74,12 +74,12 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
const sendPromptToTerminal = useCallback(
async (terminal: string, comments: readonly DiffComment[]) => {
if (!client || connState !== 'connected') {
- throw new Error(t('m.x0Dr_H8'))
+ throw new Error(t('useMobileDiffReviewSendActions.waiting'))
}
// Marked by terminal handle, not by surface, so a paste orphaned here by native
// chat would ride along with these notes (#10228). Diff review carries no device token.
if (!(await healMobileNativeChatStaleInput({ client, terminal, deviceToken: null }))) {
- throw new Error(t('m.tpf9SfA'))
+ throw new Error(t('useMobileDiffReviewSendActions.failedSend'))
}
const response = await client.sendRequest('terminal.send', {
terminal,
@@ -87,14 +87,14 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
enter: true
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.tpf9SfA'))
+ throw new Error(response.error?.message || t('useMobileDiffReviewSendActions.failedSend'))
}
if (!readMobileReviewTerminalSendAccepted(response.result)) {
- throw new Error(t('m.-NMYOgc'))
+ throw new Error(t('useMobileDiffReviewSendActions.terminal'))
}
await markNotesSent(comments)
triggerSuccess()
- setActionError(t('m.U2LqmGk'))
+ setActionError(t('useMobileDiffReviewSendActions.reviewNotesSent'))
setSendSheet(null)
},
[client, connState, markNotesSent, setActionError, setSendSheet]
@@ -103,7 +103,7 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
const createTerminalAndSend = useCallback(
async (comments: readonly DiffComment[]) => {
if (!client || connState !== 'connected') {
- throw new Error(t('m.x0Dr_H8'))
+ throw new Error(t('useMobileDiffReviewSendActions.waiting'))
}
const response = await client.sendRequest('session.tabs.createTerminal', {
worktree: `id:${worktreeId}`,
@@ -112,11 +112,11 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
navigation: 'caller'
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.NhC30K0'))
+ throw new Error(response.error?.message || t('useMobileDiffReviewSendActions.failedCreate'))
}
const created = readMobileReviewCreatedTerminal(response.result)
if (!created) {
- throw new Error(t('m.LYAe0FE'))
+ throw new Error(t('useMobileDiffReviewSendActions.created'))
}
await sendPromptToTerminal(created.terminal, comments)
},
@@ -125,7 +125,7 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
const openSendSheet = useCallback(async () => {
if (!client || connState !== 'connected') {
- setActionError(t('m.x0Dr_H8'))
+ setActionError(t('useMobileDiffReviewSendActions.waiting'))
return
}
setSendSheet({ kind: 'loading' })
@@ -134,13 +134,13 @@ export function useMobileDiffReviewSendActions(input: SendActionsInput) {
worktree: `id:${worktreeId}`
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.vMHt0l8'))
+ throw new Error(response.error?.message || t('useMobileDiffReviewSendActions.unable'))
}
setSendSheet({ kind: 'ready', terminals: readMobileReviewTerminalTabs(response.result) })
} catch (err) {
setSendSheet({
kind: 'error',
- message: err instanceof Error ? err.message : t('m.vMHt0l8'),
+ message: err instanceof Error ? err.message : t('useMobileDiffReviewSendActions.unable'),
terminals: []
})
}
diff --git a/mobile/src/session/use-mobile-image-attachment.ts b/mobile/src/session/use-mobile-image-attachment.ts
index b01fe9f6bb2..87e7ae0d31f 100644
--- a/mobile/src/session/use-mobile-image-attachment.ts
+++ b/mobile/src/session/use-mobile-image-attachment.ts
@@ -71,18 +71,18 @@ export function useMobileImageAttachment({
} catch (error) {
onError()
if (connState !== 'connected') {
- showToast(t('m.tu-qlN0'), 1500)
+ showToast(t('useMobileImageAttachment.attachFailedDisconnected'), 1500)
return
}
if (error instanceof ImageLibraryPermissionError) {
- showToast(t('m.JdGd1Ic'), 1500)
+ showToast(t('useMobileImageAttachment.photo'), 1500)
return
}
if (isClipboardImageTooLargeError(error)) {
- showToast(t('m.hJYA7AQ'), 1500)
+ showToast(t('useMobileImageAttachment.image'), 1500)
return
}
- showToast(t('m.NSS4Or0'), 1500)
+ showToast(t('useMobileImageAttachment.attachFailed'), 1500)
} finally {
setIsAttaching(false)
}
diff --git a/mobile/src/session/use-mobile-native-chat-answer-send.ts b/mobile/src/session/use-mobile-native-chat-answer-send.ts
index 894a34b9cef..5bdd7aeb6f6 100644
--- a/mobile/src/session/use-mobile-native-chat-answer-send.ts
+++ b/mobile/src/session/use-mobile-native-chat-answer-send.ts
@@ -98,7 +98,7 @@ export function useMobileNativeChatAnswerSend(args: {
async (prompt: AskPrompt, selections: AskAnswerSelection[]): Promise => {
const handle = handleRef.current
if (!client || !handle || !enabled) {
- onSendError(t('m.O2gcQk0'))
+ onSendError(t('useMobileNativeChatAnswerSend.answerNotSentDisconnected'))
return false
}
if (!hasAskAnswer(prompt, selections)) {
@@ -163,7 +163,11 @@ export function useMobileNativeChatAnswerSend(args: {
// mid-sequence left the remote selector half-stepped, and telling the
// user nothing was sent invites a retry on top of the advanced state.
onSendError(
- sawAcceptedGroup ? t('m.UnHHxag') : sawUnknownOutcome ? t('m.ukuLb_A') : t('m.eOcfBcE')
+ sawAcceptedGroup
+ ? t('useMobileNativeChatAnswerSend.answerPartly')
+ : sawUnknownOutcome
+ ? t('useMobileNativeChatAnswerSend.answerUnconfirmed')
+ : t('useMobileNativeChatAnswerSend.answerNotSent')
)
}
return false
@@ -188,7 +192,7 @@ export function useMobileNativeChatAnswerSend(args: {
}))
) {
if (generationRef.current === generation) {
- onSendError(t('m.eOcfBcE'))
+ onSendError(t('useMobileNativeChatAnswerSend.answerNotSent'))
}
return false
}
diff --git a/mobile/src/session/use-mobile-native-chat-cancel-ask.ts b/mobile/src/session/use-mobile-native-chat-cancel-ask.ts
index 6c465e1ccbb..fce75cae333 100644
--- a/mobile/src/session/use-mobile-native-chat-cancel-ask.ts
+++ b/mobile/src/session/use-mobile-native-chat-cancel-ask.ts
@@ -19,7 +19,7 @@ export function useMobileNativeChatCancelAsk(args: {
return useCallback(async (): Promise => {
const handle = handleRef.current
if (!client || !handle || !enabled) {
- onSendError(t('m.Z_x_TcE'))
+ onSendError(t('useMobileNativeChatCancelAsk.cancelNotSentDisconnected'))
return false
}
cancelPending()
@@ -37,9 +37,9 @@ export function useMobileNativeChatCancelAsk(args: {
if (outcome === 'unknown') {
// Why: the Escape may have landed (ack lost / path cutover) — a definite
// "not sent" would invite a second Escape into a changed prompt state.
- onSendError(t('m.chT2Z44'))
+ onSendError(t('useMobileNativeChatCancelAsk.cancelUnconfirmed'))
} else if (outcome === 'rejected') {
- onSendError(t('m.htcCRsA'))
+ onSendError(t('useMobileNativeChatCancelAsk.cancelNotSent'))
}
return outcome === 'accepted'
}, [cancelPending, client, deviceTokenRef, enabled, handleRef, onSendError])
diff --git a/mobile/src/session/use-mobile-native-chat-image-attachments.ts b/mobile/src/session/use-mobile-native-chat-image-attachments.ts
index 52b3678ba10..c8f205fff93 100644
--- a/mobile/src/session/use-mobile-native-chat-image-attachments.ts
+++ b/mobile/src/session/use-mobile-native-chat-image-attachments.ts
@@ -163,18 +163,18 @@ export function useMobileNativeChatImageAttachments({
} catch (error) {
onError?.()
if (connStateRef.current !== 'connected') {
- showToast(t('m.Kc1O9hE'), 1500)
+ showToast(t('useMobileNativeChatImageAttachments.attachFailedDisconnected'), 1500)
return
}
if (error instanceof ImageLibraryPermissionError) {
- showToast(t('m.jdkmIaw'), 1500)
+ showToast(t('useMobileNativeChatImageAttachments.photo'), 1500)
return
}
if (isClipboardImageTooLargeError(error)) {
- showToast(t('m.-YjNIcU'), 1500)
+ showToast(t('useMobileNativeChatImageAttachments.image'), 1500)
return
}
- showToast(t('m.JlNqDLA'), 1500)
+ showToast(t('useMobileNativeChatImageAttachments.attachFailed'), 1500)
} finally {
if (started) {
attachingCount.current -= 1
@@ -219,7 +219,7 @@ export function useMobileNativeChatImageAttachments({
const operationTerminal = activeHandleRef.current
if (operationTerminal && sendInFlightTerminalsRef.current.has(operationTerminal)) {
onError?.()
- onSendError(t('m.c6Kd_Ps'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSent'))
return false
}
if (operationTerminal) {
@@ -244,7 +244,7 @@ export function useMobileNativeChatImageAttachments({
// image path; the heal retries once the lease is back.
if (!client || !enabled || connState !== 'connected') {
onError?.()
- onSendError(t('m.4Xgw97k'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSentDisconnected'))
return false
}
const healed = await healMobileNativeChatStaleInput({
@@ -257,7 +257,7 @@ export function useMobileNativeChatImageAttachments({
// clear never touched, so abort rather than reroute it.
if (!healed || activeHandleRef.current !== staleTerminal) {
onError?.()
- onSendError(t('m.c6Kd_Ps'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSent'))
return false
}
}
@@ -268,7 +268,7 @@ export function useMobileNativeChatImageAttachments({
if (!client || !handle || !enabled || connState !== 'connected') {
onError?.()
// Mirror the text path's failure surface (the base send is never reached).
- onSendError(t('m.4Xgw97k'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSentDisconnected'))
return false
}
try {
@@ -287,7 +287,7 @@ export function useMobileNativeChatImageAttachments({
// Keep the chips so the user can retry; the failed paste never submitted.
markMobileNativeChatInputStale(handle)
onError?.()
- onSendError(t('m.c6Kd_Ps'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSent'))
return false
}
// The paste's leading Ctrl+U cleared any earlier stale input in `handle`.
@@ -305,7 +305,7 @@ export function useMobileNativeChatImageAttachments({
if (activeHandleRef.current !== handle) {
markMobileNativeChatInputStale(handle)
onError?.()
- onSendError(t('m.c6Kd_Ps'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSent'))
return false
}
const outcome = await baseSend(
@@ -339,7 +339,7 @@ export function useMobileNativeChatImageAttachments({
// attempt's leading Ctrl+U clears whatever fraction of the paste landed.
markMobileNativeChatInputStale(handle)
onError?.()
- onSendError(t('m.c6Kd_Ps'))
+ onSendError(t('useMobileNativeChatImageAttachments.messageNotSent'))
return false
}
} finally {
diff --git a/mobile/src/session/use-mobile-native-chat-message-send.ts b/mobile/src/session/use-mobile-native-chat-message-send.ts
index 591f347c4d7..07776cc1342 100644
--- a/mobile/src/session/use-mobile-native-chat-message-send.ts
+++ b/mobile/src/session/use-mobile-native-chat-message-send.ts
@@ -76,7 +76,7 @@ export function useMobileNativeChatMessageSend(args: {
// answer (which reaches this send directly) would otherwise burn the whole
// 15s heal+send budget waiting on a socket that is already gone.
if (!client || !handle || !origin || !enabled) {
- onSendError(t('m.t_qfHRA'))
+ onSendError(t('useMobileNativeChatMessageSend.messageNotSentDisconnected'))
return 'rejected'
}
// The agent's input may still hold an orphaned image paste from an earlier
@@ -94,7 +94,7 @@ export function useMobileNativeChatMessageSend(args: {
deadline
}
if (!(await healMobileNativeChatStaleInput(healArgs))) {
- onSendError(t('m.ZkABdzg'))
+ onSendError(t('useMobileNativeChatMessageSend.messageNotSent'))
return 'rejected'
}
// Why: empty the composer at send time, not on the ack — over relay the
@@ -129,7 +129,7 @@ export function useMobileNativeChatMessageSend(args: {
if (syncComposer) {
restoreRejectedDraft(origin, text)
}
- onSendError(t('m.ZkABdzg'))
+ onSendError(t('useMobileNativeChatMessageSend.messageNotSent'))
return 'rejected'
}
}
@@ -165,14 +165,16 @@ export function useMobileNativeChatMessageSend(args: {
if (outcome === 'unknown') {
// Why: an ack-lost send usually WAS delivered (issue seen on cellular
// relay) — verify via the transcript echo instead of a false "not sent".
- holdUnconfirmedSend(origin, text, () => onSendError(t('m.klTsRAk')))
+ holdUnconfirmedSend(origin, text, () =>
+ onSendError(t('useMobileNativeChatMessageSend.delivery'))
+ )
return 'unknown'
}
if (outcome === 'rejected') {
if (syncComposer) {
restoreRejectedDraft(origin, text)
}
- onSendError(t('m.ZkABdzg'))
+ onSendError(t('useMobileNativeChatMessageSend.messageNotSent'))
return 'rejected'
}
// `images` are local preview URIs for the optimistic echo only — the actual
diff --git a/mobile/src/session/use-mobile-native-chat-stop.ts b/mobile/src/session/use-mobile-native-chat-stop.ts
index 62f940629fa..859d0c4a4e4 100644
--- a/mobile/src/session/use-mobile-native-chat-stop.ts
+++ b/mobile/src/session/use-mobile-native-chat-stop.ts
@@ -44,7 +44,7 @@ export function useMobileNativeChatStop(args: {
return useCallback(() => {
const handle = handleRef.current
if (!client || !handle || !enabled) {
- onSendError(t('m.ZhefrDE'))
+ onSendError(t('useMobileNativeChatStop.stopNotSentTerminal'))
return
}
cancelPending()
@@ -74,7 +74,11 @@ export function useMobileNativeChatStop(args: {
// Why: an ack lost after the frame was written (or a logical cutover) may
// still have stopped the agent — a definite "not sent" would invite a second
// Escape into changed state. Mirrors the cancel/answer wording.
- onSendError(sawUnknown ? t('m.i8UxPTM') : t('m.S9MYUPk'))
+ onSendError(
+ sawUnknown
+ ? t('useMobileNativeChatStop.stopUnconfirmed')
+ : t('useMobileNativeChatStop.stopNotSent')
+ )
}
const sendEscape = (): void => {
const activeRoute = activeRouteRef.current
diff --git a/mobile/src/session/use-mobile-pr-actions.ts b/mobile/src/session/use-mobile-pr-actions.ts
index 5cec45e7f48..f9750c2b9a9 100644
--- a/mobile/src/session/use-mobile-pr-actions.ts
+++ b/mobile/src/session/use-mobile-pr-actions.ts
@@ -148,7 +148,10 @@ export function useMobilePrActions(input: PrActionsInput) {
// Stand-in mutations used before a client exists; they never fire (the hook gates
// on `ready`) but keep the engine constructable.
function noopMutations(): PrActionMutations {
- const fail = async () => ({ ok: false as const, error: t('m.AandnA4') })
+ const fail = async () => ({
+ ok: false as const,
+ error: t('useMobilePrActions.not')
+ })
return {
mergePR: fail,
setPRAutoMerge: fail,
diff --git a/mobile/src/session/use-mobile-pr-ai-triage.ts b/mobile/src/session/use-mobile-pr-ai-triage.ts
index 6760c941d77..015b7d62e1e 100644
--- a/mobile/src/session/use-mobile-pr-ai-triage.ts
+++ b/mobile/src/session/use-mobile-pr-ai-triage.ts
@@ -32,7 +32,7 @@ export function useMobilePrAiTriage(input: Input) {
return false
}
if (!client || connState !== 'connected') {
- setError(t('m.WXv-mcQ'))
+ setError(t('useMobilePrAiTriage.waiting'))
triggerError()
return false
}
@@ -45,7 +45,7 @@ export function useMobilePrAiTriage(input: Input) {
return true
} catch (err) {
triggerError()
- setError(err instanceof Error ? err.message : t('m.62Wqvcg'))
+ setError(err instanceof Error ? err.message : t('useMobilePrAiTriage.failed'))
return false
} finally {
inFlightRef.current = false
diff --git a/mobile/src/session/use-mobile-pr-comment-actions.ts b/mobile/src/session/use-mobile-pr-comment-actions.ts
index a63dafd6a27..a7ec91168b2 100644
--- a/mobile/src/session/use-mobile-pr-comment-actions.ts
+++ b/mobile/src/session/use-mobile-pr-comment-actions.ts
@@ -149,7 +149,7 @@ export function useMobilePrCommentActions(input: PrCommentActionsInput) {
// Why: if a mutation (or the refetch) throws, still honor the boolean
// contract — error haptic + message, return false — rather than rejecting.
triggerError()
- setError(err instanceof Error ? err.message : t('m.zchh0X0'))
+ setError(err instanceof Error ? err.message : t('useMobilePrCommentActions.comment'))
return false
} finally {
inFlightRef.current.delete(key)
diff --git a/mobile/src/session/use-mobile-pr-title-action.ts b/mobile/src/session/use-mobile-pr-title-action.ts
index 9adc76799d9..a2f6e4cd007 100644
--- a/mobile/src/session/use-mobile-pr-title-action.ts
+++ b/mobile/src/session/use-mobile-pr-title-action.ts
@@ -65,7 +65,7 @@ export function useMobilePrTitleAction(input: PrTitleActionInput) {
// Why: surface an explicit error when offline/not-ready so Save doesn't
// silently no-op (the editor stays open with a reason instead of nothing).
if (!ready || !mutations) {
- setError(t('m.RqzbvDE'))
+ setError(t('useMobilePrTitleAction.not'))
return false
}
inFlightRef.current = true
@@ -85,7 +85,7 @@ export function useMobilePrTitleAction(input: PrTitleActionInput) {
// Why: updateTitle/refetch can throw; without this the `void save()`
// rejection is unhandled — set the error + error haptic and return false.
triggerError()
- setError(err instanceof Error ? err.message : t('m.6VPjkF8'))
+ setError(err instanceof Error ? err.message : t('useMobilePrTitleAction.failed'))
return false
} finally {
inFlightRef.current = false
diff --git a/mobile/src/session/use-mobile-terminal-paste.ts b/mobile/src/session/use-mobile-terminal-paste.ts
index 8c1437dcf08..e37d8183242 100644
--- a/mobile/src/session/use-mobile-terminal-paste.ts
+++ b/mobile/src/session/use-mobile-terminal-paste.ts
@@ -38,7 +38,7 @@ const resizeMobileClipboardImage: MobileClipboardImageResizer = async (source, t
// Why: empty base64 would pass the downstream base64 check and upload a corrupt
// image, so fail loudly here instead of silently sending an invalid payload.
if (!result.base64) {
- throw new Error(t('m.eH92OqQ'))
+ throw new Error(t('useMobileTerminalPaste.failed'))
}
return { data: result.base64, width: result.width, height: result.height }
} finally {
@@ -140,7 +140,7 @@ export function useMobileTerminalPaste({
onError()
// eslint-disable-next-line no-console
console.warn('[mobile-clip] paste oversized', { wrappedBytes })
- showToast(t('m.Ezj8Uog'), 1500)
+ showToast(t('useMobileTerminalPaste.pasteToo'), 1500)
return
}
// Why: paste lives in the accessory row and must not overtake pending IME text.
@@ -174,11 +174,11 @@ export function useMobileTerminalPaste({
// eslint-disable-next-line no-console
console.warn('[mobile-clip] paste failed', { name: err.name, message: err.message })
if (isDisconnected) {
- showToast(t('m.gG0saX0'), 1500)
+ showToast(t('useMobileTerminalPaste.pasteFailedDisconnected'), 1500)
} else if (isClipboardImageTooLargeError(e)) {
- showToast(t('m.5dhlsXo'), 1500)
+ showToast(t('useMobileTerminalPaste.image'), 1500)
} else {
- showToast(t('m.weTQMew'), 1500)
+ showToast(t('useMobileTerminalPaste.pasteFailed'), 1500)
}
}
}, [
diff --git a/mobile/src/session/use-quick-commands.ts b/mobile/src/session/use-quick-commands.ts
index 8f1df678f8a..147273beae9 100644
--- a/mobile/src/session/use-quick-commands.ts
+++ b/mobile/src/session/use-quick-commands.ts
@@ -131,12 +131,12 @@ export function useQuickCommands({ client, enabled }: Args): QuickCommandsState
return
}
if (!response.ok) {
- setError((response as RpcFailure).error.message || t('m.e1BO4eM'))
+ setError((response as RpcFailure).error.message || t('useQuickCommands.failedLoad'))
return
}
const next = readQuickCommands((response as RpcSuccess).result)
if (!next) {
- setError(t('m.e1BO4eM'))
+ setError(t('useQuickCommands.failedLoad'))
return
}
mutationContext.confirmed = next
@@ -149,7 +149,7 @@ export function useQuickCommands({ client, enabled }: Args): QuickCommandsState
operationId === operationIdRef.current &&
mutationContextRef.current === mutationContext
) {
- setError(err instanceof Error ? err.message : t('m.e1BO4eM'))
+ setError(err instanceof Error ? err.message : t('useQuickCommands.failedLoad'))
}
} finally {
if (
@@ -194,19 +194,21 @@ export function useQuickCommands({ client, enabled }: Args): QuickCommandsState
mutation: commandMutation
})
if (!response.ok) {
- throw new Error((response as RpcFailure).error.message || t('m.qYK5Ouo'))
+ throw new Error(
+ (response as RpcFailure).error.message || t('useQuickCommands.failedSave')
+ )
}
const confirmed = readQuickCommands((response as RpcSuccess).result)
if (!confirmed) {
// Why: treating an invalid success payload as [] would let the next
// full-list mutation erase commands that still exist on the host.
- throw new Error(t('m.qYK5Ouo'))
+ throw new Error(t('useQuickCommands.failedSave'))
}
mutationContext.confirmed = confirmed
succeeded = true
return true
} catch (err) {
- failureMessage = err instanceof Error ? err.message : t('m.qYK5Ouo')
+ failureMessage = err instanceof Error ? err.message : t('useQuickCommands.failedSave')
return false
} finally {
mutationContext.pending = mutationContext.pending.filter(
diff --git a/mobile/src/session/worktree-label.ts b/mobile/src/session/worktree-label.ts
index c3b0afbadbb..1ab0c3ec467 100644
--- a/mobile/src/session/worktree-label.ts
+++ b/mobile/src/session/worktree-label.ts
@@ -9,5 +9,5 @@ export function getWorktreeLabel(name: string | undefined, worktreeId: string):
? worktreeId.slice(worktreeId.indexOf('::') + 2)
: worktreeId
const normalized = pathPart.replace(/\\/g, '/').replace(/\/+$/, '')
- return normalized.slice(normalized.lastIndexOf('/') + 1) || t('m.bdYtRH8')
+ return normalized.slice(normalized.lastIndexOf('/') + 1) || t('worktreeLabel.worktree')
}
diff --git a/mobile/src/source-control/MobileBranchDiffPreviewDrawer.tsx b/mobile/src/source-control/MobileBranchDiffPreviewDrawer.tsx
index 31cb84a20ef..6f692e9e980 100644
--- a/mobile/src/source-control/MobileBranchDiffPreviewDrawer.tsx
+++ b/mobile/src/source-control/MobileBranchDiffPreviewDrawer.tsx
@@ -32,15 +32,17 @@ export function MobileBranchDiffPreviewDrawer({ branchDiffPreview, onClose }: Pr
{branchDiffPreview.kind === 'ready'
- ? t('m.6lym-WQ', { value0: branchDiffPreview.summary.baseRef })
- : t('m.I6GjQO8')}
+ ? t('mobileBranchDiffPreviewDrawer.base', {
+ baseRef: branchDiffPreview.summary.baseRef
+ })
+ : t('mobileBranchDiffPreviewDrawer.committed')}
[styles.diffCloseButton, pressed && styles.iconButtonPressed]}
onPress={onClose}
hitSlop={8}
- accessibilityLabel={t('m.v6-Hc8I')}
+ accessibilityLabel={t('mobileBranchDiffPreviewDrawer.close')}
>
@@ -51,13 +53,13 @@ export function MobileBranchDiffPreviewDrawer({ branchDiffPreview, onClose }: Pr
) : branchDiffPreview.kind === 'error' ? (
- {t('m.mZj5XBY')}
+ {t('mobileBranchDiffPreviewDrawer.unable')}
{branchDiffPreview.message}
) : (
{branchDiffPreview.truncated ? (
- {t('m.CgVIb2E')}
+ {t('mobileBranchDiffPreviewDrawer.diff')}
) : null}
{branchDiffPreview.lines.map((line, index) => (
- {t('m.Hol4rtI')}
+
+ {t('mobileCommitFailurePanel.commitFailed')}
+
- {action.summary ?? t('m.qrdoHLM')}
+ {action.summary ?? t('mobileCommitFailurePanel.commitFailedMessage')}
void action.launch()}
disabled={action.launching}
accessibilityRole="button"
- accessibilityLabel={t('m.3iqxoCY')}
+ accessibilityLabel={t('mobileCommitFailurePanel.fixCommit')}
>
{action.launching ? (
) : (
)}
- {t('m.-RbEI6M')}
+ {t('mobileCommitFailurePanel.fix')}
{action.hasDetails && detailsText ? (
@@ -54,11 +56,17 @@ export function MobileCommitFailurePanel({ failure, action }: Props) {
]}
onPress={() => setExpanded((current) => !current)}
accessibilityRole="button"
- accessibilityLabel={expanded ? t('m.7eT5oiE') : t('m.6Pb0W84')}
+ accessibilityLabel={
+ expanded
+ ? t('mobileCommitFailurePanel.hideCommit')
+ : t('mobileCommitFailurePanel.showCommit')
+ }
>
- {expanded ? t('m.eysP-fI') : t('m.P2fbbug')}
+ {expanded
+ ? t('mobileCommitFailurePanel.hideDetails')
+ : t('mobileCommitFailurePanel.showDetails')}
{expanded ? {detailsText} : null}
diff --git a/mobile/src/source-control/MobileGitHistoryList.tsx b/mobile/src/source-control/MobileGitHistoryList.tsx
index 38e196dafef..cd34fcaa8ca 100644
--- a/mobile/src/source-control/MobileGitHistoryList.tsx
+++ b/mobile/src/source-control/MobileGitHistoryList.tsx
@@ -74,7 +74,7 @@ export const MobileGitHistoryList = memo(function MobileGitHistoryList({
}
} catch (err) {
if (active) {
- setError(err instanceof Error ? err.message : t('m.c_4jbTI'))
+ setError(err instanceof Error ? err.message : t('mobileGitHistoryList.failed'))
}
}
})()
@@ -165,7 +165,7 @@ export const MobileGitHistoryList = memo(function MobileGitHistoryList({
{files === 'loading' || files === undefined ? (
) : files.length === 0 ? (
- {t('m.y0bB4-s')}
+ {t('mobileGitHistoryList.noFile')}
) : (
files.map((file) => (
@@ -197,10 +197,14 @@ export const MobileGitHistoryList = memo(function MobileGitHistoryList({
return (
- {view.kind === 'waiting' ? t('m.kylGvPU') : view.message}
+ {view.kind === 'waiting' ? t('mobileGitHistoryList.waiting') : view.message}
-
- {t('m.Qb3CogY')}
+
+ {t('mobileGitHistoryList.retry')}
)
@@ -215,7 +219,7 @@ export const MobileGitHistoryList = memo(function MobileGitHistoryList({
if (view.kind === 'empty') {
return (
- {t('m.fcDHZ1U')}
+ {t('mobileGitHistoryList.noCommits')}
)
}
diff --git a/mobile/src/source-control/MobileSourceControlBranchCard.tsx b/mobile/src/source-control/MobileSourceControlBranchCard.tsx
index 8a405ee698e..de126c01eb5 100644
--- a/mobile/src/source-control/MobileSourceControlBranchCard.tsx
+++ b/mobile/src/source-control/MobileSourceControlBranchCard.tsx
@@ -53,10 +53,22 @@ export function MobileSourceControlBranchCard({
{syncLabel ? {syncLabel} : null}
- {t('m.O_0cF4M', { value0: unstagedCount })}
- {t('m.cLOWzDM', { value0: stagedCount })}
+
+ {t('mobileSourceControlBranchCard.unstaged', {
+ unstagedCount: unstagedCount
+ })}
+
+
+ {t('mobileSourceControlBranchCard.staged', {
+ stagedCount: stagedCount
+ })}
+
{branchCount > 0 ? (
- {t('m.Dysvcf0', { value0: branchCount })}
+
+ {t('mobileSourceControlBranchCard.branch', {
+ branchCount: branchCount
+ })}
+
) : null}
{/* Own row so Abort never overflows past the card when counts are long. */}
diff --git a/mobile/src/source-control/MobileSourceControlContent.tsx b/mobile/src/source-control/MobileSourceControlContent.tsx
index c62c4168c02..85c689d57cb 100644
--- a/mobile/src/source-control/MobileSourceControlContent.tsx
+++ b/mobile/src/source-control/MobileSourceControlContent.tsx
@@ -83,7 +83,9 @@ export function MobileSourceControlContent({ state }: Props) {
// Surface the reconnect state where the user is looking.
- {t('m.o_TTJDk')}
+
+ {t('mobileSourceControlContent.reconnecting')}
+
) : null}
@@ -115,7 +117,7 @@ export function MobileSourceControlContent({ state }: Props) {
) : (
)}
- {t('m.9pCKA8U')}
+ {t('mobileSourceControlContent.stage')}
[
@@ -131,7 +133,7 @@ export function MobileSourceControlContent({ state }: Props) {
) : (
)}
- {t('m.DHXoi2A')}
+ {t('mobileSourceControlContent.unstage')}
[
@@ -142,7 +144,7 @@ export function MobileSourceControlContent({ state }: Props) {
onPress={() => setShowActionSheet(true)}
disabled={ioBusy}
hitSlop={8}
- accessibilityLabel={t('m.8E6deJU')}
+ accessibilityLabel={t('mobileSourceControlContent.open')}
>
@@ -151,8 +153,8 @@ export function MobileSourceControlContent({ state }: Props) {
{!hasVisibleChanges ? (
- {t('m.89qgAps')}
- {t('m.yKqTr9E')}
+ {t('mobileSourceControlContent.noLocal')}
+ {t('mobileSourceControlContent.working')}
) : sections.length === 0 ? (
// Why: RN SectionList with empty `sections` often skips ListFooterComponent,
@@ -200,16 +202,18 @@ export function MobileSourceControlContent({ state }: Props) {
style={[styles.commitInput, styles.commitInputDisabled]}
accessibilityRole="text"
accessibilityState={{ disabled: true }}
- accessibilityLabel={t('m.ELJU7AQ')}
+ accessibilityLabel={t('mobileSourceControlContent.commitMessageDisabled')}
>
- {t('m.2X52pxU')}
+
+ {t('mobileSourceControlContent.noStaged')}
+
) : (
generatingMessage ? cancelGenerateCommitMessage() : void generateCommitMessage()
}
- accessibilityLabel={generatingMessage ? t('m.PTohtCY') : t('m.8tFmU9A')}
+ accessibilityLabel={
+ generatingMessage
+ ? t('mobileSourceControlContent.cancel')
+ : t('mobileSourceControlContent.generate')
+ }
>
{generatingMessage ? (
diff --git a/mobile/src/source-control/MobileSourceControlFileRows.tsx b/mobile/src/source-control/MobileSourceControlFileRows.tsx
index 28968c50529..21852fdeadb 100644
--- a/mobile/src/source-control/MobileSourceControlFileRows.tsx
+++ b/mobile/src/source-control/MobileSourceControlFileRows.tsx
@@ -46,7 +46,9 @@ export function makeRenderFileRow(
]}
onPress={() => void openFile(item)}
disabled={rowDisabled}
- accessibilityLabel={t('m.4a6Yo9s', { value0: item.path })}
+ accessibilityLabel={t('mobileSourceControlFileRows.openChanged', {
+ path: item.path
+ })}
>
@@ -67,11 +69,13 @@ export function makeRenderFileRow(
{item.oldPath ? (
- {t('m.SrSDY0M', { value0: item.oldPath })}
+ {t('mobileSourceControlFileRows.old', {
+ oldPath: item.oldPath
+ })}
) : item.conflictStatus === 'unresolved' ? (
- {t('m.av_Mh7U')}
+ {t('mobileSourceControlFileRows.unresolved')}
) : null}
@@ -89,7 +93,9 @@ export function makeRenderFileRow(
void runGitAction(item.unstageActionId, 'git.unstage', { filePath: item.path })
}
hitSlop={8}
- accessibilityLabel={t('m.9OoD7rs', { value0: item.path })}
+ accessibilityLabel={t('mobileSourceControlFileRows.unstage', {
+ path: item.path
+ })}
>
@@ -107,7 +113,7 @@ export function makeRenderFileRow(
void runGitAction(item.stageActionId, 'git.stage', { filePath: item.path })
}
hitSlop={8}
- accessibilityLabel={t('m.WTkbKTE', { value0: item.path })}
+ accessibilityLabel={t('mobileSourceControlFileRows.stage', { path: item.path })}
>
@@ -122,7 +128,9 @@ export function makeRenderFileRow(
disabled={ioBusy}
onPress={() => setDiscardTarget(item)}
hitSlop={8}
- accessibilityLabel={t('m.IET9hpI', { value0: item.path })}
+ accessibilityLabel={t('mobileSourceControlFileRows.discard', {
+ path: item.path
+ })}
>
@@ -170,7 +178,9 @@ export function BranchCompareFooter({ state }: { state: FooterState }) {
- {t('m.m_C8jkI')}
+
+ {t('mobileSourceControlFileRows.committedBranch')}
+
{branchCompareSummaryText ? (
{branchCompareSummaryText}
@@ -182,7 +192,7 @@ export function BranchCompareFooter({ state }: { state: FooterState }) {
{branchCompareState.kind === 'loading' ? (
- {t('m.tZHFwCg')}
+ {t('mobileSourceControlFileRows.loading')}
) : branchCompareState.kind === 'error' ? (
@@ -191,7 +201,8 @@ export function BranchCompareFooter({ state }: { state: FooterState }) {
) : branchCompareResult && branchCompareResult.summary.status !== 'ready' ? (
- {branchCompareResult.summary.errorMessage ?? t('m.Qpl1k5o')}
+ {branchCompareResult.summary.errorMessage ??
+ t('mobileSourceControlFileRows.committedChanges')}
) : (
@@ -214,7 +225,9 @@ export function BranchCompareFooter({ state }: { state: FooterState }) {
]}
onPress={() => void openBranchDiff(entry)}
disabled={rowDisabled}
- accessibilityLabel={t('m.PW__oVI', { value0: entry.path })}
+ accessibilityLabel={t('mobileSourceControlFileRows.openCommitted', {
+ filePath: entry.path
+ })}
>
diff --git a/mobile/src/source-control/MobileSourceControlHeader.tsx b/mobile/src/source-control/MobileSourceControlHeader.tsx
index a643df5f1e4..efd53f6b115 100644
--- a/mobile/src/source-control/MobileSourceControlHeader.tsx
+++ b/mobile/src/source-control/MobileSourceControlHeader.tsx
@@ -31,7 +31,9 @@ export function MobileSourceControlHeader({
style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
onPress={onBack}
hitSlop={8}
- accessibilityLabel={embedded ? t('m.MDlHRa0') : t('m.OtpFc0w')}
+ accessibilityLabel={
+ embedded ? t('mobileSourceControlHeader.close') : t('mobileSourceControlHeader.back')
+ }
>
{embedded ? (
@@ -41,7 +43,7 @@ export function MobileSourceControlHeader({
- {t('m.PjA8ztc')}
+ {t('mobileSourceControlHeader.source')}
{worktreeLabel}
@@ -54,7 +56,11 @@ export function MobileSourceControlHeader({
hitSlop={8}
accessibilityRole="link"
accessibilityLabel={
- prNumber != null ? t('m.HUC1SZA', { value0: prNumber }) : t('m.5lXW9sQ')
+ prNumber != null
+ ? t('mobileSourceControlHeader.openPullRequestPull', {
+ pullRequestNumber: prNumber
+ })
+ : t('mobileSourceControlHeader.openPullRequestWeb')
}
>
@@ -69,7 +75,7 @@ export function MobileSourceControlHeader({
onPress={onRefresh}
disabled={ioBusy}
hitSlop={8}
- accessibilityLabel={t('m.Pt1enm0')}
+ accessibilityLabel={t('mobileSourceControlHeader.refresh')}
>
diff --git a/mobile/src/source-control/MobileSourceControlModals.tsx b/mobile/src/source-control/MobileSourceControlModals.tsx
index 4ba3f230976..6f70cd74d6c 100644
--- a/mobile/src/source-control/MobileSourceControlModals.tsx
+++ b/mobile/src/source-control/MobileSourceControlModals.tsx
@@ -40,7 +40,7 @@ export function MobileSourceControlModals({ state, actionSheetActions }: Props)
setShowActionSheet(false)}
@@ -48,9 +48,15 @@ export function MobileSourceControlModals({ state, actionSheetActions }: Props)
{
if (discardTarget) {
@@ -66,11 +72,12 @@ export function MobileSourceControlModals({ state, actionSheetActions }: Props)
({
value: b,
label: b,
- subtitle: b === localBranches?.current ? t('m.2t3siE4') : undefined
+ subtitle:
+ b === localBranches?.current ? t('mobileSourceControlModals.current') : undefined
}))}
selected={localBranches?.current ?? ''}
onSelect={(branch) => {
@@ -85,9 +92,15 @@ export function MobileSourceControlModals({ state, actionSheetActions }: Props)
{
if (createdPrUrl) {
openMobilePrUrl(createdPrUrl)
diff --git a/mobile/src/source-control/MobileSourceControlPanel.tsx b/mobile/src/source-control/MobileSourceControlPanel.tsx
index e78f133f50b..f271e8809d2 100644
--- a/mobile/src/source-control/MobileSourceControlPanel.tsx
+++ b/mobile/src/source-control/MobileSourceControlPanel.tsx
@@ -246,7 +246,9 @@ export function MobileSourceControlPanel({
) : screenState.kind === 'error' || screenState.kind === 'unavailable' ? (
- {screenState.kind === 'unavailable' ? t('m.UgUD08U') : t('m.SlcSA9A')}
+ {screenState.kind === 'unavailable'
+ ? t('mobileSourceControlPanel.source')
+ : t('mobileSourceControlPanel.unable')}
{screenState.message}
{screenState.kind === 'error' ? (
@@ -261,7 +263,7 @@ export function MobileSourceControlPanel({
void loadStatus()
}}
>
- {t('m.dggV318')}
+ {t('mobileSourceControlPanel.retry')}
) : null}
diff --git a/mobile/src/source-control/MobileSourceControlPrChip.tsx b/mobile/src/source-control/MobileSourceControlPrChip.tsx
index 832b733e1e4..1585cc90ca1 100644
--- a/mobile/src/source-control/MobileSourceControlPrChip.tsx
+++ b/mobile/src/source-control/MobileSourceControlPrChip.tsx
@@ -37,12 +37,12 @@ export function MobileSourceControlPrChip({ summary, onPress }: Props) {
<>
- {t('m.xoN_ZQM')}
+ {t('mobileSourceControlPrChip.loadingPullRequest')}
>
) : summary.kind === 'none' ? (
<>
- {t('m.Q1mHSX4')}
+ {t('mobileSourceControlPrChip.create')}
>
@@ -106,11 +106,13 @@ function RollupIcon({ kind, color }: { kind: MobilePrChipRollup['kind']; color:
function chipAccessibilityLabel(summary: MobilePrChipSummary): string {
switch (summary.kind) {
case 'loading':
- return t('m.MkY5xK4')
+ return t('mobileSourceControlPrChip.loadingPullRequestMessage')
case 'none':
- return t('m.Q1mHSX4')
+ return t('mobileSourceControlPrChip.create')
case 'unavailable':
- return t('m.oDQaC0g', { value0: summary.message })
+ return t('mobileSourceControlPrChip.pullRequestUnavailable', {
+ summaryMessage: summary.message
+ })
case 'ready': {
const comments =
summary.commentCount != null && summary.commentCount > 0
@@ -121,11 +123,11 @@ function chipAccessibilityLabel(summary: MobilePrChipSummary): string {
{ count: summary.commentCount }
)
: ''
- return t('m.RvLuxao', {
- value0: summary.number,
- value1: summary.stateLabel,
- value2: summary.rollup.text,
- value3: comments
+ return t('mobileSourceControlPrChip.pullRequestPull', {
+ pullRequestNumber: summary.number,
+ stateLabel: summary.stateLabel,
+ checkSummary: summary.rollup.text,
+ commentSummary: comments
})
}
}
diff --git a/mobile/src/source-control/hosted-review-copy.ts b/mobile/src/source-control/hosted-review-copy.ts
index d9d57b8ee2f..398024f7bd7 100644
--- a/mobile/src/source-control/hosted-review-copy.ts
+++ b/mobile/src/source-control/hosted-review-copy.ts
@@ -12,15 +12,15 @@ export type HostedReviewCopy = {
}
const PR_COPY: HostedReviewCopy = {
- shortLabel: t('m.Qic_Aa4'),
- reviewLabel: t('m.rUwwMh4'),
- titleLabel: t('m.GqNlrAs')
+ shortLabel: t('hostedReviewCopy.pr'),
+ reviewLabel: t('hostedReviewCopy.pullRequest'),
+ titleLabel: t('hostedReviewCopy.pullRequestTitle')
}
const MR_COPY: HostedReviewCopy = {
- shortLabel: t('m.BWWtnQM'),
- reviewLabel: t('m.OpWJNnA'),
- titleLabel: t('m.cTkYeR8')
+ shortLabel: t('hostedReviewCopy.mr'),
+ reviewLabel: t('hostedReviewCopy.mergeRequest'),
+ titleLabel: t('hostedReviewCopy.mergeRequestTitle')
}
export function hostedReviewCopy(provider: HostedReviewProvider | undefined): HostedReviewCopy {
diff --git a/mobile/src/source-control/mobile-branch-base-ref.ts b/mobile/src/source-control/mobile-branch-base-ref.ts
index 8b7aa986cd5..501e753f716 100644
--- a/mobile/src/source-control/mobile-branch-base-ref.ts
+++ b/mobile/src/source-control/mobile-branch-base-ref.ts
@@ -87,7 +87,7 @@ export async function resolveMobileBranchCompareBaseRef(
if (isMobileGitUnavailable(defaultResponse.error?.code, defaultResponse.error?.message)) {
return null
}
- throw new Error(defaultResponse.error?.message || t('m.SX56B0U'))
+ throw new Error(defaultResponse.error?.message || t('mobileBranchBaseRef.unable'))
}
return readDefaultBaseRef(defaultResponse.result)
}
diff --git a/mobile/src/source-control/mobile-branch-compare.ts b/mobile/src/source-control/mobile-branch-compare.ts
index a0c4068e2c7..f74783d42d0 100644
--- a/mobile/src/source-control/mobile-branch-compare.ts
+++ b/mobile/src/source-control/mobile-branch-compare.ts
@@ -30,7 +30,7 @@ export function buildMobileBranchCompareSection 0) {
return { success: true, message: result.message }
@@ -33,7 +39,7 @@ export async function requestMobileCommitMessage(
const hostError =
result.success === false && typeof result.error === 'string' && result.error.length > 0
? result.error
- : t('m.R0VwXOs')
+ : t('mobileCommitMessageAi.no')
return {
success: false,
error: hostError,
diff --git a/mobile/src/source-control/mobile-create-pr-action.ts b/mobile/src/source-control/mobile-create-pr-action.ts
index 928e7d1f1b2..f1fa61f39d3 100644
--- a/mobile/src/source-control/mobile-create-pr-action.ts
+++ b/mobile/src/source-control/mobile-create-pr-action.ts
@@ -32,7 +32,7 @@ const BUSY_ACTIONS = new Set(['create-pr', 'push-create-pr'])
function hiddenAction(onPress: () => void): MobileCreatePrAction {
return {
visible: false,
- label: t('m.6N6POoY'),
+ label: t('mobileCreatePrAction.createPull'),
disabled: true,
loading: false,
pushFirst: false,
@@ -85,7 +85,9 @@ export function buildMobileCreatePrAction({
}
}
const copy = hostedReviewCopy(eligibility.provider)
- const label = t('m.aDtTv18', { value0: copy.titleLabel })
+ const label = t('mobileCreatePrAction.createReview', {
+ reviewType: copy.titleLabel
+ })
// Any in-flight git work blocks the action: runGitWorkflow no-ops while
// busyActionRef is set, so an enabled-looking button would silently do nothing.
const busy = busyAction !== null
@@ -119,7 +121,10 @@ export function buildMobileCreatePrAction({
canCreate: false,
blockedReason: eligibility.blockedReason,
nextAction: eligibility.nextAction
- }) ?? t('m.-CpqM4g', { value0: copy.reviewLabel })
+ }) ??
+ t('mobileCreatePrAction.branch', {
+ reviewType: copy.reviewLabel
+ })
return {
visible: true,
diff --git a/mobile/src/source-control/mobile-git-history.ts b/mobile/src/source-control/mobile-git-history.ts
index 3aa6b9d2d6a..3e0534a4102 100644
--- a/mobile/src/source-control/mobile-git-history.ts
+++ b/mobile/src/source-control/mobile-git-history.ts
@@ -20,7 +20,7 @@ export function formatCommitTime(timestampSeconds: number | undefined, nowMs: nu
}
const delta = nowMs - timestampSeconds * 1000
if (delta < 60_000) {
- return t('m.m8V_LQQ')
+ return t('mobileGitHistory.just')
}
const minutes = Math.floor(delta / 60_000)
if (minutes < 60) {
@@ -36,7 +36,7 @@ export function formatCommitTime(timestampSeconds: number | undefined, nowMs: nu
}
const months = Math.floor(days / 30)
if (months < 12) {
- return t('m.vuFM3_E', { value0: months })
+ return t('mobileGitHistory.months', { months: months })
}
return `${Math.floor(months / 12)}y`
}
@@ -66,7 +66,7 @@ export async function fetchMobileGitHistory(
limit
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.f-93Rxs'))
+ throw new Error(response.error?.message || t('mobileGitHistory.failed'))
}
return (response as RpcSuccess).result as GitHistoryResult
}
diff --git a/mobile/src/source-control/mobile-git-status.ts b/mobile/src/source-control/mobile-git-status.ts
index 0b846cb7764..ebf28f13630 100644
--- a/mobile/src/source-control/mobile-git-status.ts
+++ b/mobile/src/source-control/mobile-git-status.ts
@@ -23,9 +23,9 @@ export type MobileSourceControlSection = {
- unstaged: t('m.cbaJlCE'),
- untracked: t('m.cdicUlU'),
- staged: t('m.-DRFeFw')
+ unstaged: t('mobileGitStatus.changes'),
+ untracked: t('mobileGitStatus.untracked'),
+ staged: t('mobileGitStatus.staged')
}
export const MOBILE_GIT_STATUS_LABELS: Record = {
diff --git a/mobile/src/source-control/mobile-hosted-review-create-intent.ts b/mobile/src/source-control/mobile-hosted-review-create-intent.ts
index 1bea6836537..305677dba1f 100644
--- a/mobile/src/source-control/mobile-hosted-review-create-intent.ts
+++ b/mobile/src/source-control/mobile-hosted-review-create-intent.ts
@@ -51,19 +51,19 @@ export function mobileHostedReviewCreateIntentProgressMessage(
): string {
switch (progress) {
case 'staging':
- return t('m.eCa7Me8')
+ return t('mobileHostedReviewCreateIntent.staging')
case 'generating_commit_message':
- return t('m.us6yszU')
+ return t('mobileHostedReviewCreateIntent.generating')
case 'committing':
- return t('m.uN9IaYI')
+ return t('mobileHostedReviewCreateIntent.committing')
case 'publishing':
- return t('m.PnL-W2o')
+ return t('mobileHostedReviewCreateIntent.publishing')
case 'pushing':
- return t('m.0BMXLfE')
+ return t('mobileHostedReviewCreateIntent.pushing')
case 'force_pushing':
- return t('m.JokOS5o')
+ return t('mobileHostedReviewCreateIntent.force')
case 'creating_review':
- return t('m.qE1-68U')
+ return t('mobileHostedReviewCreateIntent.creating')
}
}
@@ -100,7 +100,7 @@ async function ensureLocalChangesCommitted(
if (hasUnresolvedConflicts(currentStatus)) {
return {
ok: false,
- error: t('m.695pbL4'),
+ error: t('mobileHostedReviewCreateIntent.resolveConflicts'),
committed: false,
status: currentStatus
}
@@ -113,7 +113,7 @@ async function ensureLocalChangesCommitted(
client,
'git.bulkStage',
{ worktree: `id:${worktreeId}`, filePaths: stagePaths },
- t('m.knjcZG0')
+ t('mobileHostedReviewCreateIntent.failed')
)
if (!staged.ok) {
return staged
@@ -131,7 +131,7 @@ async function ensureLocalChangesCommitted(
if (!mobileHostedReviewBranchStillMatches(input.branch, currentStatus)) {
return {
ok: false,
- error: t('m.8fhgeQQ'),
+ error: t('mobileHostedReviewCreateIntent.branch'),
committed: false,
status: currentStatus
}
@@ -142,7 +142,7 @@ async function ensureLocalChangesCommitted(
if (!hasStagedChanges) {
return {
ok: false,
- error: t('m.x1skfkY'),
+ error: t('mobileHostedReviewCreateIntent.resolveStage'),
committed: false,
status: currentStatus
}
@@ -155,7 +155,7 @@ async function ensureLocalChangesCommitted(
if (!generated.success) {
return {
ok: false,
- error: t('m.zAg6hUc'),
+ error: t('mobileHostedReviewCreateIntent.could'),
committed: false,
status: currentStatus
}
@@ -181,7 +181,7 @@ async function ensureLocalChangesCommitted(
if (!mobileHostedReviewBranchStillMatches(input.branch, currentStatus)) {
return {
ok: false,
- error: t('m.8fhgeQQ'),
+ error: t('mobileHostedReviewCreateIntent.branch'),
committed: true,
status: currentStatus
}
@@ -199,7 +199,7 @@ export async function prepareMobileHostedReviewCreateIntent(
if (!mobileHostedReviewBranchStillMatches(input.branch, currentStatus)) {
return {
ok: false,
- error: initialStatus.ok ? t('m.8fhgeQQ') : initialStatus.error,
+ error: initialStatus.ok ? t('mobileHostedReviewCreateIntent.branch') : initialStatus.error,
status: currentStatus
}
}
@@ -241,7 +241,7 @@ export async function prepareMobileHostedReviewCreateIntent(
if (!mobileHostedReviewBranchStillMatches(input.branch, currentStatus)) {
return {
ok: false,
- error: t('m.8fhgeQQ'),
+ error: t('mobileHostedReviewCreateIntent.branch'),
committed: committed.committed,
status: currentStatus
}
diff --git a/mobile/src/source-control/mobile-hosted-review-git-preparation.ts b/mobile/src/source-control/mobile-hosted-review-git-preparation.ts
index 316e6b06697..124a563893f 100644
--- a/mobile/src/source-control/mobile-hosted-review-git-preparation.ts
+++ b/mobile/src/source-control/mobile-hosted-review-git-preparation.ts
@@ -14,7 +14,10 @@ export async function readMobileHostedReviewGitStatus(
): Promise {
const response = await client.sendRequest('git.status', { worktree: `id:${worktreeId}` })
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.Cqqzv8U') }
+ return {
+ ok: false,
+ error: response.error?.message || t('mobileHostedReviewGitPreparation.unable')
+ }
}
return { ok: true, status: readMobileGitStatusResult((response as RpcSuccess).result) }
}
@@ -55,14 +58,23 @@ export async function commitMobileHostedReviewStagedChanges(
message
})
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.X4spS84') }
+ return {
+ ok: false,
+ error: response.error?.message || t('mobileHostedReviewGitPreparation.commit')
+ }
}
const result = (response as RpcSuccess).result as { success?: boolean; error?: string }
if (result?.success !== true) {
- return { ok: false, error: result?.error || t('m.X4spS84') }
+ return {
+ ok: false,
+ error: result?.error || t('mobileHostedReviewGitPreparation.commit')
+ }
}
return { ok: true }
} catch (err) {
- return { ok: false, error: err instanceof Error ? err.message : t('m.X4spS84') }
+ return {
+ ok: false,
+ error: err instanceof Error ? err.message : t('mobileHostedReviewGitPreparation.commit')
+ }
}
}
diff --git a/mobile/src/source-control/mobile-hosted-review-remote-prerequisite.ts b/mobile/src/source-control/mobile-hosted-review-remote-prerequisite.ts
index 45bcef73910..136ec41a77a 100644
--- a/mobile/src/source-control/mobile-hosted-review-remote-prerequisite.ts
+++ b/mobile/src/source-control/mobile-hosted-review-remote-prerequisite.ts
@@ -23,7 +23,7 @@ export async function applyMobileHostedReviewRemotePrerequisite(
client,
'git.push',
{ worktree: `id:${worktreeId}`, publish: true },
- t('m.HtBxXOI')
+ t('mobileHostedReviewRemotePrerequisite.failedPublish')
)
return result.ok ? { ok: true, ran: true } : result
}
@@ -33,7 +33,7 @@ export async function applyMobileHostedReviewRemotePrerequisite(
client,
'git.push',
{ worktree: `id:${worktreeId}` },
- t('m.I8tYYd4')
+ t('mobileHostedReviewRemotePrerequisite.failedPush')
)
return result.ok ? { ok: true, ran: true } : result
}
@@ -46,7 +46,7 @@ export async function applyMobileHostedReviewRemotePrerequisite(
client,
'git.push',
{ worktree: `id:${worktreeId}`, forceWithLease: true },
- t('m.2m5o9w0')
+ t('mobileHostedReviewRemotePrerequisite.failedForce')
)
return result.ok ? { ok: true, ran: true } : result
}
diff --git a/mobile/src/source-control/mobile-hosted-review-service.ts b/mobile/src/source-control/mobile-hosted-review-service.ts
index 2453a22ad8d..1d39c2277bf 100644
--- a/mobile/src/source-control/mobile-hosted-review-service.ts
+++ b/mobile/src/source-control/mobile-hosted-review-service.ts
@@ -180,11 +180,17 @@ async function pushMobileBranchBeforeCreate(
try {
const response = await client.sendRequest('git.push', { worktree: `id:${worktreeId}` })
if (!response.ok) {
- return { ok: false, error: t('m.QeyCTxE') }
+ return {
+ ok: false,
+ error: t('mobileHostedReviewService.pushFailed')
+ }
}
return { ok: true }
} catch {
- return { ok: false, error: t('m.QeyCTxE') }
+ return {
+ ok: false,
+ error: t('mobileHostedReviewService.pushFailed')
+ }
}
}
@@ -200,7 +206,10 @@ function formatMobileHostedReviewCreateError(
return result.error
}
const prefix = new RegExp(`^Create ${shortLabel} failed:\\s*`, 'i')
- return t('m.VtNQIUo', { value0: shortLabel, value1: result.error.replace(prefix, '') })
+ return t('mobileHostedReviewService.pushSucceeded', {
+ reviewType: shortLabel,
+ errorMessage: result.error.replace(prefix, '')
+ })
}
async function finishMobileHostedReviewCreateSuccess(
@@ -244,7 +253,10 @@ export async function createMobileHostedReview(
buildMobileHostedReviewCreateParams(worktreeId, input)
)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.8Tx_eZw') }
+ return {
+ ok: false,
+ error: response.error?.message || t('mobileHostedReviewService.failed')
+ }
}
const result = (response as RpcSuccess).result as CreateHostedReviewResult
if (result.ok) {
@@ -274,14 +286,14 @@ export async function createMobileHostedReview(
result,
pushed,
hostedReviewCopy(input.provider).shortLabel
- ) || t('m.8Tx_eZw')
+ ) || t('mobileHostedReviewService.failed')
}
} catch (err) {
// Why: create review runs from an inline form; transport drops should surface
// as form errors instead of escaping as unhandled promise rejections.
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.8Tx_eZw')
+ error: err instanceof Error ? err.message : t('mobileHostedReviewService.failed')
}
}
}
diff --git a/mobile/src/source-control/mobile-pr-chip-summary.ts b/mobile/src/source-control/mobile-pr-chip-summary.ts
index a113b1b758b..d8356394c1c 100644
--- a/mobile/src/source-control/mobile-pr-chip-summary.ts
+++ b/mobile/src/source-control/mobile-pr-chip-summary.ts
@@ -89,12 +89,18 @@ export function buildMobilePrChipSummary(
function buildChipRollup(state: Extract): MobilePrChipRollup {
// Conflicts win: the checks may be green, but the PR still can't merge.
if (state.data.pr.mergeable === 'CONFLICTING') {
- return { kind: 'conflict', text: t('m.hIW5XEU'), token: 'statusAmber' }
+ return { kind: 'conflict', text: t('task.conflicts'), token: 'statusAmber' }
}
// Shared classifier so the chip, the Checks list and the tasks grid never disagree about the same PR.
const checks = summarizeProviderChecks(state.data.checks)
if (checks.failed > 0) {
- return { kind: 'failing', text: t('m.L37iq1E', { value0: checks.failed }), token: 'statusRed' }
+ return {
+ kind: 'failing',
+ text: t('mobilePrChipSummary.failing', {
+ failingCheckCount: checks.failed
+ }),
+ token: 'statusRed'
+ }
}
if (checks.pending > 0) {
return {
@@ -109,7 +115,7 @@ function buildChipRollup(state: Extract): Mob
// Checks that exist but resolved to nothing actionable are not "no checks".
return {
kind: 'none',
- text: checks.total === 0 ? t('m.X9M1AcA') : t('m.UMqLjMs'),
+ text: checks.total === 0 ? t('mobilePrChipSummary.no') : t('mobilePrChipSummary.unresolved'),
token: 'textSecondary'
}
}
diff --git a/mobile/src/source-control/mobile-pr-create.ts b/mobile/src/source-control/mobile-pr-create.ts
index 636b345873b..6f51a886743 100644
--- a/mobile/src/source-control/mobile-pr-create.ts
+++ b/mobile/src/source-control/mobile-pr-create.ts
@@ -34,11 +34,18 @@ export function getMobilePrCreateSuccessWarning(
const copy = hostedReviewCopy(provider)
if (outcome.existing) {
return outcome.number
- ? t('m.89Qhlf4', { value0: copy.titleLabel, value1: outcome.number })
- : t('m.ACQh2cM', { value0: copy.titleLabel })
+ ? t('mobilePrCreate.reviewTypePull', {
+ reviewType: copy.titleLabel,
+ pullRequestNumber: outcome.number
+ })
+ : t('mobilePrCreate.reviewTypeAlreadyOpen', {
+ reviewType: copy.titleLabel
+ })
}
if (outcome.linkError) {
- return t('m.nUw7_cE', { value0: copy.titleLabel })
+ return t('mobilePrCreate.reviewTypeCreated', {
+ reviewType: copy.titleLabel
+ })
}
return undefined
}
@@ -52,38 +59,62 @@ export function getMobilePrCreateBlockMessage(prefill: MobilePrPrefill): string
// mobile has no refresh/review-lookup signal of its own, so it must not
// offer create, or the needs_push Push & Create path would slip through.
if (prefill.reviewLookupOutcome !== 'not_found') {
- return t('m.YnkDu_A', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.orca', { reviewType: copy.reviewLabel })
}
return null
}
switch (prefill.blockedReason) {
case 'dirty':
- return t('m.fS2uz3k', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.commit', {
+ reviewType: copy.reviewLabel
+ })
case 'detached_head':
- return t('m.eL3YqZQ', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.check', {
+ reviewType: copy.reviewLabel
+ })
case 'default_branch':
- return t('m.J6J02jo', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.switch', {
+ reviewType: copy.reviewLabel
+ })
case 'no_upstream':
- return t('m.aDj0ISs', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.publish', {
+ reviewType: copy.reviewLabel
+ })
case 'needs_sync':
- return t('m.h5c6qGM', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.sync', {
+ reviewType: copy.reviewLabel
+ })
case 'auth_required':
- return t('m.i65iwXo', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.authenticate', {
+ reviewType: copy.reviewLabel
+ })
case 'unsupported_provider':
- return t('m.CMzOREY', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.creatingReviewTypeS', {
+ reviewType: copy.reviewLabel
+ })
case 'existing_review':
- return t('m.UNrSqqU', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.reviewTypeAlreadyExists', {
+ reviewType: copy.reviewLabel
+ })
case 'fork_head_unsupported':
- return t('m.dhReg-4', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.creatingReviewTypeFork', {
+ reviewType: copy.reviewLabel
+ })
case 'base_not_on_remote':
- return t('m.eeoaUzE', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.push', {
+ reviewType: copy.reviewLabel
+ })
case 'needs_push':
case null:
case undefined:
- return t('m.Kdbzhtg', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.branch', {
+ reviewType: copy.reviewLabel
+ })
default:
// Why: desktop can add blocked reasons before a long-lived mobile branch
// catches up; remain safely blocked while preserving merge-ref typechecks.
- return t('m.Kdbzhtg', { value0: copy.reviewLabel })
+ return t('mobilePrCreate.branch', {
+ reviewType: copy.reviewLabel
+ })
}
}
diff --git a/mobile/src/source-control/mobile-pr-link.ts b/mobile/src/source-control/mobile-pr-link.ts
index 88b2cb42136..ff7131b8510 100644
--- a/mobile/src/source-control/mobile-pr-link.ts
+++ b/mobile/src/source-control/mobile-pr-link.ts
@@ -56,7 +56,10 @@ async function setLinkedPr(
buildWorktreeSetLinkParams(worktreeId, linkedPR)
)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.D8-XyhU') }
+ return {
+ ok: false,
+ error: response.error?.message || t('mobilePrLink.failedUpdateLinkedPull')
+ }
}
return { ok: true }
} catch (err) {
@@ -64,7 +67,7 @@ async function setLinkedPr(
// to the `{ ok:false, error }` outcome the link flow surfaces.
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.D8-XyhU')
+ error: err instanceof Error ? err.message : t('mobilePrLink.failedUpdateLinkedPull')
}
}
}
@@ -91,7 +94,10 @@ export async function linkMobileHostedReview(
try {
const response = await client.sendRequest('worktree.set', params)
if (!response.ok) {
- return { ok: false, error: response.error?.message || t('m.DIh5pvA') }
+ return {
+ ok: false,
+ error: response.error?.message || t('mobilePrLink.failedUpdateLinkedReview')
+ }
}
return { ok: true }
} catch (err) {
@@ -99,7 +105,7 @@ export async function linkMobileHostedReview(
// surface a non-fatal refresh problem instead of losing the created URL.
return {
ok: false,
- error: err instanceof Error ? err.message : t('m.DIh5pvA')
+ error: err instanceof Error ? err.message : t('mobilePrLink.failedUpdateLinkedReview')
}
}
}
diff --git a/mobile/src/source-control/mobile-source-control-actions.ts b/mobile/src/source-control/mobile-source-control-actions.ts
index 61150e1c24e..5f4f1827954 100644
--- a/mobile/src/source-control/mobile-source-control-actions.ts
+++ b/mobile/src/source-control/mobile-source-control-actions.ts
@@ -66,13 +66,25 @@ export function buildMobileSourceControlActions(
const behind = upstream?.behind ?? 0
const busy =
args.busyAction !== null || args.openingPath !== null || args.openingBranchPath !== null
- const commitHint = !hasStaged ? t('m.jzI4z6s') : !hasMessage ? t('m.9tlos5E') : undefined
- const remoteHint = !upstreamKnown ? t('m.Xh63VTo') : hasUpstream ? undefined : t('m.o8ul7Iw')
- const prHint = !upstreamKnown ? t('m.Xh63VTo') : !args.prAvailable ? t('m.8TO561E') : undefined
+ const commitHint = !hasStaged
+ ? t('mobileSourceControlActions.stage')
+ : !hasMessage
+ ? t('mobileSourceControlActions.enter')
+ : undefined
+ const remoteHint = !upstreamKnown
+ ? t('mobileSourceControlActions.checking')
+ : hasUpstream
+ ? undefined
+ : t('mobileSourceControlActions.publishBranchFirst')
+ const prHint = !upstreamKnown
+ ? t('mobileSourceControlActions.checking')
+ : !args.prAvailable
+ ? t('mobileSourceControlActions.pullRequests')
+ : undefined
return [
{
- label: t('m._Srm4Jk'),
+ label: t('mobileSourceControlActions.commit'),
iconKey: 'commit',
disabled: busy || !!commitHint,
hint: commitHint,
@@ -81,7 +93,7 @@ export function buildMobileSourceControlActions(
onPress: handlers.commit
},
{
- label: t('m.4pU4zTo'),
+ label: t('mobileSourceControlActions.commitPush'),
iconKey: 'push',
disabled: busy || !!commitHint || !upstreamKnown || !hasUpstream,
hint: commitHint ?? remoteHint,
@@ -90,27 +102,40 @@ export function buildMobileSourceControlActions(
onPress: handlers.commitPush
},
{
- label: t('m.ZFwznUg'),
+ label: t('mobileSourceControlActions.commitSync'),
iconKey: 'sync',
disabled: busy || !!commitHint || !upstreamKnown || !hasUpstream || behind === 0,
hint:
commitHint ??
- (!upstreamKnown || !hasUpstream ? remoteHint : behind === 0 ? t('m.Ia0aBfU') : undefined),
+ (!upstreamKnown || !hasUpstream
+ ? remoteHint
+ : behind === 0
+ ? t('mobileSourceControlActions.nothingPull')
+ : undefined),
loading: args.busyAction === 'commit-sync',
skipAutoClose: true,
onPress: handlers.commitSync
},
{
- label: ahead > 0 ? t('m.9Xtk0Pg', { value0: ahead }) : t('m.eBZzWkw'),
+ label:
+ ahead > 0
+ ? t('mobileSourceControlActions.pushAhead', {
+ aheadCommitCount: ahead
+ })
+ : t('mobileSourceControlActions.push'),
iconKey: 'push',
disabled: busy || !upstreamKnown || !hasUpstream || ahead === 0,
- hint: !hasUpstream ? remoteHint : ahead === 0 ? t('m.zgbzIDs') : undefined,
+ hint: !hasUpstream
+ ? remoteHint
+ : ahead === 0
+ ? t('mobileSourceControlActions.nothingPush')
+ : undefined,
loading: args.busyAction === 'push',
skipAutoClose: true,
onPress: handlers.push
},
{
- label: t('m.IgtghkE'),
+ label: t('mobileSourceControlActions.create'),
iconKey: 'pr',
disabled: busy || !args.prAvailable,
hint: prHint,
@@ -119,7 +144,7 @@ export function buildMobileSourceControlActions(
onPress: handlers.createPr
},
{
- label: t('m._Pq5EEw'),
+ label: t('mobileSourceControlActions.pushCreate'),
iconKey: 'pr',
disabled: busy || !upstreamKnown || !hasUpstream || ahead === 0 || !args.prAvailable,
hint: prHint ?? (!hasUpstream ? remoteHint : undefined),
@@ -128,10 +153,19 @@ export function buildMobileSourceControlActions(
onPress: handlers.pushAndCreatePr
},
{
- label: behind > 0 ? t('m.oCECucM', { value0: behind }) : t('m.0pGBpyQ'),
+ label:
+ behind > 0
+ ? t('mobileSourceControlActions.pullBehind', {
+ behindCommitCount: behind
+ })
+ : t('mobileSourceControlActions.pull'),
iconKey: 'pull',
disabled: busy || !upstreamKnown || !hasUpstream || behind === 0,
- hint: !hasUpstream ? remoteHint : behind === 0 ? t('m.Ia0aBfU') : undefined,
+ hint: !hasUpstream
+ ? remoteHint
+ : behind === 0
+ ? t('mobileSourceControlActions.nothingPull')
+ : undefined,
loading: args.busyAction === 'pull',
skipAutoClose: true,
onPress: handlers.pull
@@ -139,22 +173,25 @@ export function buildMobileSourceControlActions(
{
label:
ahead > 0 || behind > 0
- ? t('m.26SoVIw', { value0: behind, value1: ahead })
- : t('m.N0HpMMg'),
+ ? t('mobileSourceControlActions.syncBehind', {
+ behindCommitCount: behind,
+ aheadCommitCount: ahead
+ })
+ : t('mobileSourceControlActions.sync'),
iconKey: 'sync',
disabled: busy || !upstreamKnown || !hasUpstream || (ahead === 0 && behind === 0),
hint:
!upstreamKnown || !hasUpstream
? remoteHint
: ahead === 0 && behind === 0
- ? t('m.5Vkd48o')
+ ? t('mobileSourceControlActions.branchUp')
: undefined,
loading: args.busyAction === 'sync',
skipAutoClose: true,
onPress: handlers.sync
},
{
- label: t('m.3blspe8'),
+ label: t('mobileSourceControlActions.fetch'),
iconKey: 'fetch',
disabled: busy,
loading: args.busyAction === 'fetch',
@@ -162,31 +199,40 @@ export function buildMobileSourceControlActions(
onPress: handlers.fetch
},
{
- label: t('m.r_MPRhE'),
+ label: t('mobileSourceControlActions.publishBranch'),
iconKey: 'publish',
disabled: busy || !upstreamKnown || hasUpstream,
- hint: !upstreamKnown ? t('m.Xh63VTo') : hasUpstream ? t('m.qq_p9K0') : undefined,
+ hint: !upstreamKnown
+ ? t('mobileSourceControlActions.checking')
+ : hasUpstream
+ ? t('mobileSourceControlActions.branchAlready')
+ : undefined,
loading: args.busyAction === 'publish',
skipAutoClose: true,
onPress: handlers.publish
},
{
- label: behind > 0 ? t('m.UWyesQ8', { value0: behind }) : t('m.fp_5pjo'),
+ label:
+ behind > 0
+ ? t('mobileSourceControlActions.fastForwardBehind', {
+ behindCommitCount: behind
+ })
+ : t('mobileSourceControlActions.fastForward'),
iconKey: 'pull',
disabled: busy || !upstreamKnown || !hasUpstream || behind === 0 || ahead > 0,
hint: !hasUpstream
? remoteHint
: behind === 0
- ? t('m.qajmB_0')
+ ? t('mobileSourceControlActions.nothingFast')
: ahead > 0
- ? t('m.GaTugx8')
+ ? t('mobileSourceControlActions.local')
: undefined,
loading: args.busyAction === 'fast-forward',
skipAutoClose: true,
onPress: handlers.fastForward
},
{
- label: t('m.ntik19Q'),
+ label: t('mobileSourceControlActions.rebase'),
iconKey: 'branch',
disabled: busy,
loading: args.busyAction === 'rebase',
@@ -194,14 +240,14 @@ export function buildMobileSourceControlActions(
onPress: handlers.rebase
},
{
- label: t('m.bOc3nUM'),
+ label: t('mobileSourceControlActions.switch'),
iconKey: 'branch',
disabled: busy,
skipAutoClose: true,
onPress: handlers.checkout
},
{
- label: t('m.hjs2AB4'),
+ label: t('mobileSourceControlActions.commits'),
iconKey: 'history',
disabled: busy,
onPress: handlers.history
diff --git a/mobile/src/source-control/mobile-source-control-conflict-abort.ts b/mobile/src/source-control/mobile-source-control-conflict-abort.ts
index c4ec83b1625..58c1088ae3b 100644
--- a/mobile/src/source-control/mobile-source-control-conflict-abort.ts
+++ b/mobile/src/source-control/mobile-source-control-conflict-abort.ts
@@ -16,7 +16,9 @@ export function isMobileConflictAborting(
/** Label for the Abort control — never says "Aborting…" for unrelated busy work. */
export function mobileConflictAbortLabel(conflictOperation: string, aborting: boolean): string {
if (aborting) {
- return t('m.wFxT3pM')
+ return t('mobileSourceControlConflictAbort.aborting')
}
- return conflictOperation === 'rebase' ? t('m.S5cNB0c') : t('m.3fVn1VI')
+ return conflictOperation === 'rebase'
+ ? t('mobileSourceControlConflictAbort.abortRebase')
+ : t('mobileSourceControlConflictAbort.abortMerge')
}
diff --git a/mobile/src/source-control/mobile-source-control-hub-tab.ts b/mobile/src/source-control/mobile-source-control-hub-tab.ts
index 296125665c8..ec32af7ec6e 100644
--- a/mobile/src/source-control/mobile-source-control-hub-tab.ts
+++ b/mobile/src/source-control/mobile-source-control-hub-tab.ts
@@ -12,9 +12,9 @@ export const SOURCE_CONTROL_HUB_TABS: readonly SourceControlHubTab[] = [
] as const
export const SOURCE_CONTROL_HUB_TAB_LABELS: Record = {
- changes: t('m.TMv0RaY'),
- pr: t('m.Xawq6ME'),
- history: t('m.r9Wy-Q8')
+ changes: t('mobileSourceControlHubTab.changes'),
+ pr: t('mobileSourceControlHubTab.pull'),
+ history: t('mobileSourceControlHubTab.commits')
}
// Normalize a route param (possibly an array from expo-router, possibly unknown)
diff --git a/mobile/src/source-control/mobile-source-control-primary-action.ts b/mobile/src/source-control/mobile-source-control-primary-action.ts
index e4096c7fe89..b8884b5c069 100644
--- a/mobile/src/source-control/mobile-source-control-primary-action.ts
+++ b/mobile/src/source-control/mobile-source-control-primary-action.ts
@@ -127,66 +127,76 @@ function getMobileBranchCommitsAhead(
function getMobilePrimaryActionLabel(decision: MobileSourceControlPrimaryActionDecision): string {
if (decision.requiresForceWithLease) {
- return t('m.koj5rtA')
+ return t('mobileSourceControlPrimaryAction.forcePush')
}
switch (decision.kind) {
case 'commit':
- return t('m.7HjRY3c')
+ return t('mobileSourceControlPrimaryAction.commit')
case 'stage':
- return t('m.AvE0E2k')
+ return t('mobileSourceControlPrimaryAction.stageAll')
case 'push':
- return t('m.qgmf_L8')
+ return t('mobileSourceControlPrimaryAction.push')
case 'pull':
- return t('m.0OsPYDw')
+ return t('mobileSourceControlPrimaryAction.pull')
case 'sync':
- return t('m.gqhNZGI')
+ return t('mobileSourceControlPrimaryAction.sync')
case 'publish':
- return t('m.6Z1Zr78')
+ return t('mobileSourceControlPrimaryAction.publishBranch')
}
}
function getMobilePrimaryActionHint(decision: MobileSourceControlPrimaryActionDecision): string {
switch (decision.titleIntent) {
case 'commit_in_progress':
- return t('m.GqPiXjg')
+ return t('mobileSourceControlPrimaryAction.commitProgress')
case 'force_push_in_progress':
- return t('m.cOOTv9E')
+ return t('mobileSourceControlPrimaryAction.forcePushProgress')
case 'action_in_progress':
case 'remote_operation_in_progress':
- return t('m.YkxQqGg')
+ return t('mobileSourceControlPrimaryAction.remote')
case 'remote_operation_blocks_commit':
- return t('m.aIqyvoY')
+ return t('mobileSourceControlPrimaryAction.try')
case 'resolve_conflicts_before_commit':
- return t('m.lBQzq_8')
+ return t('mobileSourceControlPrimaryAction.resolve')
case 'commit_staged_changes':
- return t('m.sJ8R-8c')
+ return t('mobileSourceControlPrimaryAction.commitStaged')
case 'enter_commit_message':
- return t('m.YnDfQwA')
+ return t('mobileSourceControlPrimaryAction.enter')
case 'stage_all_changes':
- return t('m.MM3ixxY')
+ return t('mobileSourceControlPrimaryAction.stageAllChanges')
case 'stage_file_to_commit':
- return t('m.eSJfk9k')
+ return t('mobileSourceControlPrimaryAction.stageLeast')
case 'checkout_branch_before_publish':
- return t('m.5OKMsK4')
+ return t('mobileSourceControlPrimaryAction.check')
case 'publish_branch':
- return t('m.5MUJYGA')
+ return t('mobileSourceControlPrimaryAction.publishBranchOrigin')
case 'force_push_with_lease':
- return t('m.gSinyKw')
+ return t('mobileSourceControlPrimaryAction.forcePushLease')
case 'sync_counts':
- return t('m.al8M9-M', {
- value0: decision.behind ?? 0,
- value1: decision.ahead ?? 0
+ return t('mobileSourceControlPrimaryAction.pullBehind', {
+ behindCommitCount: decision.behind ?? 0,
+ aheadCommitCount: decision.ahead ?? 0
})
case 'pull_count':
- return t(decision.count === 1 ? 'm.UIMnif0' : 'm.35baKac', {
- value0: decision.count ?? 0
- })
+ return t(
+ decision.count === 1
+ ? 'mobileSourceControlPrimaryAction.pullCommitCountCommit'
+ : 'mobileSourceControlPrimaryAction.pullCommitCountCommits',
+ {
+ commitCount: decision.count ?? 0
+ }
+ )
case 'push_count':
- return t(decision.count === 1 ? 'm.y7z5WcU' : 'm.0yFIngw', {
- value0: decision.count ?? 0
- })
+ return t(
+ decision.count === 1
+ ? 'mobileSourceControlPrimaryAction.pushCommitCountCommit'
+ : 'mobileSourceControlPrimaryAction.pushCommitCountCommits',
+ {
+ commitCount: decision.count ?? 0
+ }
+ )
case 'nothing_to_commit_up_to_date':
- return t('m.G0fuKJo')
+ return t('mobileSourceControlPrimaryAction.nothing')
}
}
diff --git a/mobile/src/source-control/mobile-source-control-screen-state.ts b/mobile/src/source-control/mobile-source-control-screen-state.ts
index 57cde922bbc..1cdacc368b4 100644
--- a/mobile/src/source-control/mobile-source-control-screen-state.ts
+++ b/mobile/src/source-control/mobile-source-control-screen-state.ts
@@ -133,7 +133,7 @@ export function formatBranchLabel(branch: string | undefined, head: string | und
if (branch?.startsWith('refs/heads/')) {
return branch.slice('refs/heads/'.length)
}
- return branch || head?.slice(0, 7) || t('m.wL23gbE')
+ return branch || head?.slice(0, 7) || t('mobileSourceControlScreenState.noBranch')
}
export function formatMobileUpstreamSyncLabel(
@@ -143,8 +143,11 @@ export function formatMobileUpstreamSyncLabel(
return null
}
return upstream.hasUpstream
- ? t('m.1YRKLD4', { value0: upstream.ahead, value1: upstream.behind })
- : t('m.GXYBPqk')
+ ? t('mobileSourceControlScreenState.ahead', {
+ aheadCommitCount: upstream.ahead,
+ behindCommitCount: upstream.behind
+ })
+ : t('mobileSourceControlScreenState.noUpstream')
}
export function statusColor(status: MobileGitFileStatus): string {
diff --git a/mobile/src/source-control/pr-compose-validation.ts b/mobile/src/source-control/pr-compose-validation.ts
index b822b4c1c72..bce572d6a6e 100644
--- a/mobile/src/source-control/pr-compose-validation.ts
+++ b/mobile/src/source-control/pr-compose-validation.ts
@@ -41,16 +41,18 @@ export function getPrComposeDisabledReason({
reviewLabel: string
}): string | null {
if (generating) {
- return t('m.E7yK5NU')
+ return t('prComposeValidation.wait')
}
if (title.trim().length === 0) {
- return t('m.b89N2ws', { value0: reviewLabel })
+ return t('prComposeValidation.enter', {
+ reviewType: reviewLabel
+ })
}
if (base.trim().length === 0) {
- return t('m.yBuJIFU')
+ return t('prComposeValidation.choose')
}
if (!isBaseHeadDistinct(base, head)) {
- return t('m.tKcJoxk')
+ return t('prComposeValidation.base')
}
return null
}
diff --git a/mobile/src/source-control/use-mobile-commit-failure-recovery.ts b/mobile/src/source-control/use-mobile-commit-failure-recovery.ts
index bca90fbefe0..85395ff361d 100644
--- a/mobile/src/source-control/use-mobile-commit-failure-recovery.ts
+++ b/mobile/src/source-control/use-mobile-commit-failure-recovery.ts
@@ -50,7 +50,7 @@ export function useMobileCommitFailureRecovery({ client, connState, worktreeId,
return false
}
if (!client || connState !== 'connected') {
- setLaunchError(t('m.Ngsl81c'))
+ setLaunchError(t('useMobileCommitFailureRecovery.waiting'))
triggerError()
return false
}
@@ -62,7 +62,9 @@ export function useMobileCommitFailureRecovery({ client, connState, worktreeId,
return true
} catch (err) {
triggerError()
- setLaunchError(err instanceof Error ? err.message : t('m.s7LT0Wk'))
+ setLaunchError(
+ err instanceof Error ? err.message : t('useMobileCommitFailureRecovery.failed')
+ )
return false
} finally {
setLaunching(false)
diff --git a/mobile/src/source-control/use-mobile-commit-message-generation.ts b/mobile/src/source-control/use-mobile-commit-message-generation.ts
index 2aab4113d6f..8c35e58b19c 100644
--- a/mobile/src/source-control/use-mobile-commit-message-generation.ts
+++ b/mobile/src/source-control/use-mobile-commit-message-generation.ts
@@ -54,7 +54,9 @@ export function useMobileCommitMessageGeneration(params: Params) {
// message are skipped and the rejection escapes the void-called handler.
if (mountedRef.current) {
triggerError()
- setActionError(err instanceof Error ? err.message : t('m.h4RNhQ0'))
+ setActionError(
+ err instanceof Error ? err.message : t('useMobileCommitMessageGeneration.failed')
+ )
}
} finally {
if (mountedRef.current) {
diff --git a/mobile/src/source-control/use-mobile-create-pr-runner.ts b/mobile/src/source-control/use-mobile-create-pr-runner.ts
index 1e632641ea8..bdc8ea7d3a6 100644
--- a/mobile/src/source-control/use-mobile-create-pr-runner.ts
+++ b/mobile/src/source-control/use-mobile-create-pr-runner.ts
@@ -63,7 +63,7 @@ export function useMobileCreatePrRunner({
const branch = status?.branch
if (!client || !branch) {
triggerError()
- setActionError(t('m.IhhRQcI'))
+ setActionError(t('useMobileCreatePrRunner.check'))
return
}
const created: { current: MobileHostedReviewCreateIntentRunOutcome | null } = {
diff --git a/mobile/src/source-control/use-mobile-git-requests.ts b/mobile/src/source-control/use-mobile-git-requests.ts
index 1ccd4f88bd2..76c0b14d0c6 100644
--- a/mobile/src/source-control/use-mobile-git-requests.ts
+++ b/mobile/src/source-control/use-mobile-git-requests.ts
@@ -21,14 +21,16 @@ export function useMobileGitRequests({ client, connState, worktreeId }: Params)
const sendGitRequest = useCallback(
async (method: string, params?: Record): Promise => {
if (!client || connState !== 'connected') {
- throw new Error(t('m.1yTzUoY'))
+ throw new Error(t('useMobileGitRequests.waiting'))
}
const response = await client.sendRequest(method, {
worktree: `id:${worktreeId}`,
...params
})
if (!response.ok) {
- const error = new Error(response.error?.message || t('m.D2XJD5Q')) as GitRequestError
+ const error = new Error(
+ response.error?.message || t('useMobileGitRequests.source')
+ ) as GitRequestError
error.code = response.error?.code
throw error
}
@@ -41,7 +43,7 @@ export function useMobileGitRequests({ client, connState, worktreeId }: Params)
async (message: string): Promise => {
const result = await sendGitRequest('git.commit', { message })
if (!result || result.success !== true) {
- throw new Error(result?.error || t('m.9AhI4NI'))
+ throw new Error(result?.error || t('useMobileGitRequests.commit'))
}
return result
},
@@ -59,7 +61,7 @@ export function useMobileGitRequests({ client, connState, worktreeId }: Params)
}
const status = await sendGitRequest('git.status')
if (!status.upstreamStatus) {
- throw new Error(t('m.O6Amqhs'))
+ throw new Error(t('useMobileGitRequests.branch'))
}
return status.upstreamStatus
}
diff --git a/mobile/src/source-control/use-mobile-source-control-action-sheet-runners.ts b/mobile/src/source-control/use-mobile-source-control-action-sheet-runners.ts
index 181a53c90f3..8872cc0b7b6 100644
--- a/mobile/src/source-control/use-mobile-source-control-action-sheet-runners.ts
+++ b/mobile/src/source-control/use-mobile-source-control-action-sheet-runners.ts
@@ -70,11 +70,11 @@ export function useMobileSourceControlActionSheetRunners(params: Params) {
const runActionSheetRebase = useCallback(async () => {
await runGitWorkflow('rebase', async () => {
if (!client) {
- throw new Error(t('m.rF-O-TA'))
+ throw new Error(t('useMobileSourceControlActionSheetRunners.waiting'))
}
const baseRef = await resolveMobileBranchCompareBaseRef(client, worktreeId)
if (!baseRef) {
- throw new Error(t('m.aNYrFtc'))
+ throw new Error(t('useMobileSourceControlActionSheetRunners.no'))
}
await sendGitRequest('git.rebaseFromBase', { baseRef })
})
diff --git a/mobile/src/source-control/use-mobile-source-control-commit-runners.ts b/mobile/src/source-control/use-mobile-source-control-commit-runners.ts
index 7036e128bf6..00fc7e73087 100644
--- a/mobile/src/source-control/use-mobile-source-control-commit-runners.ts
+++ b/mobile/src/source-control/use-mobile-source-control-commit-runners.ts
@@ -62,7 +62,8 @@ export function useMobileSourceControlCommitRunners(params: Params) {
await sendCommitRequest(message)
} catch (err) {
recordCommitFailure({
- error: err instanceof Error ? err.message : t('m.cBrXr-8'),
+ error:
+ err instanceof Error ? err.message : t('useMobileSourceControlCommitRunners.commit'),
commitMessage: message,
stagedEntries
})
@@ -103,7 +104,8 @@ export function useMobileSourceControlCommitRunners(params: Params) {
return false
}
triggerError()
- const errorMessage = err instanceof Error ? err.message : t('m.Pej4iSQ')
+ const errorMessage =
+ err instanceof Error ? err.message : t('useMobileSourceControlCommitRunners.source')
if (!didCommit) {
recordCommitFailure({ error: errorMessage, commitMessage: message, stagedEntries })
}
diff --git a/mobile/src/source-control/use-mobile-source-control-loaders.ts b/mobile/src/source-control/use-mobile-source-control-loaders.ts
index 1f12eb0979f..94710703e30 100644
--- a/mobile/src/source-control/use-mobile-source-control-loaders.ts
+++ b/mobile/src/source-control/use-mobile-source-control-loaders.ts
@@ -113,7 +113,7 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
}
return {
kind: 'error',
- message: t('m.v0PMFRE')
+ message: t('useMobileSourceControlLoaders.unableResolve')
}
})
return false
@@ -135,7 +135,9 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
})
return false
}
- throw new Error(response.error?.message || t('m.Z4IRqv4'))
+ throw new Error(
+ response.error?.message || t('useMobileSourceControlLoaders.unableLoadCommitted')
+ )
}
setBranchCompareState({
kind: 'ready',
@@ -146,7 +148,10 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
if (!isCurrentLoad()) {
return false
}
- const message = err instanceof Error ? err.message : t('m.Z4IRqv4')
+ const message =
+ err instanceof Error
+ ? err.message
+ : t('useMobileSourceControlLoaders.unableLoadCommitted')
setBranchCompareState((prev) => {
if (options?.preserveReadyOnFailure && prev.kind === 'ready') {
return prev
@@ -184,7 +189,10 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
if (isCurrentLoad()) {
setScreenState({
kind: 'error',
- message: connState === 'connected' ? t('m.cIZvHNg') : t('m.5jVDzOo')
+ message:
+ connState === 'connected'
+ ? t('useMobileSourceControlLoaders.connecting')
+ : t('useMobileSourceControlLoaders.waiting')
})
}
return false
@@ -216,7 +224,7 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
if (isMobileGitUnavailable(response.error?.code, response.error?.message)) {
setScreenState({
kind: 'unavailable',
- message: t('m.8lyq50g')
+ message: t('useMobileSourceControlLoaders.update')
})
return false
}
@@ -230,13 +238,16 @@ export function useMobileSourceControlLoaders(params: Params): MobileSourceContr
}
continue
}
- throw new Error(response.error?.message || t('m.67FHeO0'))
+ throw new Error(
+ response.error?.message || t('useMobileSourceControlLoaders.unableLoadSource')
+ )
}
} catch (err) {
if (!isCurrentLoad()) {
return false
}
- const message = err instanceof Error ? err.message : t('m.67FHeO0')
+ const message =
+ err instanceof Error ? err.message : t('useMobileSourceControlLoaders.unableLoadSource')
setScreenState((prev) => {
// Why: git mutations can succeed while the immediate status refresh
// races a desktop abort; keep the last good screen instead of flashing
diff --git a/mobile/src/source-control/use-mobile-source-control-openers.ts b/mobile/src/source-control/use-mobile-source-control-openers.ts
index 29dd60fe0fe..56529887508 100644
--- a/mobile/src/source-control/use-mobile-source-control-openers.ts
+++ b/mobile/src/source-control/use-mobile-source-control-openers.ts
@@ -87,7 +87,7 @@ export function useMobileSourceControlOpeners(params: Params) {
if (!mountedRef.current) {
return
}
- setActionError(t('m.xLlZko0'))
+ setActionError(t('useMobileSourceControlOpeners.waiting'))
return
}
openingPathRef.current = entry.path
@@ -123,7 +123,7 @@ export function useMobileSourceControlOpeners(params: Params) {
})
}
if (!response.ok) {
- throw new Error(response.error?.message || t('m.0MDy3xU'))
+ throw new Error(response.error?.message || t('useMobileSourceControlOpeners.unableOpen'))
}
if (!mountedRef.current) {
return
@@ -146,7 +146,9 @@ export function useMobileSourceControlOpeners(params: Params) {
return
}
triggerError()
- setActionError(err instanceof Error ? err.message : t('m.0MDy3xU'))
+ setActionError(
+ err instanceof Error ? err.message : t('useMobileSourceControlOpeners.unableOpen')
+ )
} finally {
if (openingPathRef.current === entry.path) {
openingPathRef.current = null
@@ -183,7 +185,7 @@ export function useMobileSourceControlOpeners(params: Params) {
if (!mountedRef.current) {
return
}
- setActionError(t('m.xLlZko0'))
+ setActionError(t('useMobileSourceControlOpeners.waiting'))
return
}
if (branchCompareState.kind !== 'ready') {
@@ -227,11 +229,11 @@ export function useMobileSourceControlOpeners(params: Params) {
}
})
if (!response.ok) {
- throw new Error(response.error?.message || t('m.zniLwck'))
+ throw new Error(response.error?.message || t('useMobileSourceControlOpeners.unableLoad'))
}
const result = (response as RpcSuccess).result as GitDiffTextResult | { kind: 'binary' }
if (result.kind !== 'text') {
- throw new Error(t('m.q53ZKds'))
+ throw new Error(t('useMobileSourceControlOpeners.binary'))
}
const diff = buildMobileDiffLines(result.originalContent, result.modifiedContent)
const syntaxLanguage = resolveMobileSyntaxLanguage(entry.path)
@@ -254,7 +256,8 @@ export function useMobileSourceControlOpeners(params: Params) {
setBranchDiffPreview({
kind: 'error',
entry,
- message: err instanceof Error ? err.message : t('m.zniLwck')
+ message:
+ err instanceof Error ? err.message : t('useMobileSourceControlOpeners.unableLoad')
})
} finally {
if (openingBranchPathRef.current === entry.path) {
diff --git a/mobile/src/source-control/use-mobile-source-control-runners.ts b/mobile/src/source-control/use-mobile-source-control-runners.ts
index b45f468c3ed..a3884b034b5 100644
--- a/mobile/src/source-control/use-mobile-source-control-runners.ts
+++ b/mobile/src/source-control/use-mobile-source-control-runners.ts
@@ -114,7 +114,9 @@ export function useMobileSourceControlRunners(params: Params) {
return false
}
triggerError()
- setActionError(err instanceof Error ? err.message : t('m.iO0cooo'))
+ setActionError(
+ err instanceof Error ? err.message : t('useMobileSourceControlRunners.source')
+ )
return false
} finally {
if (busyActionRef.current === actionId) {
diff --git a/mobile/src/storage/codex-reset-attempt-journal.ts b/mobile/src/storage/codex-reset-attempt-journal.ts
index 7af21801fed..bcbe9c82440 100644
--- a/mobile/src/storage/codex-reset-attempt-journal.ts
+++ b/mobile/src/storage/codex-reset-attempt-journal.ts
@@ -24,7 +24,7 @@ export const CodexResetCreditExpectedScopeSchema = z
if (scope.target.runtime === 'host' && scope.target.wslDistro !== null) {
context.addIssue({
code: 'custom',
- message: t('m.TJPBpxE'),
+ message: t('codexResetAttemptJournal.host'),
path: ['target', 'wslDistro']
})
}
@@ -34,7 +34,7 @@ export const CodexResetCreditExpectedScopeSchema = z
) {
context.addIssue({
code: 'custom',
- message: t('m.fCVCUqw'),
+ message: t('codexResetAttemptJournal.wsl'),
path: ['target', 'wslDistro']
})
}
diff --git a/mobile/src/tasks/github-review-metadata.ts b/mobile/src/tasks/github-review-metadata.ts
index 832135e68f8..1e65d6e65a1 100644
--- a/mobile/src/tasks/github-review-metadata.ts
+++ b/mobile/src/tasks/github-review-metadata.ts
@@ -3,17 +3,17 @@ import { t } from '../i18n/mobile-i18n'
export function githubReviewStateLabel(state: string | null | undefined): string {
switch (state) {
case 'APPROVED':
- return t('m.IloG18k')
+ return t('prChecksPresentation.approved')
case 'CHANGES_REQUESTED':
- return t('m.rjj84-Y')
+ return t('prChecksPresentation.changes')
case 'COMMENTED':
- return t('m.bF0aphw')
+ return t('prChecksPresentation.commented')
case 'DISMISSED':
- return t('m.dmAcep8')
+ return t('prChecksPresentation.dismissed')
case 'PENDING':
- return t('m.NEg29tM')
+ return t('prChecksPresentation.pending')
default:
- return t('m._IeDTL8')
+ return t('prChecksPresentation.reviewed')
}
}
diff --git a/mobile/src/tasks/linear-mobile-issue-read.ts b/mobile/src/tasks/linear-mobile-issue-read.ts
index a1e9894fd98..ff86ec540a4 100644
--- a/mobile/src/tasks/linear-mobile-issue-read.ts
+++ b/mobile/src/tasks/linear-mobile-issue-read.ts
@@ -36,5 +36,5 @@ export function extractLinearIssueReadItems(result: unknown): LinearMobileIssue[
return (result as { items: LinearMobileIssue[] }).items
}
- throw new Error(t('m.AX4IXS0'))
+ throw new Error(t('linearMobileIssueRead.unexpected'))
}
diff --git a/mobile/src/tasks/mobile-github-project-group-sort.ts b/mobile/src/tasks/mobile-github-project-group-sort.ts
index 6ea84a56b38..5fe5b29bb01 100644
--- a/mobile/src/tasks/mobile-github-project-group-sort.ts
+++ b/mobile/src/tasks/mobile-github-project-group-sort.ts
@@ -57,7 +57,7 @@ const EMPTY_GROUP_KEY = '__empty__'
const UNKNOWN_INDEX_SENTINEL = Number.MAX_SAFE_INTEGER
function labelForEmpty(field: GitHubProjectField): string {
- return t('m.QNvTsRo', { value0: field.name })
+ return t('mobileGithubProjectGroupSort.no', { fieldName: field.name })
}
function deriveStringValue(value: GitHubProjectFieldValue): string {
@@ -98,7 +98,7 @@ function getFieldValueForGrouping(
const meta = iterations.find((it) => it.id === value.iterationId)
return {
key: value.iterationId,
- label: value.title || meta?.title || t('m.AXVCL9g'),
+ label: value.title || meta?.title || t('mobileGithubProjectGroupSort.iteration'),
orderHint: idx === -1 ? UNKNOWN_INDEX_SENTINEL - 1 : idx,
iteration: meta
? { startDate: meta.startDate, duration: meta.duration, completed: meta.completed }
diff --git a/mobile/src/tasks/mobile-hosted-check-status.ts b/mobile/src/tasks/mobile-hosted-check-status.ts
index c8cd07f88ac..86872d62080 100644
--- a/mobile/src/tasks/mobile-hosted-check-status.ts
+++ b/mobile/src/tasks/mobile-hosted-check-status.ts
@@ -12,50 +12,62 @@ export type MobileHostedReviewStatus = {
export function getHostedReviewLabel(item: MobileHostedReviewStatus): string {
if (item.reviewDecision === 'approved' || item.reviewDecision === 'APPROVED') {
- return t('m.O3Knlx4')
+ return t('task.approved')
}
if (item.reviewDecision === 'changes_requested' || item.reviewDecision === 'CHANGES_REQUESTED') {
- return t('m.yMw_C-k')
+ return t('task.changes')
}
if (item.reviewDecision === 'review_required' || item.reviewDecision === 'REVIEW_REQUIRED') {
- return t('m.97h575A')
+ return t('mobileHostedCheckStatus.review')
}
const reviewerCount = item.reviewerCount ?? item.reviewRequests?.length
return reviewerCount
- ? t(reviewerCount === 1 ? 'm.39Q08OU' : 'm.d8cyKVY', { value0: reviewerCount })
- : t('m.zrt1n24')
+ ? t(
+ reviewerCount === 1
+ ? 'mobileHostedCheckStatus.reviewerCountReviewer'
+ : 'mobileHostedCheckStatus.reviewerCountReviewers',
+ { reviewerCount: reviewerCount }
+ )
+ : t('task.noReviewers')
}
export function getHostedMergeLabel(item: MobileHostedReviewStatus): string {
if (item.mergeable === 'CONFLICTING' || item.mergeStateStatus === 'BLOCKED') {
- return t('m.hIW5XEU')
+ return t('task.conflicts')
}
if (item.mergeStateStatus === 'BEHIND' || item.checksSummary?.state === 'pending') {
- return t('m.OXTehpM')
+ return t('task.behind')
}
if (item.mergeable === 'MERGEABLE' || item.mergeStateStatus === 'CLEAN') {
- return t('m.cbIMuqY')
+ return t('task.able')
}
- return t('m.6MEByr4')
+ return t('task.unknown')
}
export function getHostedChecksLabel(item: { checksSummary?: ProviderCheckSummary }): string {
const summary = item.checksSummary
if (!summary) {
- return t('m.XlbT3Zg')
+ return t('task.checks')
}
if (summary.total === 0) {
- return t('m.X9M1AcA')
+ return t('mobilePrChipSummary.no')
}
if (summary.failed > 0) {
- return t('m.L37iq1E', { value0: summary.failed })
+ return t('mobilePrChipSummary.failing', {
+ failingCheckCount: summary.failed
+ })
}
if (summary.pending > 0) {
- return t('m.Uc3hFHs', { value0: summary.pending })
+ return t('mobileHostedCheckStatus.pending', {
+ pendingCheckCount: summary.pending
+ })
}
return summary.state === 'neutral'
- ? t('m.UMqLjMs')
- : t('m.Sos7PxI', { value0: summary.passed, value1: summary.total })
+ ? t('mobilePrChipSummary.unresolved')
+ : t('mobileHostedCheckStatus.passed', {
+ passedCheckCount: summary.passed,
+ totalCheckCount: summary.total
+ })
}
export function getHostedReviewSignalTone(
diff --git a/mobile/src/tasks/mobile-smart-source-modes.ts b/mobile/src/tasks/mobile-smart-source-modes.ts
index efd48a934d5..6b3d951db9f 100644
--- a/mobile/src/tasks/mobile-smart-source-modes.ts
+++ b/mobile/src/tasks/mobile-smart-source-modes.ts
@@ -17,12 +17,36 @@ export type SmartModeOption = {
// Order + labels + icons mirror desktop getSmartWorkspaceNameModes():
// Smart · GitHub · Linear · GitLab · Branch · Name.
export const SMART_MODE_OPTIONS: readonly SmartModeOption[] = [
- { id: 'smart', label: t('m.0GQcyjg'), icon: { type: 'lucide', name: 'sparkles' } },
- { id: 'github', label: t('m.fLijFJI'), icon: { type: 'provider', provider: 'github' } },
- { id: 'linear', label: t('m.j6H-ZB8'), icon: { type: 'provider', provider: 'linear' } },
- { id: 'gitlab', label: t('m.JEQaLyM'), icon: { type: 'provider', provider: 'gitlab' } },
- { id: 'branches', label: t('m.efmLHxE'), icon: { type: 'lucide', name: 'git-branch' } },
- { id: 'text', label: t('m._NhxpRw'), icon: { type: 'lucide', name: 'case-sensitive' } }
+ {
+ id: 'smart',
+ label: t('mobileSmartSourceModes.smart'),
+ icon: { type: 'lucide', name: 'sparkles' }
+ },
+ {
+ id: 'github',
+ label: t('mobileSmartSourceModes.gitHub'),
+ icon: { type: 'provider', provider: 'github' }
+ },
+ {
+ id: 'linear',
+ label: t('mobileSmartSourceModes.linear'),
+ icon: { type: 'provider', provider: 'linear' }
+ },
+ {
+ id: 'gitlab',
+ label: t('mobileSmartSourceModes.gitLab'),
+ icon: { type: 'provider', provider: 'gitlab' }
+ },
+ {
+ id: 'branches',
+ label: t('mobileSmartSourceModes.branch'),
+ icon: { type: 'lucide', name: 'git-branch' }
+ },
+ {
+ id: 'text',
+ label: t('mobileSmartSourceModes.name'),
+ icon: { type: 'lucide', name: 'case-sensitive' }
+ }
]
export type SmartModeAvailabilityInput = {
@@ -85,10 +109,10 @@ export type MrStateFilterOption = { id: MrStateFilter; label: string }
// Desktop getMrStateFilters(): Open · Merged · Closed · All, default 'opened'.
export const MR_STATE_FILTER_OPTIONS: readonly MrStateFilterOption[] = [
- { id: 'opened', label: t('m.dGRdl38') },
- { id: 'merged', label: t('m.sKFSmrM') },
- { id: 'closed', label: t('m.J54idHw') },
- { id: 'all', label: t('m.IwMISoQ') }
+ { id: 'opened', label: t('mobileSmartSourceModes.open') },
+ { id: 'merged', label: t('mobileSmartSourceModes.merged') },
+ { id: 'closed', label: t('mobileSmartSourceModes.closed') },
+ { id: 'all', label: t('mobileSmartSourceModes.all') }
]
export const DEFAULT_MR_STATE_FILTER: MrStateFilter = 'opened'
diff --git a/mobile/src/tasks/mobile-tasks-screen-types.ts b/mobile/src/tasks/mobile-tasks-screen-types.ts
new file mode 100644
index 00000000000..dddd781b48e
--- /dev/null
+++ b/mobile/src/tasks/mobile-tasks-screen-types.ts
@@ -0,0 +1,256 @@
+import type { HostedReviewDecision } from '../../../src/shared/hosted-review'
+import type { GitHubOwnerRepo, ProviderCheckSummary } from '../../../src/shared/types'
+import type { RpcClient } from '../transport/rpc-client'
+import type { LinearMobileIssue } from './linear-mobile-issue-read'
+
+export type RepoSummary = {
+ id: string
+ displayName: string
+ path: string
+ badgeColor?: string
+ kind?: 'git' | 'folder'
+ connectionId?: string | null
+ issueSourcePreference?: IssueSourcePreference
+}
+
+export type IssueSourcePreference = 'upstream' | 'origin' | 'auto'
+
+export type GitHubWorkItem = {
+ id: string
+ type: 'issue' | 'pr'
+ number: number
+ title: string
+ state: 'open' | 'closed' | 'merged' | 'draft'
+ url: string
+ labels: string[]
+ updatedAt: string
+ author: string | null
+ branchName?: string
+ baseRefName?: string
+ isCrossRepository?: boolean
+ additions?: number
+ deletions?: number
+ changedFiles?: number
+ repoId: string
+ repoName: string
+ reviewDecision?: string | null
+ reviewRequests?: GitHubAssignableUser[]
+ latestReviews?: GitHubPRReviewSummary[]
+ checksSummary?: ProviderCheckSummary
+ mergeable?: GitHubPRMergeableState
+ mergeStateStatus?: string | null
+}
+
+export type GitHubAssignableUser = {
+ login: string
+ name?: string | null
+ avatarUrl?: string | null
+}
+
+export type GitHubPRReviewSummary = {
+ login: string
+ state?: string | null
+ avatarUrl?: string | null
+}
+
+export type GitHubPRMergeableState = 'MERGEABLE' | 'CONFLICTING' | 'UNKNOWN'
+
+export type GitHubPRReviewerRow = {
+ login: string
+ name?: string | null
+ avatarUrl?: string | null
+ stateLabel: string
+}
+
+export type GitHubRepoSources = {
+ issues: GitHubOwnerRepo | null
+ prs: GitHubOwnerRepo | null
+ upstreamCandidate: GitHubOwnerRepo | null
+}
+
+export type TaskRuntimeStatus = {
+ capabilities?: string[]
+}
+
+export type TasksSupportState =
+ | { kind: 'unknown'; client: RpcClient | null }
+ | { kind: 'supported'; client: RpcClient }
+ | { kind: 'unsupported'; client: RpcClient }
+
+export type GitLabWorkItem = {
+ id: string
+ type: 'issue' | 'mr'
+ number: number
+ title: string
+ state: 'opened' | 'closed' | 'merged' | 'locked' | 'draft'
+ url: string
+ labels: string[]
+ updatedAt: string
+ author: string | null
+ branchName?: string
+ baseRefName?: string
+ isCrossRepository?: boolean
+ projectRef?: { host: string; path: string }
+ checksSummary?: ProviderCheckSummary
+ mergeable?: 'MERGEABLE' | 'CONFLICTING' | 'UNKNOWN'
+ reviewDecision?: HostedReviewDecision
+ reviewerCount?: number
+ repoId: string
+ repoName: string
+}
+
+export type GitLabTodo = {
+ id: number
+ actionName: string
+ targetType: string
+ targetIid: number | null
+ targetTitle: string
+ targetUrl: string
+ projectPath: string
+ authorUsername: string
+ updatedAt: string
+ state: 'pending' | 'done'
+}
+
+export type GitPushTarget = {
+ remoteName: string
+ branchName: string
+ remoteUrl?: string
+}
+
+export type SetupDecision = 'inherit' | 'run' | 'skip'
+export type SetupRunPolicy = 'ask' | 'run-by-default' | 'skip-by-default'
+
+export type RepoHooksResponse = {
+ hooks: { scripts?: { setup?: string } } | null
+ source: string | null
+ setupRunPolicy?: SetupRunPolicy
+ setupTrust?: {
+ contentHash: string
+ scriptContent: string
+ }
+}
+
+export type LinearProject = {
+ id: string
+ name: string
+ url?: string
+ color?: string
+}
+
+export type LinearIssueChild = {
+ id: string
+ identifier: string
+ title: string
+ url: string
+}
+
+export type LinearIssue = LinearMobileIssue
+
+export type LinearState = {
+ id: string
+ name: string
+ type: string
+ color?: string
+}
+
+export type LinearTeam = {
+ id: string
+ workspaceId?: string
+ workspaceName?: string
+ name: string
+ key: string
+}
+
+export type DetailComment = {
+ id: string | number
+ author?: string
+ authorAvatarUrl?: string
+ user?: { displayName?: string }
+ isBot?: boolean
+ body: string
+ createdAt?: string
+ url?: string
+ reactions?: Array<{
+ content:
+ | 'thumbs_up'
+ | 'thumbs_down'
+ | 'laugh'
+ | 'confused'
+ | 'heart'
+ | 'hooray'
+ | 'rocket'
+ | 'eyes'
+ count: number
+ }>
+ path?: string
+ line?: number
+ startLine?: number
+ threadId?: string
+ isResolved?: boolean
+}
+
+export type GitHubDetailFile = {
+ path: string
+ oldPath?: string
+ status?: 'added' | 'modified' | 'removed' | 'renamed' | 'copied' | 'changed' | 'unchanged'
+ additions?: number
+ deletions?: number
+ isBinary?: boolean
+ viewerViewedState?: 'DISMISSED' | 'VIEWED' | 'UNVIEWED'
+}
+
+export type GitHubDetailCheck = {
+ name: string
+ status: string
+ conclusion?: string | null
+ url?: string | null
+}
+
+export type GitHubPRFileContents = {
+ original: string
+ modified: string
+ originalIsBinary: boolean
+ modifiedIsBinary: boolean
+}
+
+export type DetailPayload =
+ | {
+ provider: 'github'
+ body: string
+ comments: DetailComment[]
+ labels: string[]
+ assignees: string[]
+ reviewDecision?: string | null
+ reviewRequests: GitHubAssignableUser[]
+ latestReviews: GitHubPRReviewSummary[]
+ headSha?: string
+ baseSha?: string
+ pullRequestId?: string
+ checks: GitHubDetailCheck[]
+ files: GitHubDetailFile[]
+ }
+ | {
+ provider: 'gitlab'
+ body: string
+ comments: DetailComment[]
+ labels: string[]
+ assignees: string[]
+ pipelineJobs: Array<{
+ id?: number
+ name: string
+ stage: string
+ status: string
+ webUrl?: string | null
+ duration?: number | null
+ }>
+ }
+ | {
+ provider: 'linear'
+ description: string
+ comments: DetailComment[]
+ labels: string[]
+ assignee?: string
+ project?: LinearProject
+ children: LinearIssueChild[]
+ }
diff --git a/mobile/src/tasks/mobile-tui-agents.ts b/mobile/src/tasks/mobile-tui-agents.ts
index ae313a54d1b..13dc75abe79 100644
--- a/mobile/src/tasks/mobile-tui-agents.ts
+++ b/mobile/src/tasks/mobile-tui-agents.ts
@@ -43,41 +43,41 @@ export const MOBILE_TUI_AGENT_AUTO_PICK_ORDER = [
] as const satisfies readonly TuiAgent[]
export const MOBILE_TUI_AGENT_LABELS: Record = {
- claude: t('m.OZJxvKQ'),
- 'claude-agent-teams': t('m.cUAuG8c'),
- openclaude: t('m.4os-vWc'),
- codex: t('m.Tvbh_c4'),
- grok: t('m.58N2Zh8'),
- copilot: t('m.7u-Lga4'),
- opencode: t('m.qar2VvQ'),
- 'mimo-code': t('m.imGLJZs'),
- ante: t('m.Y9bn4gA'),
- trae: t('m.STuGb5Q'),
- pi: t('m.BWhYVOA'),
- omp: t('m.GovXMeA'),
- gemini: t('m.qcMaCQk'),
- antigravity: t('m.tkhwBEU'),
- aider: t('m.FWr_S8c'),
- goose: t('m.Gqznj90'),
- amp: t('m.njg39j4'),
- kilo: t('m.FYcf7kI'),
- kiro: t('m.kej-9Lc'),
- crush: t('m.6Y3GKfY'),
- aug: t('m.ufugQXE'),
- autohand: t('m.RCPC-L0'),
- cline: t('m.Vqp3lvY'),
- codebuff: t('m.fm231VU'),
- 'command-code': t('m.WeGqDrY'),
- continue: t('m.dSfrwic'),
- cursor: t('m.Vly29R0'),
- droid: t('m.uvSF6-U'),
- kimi: t('m.HG6jBAg'),
- 'mistral-vibe': t('m.yUpY07s'),
- 'qwen-code': t('m.X7ZF7JI'),
- rovo: t('m.tNRBWNU'),
- hermes: t('m.Lrz_Jb8'),
- devin: t('m.rZEdz3o'),
- openclaw: t('m.fpKzlOM')
+ claude: t('mobileTuiAgents.claude'),
+ 'claude-agent-teams': t('mobileTuiAgents.claudeAgent'),
+ openclaude: t('mobileTuiAgents.openClaude'),
+ codex: t('mobileTuiAgents.codex'),
+ grok: t('mobileTuiAgents.grok'),
+ copilot: t('mobileTuiAgents.git'),
+ opencode: t('mobileTuiAgents.openCode'),
+ 'mimo-code': t('mobileTuiAgents.mi'),
+ ante: t('mobileTuiAgents.ante'),
+ trae: t('mobileTuiAgents.trae'),
+ pi: t('mobileTuiAgents.pi'),
+ omp: t('mobileTuiAgents.omp'),
+ gemini: t('mobileTuiAgents.gemini'),
+ antigravity: t('mobileTuiAgents.antigravity'),
+ aider: t('mobileTuiAgents.aider'),
+ goose: t('mobileTuiAgents.goose'),
+ amp: t('mobileTuiAgents.amp'),
+ kilo: t('mobileTuiAgents.kilocode'),
+ kiro: t('mobileTuiAgents.kiro'),
+ crush: t('mobileTuiAgents.charm'),
+ aug: t('mobileTuiAgents.auggie'),
+ autohand: t('mobileTuiAgents.autohand'),
+ cline: t('mobileTuiAgents.cline'),
+ codebuff: t('mobileTuiAgents.codebuff'),
+ 'command-code': t('mobileTuiAgents.command'),
+ continue: t('mobileTuiAgents.continue'),
+ cursor: t('mobileTuiAgents.cursor'),
+ droid: t('mobileTuiAgents.droid'),
+ kimi: t('mobileTuiAgents.kimi'),
+ 'mistral-vibe': t('mobileTuiAgents.mistral'),
+ 'qwen-code': t('mobileTuiAgents.qwen'),
+ rovo: t('mobileTuiAgents.rovo'),
+ hermes: t('mobileTuiAgents.hermes'),
+ devin: t('mobileTuiAgents.devin'),
+ openclaw: t('mobileTuiAgents.openClaw')
}
export const MOBILE_TUI_AGENT_FAVICON_DOMAINS: Partial> = {
diff --git a/mobile/src/tasks/sparse-preset-draft.ts b/mobile/src/tasks/sparse-preset-draft.ts
index 7d6419a794d..23f82f1cb75 100644
--- a/mobile/src/tasks/sparse-preset-draft.ts
+++ b/mobile/src/tasks/sparse-preset-draft.ts
@@ -41,7 +41,7 @@ export function parseSparsePresetDirectories(value: string): SparsePresetDirecto
if (rawEntries.some(isAbsoluteSparseDirectoryPath)) {
return {
directories: [],
- error: t('m.TgLMnDc')
+ error: t('sparsePresetDraft.use')
}
}
@@ -50,14 +50,14 @@ export function parseSparsePresetDirectories(value: string): SparsePresetDirecto
if (directories.length === 0) {
return {
directories,
- error: t('m.M0WKvoE')
+ error: t('sparsePresetDraft.add')
}
}
if (directories.some((entry) => entry === '.' || entry.split('/').includes('..'))) {
return {
directories: [],
- error: t('m.TgLMnDc')
+ error: t('sparsePresetDraft.use')
}
}
diff --git a/mobile/src/tasks/use-mobile-composer-source.ts b/mobile/src/tasks/use-mobile-composer-source.ts
index 16de0f944d0..d7927029fa3 100644
--- a/mobile/src/tasks/use-mobile-composer-source.ts
+++ b/mobile/src/tasks/use-mobile-composer-source.ts
@@ -99,7 +99,7 @@ export function useMobileComposerSource(args: UseMobileComposerSourceArgs) {
return
}
setBase(EMPTY_BASE)
- onError?.(error instanceof Error ? error.message : t('m.x04i9ik'))
+ onError?.(error instanceof Error ? error.message : t('useMobileComposerSource.failed'))
})
.finally(() => {
if (resolveTokenRef.current === token) {
diff --git a/mobile/src/tasks/workspace-agent-selection.ts b/mobile/src/tasks/workspace-agent-selection.ts
index ffd80827ecf..022ee1a0ffe 100644
--- a/mobile/src/tasks/workspace-agent-selection.ts
+++ b/mobile/src/tasks/workspace-agent-selection.ts
@@ -28,7 +28,7 @@ type ResolveWorkspaceAgentSelectionArgs = WorkspaceAgentSelectionState & {
}
export function workspaceAgentLabel(agent: WorkspaceAgentChoice): string {
- return agent === 'blank' ? t('m.nDyX2e8') : MOBILE_TUI_AGENT_LABELS[agent]
+ return agent === 'blank' ? t('workspaceAgentSelection.blank') : MOBILE_TUI_AGENT_LABELS[agent]
}
export function normalizeWorkspaceAgent(value: unknown): WorkspaceAgentChoice | null {
diff --git a/mobile/src/tasks/workspace-ssh-gate.ts b/mobile/src/tasks/workspace-ssh-gate.ts
index b69da7951b0..301c8de7b2e 100644
--- a/mobile/src/tasks/workspace-ssh-gate.ts
+++ b/mobile/src/tasks/workspace-ssh-gate.ts
@@ -14,27 +14,27 @@ function isWorkspaceSshConnectInProgress(status: SshConnectionStatus | null): bo
export function workspaceSshStatusLabel(status: SshConnectionStatus | null): string {
if (status === 'connected') {
- return t('m.GyhUU1I')
+ return t('workspaceSshGate.connected')
}
if (status === 'connecting') {
- return t('m.Y4pY3mY')
+ return t('workspaceSshGate.connecting')
}
if (status === 'deploying-relay') {
- return t('m.XpcB6Lk')
+ return t('workspaceSshGate.deploying')
}
if (status === 'reconnecting') {
- return t('m.uEprraQ')
+ return t('workspaceSshGate.reconnecting')
}
if (status === 'auth-failed') {
- return t('m.55lbvEs')
+ return t('workspaceSshGate.authentication')
}
if (status === 'reconnection-failed') {
- return t('m.wOY1nLM')
+ return t('workspaceSshGate.reconnect')
}
if (status === 'error') {
- return t('m.FZM-PD0')
+ return t('workspaceSshGate.connection')
}
- return t('m.7wOLCCY')
+ return t('workspaceSshGate.disconnected')
}
export function deriveWorkspaceSshGate(args: {
diff --git a/mobile/src/tasks/worktree-create-retry.ts b/mobile/src/tasks/worktree-create-retry.ts
index 610a2701719..4e58d6bf18c 100644
--- a/mobile/src/tasks/worktree-create-retry.ts
+++ b/mobile/src/tasks/worktree-create-retry.ts
@@ -72,7 +72,7 @@ export async function createWorktreeWithNameRetry(
break
}
}
- return { error: lastError ?? t('m.G_aoVj8') }
+ return { error: lastError ?? t('worktreeCreateRetry.failed') }
}
// Sends worktree.create, re-issuing on a connection-migration cutover only. The
diff --git a/mobile/src/terminal/TerminalWebView.tsx b/mobile/src/terminal/TerminalWebView.tsx
index 19543547bf8..7ba87f4c8ca 100644
--- a/mobile/src/terminal/TerminalWebView.tsx
+++ b/mobile/src/terminal/TerminalWebView.tsx
@@ -382,9 +382,15 @@ export const TerminalWebView = forwardRef(function
textZoom={100}
onLoadStart={handleLoadStart}
onMessage={handleMessage}
- onError={(event) => reportNativeEngineError(t('m.GY53tDU'), event)}
- onHttpError={(event) => reportNativeEngineError(t('m.9IP25z8'), event)}
- onRenderProcessGone={(event) => reportNativeEngineError(t('m.QESpnhs'), event)}
+ onError={(event) =>
+ reportNativeEngineError(t('terminalWebView.terminalWebViewLoad'), event)
+ }
+ onHttpError={(event) =>
+ reportNativeEngineError(t('terminalWebView.terminalWebViewHttp'), event)
+ }
+ onRenderProcessGone={(event) =>
+ reportNativeEngineError(t('terminalWebView.terminalWebViewRender'), event)
+ }
onContentProcessDidTerminate={handleContentProcessDidTerminate}
/>
{engineError ? (
diff --git a/mobile/src/terminal/terminal-accessory-key-catalog.ts b/mobile/src/terminal/terminal-accessory-key-catalog.ts
index 83c04f7ccf3..f63bdbbf8bc 100644
--- a/mobile/src/terminal/terminal-accessory-key-catalog.ts
+++ b/mobile/src/terminal/terminal-accessory-key-catalog.ts
@@ -2,61 +2,131 @@ import { t } from '@/i18n/mobile-i18n'
import type { TerminalAccessoryKey } from './terminal-accessory-keys'
export const TERMINAL_ACCESSORY_KEYS: TerminalAccessoryKey[] = [
- { id: 'escape', label: t('m.bNejRmQ'), bytes: '\x1b', accessibilityLabel: t('m.jHe6UUU') },
- { id: 'tab', label: t('m.hM5KUAw'), bytes: '\t', accessibilityLabel: t('m.hM5KUAw') },
- { id: 'enter', label: t('m.9KFo5zM'), bytes: '\r', accessibilityLabel: t('m.9KFo5zM') },
+ {
+ id: 'escape',
+ label: t('terminalAccessoryKeyCatalog.esc'),
+ bytes: '\x1b',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.escape')
+ },
+ {
+ id: 'tab',
+ label: t('terminalAccessoryKeyCatalog.tab'),
+ bytes: '\t',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.tab')
+ },
+ {
+ id: 'enter',
+ label: t('terminalAccessoryKeyCatalog.enter'),
+ bytes: '\r',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.enter')
+ },
// Why: terminal apps recognize ESC [ Z as the reverse-tab sequence.
- { id: 'shiftTab', label: t('m.S9DH8y4'), bytes: '\x1b[Z', accessibilityLabel: t('m.p7_d2FU') },
- { id: 'space', label: t('m.l6KJT3M'), bytes: ' ', accessibilityLabel: t('m.l6KJT3M') },
+ {
+ id: 'shiftTab',
+ label: t('terminalAccessoryKeyCatalog.shiftPlus'),
+ bytes: '\x1b[Z',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.shiftTab')
+ },
+ {
+ id: 'space',
+ label: t('terminalAccessoryKeyCatalog.space'),
+ bytes: ' ',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.space')
+ },
{
id: 'backspace',
label: '⌫',
bytes: '\x7f',
- accessibilityLabel: t('m.6TRPiic'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.backspace'),
repeatable: true
},
{
id: 'delete',
- label: t('m.gmy3A7M'),
+ label: t('terminalAccessoryKeyCatalog.del'),
bytes: '\x1b[3~',
- accessibilityLabel: t('m.fNgDk9o'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.forward'),
repeatable: true
},
{
id: 'arrowUp',
label: '↑',
bytes: '\x1b[A',
- accessibilityLabel: t('m.IwJi8TY'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.arrowUp'),
repeatable: true
},
{
id: 'arrowDown',
label: '↓',
bytes: '\x1b[B',
- accessibilityLabel: t('m.vVsy7qk'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.arrowDown'),
repeatable: true
},
{
id: 'arrowLeft',
label: '←',
bytes: '\x1b[D',
- accessibilityLabel: t('m.RiGIavM'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.arrowLeft'),
repeatable: true
},
{
id: 'arrowRight',
label: '→',
bytes: '\x1b[C',
- accessibilityLabel: t('m.v5WSGO0'),
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.arrowRight'),
repeatable: true
},
- { id: 'ctrlC', label: t('m.ke03J5M'), bytes: '\x03', accessibilityLabel: t('m.AzHoQzM') },
- { id: 'ctrlD', label: t('m.vFYSo0s'), bytes: '\x04', accessibilityLabel: t('m.PBPnPeQ') },
- { id: 'ctrlL', label: t('m.R6ZcIz8'), bytes: '\x0c', accessibilityLabel: t('m.Eqaj8oY') },
- { id: 'ctrlZ', label: t('m.NIdsbYo'), bytes: '\x1a', accessibilityLabel: t('m.hqWfNmA') },
- { id: 'ctrlR', label: t('m.a2Cb3GE'), bytes: '\x12', accessibilityLabel: t('m.mcvHf4o') },
- { id: 'ctrlA', label: t('m.u9q9lPQ'), bytes: '\x01', accessibilityLabel: t('m.CKFp_QM') },
- { id: 'ctrlE', label: t('m.5m_ucwE'), bytes: '\x05', accessibilityLabel: t('m.0VWtVO8') },
- { id: 'ctrlW', label: t('m.jVVj75Y'), bytes: '\x17', accessibilityLabel: t('m.Bd9qfdk') },
- { id: 'ctrlU', label: t('m.sL5fKGQ'), bytes: '\x15', accessibilityLabel: t('m.HrWsdDM') }
+ {
+ id: 'ctrlC',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusC'),
+ bytes: '\x03',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.interrupt')
+ },
+ {
+ id: 'ctrlD',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusD'),
+ bytes: '\x04',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.send')
+ },
+ {
+ id: 'ctrlL',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusL'),
+ bytes: '\x0c',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.clearScreen')
+ },
+ {
+ id: 'ctrlZ',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusZ'),
+ bytes: '\x1a',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.suspend')
+ },
+ {
+ id: 'ctrlR',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusR'),
+ bytes: '\x12',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.reverse')
+ },
+ {
+ id: 'ctrlA',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlus'),
+ bytes: '\x01',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.start')
+ },
+ {
+ id: 'ctrlE',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusE'),
+ bytes: '\x05',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.end')
+ },
+ {
+ id: 'ctrlW',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusW'),
+ bytes: '\x17',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.delete')
+ },
+ {
+ id: 'ctrlU',
+ label: t('terminalAccessoryKeyCatalog.ctrlPlusU'),
+ bytes: '\x15',
+ accessibilityLabel: t('terminalAccessoryKeyCatalog.clearLine')
+ }
]
diff --git a/mobile/src/terminal/terminal-accessory-keys.ts b/mobile/src/terminal/terminal-accessory-keys.ts
index 6d54c79ce18..658d9e793c2 100644
--- a/mobile/src/terminal/terminal-accessory-keys.ts
+++ b/mobile/src/terminal/terminal-accessory-keys.ts
@@ -32,9 +32,9 @@ const canonicalTerminalLabel = mobileI18n.getFixedT('en')
export const TERMINAL_SHORTCUT_MODIFIER_LABELS: Readonly> =
{
- ctrl: canonicalTerminalLabel('m.mthhwXw'),
- alt: canonicalTerminalLabel('m.zN_6g9g'),
- shift: canonicalTerminalLabel('m.lCZrWn4')
+ ctrl: canonicalTerminalLabel('terminalAccessoryKeys.ctrl'),
+ alt: canonicalTerminalLabel('terminalAccessoryKeys.alt'),
+ shift: canonicalTerminalLabel('terminalAccessoryKeys.shift')
}
const MODIFIER_ORDER: TerminalShortcutModifier[] = ['ctrl', 'alt', 'shift']
@@ -80,63 +80,63 @@ const CTRL_PRINTABLE_BYTES: Record = {
}
const SPECIAL_KEY_LABELS: Record = {
- escape: canonicalTerminalLabel('m.bNejRmQ'),
- tab: canonicalTerminalLabel('m.hM5KUAw'),
- enter: canonicalTerminalLabel('m.9KFo5zM'),
+ escape: canonicalTerminalLabel('terminalAccessoryKeyCatalog.esc'),
+ tab: canonicalTerminalLabel('terminalAccessoryKeyCatalog.tab'),
+ enter: canonicalTerminalLabel('terminalAccessoryKeyCatalog.enter'),
backspace: '⌫',
- delete: canonicalTerminalLabel('m.gmy3A7M'),
- insert: canonicalTerminalLabel('m.bh9E9Gk'),
+ delete: canonicalTerminalLabel('terminalAccessoryKeyCatalog.del'),
+ insert: canonicalTerminalLabel('terminalAccessoryKeys.ins'),
arrowUp: '↑',
arrowDown: '↓',
arrowLeft: '←',
arrowRight: '→',
- home: canonicalTerminalLabel('m.r2L-IvQ'),
- end: canonicalTerminalLabel('m.6UajMWQ'),
- pageUp: canonicalTerminalLabel('m.1qkhXPI'),
- pageDown: canonicalTerminalLabel('m.Wt9qvqo'),
- space: canonicalTerminalLabel('m.l6KJT3M'),
- f1: canonicalTerminalLabel('m.wPNSaMQ'),
- f2: canonicalTerminalLabel('m.5OQeDMc'),
- f3: canonicalTerminalLabel('m.fNbslzw'),
- f4: canonicalTerminalLabel('m.dMpOhHI'),
- f5: canonicalTerminalLabel('m.MmdqLFU'),
- f6: canonicalTerminalLabel('m.xOj4ngY'),
- f7: canonicalTerminalLabel('m.EbNp-x4'),
- f8: canonicalTerminalLabel('m.DR9i7SU'),
- f9: canonicalTerminalLabel('m.rI3MEx0'),
- f10: canonicalTerminalLabel('m.d6orzBg'),
- f11: canonicalTerminalLabel('m.T7RTOC4'),
- f12: canonicalTerminalLabel('m._dDm4ic')
+ home: canonicalTerminalLabel('terminalAccessoryKeys.home'),
+ end: canonicalTerminalLabel('terminalAccessoryKeys.end'),
+ pageUp: canonicalTerminalLabel('terminalAccessoryKeys.pgUp'),
+ pageDown: canonicalTerminalLabel('terminalAccessoryKeys.pgDn'),
+ space: canonicalTerminalLabel('terminalAccessoryKeyCatalog.space'),
+ f1: canonicalTerminalLabel('terminalAccessoryKeys.f1'),
+ f2: canonicalTerminalLabel('terminalAccessoryKeys.f2'),
+ f3: canonicalTerminalLabel('terminalAccessoryKeys.f3'),
+ f4: canonicalTerminalLabel('terminalAccessoryKeys.f4'),
+ f5: canonicalTerminalLabel('terminalAccessoryKeys.f5'),
+ f6: canonicalTerminalLabel('terminalAccessoryKeys.f6'),
+ f7: canonicalTerminalLabel('terminalAccessoryKeys.f7'),
+ f8: canonicalTerminalLabel('terminalAccessoryKeys.f8'),
+ f9: canonicalTerminalLabel('terminalAccessoryKeys.f9'),
+ f10: canonicalTerminalLabel('terminalAccessoryKeys.f10'),
+ f11: canonicalTerminalLabel('terminalAccessoryKeys.f11'),
+ f12: canonicalTerminalLabel('terminalAccessoryKeys.f12')
}
const SPECIAL_KEY_ACCESSIBILITY_LABELS: Record = {
- escape: t('m.jHe6UUU'),
- tab: t('m.hM5KUAw'),
- enter: t('m.9KFo5zM'),
- backspace: t('m.6TRPiic'),
- delete: t('m.fNgDk9o'),
- insert: t('m.JAhWIZE'),
- arrowUp: t('m.S_D2PxQ'),
- arrowDown: t('m.jB50jh8'),
- arrowLeft: t('m.1TJf6c4'),
- arrowRight: t('m.EvEE7WE'),
- home: t('m.r2L-IvQ'),
- end: t('m.6UajMWQ'),
- pageUp: t('m.1n1QZYk'),
- pageDown: t('m.Z-W6Rzg'),
- space: t('m.l6KJT3M'),
- f1: t('m.wPNSaMQ'),
- f2: t('m.5OQeDMc'),
- f3: t('m.fNbslzw'),
- f4: t('m.dMpOhHI'),
- f5: t('m.MmdqLFU'),
- f6: t('m.xOj4ngY'),
- f7: t('m.EbNp-x4'),
- f8: t('m.DR9i7SU'),
- f9: t('m.rI3MEx0'),
- f10: t('m.d6orzBg'),
- f11: t('m.T7RTOC4'),
- f12: t('m._dDm4ic')
+ escape: t('terminalAccessoryKeyCatalog.escape'),
+ tab: t('terminalAccessoryKeyCatalog.tab'),
+ enter: t('terminalAccessoryKeyCatalog.enter'),
+ backspace: t('terminalAccessoryKeyCatalog.backspace'),
+ delete: t('terminalAccessoryKeyCatalog.forward'),
+ insert: t('terminalAccessoryKeys.insert'),
+ arrowUp: t('terminalAccessoryKeys.arrowUp'),
+ arrowDown: t('terminalAccessoryKeys.arrowDown'),
+ arrowLeft: t('terminalAccessoryKeys.arrowLeft'),
+ arrowRight: t('terminalAccessoryKeys.arrowRight'),
+ home: t('terminalAccessoryKeys.home'),
+ end: t('terminalAccessoryKeys.end'),
+ pageUp: t('terminalAccessoryKeys.pageUp'),
+ pageDown: t('terminalAccessoryKeys.pageDown'),
+ space: t('terminalAccessoryKeyCatalog.space'),
+ f1: t('terminalAccessoryKeys.f1'),
+ f2: t('terminalAccessoryKeys.f2'),
+ f3: t('terminalAccessoryKeys.f3'),
+ f4: t('terminalAccessoryKeys.f4'),
+ f5: t('terminalAccessoryKeys.f5'),
+ f6: t('terminalAccessoryKeys.f6'),
+ f7: t('terminalAccessoryKeys.f7'),
+ f8: t('terminalAccessoryKeys.f8'),
+ f9: t('terminalAccessoryKeys.f9'),
+ f10: t('terminalAccessoryKeys.f10'),
+ f11: t('terminalAccessoryKeys.f11'),
+ f12: t('terminalAccessoryKeys.f12')
}
const CSI_FINAL_SPECIAL_KEYS: Record = {
diff --git a/mobile/src/terminal/terminal-live-input-affordance.test.ts b/mobile/src/terminal/terminal-live-input-affordance.test.ts
index 6166e718dcc..c7e7f9a09c4 100644
--- a/mobile/src/terminal/terminal-live-input-affordance.test.ts
+++ b/mobile/src/terminal/terminal-live-input-affordance.test.ts
@@ -32,8 +32,8 @@ describe('terminal live input affordance', () => {
expect(block).toContain('onPress={focusLiveInput}')
expect(block).toContain('accessibilityRole="button"')
- expect(block).toContain("accessibilityLabel={t('m.JQAVlGc')}")
- expect(block).toContain("accessibilityHint={t('m.Rddk0Io')}")
+ expect(block).toContain("accessibilityLabel={tr('show')}")
+ expect(block).toContain("accessibilityHint={tr('typed')}")
expect(block).toContain('pressed && styles.liveInputFocusTargetPressed')
expect(block).toContain('!canSend && styles.liveInputFocusTargetDisabled')
expect(block).toContain('showSoftInputOnFocus')
@@ -49,7 +49,7 @@ describe('terminal live input affordance', () => {
})
it('makes the live keyboard target visible instead of status-only chrome', () => {
- expect(liveInputStatusSource).toContain("t('m.7IfxObc')")
+ expect(liveInputStatusSource).toContain("t('mobileTerminalLiveInputStatus.tapShow')")
expect(commandInputStylesSource).toContain('backgroundColor: colors.bgRaised')
expect(commandInputStylesSource).toContain('borderWidth: 1')
expect(commandInputStylesSource).toContain('liveInputFocusTargetPressed')
diff --git a/mobile/src/terminal/terminal-webview-engine-error-state.tsx b/mobile/src/terminal/terminal-webview-engine-error-state.tsx
index e06598223b1..e892093832b 100644
--- a/mobile/src/terminal/terminal-webview-engine-error-state.tsx
+++ b/mobile/src/terminal/terminal-webview-engine-error-state.tsx
@@ -81,13 +81,13 @@ export function TerminalWebViewEngineErrorOverlay({
}: TerminalWebViewEngineErrorOverlayProps) {
return (
- {t('m.p2soPzg')}
+ {t('terminalWebviewEngineErrorState.terminal')}
{message}
- {t('m.UnBBA1A')}
+ {t('terminalWebviewEngineErrorState.reload')}
)
diff --git a/mobile/src/terminal/terminal-webview-notification-dispatch.ts b/mobile/src/terminal/terminal-webview-notification-dispatch.ts
index ff951fa17c9..e4590c3e27b 100644
--- a/mobile/src/terminal/terminal-webview-notification-dispatch.ts
+++ b/mobile/src/terminal/terminal-webview-notification-dispatch.ts
@@ -20,7 +20,10 @@ export function dispatchTerminalWebViewNotification(
// eslint-disable-next-line no-console
console.log(tag, msg.payload)
} else if (msg.type === 'error') {
- const message = typeof msg.message === 'string' ? msg.message : t('m.TI9qKn0')
+ const message =
+ typeof msg.message === 'string'
+ ? msg.message
+ : t('terminalWebviewNotificationDispatch.unknown')
handlers.reportEngineError(message, msg.fatal !== false)
} else if (msg.type === 'set-select-mode') {
handlers.onSelectionMode?.(!!msg.enabled)
diff --git a/mobile/src/terminal/terminal-webview-ready-watchdog.ts b/mobile/src/terminal/terminal-webview-ready-watchdog.ts
index 4823f548aed..d2cd5a1120e 100644
--- a/mobile/src/terminal/terminal-webview-ready-watchdog.ts
+++ b/mobile/src/terminal/terminal-webview-ready-watchdog.ts
@@ -32,7 +32,7 @@ export function useTerminalWebReadyWatchdog(
watchdogRef.current = setTimeout(fire, WEB_READY_WATCHDOG_MS)
return
}
- reportEngineError(t('m.nEDriRI'), true)
+ reportEngineError(t('terminalWebviewReadyWatchdog.terminal'), true)
}
watchdogRef.current = setTimeout(fire, WEB_READY_WATCHDOG_MS)
}, [clearWebReadyWatchdog, isWebReadyRef, reportEngineError])
diff --git a/mobile/src/transport/connection-health.test.ts b/mobile/src/transport/connection-health.test.ts
index 5ac61c06a93..6c006205b6c 100644
--- a/mobile/src/transport/connection-health.test.ts
+++ b/mobile/src/transport/connection-health.test.ts
@@ -1,5 +1,18 @@
import { describe, expect, it } from 'vitest'
-import { classifyConnection, verdictDisplayLabel } from './connection-health'
+import {
+ classifyConnection,
+ isConnectionErrorVerdict,
+ verdictDisplayLabel
+} from './connection-health'
+
+it('classifies only actionable connection failures as errors', () => {
+ expect(isConnectionErrorVerdict({ kind: 'normal', label: 'Connected' })).toBe(false)
+ expect(isConnectionErrorVerdict({ kind: 'warning', label: 'Cannot connect' })).toBe(true)
+ expect(
+ isConnectionErrorVerdict({ kind: 'unreachable', label: 'Unreachable', reason: 'stale' })
+ ).toBe(true)
+ expect(isConnectionErrorVerdict({ kind: 'auth-failed', label: 'Pairing invalid' })).toBe(true)
+})
describe('classifyConnection auth-failed verdict', () => {
it('tells the user to re-pair instead of showing a generic auth error', () => {
diff --git a/mobile/src/transport/connection-health.ts b/mobile/src/transport/connection-health.ts
index b2c28595810..d44708f6540 100644
--- a/mobile/src/transport/connection-health.ts
+++ b/mobile/src/transport/connection-health.ts
@@ -27,7 +27,7 @@ const STALE_SINCE_LAST_CONNECT_MS = 60_000
// the phone's Tailscale tunnel is down or wedged (a known iOS failure mode
// that only a manual toggle fixes) — not that the desktop moved. Say so
// instead of leaving the user staring at a generic "Can't connect".
-const TAILSCALE_HINT = t('m.TxG95wU')
+const TAILSCALE_HINT = t('connectionHealth.check')
export type ConnectionVerdict =
| { kind: 'normal'; label: string }
@@ -40,6 +40,10 @@ export type ConnectionVerdict =
}
| { kind: 'auth-failed'; label: string }
+export function isConnectionErrorVerdict(verdict: ConnectionVerdict): boolean {
+ return ['warning', 'unreachable', 'auth-failed'].includes(verdict.kind)
+}
+
// Why: the rpc-client's lastConnectedAt is a one-shot timestamp; we have
// to recompute "are we currently stale" against now() each render.
// Centralized so home + host-detail show identical verdicts.
@@ -59,15 +63,18 @@ export function classifyConnection(args: {
// Why: auth-failed means the desktop no longer recognizes this pairing (e.g. it
// lost its device registry) — retrying can't fix it, only re-pairing can, so say so.
if (state === 'auth-failed') {
- return { kind: 'auth-failed', label: t('m.0BvjSKA') }
+ return {
+ kind: 'auth-failed',
+ label: t('connectionHealth.pairing')
+ }
}
if (state === 'connected') {
- return { kind: 'normal', label: t('m.jgGsba4') }
+ return { kind: 'normal', label: t('connectionHealth.connected') }
}
if (state === 'disconnected') {
- return { kind: 'normal', label: t('m.G6a1Jqk') }
+ return { kind: 'normal', label: t('connectionHealth.disconnected') }
}
// connecting / handshaking / reconnecting from here. The gates apply to all
@@ -78,7 +85,7 @@ export function classifyConnection(args: {
if (lastConnectedAt == null) {
return {
kind: 'unreachable',
- label: t('m.YAPgxBM'),
+ label: t('connectionHealth.cannotReach'),
reason: 'never-connected',
hint
}
@@ -86,7 +93,7 @@ export function classifyConnection(args: {
if (now - lastConnectedAt >= STALE_SINCE_LAST_CONNECT_MS) {
return {
kind: 'unreachable',
- label: t('m.YAPgxBM'),
+ label: t('connectionHealth.cannotReach'),
reason: 'stale',
hint
}
@@ -94,12 +101,15 @@ export function classifyConnection(args: {
}
if (reconnectAttempts >= WARNING_ATTEMPTS) {
- return { kind: 'warning', label: t('m.6_SeqME'), hint }
+ return { kind: 'warning', label: t('connectionHealth.cannotConnect'), hint }
}
return {
kind: 'normal',
- label: state === 'reconnecting' ? t('m.KbmpcZs') : t('m.I-waJyg')
+ label:
+ state === 'reconnecting'
+ ? t('connectionHealth.reconnecting')
+ : t('connectionHealth.connecting')
}
}
diff --git a/mobile/src/transport/host-endpoint.ts b/mobile/src/transport/host-endpoint.ts
index ec46d364994..e12634807f2 100644
--- a/mobile/src/transport/host-endpoint.ts
+++ b/mobile/src/transport/host-endpoint.ts
@@ -108,7 +108,7 @@ export function normalizeHostEndpoint(
): NormalizeHostEndpointResult {
const trimmed = input.trim()
if (!trimmed) {
- return { ok: false, error: t('m.z85IfPo') }
+ return { ok: false, error: t('hostEndpoint.enter') }
}
const fallbackPort = resolveFallbackPort(options?.fallbackPort)
@@ -135,56 +135,56 @@ function resolveFallbackPort(value: string | number | undefined): string {
function normalizeSchemeUrl(input: string, fallbackPort: string): NormalizeHostEndpointResult {
const explicitPort = resolveWebsocketUrlPort(input)
if (explicitPort.kind === 'invalid') {
- return { ok: false, error: t('m.HguWCpQ') }
+ return { ok: false, error: t('hostEndpoint.port') }
}
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):\/\//.exec(input)?.[1]?.toLowerCase()
if (scheme !== 'ws' && scheme !== 'wss') {
- return { ok: false, error: t('m.HQMAFdE') }
+ return { ok: false, error: t('hostEndpoint.use') }
}
const rawAuthority = parseRawSchemeAuthority(input)
if (rawAuthority.hasUserInfo) {
- return { ok: false, error: t('m.CshxztM') }
+ return { ok: false, error: t('hostEndpoint.notValidAddress') }
}
if (rawAuthority.hasPathOrQuery) {
- return { ok: false, error: t('m.fX92Peg') }
+ return { ok: false, error: t('hostEndpoint.host') }
}
if (
rawAuthority.hostname &&
validateNumericIpv4Candidate(normalizeRawNumericIpv4Candidate(rawAuthority.hostname))
) {
- return { ok: false, error: t('m.6lctDfQ') }
+ return { ok: false, error: t('hostEndpoint.notValidHostname') }
}
let url: URL
try {
url = new URL(input)
} catch {
- return { ok: false, error: t('m.CshxztM') }
+ return { ok: false, error: t('hostEndpoint.notValidAddress') }
}
if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {
- return { ok: false, error: t('m.HQMAFdE') }
+ return { ok: false, error: t('hostEndpoint.use') }
}
if (!url.hostname) {
- return { ok: false, error: t('m.dRmw4EQ') }
+ return { ok: false, error: t('hostEndpoint.missing') }
}
// Why: edit-host persists a bare host:port WebSocket endpoint. Path/query/
// userinfo are not part of the pairing contract — reject rather than strip
// so typos like desk/path or desk?route cannot be saved silently.
if (url.username || url.password) {
- return { ok: false, error: t('m.CshxztM') }
+ return { ok: false, error: t('hostEndpoint.notValidAddress') }
}
if ((url.pathname && url.pathname !== '/') || url.search || url.hash) {
- return { ok: false, error: t('m.fX92Peg') }
+ return { ok: false, error: t('hostEndpoint.host') }
}
const hostname = unwrapHostname(url.hostname)
// Why: WHATWG URL accepts legacy aliases and rewrites them to a different
// IPv4 address. Only an already-canonical raw dotted quad may become IPv4.
if (rawAuthority.hostname && isCanonicalIpv4(hostname) && rawAuthority.hostname !== hostname) {
- return { ok: false, error: t('m.6lctDfQ') }
+ return { ok: false, error: t('hostEndpoint.notValidHostname') }
}
const hostError = validateHostname(hostname)
if (hostError) {
@@ -195,7 +195,7 @@ function normalizeSchemeUrl(input: string, fallbackPort: string): NormalizeHostE
// of rewriting them to fallbackPort (usually 6768).
const resolvedPort = resolveWebsocketUrlPort(input, url)
if (resolvedPort.kind === 'invalid') {
- return { ok: false, error: t('m.HguWCpQ') }
+ return { ok: false, error: t('hostEndpoint.port') }
}
const port = resolvedPort.kind === 'valid' ? resolvedPort.port : fallbackPort
@@ -241,14 +241,14 @@ function normalizeHostPort(
if (input.startsWith('[')) {
const close = input.indexOf(']')
if (close <= 1) {
- return { ok: false, error: t('m.CshxztM') }
+ return { ok: false, error: t('hostEndpoint.notValidAddress') }
}
host = input.slice(1, close)
const rest = input.slice(close + 1)
if (rest.startsWith(':')) {
port = rest.slice(1)
} else if (rest.length > 0) {
- return { ok: false, error: t('m.CshxztM') }
+ return { ok: false, error: t('hostEndpoint.notValidAddress') }
}
} else {
const firstColon = input.indexOf(':')
@@ -264,7 +264,7 @@ function normalizeHostPort(
host = host.trim()
if (!host) {
- return { ok: false, error: t('m.dRmw4EQ') }
+ return { ok: false, error: t('hostEndpoint.missing') }
}
// Why: bare input is not a URL, so characters that only make sense in a URL
@@ -277,7 +277,7 @@ function normalizeHostPort(
if (port !== undefined) {
port = port.trim()
if (!isValidPort(port)) {
- return { ok: false, error: t('m.HguWCpQ') }
+ return { ok: false, error: t('hostEndpoint.port') }
}
}
@@ -295,11 +295,11 @@ function formatHostForUrl(host: string): string {
*/
function validateHostname(host: string): string | null {
if (!host) {
- return t('m.dRmw4EQ')
+ return t('hostEndpoint.missing')
}
// Spaces, path/query/fragment separators, userinfo separators, brackets.
if (/[\s/?#@[\]]/.test(host)) {
- return t('m.6lctDfQ')
+ return t('hostEndpoint.notValidHostname')
}
const numericIpv4Error = validateNumericIpv4Candidate(host)
if (numericIpv4Error) {
@@ -309,12 +309,12 @@ function validateHostname(host: string): string | null {
// Why: a hex/colon regex accepts malformed forms such as two `::` runs.
// Reuse the URL parser that WebSocket will ultimately use.
if (!/^[0-9a-fA-F:]+$/.test(host)) {
- return t('m.6lctDfQ')
+ return t('hostEndpoint.notValidHostname')
}
try {
new URL(`ws://[${host}]:${DEFAULT_PORT}`)
} catch {
- return t('m.6lctDfQ')
+ return t('hostEndpoint.notValidHostname')
}
return null
}
@@ -324,7 +324,7 @@ function validateHostname(host: string): string | null {
host
)
) {
- return t('m.6lctDfQ')
+ return t('hostEndpoint.notValidHostname')
}
return null
}
@@ -334,7 +334,7 @@ function validateNumericIpv4Candidate(host: string): string | null {
return null
}
if (!isCanonicalIpv4(host)) {
- return t('m.6lctDfQ')
+ return t('hostEndpoint.notValidHostname')
}
return null
}
diff --git a/mobile/src/transport/mobile-connection-path-label.ts b/mobile/src/transport/mobile-connection-path-label.ts
index 5b506f105cd..ca7b0955dae 100644
--- a/mobile/src/transport/mobile-connection-path-label.ts
+++ b/mobile/src/transport/mobile-connection-path-label.ts
@@ -3,7 +3,9 @@ import { t } from '@/i18n/mobile-i18n'
export function mobileConnectionPathLabel(path: MobileConnectionPath): string {
if (path === 'relay') {
- return t('m.Lo_8ioI')
+ return t('mobileConnectionPathLabel.orca')
}
- return path === 'tailscale' ? t('m.f3Si3vU') : t('m.hPnnpWc')
+ return path === 'tailscale'
+ ? t('mobileConnectionPathLabel.directTailscale')
+ : t('mobileConnectionPathLabel.directLan')
}
diff --git a/mobile/src/transport/mobile-relay-host-overlay.ts b/mobile/src/transport/mobile-relay-host-overlay.ts
index f0c6d53c731..63bcaf973bf 100644
--- a/mobile/src/transport/mobile-relay-host-overlay.ts
+++ b/mobile/src/transport/mobile-relay-host-overlay.ts
@@ -24,14 +24,17 @@ export const MobileRelayHostOverlaySchema = z
.strict()
.superRefine((overlay, context) => {
if ((overlay.relayHostId === undefined) !== (overlay.relay === undefined)) {
- context.addIssue({ code: 'custom', message: t('m.CjbcG3A') })
+ context.addIssue({
+ code: 'custom',
+ message: t('mobileRelayHostOverlay.relayIdentity')
+ })
return
}
if (overlay.relay && overlay.relay.relayHostId !== overlay.relayHostId) {
context.addIssue({
code: 'custom',
path: ['relayHostId'],
- message: t('m.e-zCiAo')
+ message: t('mobileRelayHostOverlay.relayHost')
})
}
const relayEndpointCount = overlay.endpoints.filter(({ kind }) => kind === 'relay').length
@@ -39,7 +42,7 @@ export const MobileRelayHostOverlaySchema = z
context.addIssue({
code: 'custom',
path: ['endpoints'],
- message: t('m.lxKZMMw')
+ message: t('mobileRelayHostOverlay.expected')
})
}
})
diff --git a/mobile/src/transport/mobile-relay-rpc-streams.ts b/mobile/src/transport/mobile-relay-rpc-streams.ts
index 09a989c575d..6b6679c2ada 100644
--- a/mobile/src/transport/mobile-relay-rpc-streams.ts
+++ b/mobile/src/transport/mobile-relay-rpc-streams.ts
@@ -59,11 +59,12 @@ export class MobileRelayRpcStreams {
.waitForConnected()
.then(() => {
if (!stream.cancelled && !this.options.sendFrame({ id, method, params: stream.params })) {
- this.fail(id, stream, t('m.B2yGeak'))
+ this.fail(id, stream, t('mobileRelayRpcStreams.connection'))
}
})
.catch((error: unknown) => {
- const message = error instanceof Error ? error.message : t('m.B2yGeak')
+ const message =
+ error instanceof Error ? error.message : t('mobileRelayRpcStreams.connection')
this.fail(id, stream, message, error)
})
return () => this.cancel(id)
diff --git a/mobile/src/transport/pair-confirm-state.ts b/mobile/src/transport/pair-confirm-state.ts
index 3f34d50dfe6..82b626899ca 100644
--- a/mobile/src/transport/pair-confirm-state.ts
+++ b/mobile/src/transport/pair-confirm-state.ts
@@ -8,12 +8,20 @@ export type PairConfirmRouteState =
export function resolvePairConfirmRouteState(code: string | undefined): PairConfirmRouteState {
if (!code) {
- return { kind: 'error', offer: null, errorMessage: t('m.WABgCvg') }
+ return {
+ kind: 'error',
+ offer: null,
+ errorMessage: t('pairConfirmState.missing')
+ }
}
const offer = parsePairingCode(code)
if (!offer) {
- return { kind: 'error', offer: null, errorMessage: t('m.gx2zC4w') }
+ return {
+ kind: 'error',
+ offer: null,
+ errorMessage: t('pairConfirmState.not')
+ }
}
return { kind: 'ready', offer, errorMessage: '' }
diff --git a/mobile/src/worktree/agent-row-display.ts b/mobile/src/worktree/agent-row-display.ts
index 455b5d6f87b..1ad80390970 100644
--- a/mobile/src/worktree/agent-row-display.ts
+++ b/mobile/src/worktree/agent-row-display.ts
@@ -37,17 +37,17 @@ export function agentDotState(
export function agentStateLabel(state: AgentDotState): string {
switch (state) {
case 'working':
- return t('m.xLtCpIk')
+ return t('agentRowDisplay.working')
case 'blocked':
- return t('m.CeMk5QY')
+ return t('agentRowDisplay.blocked')
case 'waiting':
- return t('m.clLXJRk')
+ return t('agentRowDisplay.waiting')
case 'interrupted':
- return t('m.eSniHCo')
+ return t('agentRowDisplay.interrupted')
case 'done':
- return t('m.cfFE9JM')
+ return t('agentRowDisplay.done')
case 'idle':
- return t('m.cuSNE9k')
+ return t('agentRowDisplay.idle')
}
}
@@ -91,7 +91,7 @@ export function agentIdentityLabel(agentType: string | null): string {
export function formatTimeAgo(ts: number, now: number): string {
const delta = now - ts
if (delta < 60_000) {
- return t('m.3OzvpCE')
+ return t('agentRowDisplay.just')
}
const minutes = Math.floor(delta / 60_000)
if (minutes < 60) {
diff --git a/mobile/src/worktree/mobile-host-screen-props.ts b/mobile/src/worktree/mobile-host-screen-props.ts
new file mode 100644
index 00000000000..3234f7ab271
--- /dev/null
+++ b/mobile/src/worktree/mobile-host-screen-props.ts
@@ -0,0 +1,6 @@
+export type MobileHostScreenProps = {
+ embedded?: boolean
+ hostId?: string
+ action?: string
+ onHideSidebar?: () => void
+}
diff --git a/mobile/src/worktree/mobile-workspace-statuses.ts b/mobile/src/worktree/mobile-workspace-statuses.ts
index 8ef61845409..17c271a4cc3 100644
--- a/mobile/src/worktree/mobile-workspace-statuses.ts
+++ b/mobile/src/worktree/mobile-workspace-statuses.ts
@@ -5,15 +5,30 @@ export const DEFAULT_MOBILE_WORKSPACE_STATUS_ID = 'in-progress'
export function getDefaultMobileWorkspaceStatuses(): readonly WorkspaceStatusDefinition[] {
return [
- { id: 'completed', label: t('m.EleEi2Q'), color: 'conductor-done', icon: 'conductor-done' },
- { id: 'in-review', label: t('m.mg8ozqs'), color: 'conductor-review', icon: 'conductor-review' },
+ {
+ id: 'completed',
+ label: t('mobileWorkspaceStatuses.done'),
+ color: 'conductor-done',
+ icon: 'conductor-done'
+ },
+ {
+ id: 'in-review',
+ label: t('mobileWorkspaceStatuses.review'),
+ color: 'conductor-review',
+ icon: 'conductor-review'
+ },
{
id: DEFAULT_MOBILE_WORKSPACE_STATUS_ID,
- label: t('m.hWeTdOM'),
+ label: t('mobileWorkspaceStatuses.progress'),
color: 'conductor-progress',
icon: 'conductor-progress'
},
- { id: 'todo', label: t('m.zWwi3-o'), color: 'neutral', icon: 'circle' }
+ {
+ id: 'todo',
+ label: t('mobileWorkspaceStatuses.todo'),
+ color: 'neutral',
+ icon: 'circle'
+ }
]
}
diff --git a/mobile/src/worktree/workspace-list-picker-options.ts b/mobile/src/worktree/workspace-list-picker-options.ts
index 6a286aaad25..9ca4f91c05c 100644
--- a/mobile/src/worktree/workspace-list-picker-options.ts
+++ b/mobile/src/worktree/workspace-list-picker-options.ts
@@ -7,21 +7,37 @@ export function getWorkspaceSortOptions(): PickerOption[] {
// Why: desktop and persisted state keep the `smart` key, while mobile shows the product label.
{
value: 'smart',
- label: t('m.6gEQgs0'),
- subtitle: t('m.RcmL46Y')
+ label: t('workspaceListPickerOptions.agent'),
+ subtitle: t('workspaceListPickerOptions.agents')
},
- { value: 'name', label: t('m.tQqkyxI'), subtitle: t('m.BaGIgrE') },
- { value: 'recent', label: t('m.2xJ96AA'), subtitle: t('m.egkm8qI') },
- { value: 'repo', label: t('m.v5H1mJY'), subtitle: t('m.yH1bPxU') },
- { value: 'manual', label: t('m.FyGSYV4'), subtitle: t('m.y1TvQWs') }
+ {
+ value: 'name',
+ label: t('workspaceListPickerOptions.name'),
+ subtitle: t('workspaceListPickerOptions.alphabetical')
+ },
+ {
+ value: 'recent',
+ label: t('workspaceListPickerOptions.recent'),
+ subtitle: t('workspaceListPickerOptions.most')
+ },
+ {
+ value: 'repo',
+ label: t('workspaceListPickerOptions.repo'),
+ subtitle: t('workspaceListPickerOptions.repository')
+ },
+ {
+ value: 'manual',
+ label: t('workspaceListPickerOptions.manual'),
+ subtitle: t('workspaceListPickerOptions.server')
+ }
]
}
export function getWorkspaceGroupOptions(): PickerOption[] {
return [
- { value: 'none', label: t('m.Iq3a5so') },
- { value: 'workspaceStatus', label: t('m.oBZu0_c') },
- { value: 'repo', label: t('m.BX2Np3Y') },
- { value: 'prStatus', label: t('m.1Bc_S64') }
+ { value: 'none', label: t('workspaceListPickerOptions.no') },
+ { value: 'workspaceStatus', label: t('workspaceListPickerOptions.status') },
+ { value: 'repo', label: t('task.repository') },
+ { value: 'prStatus', label: t('workspaceListPickerOptions.pr') }
]
}
diff --git a/mobile/src/worktree/workspace-list-sections.ts b/mobile/src/worktree/workspace-list-sections.ts
index 449a0a97620..99e2f5ac8e3 100644
--- a/mobile/src/worktree/workspace-list-sections.ts
+++ b/mobile/src/worktree/workspace-list-sections.ts
@@ -128,13 +128,19 @@ export function buildSections(
const sections: Section[] = []
if (pinned.length > 0) {
- sections.push(makeSection('pinned', t('m.Rn74bFA'), pinned, 'pin'))
+ sections.push(makeSection('pinned', t('task.pinned'), pinned, 'pin'))
}
if (groupMode === 'none') {
if (canonicalGroupWorktrees.length > 0) {
sections.push(
- makeSection('all', t('m.IwMISoQ'), canonicalGroupWorktrees, undefined, collapsedGroups)
+ makeSection(
+ 'all',
+ t('mobileSmartSourceModes.all'),
+ canonicalGroupWorktrees,
+ undefined,
+ collapsedGroups
+ )
)
}
} else if (groupMode === 'repo') {
@@ -166,7 +172,7 @@ export function buildSections(
}
for (const [repoIdentity, items] of byRepo) {
const missingRepository = repoIdentity === MISSING_REPOSITORY_GROUP_KEY
- const repo = missingRepository ? t('m.6MEByr4') : repoIdentity
+ const repo = missingRepository ? t('task.unknown') : repoIdentity
const key = missingRepository ? 'repo:missing' : `repo:${repoIdsByName.get(repo) ?? repo}`
sections.push(
makeSection(key, repo, orderMainWorktreeFirst(items), undefined, collapsedGroups)
diff --git a/mobile/src/worktree/workspace-pr-status-groups.ts b/mobile/src/worktree/workspace-pr-status-groups.ts
index bcb3b870873..b1b3b13497f 100644
--- a/mobile/src/worktree/workspace-pr-status-groups.ts
+++ b/mobile/src/worktree/workspace-pr-status-groups.ts
@@ -7,10 +7,10 @@ export type PRGroupKey = 'done' | 'in-review' | 'in-progress' | 'closed'
export function getPRGroupLabel(group: PRGroupKey): string {
return {
- done: t('m.LEXdDEk'),
- 'in-review': t('m.sMpsrkY'),
- 'in-progress': t('m.epStUOc'),
- closed: t('m.sC5iGOA')
+ done: t('workspacePrStatusGroups.done'),
+ 'in-review': t('workspacePrStatusGroups.review'),
+ 'in-progress': t('workspacePrStatusGroups.progress'),
+ closed: t('workspacePrStatusGroups.closed')
}[group]
}