diff --git a/MobileUnitTestPlan.xctestplan b/MobileUnitTestPlan.xctestplan new file mode 100644 index 00000000..181c33dd --- /dev/null +++ b/MobileUnitTestPlan.xctestplan @@ -0,0 +1,25 @@ +{ + "configurations" : [ + { + "id" : "B1A2C3D4-0003-0003-0003-000000000003", + "name" : "Mobile Unit", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false, + "testTimeoutsEnabled" : true + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:RxCode.xcodeproj", + "identifier" : "DF230B5E2FBC7368008929A6", + "name" : "RxCodeMobileTests" + } + } + ], + "version" : 1 +} diff --git a/Packages/Sources/MessageList/MessageList.swift b/Packages/Sources/MessageList/MessageList.swift index 3ce19013..5e0cd5ce 100644 --- a/Packages/Sources/MessageList/MessageList.swift +++ b/Packages/Sources/MessageList/MessageList.swift @@ -202,15 +202,23 @@ public struct MessageList: View { } private var pinTailSpacerHeight: CGFloat { - guard pinning.pinnedUserMessageID != nil, scrollViewHeight > 0 else { return 0 } - let turnHeight = max(activeTurnMaxMeasuredHeight, rawActiveTurnMeasuredHeight) - return max(0, scrollViewHeight - turnHeight - 16) + guard pinning.isPinningUserMessage, scrollViewHeight > 0 else { return 0 } + return max(0, scrollViewHeight - activeTurnHeight - MessageListConstants.minimumPinnedTailSpacing) } private var rawActiveTurnMeasuredHeight: CGFloat { max(0, tailMarkerMinY - latestUserMinY) } + private var activeTurnHeight: CGFloat { + max(activeTurnMaxMeasuredHeight, rawActiveTurnMeasuredHeight) + } + + private var pinnedTurnFillsViewport: Bool { + guard scrollViewHeight > 0 else { return false } + return activeTurnHeight >= scrollViewHeight - MessageListConstants.minimumPinnedTailSpacing + } + private var isAnchoredAtBottom: Bool { anchor.isNearBottom && isAtBottom } @@ -223,6 +231,22 @@ public struct MessageList: View { messages.last { $0.isUserMessage }?.id } + private var hasContentAfterPinnedUserMessage: Bool { + guard let pinnedID = pinning.pinnedUserMessageID, + let pinnedIndex = messages.firstIndex(where: { $0.id == pinnedID }) + else { return false } + + let nextIndex = messages.index(after: pinnedIndex) + guard nextIndex < messages.endIndex else { return false } + return messages[nextIndex...].contains { !$0.isMessageListAccessory } + } + + private var shouldReleasePinnedUserMessageForFilledTurn: Bool { + pinning.isPinningUserMessage + && hasContentAfterPinnedUserMessage + && pinnedTurnFillsViewport + } + private var messageListChangeToken: MessageListChangeToken { MessageListChangeToken( ids: messages.map(\.id), @@ -237,6 +261,11 @@ public struct MessageList: View { visibleMaxY: metrics.visibleMaxY ) updateIsAtBottomBinding(anchor.isNearBottom) + + if shouldReleasePinnedUserMessageForFilledTurn, !isUserDrivenScroll { + releasePinnedUserMessage(proxy: proxy) + } + if decision == .scrollToBottom, isAtBottom, isStreaming, @@ -426,7 +455,7 @@ public struct MessageList: View { } private func updateActiveTurnMaxMeasuredHeight() { - guard pinning.pinnedUserMessageID != nil else { return } + guard pinning.isPinningUserMessage else { return } let measured = rawActiveTurnMeasuredHeight guard measured > activeTurnMaxMeasuredHeight + 0.5 else { return } var transaction = Transaction() @@ -492,6 +521,7 @@ private nonisolated enum MessageListConstants { static let tailMarkerID = "message-list-tail-marker" static let coordinateSpaceName = "message-list-content" static let loadThreshold: CGFloat = 96 + static let minimumPinnedTailSpacing: CGFloat = 16 static let userScrollDownDelta: CGFloat = 4 static let layoutSettleDelayNanoseconds: UInt64 = 16_000_000 static let streamingBottomScrollInterval: TimeInterval = 2 diff --git a/Packages/Sources/RxCodeChatKit/ChangeDiffView.swift b/Packages/Sources/RxCodeChatKit/ChangeDiffView.swift index 06a0dbc9..18a16fb3 100644 --- a/Packages/Sources/RxCodeChatKit/ChangeDiffView.swift +++ b/Packages/Sources/RxCodeChatKit/ChangeDiffView.swift @@ -43,8 +43,9 @@ public struct ChangeDiffView: View { @ViewBuilder private func unifiedRows(_ diff: String) -> some View { let lines = diff.components(separatedBy: .newlines) - ForEach(Array(lines.enumerated()), id: \.offset) { _, line in + ForEach(Array(lines.enumerated()), id: \.offset) { index, line in diffRow( + lineNumber: unifiedLineNumber(line: line, offset: index), text: line.isEmpty ? " " : line, color: unifiedColor(line), background: unifiedBackground(line) @@ -66,27 +67,42 @@ public struct ChangeDiffView: View { let added = hunk.newString .components(separatedBy: .newlines) .map { ("+ " + $0, ClaudeTheme.statusSuccess, ClaudeTheme.statusSuccess.opacity(0.06)) } - ForEach(Array((removed + added).enumerated()), id: \.offset) { _, item in - diffRow(text: item.0, color: item.1, background: item.2) + ForEach(Array((removed + added).enumerated()), id: \.offset) { offset, item in + diffRow(lineNumber: offset + 1, text: item.0, color: item.1, background: item.2) } } } // MARK: - Shared row - private func diffRow(text: String, color: Color, background: Color) -> some View { - ChatTextContentView( - text, - size: ClaudeTheme.messageSize(12), - design: .monospaced, - color: color - ) - .frame(maxWidth: .infinity, alignment: .leading) + private func diffRow(lineNumber: Int? = nil, text: String, color: Color, background: Color) -> some View { + HStack(alignment: .firstTextBaseline, spacing: 8) { + Text(lineNumber.map(String.init) ?? "") + .font(.system(size: ClaudeTheme.messageSize(11), design: .monospaced)) + .foregroundStyle(ClaudeTheme.textTertiary) + .frame(width: 34, alignment: .trailing) + .accessibilityIdentifier("diff-line-number") + + ChatTextContentView( + text, + size: ClaudeTheme.messageSize(12), + design: .monospaced, + color: color + ) + .frame(maxWidth: .infinity, alignment: .leading) + } .padding(.horizontal, 8) .padding(.vertical, 1) .background(background) } + private func unifiedLineNumber(line: String, offset: Int) -> Int? { + if line.hasPrefix("diff ") || line.hasPrefix("index ") || line.hasPrefix("---") || line.hasPrefix("+++") || line.hasPrefix("@@") { + return nil + } + return offset + 1 + } + private func unifiedColor(_ line: String) -> Color { if line.hasPrefix("+"), !line.hasPrefix("+++") { return ClaudeTheme.statusSuccess } if line.hasPrefix("-"), !line.hasPrefix("---") { return ClaudeTheme.statusError } diff --git a/Packages/Sources/RxCodeChatKit/FileDiffView.swift b/Packages/Sources/RxCodeChatKit/FileDiffView.swift index b6057a18..8752df26 100644 --- a/Packages/Sources/RxCodeChatKit/FileDiffView.swift +++ b/Packages/Sources/RxCodeChatKit/FileDiffView.swift @@ -8,6 +8,12 @@ public struct FileDiffView: View { public let fileName: String public let editHunks: [PreviewFile.EditHunk] public let gitDiffMode: PreviewFile.GitDiffMode? + public let showFullFileDiff: Bool + /// Optional pre-edit snapshot. When provided alongside `showFullFileDiff`, + /// the view diffs this snapshot against the current on-disk content + /// directly — bypassing hunk reverse-application. This gives an exact diff + /// even when other agents have concurrently modified the file. + public let originalContent: String? @Environment(WindowState.self) private var windowState @State private var diffLines: [DiffLine] = [] @State private var isLoading = true @@ -17,12 +23,16 @@ public struct FileDiffView: View { filePath: String, fileName: String, editHunks: [PreviewFile.EditHunk] = [], - gitDiffMode: PreviewFile.GitDiffMode? = nil + gitDiffMode: PreviewFile.GitDiffMode? = nil, + showFullFileDiff: Bool = false, + originalContent: String? = nil ) { self.filePath = filePath self.fileName = fileName self.editHunks = editHunks self.gitDiffMode = gitDiffMode + self.showFullFileDiff = showFullFileDiff + self.originalContent = originalContent } public var body: some View { @@ -139,8 +149,33 @@ public struct FileDiffView: View { isLoading = true defer { isLoading = false } + // Preferred path when both showFullFileDiff and an originalContent + // snapshot are available: diff the snapshot directly against the + // current file contents. This is exact under concurrent edits — no + // hunk reverse-application, no orphan "unmatched change" headers. + if showFullFileDiff, let original = originalContent { + let path = filePath + diffLines = await Task.detached(priority: .userInitiated) { + let current = (try? String(contentsOfFile: path, encoding: .utf8)) ?? "" + return FileDiffView.buildSnapshotDiffLines(original: original, current: current) + }.value + return + } + if !editHunks.isEmpty { let hunks = editHunks + let path = filePath + if showFullFileDiff, + let fullFileLines = await Task.detached(priority: .userInitiated, operation: { () -> [DiffLine]? in + guard let contents = try? String(contentsOfFile: path, encoding: .utf8) else { + return nil + } + return FileDiffView.buildFullFileEditDiffLines(currentContent: contents, hunks: hunks) + }).value { + diffLines = fullFileLines + return + } + diffLines = await Task.detached(priority: .userInitiated) { FileDiffView.buildEditDiffLines(from: hunks) }.value @@ -198,19 +233,200 @@ public struct FileDiffView: View { guard !raw.isEmpty else { return [] } var lines = raw.components(separatedBy: "\n") if lines.last == "" { lines.removeLast() } - return lines.map { line in - if line.hasPrefix("+") && !line.hasPrefix("+++") { - return DiffLine(text: line, kind: .added) - } else if line.hasPrefix("-") && !line.hasPrefix("---") { - return DiffLine(text: line, kind: .removed) - } else if line.hasPrefix("@@") { - return DiffLine(text: line, kind: .hunk) - } else if line.hasPrefix("diff ") || line.hasPrefix("index ") || line.hasPrefix("---") || line.hasPrefix("+++") { - return DiffLine(text: line, kind: .meta) + var oldLine = 0 + var newLine = 0 + var result: [DiffLine] = [] + result.reserveCapacity(lines.count) + for line in lines { + if line.hasPrefix("@@") { + if let (o, n) = parseHunkHeader(line) { + oldLine = o + newLine = n + } + result.append(DiffLine(text: line, kind: .hunk)) + } else if line.hasPrefix("+++") || line.hasPrefix("---") || line.hasPrefix("diff ") || line.hasPrefix("index ") { + result.append(DiffLine(text: line, kind: .meta)) + } else if line.hasPrefix("+") { + result.append(DiffLine(text: line, kind: .added, oldLineNumber: nil, newLineNumber: newLine)) + newLine += 1 + } else if line.hasPrefix("-") { + result.append(DiffLine(text: line, kind: .removed, oldLineNumber: oldLine, newLineNumber: nil)) + oldLine += 1 } else { - return DiffLine(text: line, kind: .context) + result.append(DiffLine(text: line, kind: .context, oldLineNumber: oldLine, newLineNumber: newLine)) + oldLine += 1 + newLine += 1 + } + } + return result + } + + /// Parses a `@@ -oldStart,oldCount +newStart,newCount @@` header and + /// returns the starting line numbers (1-based). Returns nil for malformed + /// headers. + private nonisolated static func parseHunkHeader(_ line: String) -> (oldStart: Int, newStart: Int)? { + // Expected shape: `@@ -[,] +[,] @@ ` + let scanner = Scanner(string: line) + scanner.charactersToBeSkipped = nil + guard scanner.scanString("@@") != nil, + scanner.scanString(" -") != nil, + let oldStart = scanner.scanInt() else { return nil } + _ = scanner.scanString(",") + _ = scanner.scanInt() + guard scanner.scanString(" +") != nil, + let newStart = scanner.scanInt() else { return nil } + return (oldStart, newStart) + } + + nonisolated static func buildFullFileEditDiffLines( + currentContent: String, + hunks: [PreviewFile.EditHunk] + ) -> [DiffLine] { + return buildCurrentContentDiffLines(currentContent: currentContent, hunks: hunks) + } + + /// Build a unified diff between two full-file snapshots. Used when a + /// pre-edit snapshot is available (captured at tool_use time), so we can + /// render an exact diff without ever reverse-applying hunks. + nonisolated static func buildSnapshotDiffLines( + original: String, + current: String + ) -> [DiffLine] { + let originalLines = contentLines(original) + let currentLines = contentLines(current) + return computeUnifiedDiffLines(old: originalLines, new: currentLines) + } + + /// Build a unified diff that shows the full current file with the hunks + /// rendered inline on top of it. Works by reverse-applying each hunk + /// (newString → oldString) against the current content to reconstruct the + /// pre-edit state, then running a proper line diff between the pre-edit + /// and current lines. Hunks that can't be reverse-applied — pure + /// deletions (empty newString) or hunks whose newString no longer appears + /// in the file — become "orphan" hunks rendered at the top with a header, + /// so a deleted line is still visible even though its exact original + /// position can't be recovered. + private nonisolated static func buildCurrentContentDiffLines( + currentContent: String, + hunks: [PreviewFile.EditHunk] + ) -> [DiffLine] { + let currentLines = contentLines(currentContent) + guard !currentLines.isEmpty else { + return buildEditDiffLines(from: hunks) + } + + var reconstructed = currentContent + var orphans: [PreviewFile.EditHunk] = [] + + for hunk in hunks.reversed() { + if hunk.newString.isEmpty { + if !hunk.oldString.isEmpty { + orphans.insert(hunk, at: 0) + } + continue + } + if let range = reconstructed.range(of: hunk.newString) { + reconstructed.replaceSubrange(range, with: hunk.oldString) + } else if !hunk.oldString.isEmpty { + orphans.insert(hunk, at: 0) + } + } + + let preEditLines = contentLines(reconstructed) + let unifiedLines = computeUnifiedDiffLines(old: preEditLines, new: currentLines) + + guard !orphans.isEmpty else { return unifiedLines } + + var result: [DiffLine] = [] + for (idx, orphan) in orphans.enumerated() { + let header = orphans.count > 1 + ? "@@ unmatched change \(idx + 1)/\(orphans.count) @@" + : "@@ unmatched change @@" + result.append(DiffLine(text: header, kind: .hunk)) + for line in contentLines(orphan.oldString) { + result.append(DiffLine(text: "-\(line)", kind: .removed)) + } + for line in contentLines(orphan.newString) { + result.append(DiffLine(text: "+\(line)", kind: .added)) + } + } + result.append(contentsOf: unifiedLines) + return result + } + + private nonisolated static func computeUnifiedDiffLines( + old: [String], + new: [String] + ) -> [DiffLine] { + let diff = new.difference(from: old) + var removalIndices = Set() + var insertionElements: [Int: String] = [:] + for change in diff { + switch change { + case .remove(let offset, _, _): + removalIndices.insert(offset) + case .insert(let offset, let element, _): + insertionElements[offset] = element } } + + var lines: [DiffLine] = [] + var oldIdx = 0 + var newIdx = 0 + + while oldIdx < old.count || newIdx < new.count { + if oldIdx < old.count, removalIndices.contains(oldIdx) { + lines.append(DiffLine( + text: "-\(old[oldIdx])", + kind: .removed, + oldLineNumber: oldIdx + 1, + newLineNumber: nil + )) + oldIdx += 1 + } else if newIdx < new.count, let added = insertionElements[newIdx] { + lines.append(DiffLine( + text: "+\(added)", + kind: .added, + oldLineNumber: nil, + newLineNumber: newIdx + 1 + )) + newIdx += 1 + } else if oldIdx < old.count, newIdx < new.count { + lines.append(DiffLine( + text: " \(new[newIdx])", + kind: .context, + oldLineNumber: oldIdx + 1, + newLineNumber: newIdx + 1 + )) + oldIdx += 1 + newIdx += 1 + } else if oldIdx < old.count { + lines.append(DiffLine( + text: " \(old[oldIdx])", + kind: .context, + oldLineNumber: oldIdx + 1, + newLineNumber: nil + )) + oldIdx += 1 + } else if newIdx < new.count { + lines.append(DiffLine( + text: " \(new[newIdx])", + kind: .context, + oldLineNumber: nil, + newLineNumber: newIdx + 1 + )) + newIdx += 1 + } + } + + return lines + } + + private nonisolated static func contentLines(_ content: String) -> [String] { + guard !content.isEmpty else { return [] } + var lines = content.components(separatedBy: "\n") + if lines.last == "" { lines.removeLast() } + return lines } } @@ -233,6 +449,19 @@ struct DiffLine { let text: String let kind: Kind + /// 1-based line number in the pre-edit file (left gutter). Nil for added, + /// hunk, meta, or orphan rows that have no pre-edit position. + let oldLineNumber: Int? + /// 1-based line number in the current file (right gutter). Nil for removed, + /// hunk, meta, or orphan rows that have no post-edit position. + let newLineNumber: Int? + + nonisolated init(text: String, kind: Kind, oldLineNumber: Int? = nil, newLineNumber: Int? = nil) { + self.text = text + self.kind = kind + self.oldLineNumber = oldLineNumber + self.newLineNumber = newLineNumber + } } // MARK: - NSTextView-based Renderer (TextKit2) @@ -360,21 +589,54 @@ private struct DiffTextRenderer: NSViewRepresentable { let fontSize: CGFloat = 12 let font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .regular) let gutterColor = NSColor(ClaudeTheme.textTertiary).withAlphaComponent(0.6) - let gutterDigits = max(String(lines.count).count, 2) - let blankPrefix = String(repeating: " ", count: gutterDigits) + " " + + // GitHub-style two-column gutter: left = pre-edit line number, + // right = post-edit line number. When one side is entirely empty + // (e.g. a Write that created the file from nothing — every row is + // pure addition), collapse to a single column so we don't waste + // gutter width on a permanently blank lane. + let maxOld = lines.compactMap(\.oldLineNumber).max() ?? 0 + let maxNew = lines.compactMap(\.newLineNumber).max() ?? 0 + let showOld = maxOld > 0 + let showNew = maxNew > 0 + let oldDigits = max(String(maxOld).count, 2) + let newDigits = max(String(maxNew).count, 2) + let oldBlank = String(repeating: " ", count: oldDigits) + let newBlank = String(repeating: " ", count: newDigits) let addedBg = NSColor(ClaudeTheme.statusSuccess).withAlphaComponent(0.14) let removedBg = NSColor(ClaudeTheme.statusError).withAlphaComponent(0.14) - let result = NSMutableAttributedString() - for (index, line) in lines.enumerated() { - let prefix: String - if line.kind == .meta { - prefix = blankPrefix - } else { - let n = String(index + 1) - prefix = String(repeating: " ", count: gutterDigits - n.count) + n + " " + func pad(_ n: Int?, width: Int, blank: String) -> String { + guard let n else { return blank } + let s = String(n) + if s.count >= width { return s } + return String(repeating: " ", count: width - s.count) + s + } + + func gutterPrefix(for line: DiffLine) -> String { + let isHeader = line.kind == .meta || line.kind == .hunk + switch (showOld, showNew) { + case (true, true): + if isHeader { return oldBlank + " " + newBlank + " " } + return pad(line.oldLineNumber, width: oldDigits, blank: oldBlank) + + " " + + pad(line.newLineNumber, width: newDigits, blank: newBlank) + + " " + case (true, false): + if isHeader { return oldBlank + " " } + return pad(line.oldLineNumber, width: oldDigits, blank: oldBlank) + " " + case (false, true): + if isHeader { return newBlank + " " } + return pad(line.newLineNumber, width: newDigits, blank: newBlank) + " " + case (false, false): + return "" } + } + + let result = NSMutableAttributedString() + for line in lines { + let prefix = gutterPrefix(for: line) let rowBg: NSColor? = { switch line.kind { diff --git a/Packages/Sources/RxCodeChatKit/Resources/Localizable.xcstrings b/Packages/Sources/RxCodeChatKit/Resources/Localizable.xcstrings index 6aa2ec7d..6b67a794 100644 --- a/Packages/Sources/RxCodeChatKit/Resources/Localizable.xcstrings +++ b/Packages/Sources/RxCodeChatKit/Resources/Localizable.xcstrings @@ -1,6001 +1,6004 @@ { - "sourceLanguage": "en", - "strings": { - "": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "" + "sourceLanguage" : "en", + "strings" : { + "" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "" } } } }, - " · ": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": " · " + " · " : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " · " } } } }, - "$": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "$" + "--" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "--" } } } }, - "%@ %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$@ %2$@" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$@ %2$@" + "·" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "·" } } } }, - "%@ in progress": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 进行中" + "(no output)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "(无输出)" } } } }, - "%@ — ": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ — " + "/" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "/" } } } }, - "%lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld" + "%@ — " : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ — " } } } }, - "%lld commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%lld commands" + "%@ %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ %2$@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%lld개 커맨드" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个命令" + } + } + }, + "%@ in progress" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 进行中" } } } }, - "%lld messages queued": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 条消息已排队" + "%lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" } } } }, - "%lld shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%lld shortcuts" + "%lld commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%lld개 단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个命令" } } } }, - "%lld tools executed": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%lld tools executed" + "%lld messages queued" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 条消息已排队" + } + } + } + }, + "%lld shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%lld개 도구 실행됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已执行 %lld 个工具" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个快捷方式" } } } }, - "%lld%%": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld%%" + "%lld tools executed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld tools executed" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 도구 실행됨" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已执行 %lld 个工具" } } } }, - "%lld/%lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$lld/%2$lld" + "%lld/%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld/%2$lld" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$lld/%2$lld" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld/%2$lld" } } } }, - "(no output)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "(无输出)" + "%lld%%" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld%%" } } } }, - "+%d more pending": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "+%d more pending" + "+%d more pending" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "+%d more pending" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还有 %d 个待处理" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还有 %d 个待处理" } } } }, - "--": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "--" + "$" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "$" } } } }, - "/": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "/" + "5-hour rate limit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "5-hour rate limit" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "5시간 사용량 한도" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "5 小时用量限制" } } } }, - "5-hour rate limit": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "5-hour rate limit" + "5h" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "5h" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "5시간 사용량 한도" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "5시간" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "5 小时用量限制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "5小时" } } } }, - "5h": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "5h" + "7-day rate limit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "7-day rate limit" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "5시간" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "7일 사용량 한도" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "5小时" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "7 天用量限制" } } } }, - "7-day rate limit": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "7-day rate limit" + "7d" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "7d" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "7일 사용량 한도" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "7일" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "7 天用量限制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "7天" } } } }, - "7d": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "7d" + "A command with this name already exists." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "A command with this name already exists." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "7일" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미 존재하는 커맨드 이름입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "7天" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已存在同名命令。" } } } }, - "A command with this name already exists.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "A command with this name already exists." + "Accept + Auto" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accept + Auto" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미 존재하는 커맨드 이름입니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已存在同名命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受 + 自动" } } } }, - "Accept + Auto": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Accept + Auto" + "Accept Ask" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accept Ask" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受 + 自动" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受并询问" + } + } + } + }, + "Accept Edits" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受编辑" } } } }, - "Accept Ask": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Accept Ask" + "accepts input" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "accepts input" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력 허용" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受并询问" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受输入" } } } }, - "Accept Edits": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受编辑" + "Accepts Input" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accepts Input" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력 허용" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受输入" } } } }, - "Accepts Input": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Accepts Input" + "acceptsInput: true lets users type additional text after the command." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "acceptsInput: true lets users type additional text after the command." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력 허용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "acceptsInput: true이면 커맨드 뒤에 추가 텍스트를 입력할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受输入" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "acceptsInput:设为 true 后,用户可以在命令后输入额外文本。" } } } }, - "Add": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add" + "Add" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加" + } + } + } + }, + "Add — attach file or toggle plan mode" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加 — 附加文件或切换计划模式" } } } }, - "Add First Shortcut": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add First Shortcut" + "Add First Shortcut" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add First Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "첫 단축키 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "첫 단축키 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加第一个快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加第一个快捷方式" } } } }, - "Add New Command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add New Command" + "Add New Command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add New Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 커맨드 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 커맨드 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加新命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加新命令" } } } }, - "Add New Shortcut": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add New Shortcut" + "Add New Shortcut" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add New Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 단축키 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 단축키 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加新快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加新快捷方式" } } } }, - "Add working directory to session": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add working directory to session" + "Add working directory to session" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add working directory to session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션에 작업 디렉토리 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션에 작업 디렉토리 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将工作目录添加到会话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将工作目录添加到会话" } } } }, - "Add — attach file or toggle plan mode": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加 — 附加文件或切换计划模式" + "Agent" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "智能体" } } } }, - "Agent": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "智能体" + "Agent asked %d questions" : { + "comment" : "Inline summary when the assistant invokes AskUserQuestion with multiple questions. %d is the number of questions.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "智能体提出了 %d 个问题" } } } }, - "Agent asked %d questions": { - "comment": "Inline summary when the assistant invokes AskUserQuestion with multiple questions. %d is the number of questions.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "智能体提出了 %d 个问题" + "Agent asked a question" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "智能体提出了一个问题" } } } }, - "Agent asked a question": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "智能体提出了一个问题" + "agentProvider: agent this command applies to (claudeCode, codex, acp). Use null or omit it for all agents." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "agentProvider: agent this command applies to (claudeCode, codex, acp). Use null or omit it for all agents." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "agentProvider:此命令适用的代理(claudeCode、codex、acp)。设为 null 或省略表示适用于所有代理。" } } } }, - "All Agents": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有智能体" + "All Agents" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有智能体" } } } }, - "All Agents (Global)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有智能体(全局)" + "All Agents (Global)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有智能体(全局)" } } } }, - "All modified default commands will be restored to their original state.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "All modified default commands will be restored to their original state." + "All modified default commands will be restored to their original state." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "All modified default commands will be restored to their original state." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "수정한 모든 기본 커맨드가 원래 상태로 복원됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "수정한 모든 기본 커맨드가 원래 상태로 복원됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有修改过的默认命令都会恢复到原始状态。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有修改过的默认命令都会恢复到原始状态。" } } } }, - "All properties example:": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "All properties example:" + "All properties example:" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "All properties example:" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 속성 예시:" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 속성 예시:" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "完整属性示例:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整属性示例:" } } } }, - "Allows additional text to be entered after the command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Allows additional text to be entered after the command" + "Allows additional text to be entered after the command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Allows additional text to be entered after the command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 뒤에 추가 텍스트를 입력할 수 있습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 뒤에 추가 텍스트를 입력할 수 있습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "允许在命令后输入额外文本" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "允许在命令后输入额外文本" } } } }, - "Analyze security vulnerabilities": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Analyze security vulnerabilities" + "Analyze security vulnerabilities" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Analyze security vulnerabilities" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 브랜치 변경사항 보안 분석" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 브랜치 변경사항 보안 분석" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分析安全漏洞" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分析安全漏洞" } } } }, - "Answered": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已回答" + "Answered" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已回答" } } } }, - "Assistant: %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "助手:%@" + "Assistant: %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "助手:%@" } } } }, - "Attach file": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Attach file" + "Attach file" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Attach file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 첨부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "附加文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "附加文件" } } } }, - "Attach file…": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Attach file…" + "Attach file…" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Attach file…" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "附加文件…" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "附加文件…" } } } }, - "Auto-fix PR CI failures and review comments": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto-fix PR CI failures and review comments" + "Auto-fix PR CI failures and review comments" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto-fix PR CI failures and review comments" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "PR CI 실패 및 리뷰 댓글 자동 수정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "PR CI 실패 및 리뷰 댓글 자동 수정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动修复 PR CI 失败和评审评论" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动修复 PR CI 失败和评审评论" } } } }, - "Bash": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Bash" + "Bash" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bash" } } } }, - "Built-in command names are ignored on import and are never exported.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Built-in command names are ignored on import and are never exported." + "Built-in command names are ignored on import and are never exported." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Built-in command names are ignored on import and are never exported." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 명령어 이름은 가져올 때 무시되며 내보내기에 포함되지 않습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 명령어 이름은 가져올 때 무시되며 내보내기에 포함되지 않습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "内置命令名称在导入时会被忽略,也不会被导出。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "内置命令名称在导入时会被忽略,也不会被导出。" } } } }, - "Built-in commands are Claude Code only. Custom commands can target one agent or all.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "内置命令仅适用于 Claude Code。自定义命令可以针对一个智能体或全部智能体。" + "Built-in commands are Claude Code only. Custom commands can target one agent or all." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "内置命令仅适用于 Claude Code。自定义命令可以针对一个智能体或全部智能体。" } } } }, - "Cache creation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cache creation" + "Cache creation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cache creation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "캐시 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "캐시 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "创建缓存" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建缓存" } } } }, - "Cache read": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cache read" + "Cache read" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cache read" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "캐시 읽기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "캐시 읽기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "读取缓存" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "读取缓存" } } } }, - "Cancel": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cancel" + "Cancel" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cancel" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "취소" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "취소" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "取消" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消" } } } }, - "Change color theme": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Change color theme" + "Change color theme" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Change color theme" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "색상 테마 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "색상 테마 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "更改颜色主题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更改颜色主题" } } } }, - "Client: %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "客户端:%@" + "Client: %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "客户端:%@" } } } }, - "Close": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close" + "Close" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "닫기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "닫기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" } } } }, - "Close — you can review later from the banner": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close — you can review later from the banner" + "Close — you can review later from the banner" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close — you can review later from the banner" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭 — 之后可从横幅继续查看" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭 — 之后可从横幅继续查看" } } } }, - "Collapse": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Collapse" + "Collapse" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Collapse" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "접기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "접기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "折叠" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "折叠" } } } }, - "Collapse earlier messages": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Collapse earlier messages" + "Collapse earlier messages" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Collapse earlier messages" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이전 메시지 접기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이전 메시지 접기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "折叠较早消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "折叠较早消息" } } } }, - "Combine and send all queued messages as a single turn": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将所有排队消息合并为一轮发送" + "Combine and send all queued messages as a single turn" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将所有排队消息合并为一轮发送" } } } }, - "Command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Command" + "Command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "命令" } } } }, - "Command name (e.g. my-command)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Command name (e.g. my-command)" + "Command name (e.g. my-command)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Command name (e.g. my-command)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 이름 (예: my-command)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 이름 (예: my-command)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "命令名称(例如 my-command)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "命令名称(例如 my-command)" } } } }, - "Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Commands" + "Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "命令" } } } }, - "Commands requiring TUI will run in the inline terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Commands requiring TUI will run in the inline terminal" + "Commands requiring TUI will run in the inline terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Commands requiring TUI will run in the inline terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "TUI가 필요한 커맨드는 인라인 터미널에서 실행됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TUI가 필요한 커맨드는 인라인 터미널에서 실행됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "需要 TUI 的命令会在内联终端中运行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要 TUI 的命令会在内联终端中运行" } } } }, - "Compact conversation (focus instructions allowed)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Compact conversation (focus instructions allowed)" + "Compact conversation (focus instructions allowed)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Compact conversation (focus instructions allowed)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화 압축 (선택적 포커스 지침 허용)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화 압축 (선택적 포커스 지침 허용)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "压缩对话(允许保留重点说明)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "压缩对话(允许保留重点说明)" } } } }, - "Completed": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Completed" + "Completed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Completed" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "완료됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "완료됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已完成" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已完成" } } } }, - "Configure Claude in Chrome": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure Claude in Chrome" + "Configure Claude in Chrome" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure Claude in Chrome" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Chrome에서 Claude 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chrome에서 Claude 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 Chrome 中配置 Claude" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Chrome 中配置 Claude" } } } }, - "Configure extra usage": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure extra usage" + "Configure extra usage" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure extra usage" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "속도 제한 초과 시 추가 사용량 구성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "속도 제한 초과 시 추가 사용량 구성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置额外用量" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置额外用量" } } } }, - "Configure keybindings": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure keybindings" + "Configure keybindings" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure keybindings" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "키바인딩 구성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "키바인딩 구성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置键位绑定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置键位绑定" } } } }, - "Configure remote environment": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure remote environment" + "Configure remote environment" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure remote environment" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "원격 환경 구성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "원격 환경 구성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置远程环境" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置远程环境" } } } }, - "Configure status line": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure status line" + "Configure status line" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure status line" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상태 표시줄 구성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 표시줄 구성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置状态行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置状态行" } } } }, - "Configure terminal keybindings": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure terminal keybindings" + "Configure terminal keybindings" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure terminal keybindings" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 키바인딩 구성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 키바인딩 구성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置终端键位绑定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置终端键位绑定" } } } }, - "Connect GitHub account to Claude Code on the web": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Connect GitHub account to Claude Code on the web" + "Connect GitHub account to Claude Code on the web" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connect GitHub account to Claude Code on the web" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub 계정을 Claude Code 웹에 연결" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 계정을 Claude Code 웹에 연결" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将 GitHub 账号连接到网页版 Claude Code" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将 GitHub 账号连接到网页版 Claude Code" } } } }, - "Context window": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Context window" + "context" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "context" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "컨텍스트 윈도우" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "컨텍스트" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上下文窗口" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上下文" } } } }, - "Continue in Desktop app": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Continue in Desktop app" + "Context window" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Context window" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "데스크톱 앱에서 세션 계속" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "컨텍스트 윈도우" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在桌面应用中继续" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上下文窗口" } } } }, - "Copied": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copied" + "Continue in Desktop app" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Continue in Desktop app" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "복사됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "데스크톱 앱에서 세션 계속" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已复制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在桌面应用中继续" } } } }, - "Copy": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy" + "Copied" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copied" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "복사됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已复制" } } } }, - "Copy Conversation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy Conversation" + "Copy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화 복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "복사" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制对话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制" } } } }, - "Copy Message": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy Message" + "Copy Conversation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy Conversation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화 복사" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制对话" } } } }, - "Copy last response to clipboard": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy last response to clipboard" + "Copy last response to clipboard" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy last response to clipboard" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "마지막 응답을 클립보드에 복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "마지막 응답을 클립보드에 복사" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将最后一条响应复制到剪贴板" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将最后一条响应复制到剪贴板" } } } }, - "Copy output": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制输出" + "Copy Message" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy Message" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 복사" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制消息" } } } }, - "Copy plan": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy plan" + "Copy output" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制输出" + } + } + } + }, + "Copy plan" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy plan" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制计划" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制计划" } } } }, - "Cost": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cost" + "Cost" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cost" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "비용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "비용" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "费用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "费用" } } } }, - "Create a branch of current conversation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Create a branch of current conversation" + "Create a branch of current conversation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Create a branch of current conversation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 대화의 브랜치 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 대화의 브랜치 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从当前对话创建分支" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从当前对话创建分支" } } } }, - "Create new file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Create new file" + "Create new file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Create new file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 파일 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 파일 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "创建新文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建新文件" } } } }, - "Currently at %lld%%": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Currently at %lld%%" + "Currently at %lld%%" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Currently at %lld%%" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 %lld%%" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 %lld%%" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前为 %lld%%" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前为 %lld%%" } } } }, - "Daily usage and session history visualization": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Daily usage and session history visualization" + "Daily usage and session history visualization" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Daily usage and session history visualization" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일일 사용량, 세션 기록, 연속 기록 시각화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일일 사용량, 세션 기록, 연속 기록 시각화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每日用量和会话历史可视化" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每日用量和会话历史可视化" } } } }, - "Decided": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Decided" + "Decided" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Decided" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已决定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已决定" } } } }, - "Deep multi-agent cloud code review": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Deep multi-agent cloud code review" + "Deep multi-agent cloud code review" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Deep multi-agent cloud code review" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다중 에이전트 심층 클라우드 코드 리뷰" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다중 에이전트 심층 클라우드 코드 리뷰" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "深度多智能体云端代码评审" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "深度多智能体云端代码评审" } } } }, - "Delete": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Delete" + "default" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "default" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "삭제" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认" } } } }, - "Description": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Description" + "Delete" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Delete" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설명" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "삭제" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "描述" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除" } } } }, - "Detail Description (optional)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Detail Description (optional)" + "Description" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Description" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상세 설명 (선택사항)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설명" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "详细描述(可选)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "描述" } } } }, - "Diagnose installation/configuration": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Diagnose installation/configuration" + "description: short text shown in the command picker." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "description: short text shown in the command picker." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치 및 설정 진단" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "description: 커맨드 선택기에 표시되는 짧은 설명입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "诊断安装/配置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "description:显示在命令选择器中的简短文本。" } } } }, - "Diff": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Diff" + "Detail Description (optional)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Detail Description (optional)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Diff" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상세 설명 (선택사항)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "差异" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "详细描述(可选)" } } } }, - "Diff viewer for uncommitted changes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Diff viewer for uncommitted changes" + "detailDescription: optional longer text shown in command details. Use null or omit it when empty." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "detailDescription: optional longer text shown in command details. Use null or omit it when empty." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "미커밋 변경사항 diff 뷰어" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "detailDescription: 커맨드 상세에 표시되는 선택적 긴 설명입니다. 비어 있으면 null을 쓰거나 생략하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未提交更改的差异查看器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "detailDescription:显示在命令详情中的可选长文本。为空时使用 null 或省略。" } } } }, - "Disable": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Disable" + "Diagnose installation/configuration" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Diagnose installation/configuration" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "비활성화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치 및 설정 진단" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "停用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "诊断安装/配置" } } } }, - "Draft a plan in an ultraplan session": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Draft a plan in an ultraplan session" + "Diff" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Diff" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Ultraplan 세션에서 계획 작성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diff" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 ultraplan 会话中起草计划" - } - } - } - }, - "Drafting plan…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在起草计划…" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "差异" } } } }, - "Duration": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Duration" + "Diff viewer for uncommitted changes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Diff viewer for uncommitted changes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "소요 시간" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "미커밋 변경사항 diff 뷰어" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "持续时间" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未提交更改的差异查看器" } } } }, - "Each custom command supports these properties:": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Each custom command supports these properties:" + "Disable" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Disable" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "각 커스텀 커맨드는 다음 속성을 지원합니다:" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "비활성화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每个自定义命令支持这些属性:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "停用" } } } }, - "Each shortcut supports these properties:": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Each shortcut supports these properties:" + "Draft a plan in an ultraplan session" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Draft a plan in an ultraplan session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "각 단축키는 다음 속성을 지원합니다:" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ultraplan 세션에서 계획 작성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每个快捷方式支持这些属性:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 ultraplan 会话中起草计划" } } } }, - "Edit CLAUDE.md memory file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit CLAUDE.md memory file" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "CLAUDE.md 메모리 파일 편집" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑 CLAUDE.md 记忆文件" + "Drafting plan…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在起草计划…" } } } }, - "Edit Command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit Command" + "Duration" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Duration" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "소요 시간" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "持续时间" } } } }, - "Edit Message": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit Message" + "Each custom command supports these properties:" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Each custom command supports these properties:" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "각 커스텀 커맨드는 다음 속성을 지원합니다:" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每个自定义命令支持这些属性:" } } } }, - "Edit Shortcut": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit Shortcut" + "Each shortcut supports these properties:" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Each shortcut supports these properties:" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "각 단축키는 다음 속성을 지원합니다:" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每个快捷方式支持这些属性:" } } } }, - "Edit file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit file" + "Edit CLAUDE.md memory file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit CLAUDE.md memory file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "CLAUDE.md 메모리 파일 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑 CLAUDE.md 记忆文件" } } } }, - "Edit message...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit message..." + "Edit Command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 편집..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑消息..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑命令" } } } }, - "Edit multiple locations": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit multiple locations" + "Edit file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "여러 위치 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑多个位置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑文件" } } } }, - "Edit notebook": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit notebook" + "Edit Message" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit Message" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "노트북 편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑笔记本" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑消息" } } } }, - "Edit the array below to add, remove, or change custom slash commands.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit the array below to add, remove, or change custom slash commands." + "Edit message..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit message..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "아래 배열을 편집해서 커스텀 슬래시 커맨드를 추가, 삭제, 변경하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 편집..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑下面的数组以添加、移除或更改自定义斜杠命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑消息..." } } } }, - "Edit the array below to add, remove, or change shortcuts.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit the array below to add, remove, or change shortcuts." + "Edit multiple locations" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit multiple locations" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "아래 배열을 편집해서 단축키를 추가, 삭제, 변경하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여러 위치 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑下面的数组以添加、移除或更改快捷方式。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑多个位置" } } } }, - "Enable": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enable" + "Edit notebook" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit notebook" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "활성화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "노트북 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑笔记本" } } } }, - "Enable debug logging and diagnose issues": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enable debug logging and diagnose issues" + "Edit Shortcut" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "디버그 로그 활성화 및 문제 진단" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用调试日志并诊断问题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑快捷方式" } } } }, - "Enter plan mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enter plan mode" + "Edit the array below to add, remove, or change custom slash commands." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit the array below to add, remove, or change custom slash commands." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플랜 모드 진입" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아래 배열을 편집해서 커스텀 슬래시 커맨드를 추가, 삭제, 변경하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "进入计划模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑下面的数组以添加、移除或更改自定义斜杠命令。" } } } }, - "Error occurred": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Error occurred" + "Edit the array below to add, remove, or change shortcuts." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit the array below to add, remove, or change shortcuts." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "오류 발생" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아래 배열을 편집해서 단축키를 추가, 삭제, 변경하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发生错误" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑下面的数组以添加、移除或更改快捷方式。" } } } }, - "Execution Mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Execution Mode" + "Enable" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enable" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "실행 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "활성화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "执行模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" } } } }, - "Exit CLI": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Exit CLI" + "Enable debug logging and diagnose issues" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enable debug logging and diagnose issues" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "CLI 종료" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "디버그 로그 활성화 및 문제 진단" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "退出 CLI" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用调试日志并诊断问题" } } } }, - "Export": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export" + "Enter plan mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enter plan mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "내보내기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플랜 모드 진입" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导出" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "进入计划模式" } } } }, - "Export Shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export Shortcuts" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 내보내기" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导出快捷按钮" + "error" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "error" } } } }, - "Export Slash Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export Slash Commands" + "Error occurred" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Error occurred" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 내보내기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오류 발생" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导出斜杠命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发生错误" } } } }, - "Export conversation as text": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export conversation as text" + "Execution Mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Execution Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 대화를 텍스트로 내보내기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "실행 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将对话导出为文本" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "执行模式" } } } }, - "Export custom commands to a JSON file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export custom commands to a JSON file" + "Exit CLI" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Exit CLI" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커스텀 커맨드를 JSON 파일로 내보냅니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "CLI 종료" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将自定义命令导出为 JSON 文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出 CLI" } } } }, - "Export shortcuts to a JSON file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Export shortcuts to a JSON file" + "Export" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키를 JSON 파일로 내보냅니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "내보내기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将快捷方式导出为 JSON 文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出" } } } }, - "File Search": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File Search" + "Export conversation as text" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export conversation as text" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 검색" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 대화를 텍스트로 내보내기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件搜索" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将对话导出为文本" } } } }, - "Files": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件" - } - } - } - }, - "Find files": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Find files" + "Export custom commands to a JSON file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export custom commands to a JSON file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 찾기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커스텀 커맨드를 JSON 파일로 내보냅니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查找文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将自定义命令导出为 JSON 文件" } } } }, - "Generate a one-line session summary": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Generate a one-line session summary" + "Export Shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 한 줄 요약 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 내보내기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "生成单行会话摘要" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出快捷按钮" } } } }, - "Generate a team onboarding guide": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Generate a team onboarding guide" + "Export shortcuts to a JSON file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export shortcuts to a JSON file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "팀 온보딩 가이드 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키를 JSON 파일로 내보냅니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "生成团队入门指南" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将快捷方式导出为 JSON 文件" } } } }, - "Generating response...": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Generating response..." + "Export Slash Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Export Slash Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "응답 생성 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 내보내기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在生成响应..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出斜杠命令" } } } }, - "How can I help you?": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "How can I help you?" + "File Search" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File Search" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "무엇을 도와드릴까요?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 검색" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "有什么可以帮你?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件搜索" } } } }, - "Image not available": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "图像不可用" + "Files" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件" } } } }, - "Image unavailable": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "图像不可用" + "Find files" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Find files" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 찾기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查找文件" } } } }, - "Import": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import" + "Generate a one-line session summary" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Generate a one-line session summary" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "가져오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 한 줄 요약 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导入" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "生成单行会话摘要" } } } }, - "Import Failed": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import Failed" + "Generate a team onboarding guide" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Generate a team onboarding guide" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "가져오기 실패" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "팀 온보딩 가이드 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导入失败" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "生成团队入门指南" } } } }, - "Import Shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import Shortcuts" + "Generating response..." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Generating response..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 가져오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "응답 생성 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导入快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在生成响应..." } } } }, - "Import Slash Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import Slash Commands" + "How can I help you?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "How can I help you?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 가져오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "무엇을 도와드릴까요?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导入斜杠命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "有什么可以帮你?" } } } }, - "Import Succeeded": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import Succeeded" + "id: optional unique identifier (UUID). Auto-generated on import if omitted." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "id: optional unique identifier (UUID). Auto-generated on import if omitted." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "가져오기 성공" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: 선택적 고유 식별자 (UUID). 가져올 때 생략하면 자동 생성됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "导入成功" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "id:可选的唯一标识符(UUID)。导入时省略则自动生成。" } } } }, - "Import commands from a JSON file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import commands from a JSON file" + "Image not available" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图像不可用" } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "JSON 파일에서 커맨드를 가져옵니다" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从 JSON 文件导入命令" + } + } + }, + "Image unavailable" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图像不可用" } } } }, - "Import shortcuts from a JSON file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Import shortcuts from a JSON file" + "Import" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "JSON 파일에서 단축키를 가져옵니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가져오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从 JSON 文件导入快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入" } } } }, - "Imported %lld custom commands.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Imported %lld custom commands." + "Import commands from a JSON file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import commands from a JSON file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%lld개 커스텀 커맨드를 가져왔습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 파일에서 커맨드를 가져옵니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已导入 %lld 个自定义命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从 JSON 文件导入命令" } } } }, - "Initialize project with CLAUDE.md": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Initialize project with CLAUDE.md" + "Import Failed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import Failed" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "CLAUDE.md로 프로젝트 초기화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가져오기 실패" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用 CLAUDE.md 初始化项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入失败" } } } }, - "Input tokens": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Input tokens" + "Import Shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력 토큰" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 가져오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入 token" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入快捷按钮" } } } }, - "Install Slack app": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Install Slack app" + "Import shortcuts from a JSON file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import shortcuts from a JSON file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Slack 앱 설치" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 파일에서 단축키를 가져옵니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装 Slack 应用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从 JSON 文件导入快捷方式" } } } }, - "Interactive (Terminal)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interactive (Terminal)" + "Import Slash Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import Slash Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인터랙티브 (터미널)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 가져오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "交互式(终端)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入斜杠命令" } } } }, - "Interactive feature lessons with demos": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interactive feature lessons with demos" + "Import Succeeded" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Import Succeeded" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "애니메이션 데모와 함께하는 기능 학습" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가져오기 성공" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "带演示的交互式功能课程" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入成功" } } } }, - "Interactive terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interactive terminal" + "Imported %lld custom commands." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Imported %lld custom commands." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인터랙티브 터미널" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 커스텀 커맨드를 가져왔습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "交互式终端" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已导入 %lld 个自定义命令。" } } } }, - "Interrupted": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interrupted" + "Initialize project with CLAUDE.md" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Initialize project with CLAUDE.md" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "중단됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "CLAUDE.md로 프로젝트 초기화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已中断" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 CLAUDE.md 初始化项目" } } } }, - "Invalid JSON format.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Invalid JSON format." + "Input tokens" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Input tokens" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "유효하지 않은 JSON 형식입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력 토큰" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "JSON 格式无效。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入 token" } } } }, - "List available skills": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "List available skills" + "Install Slack app" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Install Slack app" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용 가능한 스킬 목록" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slack 앱 설치" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "列出可用技能" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装 Slack 应用" } } } }, - "Load Claude API reference for current project": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Load Claude API reference for current project" + "Interactive (Terminal)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interactive (Terminal)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 프로젝트용 Claude API 레퍼런스 로드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인터랙티브 (터미널)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "为当前项目加载 Claude API 参考" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "交互式(终端)" } } } }, - "Log in to Anthropic account": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Log in to Anthropic account" + "Interactive feature lessons with demos" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interactive feature lessons with demos" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Anthropic 계정 로그인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "애니메이션 데모와 함께하는 기능 학습" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "登录 Anthropic 账号" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "带演示的交互式功能课程" } } } }, - "Log out of Anthropic account": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Log out of Anthropic account" + "Interactive terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interactive terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Anthropic 계정 로그아웃" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인터랙티브 터미널" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "退出 Anthropic 账号" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "交互式终端" } } } }, - "Manage Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage Commands" + "Interrupted" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interrupted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "중단됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已中断" } } } }, - "Manage IDE integration": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage IDE integration" + "Invalid JSON format." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Invalid JSON format." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "IDE 통합 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "유효하지 않은 JSON 형식입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理 IDE 集成" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 格式无效。" } } } }, - "Manage MCP servers": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage MCP servers" + "isInteractive: true runs the command in the interactive terminal." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "isInteractive: true runs the command in the interactive terminal." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "MCP 서버 연결 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "isInteractive: true이면 인터랙티브 터미널에서 실행됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理 MCP 服务器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "isInteractive:设为 true 后,命令会在交互式终端中运行。" } } } }, - "Manage agent configuration": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage agent configuration" + "isTerminalCommand: true runs the message as a terminal command instead of sending it to chat." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "isTerminalCommand: true runs the message as a terminal command instead of sending it to chat." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "에이전트 구성 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "isTerminalCommand: true이면 채팅 대신 터미널 커맨드로 실행됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理智能体配置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "isTerminalCommand:设为 true 后,会把消息作为终端命令运行,而不是发送到聊天。" } } } }, - "Manage background tasks": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage background tasks" + "json" : { + + }, + "List available skills" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "List available skills" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "백그라운드 작업 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용 가능한 스킬 목록" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理后台任务" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "列出可用技能" } } } }, - "Manage cloud scheduled tasks": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage cloud scheduled tasks" + "Load Claude API reference for current project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Load Claude API reference for current project" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "클라우드 예약 작업 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 프로젝트용 Claude API 레퍼런스 로드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理云端计划任务" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "为当前项目加载 Claude API 参考" } } } }, - "Manage permissions": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage permissions" + "loading..." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "loading..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 규칙 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "불러오는 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理权限" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载..." } } } }, - "Manage plugins": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage plugins" + "Log in to Anthropic account" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Log in to Anthropic account" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플러그인 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic 계정 로그인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理插件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "登录 Anthropic 账号" } } } }, - "Manage shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage shortcuts" + "Log out of Anthropic account" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Log out of Anthropic account" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic 계정 로그아웃" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出 Anthropic 账号" } } } }, - "Message": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Message" + "Manage agent configuration" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage agent configuration" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "에이전트 구성 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理智能体配置" } } } }, - "Message sent to Claude or command run in terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Message sent to Claude or command run in terminal" + "Manage background tasks" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage background tasks" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude에 전송할 메시지 또는 터미널에서 실행할 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "백그라운드 작업 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送给 Claude 的消息或在终端中运行的命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理后台任务" } } } }, - "Mobile app QR code": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Mobile app QR code" + "Manage cloud scheduled tasks" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage cloud scheduled tasks" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모바일 앱 QR 코드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "클라우드 예약 작업 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移动应用二维码" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理云端计划任务" } } } }, - "Name": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Name" + "Manage Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이름" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理命令" } } } }, - "Name shown on the button": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Name shown on the button" + "Manage IDE integration" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage IDE integration" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "버튼에 표시될 이름" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "IDE 통합 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按钮上显示的名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理 IDE 集成" } } } }, - "New Command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "New Command" + "Manage MCP servers" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage MCP servers" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP 서버 연결 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "新建命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理 MCP 服务器" } } } }, - "New Shortcut": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "New Shortcut" + "Manage permissions" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage permissions" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 규칙 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "新建快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理权限" } } } }, - "No changes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No changes" + "Manage plugins" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage plugins" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "변경사항 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플러그인 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有变更" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理插件" } } } }, - "No results found": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No results found" + "Manage shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "검색 결과 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到结果" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理快捷按钮" } } } }, - "No shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No shortcuts" + "Message" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Message" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息" } } } }, - "No todos": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No todos" + "Message sent to Claude or command run in terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Message sent to Claude or command run in terminal" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude에 전송할 메시지 또는 터미널에서 실행할 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有待办" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送给 Claude 的消息或在终端中运行的命令" } } } }, - "OK": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "OK" + "message: text sent to Claude, or command run in the terminal." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "message: text sent to Claude, or command run in the terminal." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "확인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "message: Claude에 전송할 텍스트 또는 터미널에서 실행할 커맨드입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "确定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "message:发送给 Claude 的文本,或在终端中运行的命令。" } } } }, - "Open in browser": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Open in browser" + "Mobile app QR code" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Mobile app QR code" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "브라우저에서 열기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모바일 앱 QR 코드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在浏览器中打开" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移动应用二维码" } } } }, - "Open the plan to accept or reject": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开计划以接受或拒绝" + "Name" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Name" } - } - } - }, - "Open the plan to review the decision": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开计划以查看决策" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이름" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "名称" } } } }, - "Optional longer description shown in command details": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Optional longer description shown in command details" + "Name shown on the button" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Name shown on the button" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 상세에 표시되는 선택적 긴 설명" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "버튼에 표시될 이름" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示在命令详情中的可选长描述" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按钮上显示的名称" } } } }, - "Orchestrate large-scale parallel changes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Orchestrate large-scale parallel changes" + "name: command name without the leading slash." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "name: command name without the leading slash." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대규모 병렬 변경 오케스트레이션" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "name: 앞의 /를 제외한 커맨드 이름입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编排大规模并行更改" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "name:不含开头斜杠的命令名称。" } } } }, - "Order Claude Code stickers": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Order Claude Code stickers" + "name: label shown on the shortcut button." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "name: label shown on the shortcut button." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude Code 스티커 주문" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "name: 단축키 버튼에 표시되는 이름입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "订购 Claude Code 贴纸" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "name:显示在快捷方式按钮上的标签。" } } } }, - "Output tokens": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Output tokens" + "New Command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "New Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "출력 토큰" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输出 token" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建命令" } } } }, - "Plan": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Plan" + "New Shortcut" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "New Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "계획" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建快捷方式" } } } }, - "Plan content unavailable.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Plan content unavailable." + "No changes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No changes" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "변경사항 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划内容不可用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有变更" } } } }, - "Plan is still drafting…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划仍在起草…" + "No results found" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No results found" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "검색 결과 없음" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到结果" } } } }, - "Plan mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Plan mode" + "No shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No shortcuts" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有快捷方式" } } } }, - "Plan mode is on — Add menu": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划模式已开启 — 添加菜单" + "No todos" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No todos" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有待办" } } } }, - "Plan ready": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划已就绪" + "ok" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "ok" } } } }, - "Plan usage limits and rate limits": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Plan usage limits and rate limits" + "OK" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "OK" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "요금제 사용 한도 및 속도 제한" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "확인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "规划用量限制和速率限制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定" } } } }, - "Portion of the current conversation's context window in use. When it fills, older messages may be summarized or dropped.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Portion of the current conversation's context window in use. When it fills, older messages may be summarized or dropped." + "Open in browser" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Open in browser" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 대화의 컨텍스트 윈도우 중 사용 중인 비율입니다. 가득 차면 이전 메시지가 요약되거나 삭제될 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브라우저에서 열기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前对话上下文窗口的已用比例。填满后,较早消息可能会被总结或丢弃。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在浏览器中打开" } } } }, - "Preview": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Preview" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "미리보기" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "预览" + "Open the plan to accept or reject" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开计划以接受或拒绝" } } } }, - "Privacy settings (Pro/Max)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Privacy settings (Pro/Max)" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "개인정보 설정 (Pro/Max)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐私设置(Pro/Max)" + "Open the plan to review the decision" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开计划以查看决策" } } } }, - "Pull a web session into this terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Pull a web session into this terminal" + "Optional longer description shown in command details" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Optional longer description shown in command details" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "웹 세션을 터미널로 가져오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 상세에 표시되는 선택적 긴 설명" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将网页会话拉取到此终端" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示在命令详情中的可选长描述" } } } }, - "Question": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Question" + "Orchestrate large-scale parallel changes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Orchestrate large-scale parallel changes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "질문" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대규모 병렬 변경 오케스트레이션" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "问题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编排大规模并行更改" } } } }, - "Read file": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Read file" + "Order Claude Code stickers" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Order Claude Code stickers" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 읽기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code 스티커 주문" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "读取文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "订购 Claude Code 贴纸" } } } }, - "Reduce permission prompts by scanning transcripts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reduce permission prompts by scanning transcripts" + "Output tokens" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Output tokens" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화 기록 분석으로 권한 요청 횟수 줄이기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "출력 토큰" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通过扫描转录记录减少权限提示" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输出 token" } } } }, - "Register frequently used messages as shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Register frequently used messages as shortcuts" + "Plan" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "자주 사용하는 메시지를 단축키로 등록하세요" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계획" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将常用消息注册为快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划" } } } }, - "Reject": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reject" + "Plan content unavailable." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan content unavailable." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "拒绝" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划内容不可用。" } } } }, - "Reject with Reason": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reject with Reason" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "拒绝并说明原因" + "Plan is still drafting…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划仍在起草…" } } } }, - "Reload plugins": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reload plugins" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플러그인 다시 로드" + "Plan mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan mode" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重新加载插件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划模式" } } } }, - "Remote control from claude.ai": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Remote control from claude.ai" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "claude.ai에서 원격 제어" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "来自 claude.ai 的远程控制" + "Plan mode is on — Add menu" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划模式已开启 — 添加菜单" } } } }, - "Remove": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除" + "Plan ready" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划已就绪" } } } }, - "Rename session": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rename session" + "Plan usage limits and rate limits" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan usage limits and rate limits" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 이름 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "요금제 사용 한도 및 속도 제한" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名会话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "规划用量限制和速率限制" } } } }, - "Repeat execution (e.g. /loop 5m /foo)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Repeat execution (e.g. /loop 5m /foo)" + "Portion of the current conversation's context window in use. When it fills, older messages may be summarized or dropped." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Portion of the current conversation's context window in use. When it fills, older messages may be summarized or dropped." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "반복 실행 (예: /loop 5m /foo)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 대화의 컨텍스트 윈도우 중 사용 중인 비율입니다. 가득 차면 이전 메시지가 요약되거나 삭제될 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重复执行(例如 /loop 5m /foo)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前对话上下文窗口的已用比例。填满后,较早消息可能会被总结或丢弃。" } } } }, - "Reset": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset" + "Preview" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Preview" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "초기화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "미리보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "预览" } } } }, - "Reset Default Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset Default Commands" + "Privacy settings (Pro/Max)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Privacy settings (Pro/Max)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 커맨드 초기화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "개인정보 설정 (Pro/Max)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置默认命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐私设置(Pro/Max)" } } } }, - "Reset Defaults": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset Defaults" + "Pull a web session into this terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Pull a web session into this terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본값 초기화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "웹 세션을 터미널로 가져오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置默认值" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将网页会话拉取到此终端" } } } }, - "Resets in %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Resets in %@" + "Question" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Question" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%@ 후 리셋" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "질문" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 后重置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "问题" } } } }, - "Response in progress": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "响应进行中" + "Read file" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Read file" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 읽기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "读取文件" } } } }, - "Restore Default": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Restore Default" + "Reduce permission prompts by scanning transcripts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reduce permission prompts by scanning transcripts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본값 복원" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화 기록 분석으로 권한 요청 횟수 줄이기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "恢复默认" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过扫描转录记录减少权限提示" } } } }, - "Restore modified default commands to their original state": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Restore modified default commands to their original state" + "Register frequently used messages as shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Register frequently used messages as shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "수정한 기본 커맨드를 원래 상태로 복원합니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "자주 사용하는 메시지를 단축키로 등록하세요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将修改过的默认命令恢复到原始状态" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将常用消息注册为快捷方式" } } } }, - "Review": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看" + "Reject" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reject" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "拒绝" } } } }, - "Review a pull request locally": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Review a pull request locally" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "로컬에서 PR 리뷰" + "Reject with Reason" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reject with Reason" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在本地评审拉取请求" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "拒绝并说明原因" } } } }, - "Review and fix code quality/efficiency of changes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Review and fix code quality/efficiency of changes" + "Reload plugins" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reload plugins" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "변경사항 코드 품질/효율성 검토 및 수정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플러그인 다시 로드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "评审并修复更改的代码质量/效率问题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新加载插件" } } } }, - "Rewind to a previous point": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rewind to a previous point" + "Remote control from claude.ai" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Remote control from claude.ai" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이전 시점으로 되돌리기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "claude.ai에서 원격 제어" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "回退到之前的位置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "来自 claude.ai 的远程控制" } } } }, - "Run as terminal command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Run as terminal command" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 커맨드로 실행" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "作为终端命令运行" + "Remove" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除" } } } }, - "Run command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Run command" + "Rename session" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 실행" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 이름 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "运行命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名会话" } } } }, - "Running": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Running" + "Repeat execution (e.g. /loop 5m /foo)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Repeat execution (e.g. /loop 5m /foo)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "실행 중" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "반복 실행 (예: /loop 5m /foo)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在运行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重复执行(例如 /loop 5m /foo)" } } } }, - "RxCode shortcut export file.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "RxCode shortcut export file." + "Reset" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode 단축키 내보내기 파일입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초기화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode 快捷方式导出文件。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置" } } } }, - "RxCode slash command export file.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "RxCode slash command export file." + "Reset Default Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset Default Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode 슬래시 커맨드 내보내기 파일입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 커맨드 초기화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode 斜杠命令导出文件。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置默认命令" } } } }, - "Save": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Save" + "Reset Defaults" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset Defaults" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본값 초기화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保存" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置默认值" } } } }, - "Search commands...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search commands..." + "Resets in %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Resets in %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 검색..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 후 리셋" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索命令..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 后重置" } } } }, - "Search in code": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search in code" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "코드 검색" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在代码中搜索" + "Response in progress" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "响应进行中" } } } }, - "Select/change AI model": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select/change AI model" + "Restore Default" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Restore Default" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "AI 모델 선택/변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본값 복원" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择/更改 AI 模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "恢复默认" } } } }, - "Send": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Send" + "Restore modified default commands to their original state" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Restore modified default commands to their original state" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "전송" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "수정한 기본 커맨드를 원래 상태로 복원합니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将修改过的默认命令恢复到原始状态" } } } }, - "Send all as one": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "合并发送" + "Review" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看" } } } }, - "Send feedback": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Send feedback" + "Review a pull request locally" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Review a pull request locally" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送反馈" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로컬에서 PR 리뷰" } - } - } - }, - "Send now — cancels current response": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "立即发送 — 取消当前响应" + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在本地评审拉取请求" } } } }, - "Session Usage": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Session Usage" + "Review and fix code quality/efficiency of changes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Review and fix code quality/efficiency of changes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 사용량" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "변경사항 코드 품질/효율성 검토 및 수정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "会话用量" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "评审并修复更改的代码质量/效率问题" } } } }, - "Session analysis report": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Session analysis report" + "Rewind to a previous point" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rewind to a previous point" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 분석 보고서 생성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이전 시점으로 되돌리기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "会话分析报告" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "回退到之前的位置" } } } }, - "Set model effort level": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Set model effort level" + "Run as terminal command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Run as terminal command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델 effort 수준 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 커맨드로 실행" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置模型推理强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "作为终端命令运行" } } } }, - "Set prompt bar color": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Set prompt bar color" + "Run command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Run command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프롬프트 바 색상 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 실행" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置提示栏颜色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "运行命令" } } } }, - "Set terminal UI renderer": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Set terminal UI renderer" + "Running" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Running" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 UI 렌더러 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "실행 중" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置终端 UI 渲染器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在运行" } } } }, - "Set up GitHub Actions app": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Set up GitHub Actions app" + "RxCode shortcut export file." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "RxCode shortcut export file." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub Actions 앱 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 단축키 내보내기 파일입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置 GitHub Actions 应用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 快捷方式导出文件。" } } } }, - "Settings interface": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Settings interface" + "RxCode slash command export file." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "RxCode slash command export file." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설정 인터페이스" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 슬래시 커맨드 내보내기 파일입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置界面" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 斜杠命令导出文件。" } } } }, - "Share free 1-week passes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Share free 1-week passes" + "Save" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Save" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "1주 무료 이용권 공유" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分享免费 1 周通行证" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存" } } } }, - "Short description": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Short description" + "Search commands..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search commands..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "짧은 설명" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 검색..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "简短描述" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索命令..." } } } }, - "Short description shown in the command picker": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Short description shown in the command picker" + "Search in code" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search in code" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 선택기에 표시되는 짧은 설명" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "코드 검색" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示在命令选择器中的简短描述" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在代码中搜索" } } } }, - "Shortcut": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Shortcut" + "Select/change AI model" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select/change AI model" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "AI 모델 선택/변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择/更改 AI 模型" } } } }, - "Shortcut Manager": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Shortcut Manager" + "Send" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Send" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 관리자" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전송" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷方式管理器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送" } } } }, - "Shortcut button label": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Shortcut button label" + "Send all as one" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "合并发送" } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 버튼 이름" + } + } + }, + "Send feedback" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Send feedback" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷方式按钮标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送反馈" } } } }, - "Shortcuts": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷按钮" + "Send now — cancels current response" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "立即发送 — 取消当前响应" } } } }, - "Show %lld earlier messages": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show %lld earlier messages" + "Session analysis report" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Session analysis report" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%lld개 이전 메시지 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 분석 보고서 생성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示前 %lld 条消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "会话分析报告" } } } }, - "Show help": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show help" + "Session Usage" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Session Usage" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "도움말 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 사용량" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示帮助" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "会话用量" } } } }, - "Show less": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show less" + "Set model effort level" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Set model effort level" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "접기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델 effort 수준 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "收起" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置模型推理强度" } } } }, - "Show more": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show more" + "Set prompt bar color" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Set prompt bar color" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "더 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프롬프트 바 색상 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示更多" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置提示栏颜色" } } } }, - "Side question not added to conversation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Side question not added to conversation" + "Set terminal UI renderer" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Set terminal UI renderer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화에 추가되지 않는 부가 질문" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 UI 렌더러 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "旁路问题未添加到对话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置终端 UI 渲染器" } } } }, - "Skill": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skill" + "Set up GitHub Actions app" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Set up GitHub Actions app" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스킬" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub Actions 앱 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "技能" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置 GitHub Actions 应用" } } } }, - "Slash Command Manager": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Slash Command Manager" + "Settings interface" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Settings interface" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 관리자" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정 인터페이스" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜杠命令管理器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置界面" } } } }, - "Slash Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Slash Commands" + "Share free 1-week passes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Share free 1-week passes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "1주 무료 이용권 공유" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜杠命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分享免费 1 周通行证" } } } }, - "Start a new conversation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Start a new conversation" + "Short description" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Short description" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 대화 시작" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "짧은 설명" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开始新对话" - } - } - } - }, - "Start in plan mode": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "以计划模式开始" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "简短描述" } } } }, - "Subagent": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Subagent" + "Short description shown in the command picker" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Short description shown in the command picker" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "서브에이전트" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 선택기에 표시되는 짧은 설명" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "子智能体" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示在命令选择器中的简短描述" } } } }, - "Submit feedback/bug report": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Submit feedback/bug report" + "Shortcut" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "피드백/버그 보고" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "提交反馈/错误报告" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷按钮" } } } }, - "Tell Claude what to change": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Tell Claude what to change" + "Shortcut button label" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Shortcut button label" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "告诉 Claude 需要修改什么" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 버튼 이름" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷方式按钮标签" } } } }, - "The leading slash is optional while editing names; RxCode saves names without it.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The leading slash is optional while editing names; RxCode saves names without it." + "Shortcut Manager" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Shortcut Manager" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이름을 편집할 때 앞의 /는 선택사항입니다. RxCode는 / 없이 저장합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 관리자" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑名称时开头的斜杠可选;RxCode 保存时不包含它。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷方式管理器" } } } }, - "Thinking...": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Thinking..." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "생각하는 중..." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在思考..." + "Shortcuts" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷按钮" } } } }, - "This command will run in the terminal when the button is clicked": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "This command will run in the terminal when the button is clicked" + "Show %lld earlier messages" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show %lld earlier messages" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "버튼을 클릭하면 이 커맨드가 터미널에서 실행됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 이전 메시지 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击按钮时,此命令会在终端中运行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示前 %lld 条消息" } } } }, - "This message will be sent when the button is clicked": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "This message will be sent when the button is clicked" + "Show help" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show help" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "버튼을 클릭하면 이 메시지가 전송됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "도움말 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击按钮时会发送此消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示帮助" } } } }, - "Todos": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Todos" + "Show less" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show less" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "접기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "待办" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "收起" } } } }, - "Toggle fast mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle fast mode" + "Show more" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show more" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "빠른 모드 켜기/끄기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "더 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换快速模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示更多" } } } }, - "Toggle sandbox mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle sandbox mode" + "Side question not added to conversation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Side question not added to conversation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "샌드박스 모드 전환" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화에 추가되지 않는 부가 질문" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换沙盒模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "旁路问题未添加到对话" } } } }, - "Toggle voice dictation": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle voice dictation" + "Skill" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skill" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "음성 받아쓰기 전환" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스킬" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换语音听写" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "技能" } } } }, - "Token usage statistics": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Token usage statistics" + "Slash Command Manager" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slash Command Manager" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "토큰 사용 통계" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 관리자" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Token 用量统计" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜杠命令管理器" } } } }, - "Tracks usage against Anthropic's rolling 5-hour limit. Resets gradually as older requests age out.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Tracks usage against Anthropic's rolling 5-hour limit. Resets gradually as older requests age out." + "Slash Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slash Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Anthropic의 5시간 롤링 한도 대비 사용량을 추적합니다. 이전 요청이 시간이 지남에 따라 점진적으로 리셋됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跟踪 Anthropic 5 小时滚动限制的用量。旧请求过期后会逐步恢复。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜杠命令" } } } }, - "Tracks usage against Anthropic's rolling 7-day limit. Resets gradually as older requests age out.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Tracks usage against Anthropic's rolling 7-day limit. Resets gradually as older requests age out." + "Start a new conversation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Start a new conversation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Anthropic의 7일 롤링 한도 대비 사용량을 추적합니다. 이전 요청이 시간이 지남에 따라 점진적으로 리셋됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 대화 시작" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跟踪 Anthropic 7 天滚动限制的用量。旧请求过期后会逐步恢复。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开始新对话" } } } }, - "Tracks usage against Codex's rolling 5-hour limit. Resets gradually as older requests age out.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跟踪 Codex 滚动 5 小时限制下的用量。较早请求过期后会逐步重置。" + "Start in plan mode" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "以计划模式开始" } } } }, - "Tracks usage against Codex's rolling 7-day limit. Resets gradually as older requests age out.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跟踪 Codex 滚动 7 天限制下的用量。较早请求过期后会逐步重置。" + "Subagent" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Subagent" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "서브에이전트" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "子智能体" } } } }, - "Try a different keyword": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Try a different keyword" + "Submit feedback/bug report" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Submit feedback/bug report" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다른 키워드로 검색해 보세요" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "피드백/버그 보고" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "尝试其他关键词" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "提交反馈/错误报告" } } } }, - "Turn off plan mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Turn off plan mode" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플랜 모드 끄기" + "Tell Claude what to change" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Tell Claude what to change" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭计划模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "告诉 Claude 需要修改什么" } } } }, - "Turns": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Turns" + "terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화 횟수" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "轮次" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "终端" } } } }, - "Type a message...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Type a message..." + "The leading slash is optional while editing names; RxCode saves names without it." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The leading slash is optional while editing names; RxCode saves names without it." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지를 입력하세요..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이름을 편집할 때 앞의 /는 선택사항입니다. RxCode는 / 없이 저장합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入消息..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑名称时开头的斜杠可选;RxCode 保存时不包含它。" } } } }, - "Upgrade plan": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Upgrade plan" + "Thinking..." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Thinking..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상위 요금제로 업그레이드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "생각하는 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "升级套餐" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在思考..." } } } }, - "Usage": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Usage" + "This command will run in the terminal when the button is clicked" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "This command will run in the terminal when the button is clicked" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용량" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "버튼을 클릭하면 이 커맨드가 터미널에서 실행됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用量" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击按钮时,此命令会在终端中运行" } } } }, - "Usage:": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Usage:" + "This message will be sent when the button is clicked" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "This message will be sent when the button is clicked" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용법:" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "버튼을 클릭하면 이 메시지가 전송됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用法:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击按钮时会发送此消息" } } } }, - "Use the Add menu or Shift-Tab to ask the agent for a read-only plan before edits begin.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在开始编辑前,使用“添加”菜单或 Shift-Tab 请求智能体提供只读计划。" + "Todos" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Todos" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "待办" } } } }, - "Version, model, and account status": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Version, model, and account status" + "Toggle fast mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle fast mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "버전, 모델, 계정 상태" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "빠른 모드 켜기/끄기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "版本、模型和账号状态" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换快速模式" } } } }, - "View": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看" - } - } - } - }, - "View Result": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "View Result" + "Toggle sandbox mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle sandbox mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "결과 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "샌드박스 모드 전환" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看结果" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换沙盒模式" } } } }, - "View changelog": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "View changelog" + "Toggle voice dictation" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle voice dictation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "변경 로그 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "음성 받아쓰기 전환" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看更新日志" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换语音听写" } } } }, - "View hook configuration": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "View hook configuration" + "tok" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "tok" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "훅 구성 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "토큰" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看 hook 配置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "tok" } } } }, - "Visualize context usage": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Visualize context usage" + "Token usage statistics" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Token usage statistics" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "컨텍스트 사용량 시각화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "토큰 사용 통계" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "可视化上下文用量" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Token 用量统计" } } } }, - "Waiting for answer": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "等待回答" + "tokens" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "tokens" } - } - } - }, - "What should we build in %@?": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What should we build in %@?" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "토큰" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "我们要在 %@ 中构建什么?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "token" } } } }, - "What would you like changed?": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What would you like changed?" + "Tracks usage against Anthropic's rolling 5-hour limit. Resets gradually as older requests age out." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Tracks usage against Anthropic's rolling 5-hour limit. Resets gradually as older requests age out." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic의 5시간 롤링 한도 대비 사용량을 추적합니다. 이전 요청이 시간이 지남에 따라 점진적으로 리셋됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "你希望修改什么?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟踪 Anthropic 5 小时滚动限制的用量。旧请求过期后会逐步恢复。" } } } }, - "When enabled, the command runs in the terminal instead of chat": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "When enabled, the command runs in the terminal instead of chat" + "Tracks usage against Anthropic's rolling 7-day limit. Resets gradually as older requests age out." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Tracks usage against Anthropic's rolling 7-day limit. Resets gradually as older requests age out." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "활성화하면 커맨드가 채팅 대신 터미널에서 실행됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic의 7일 롤링 한도 대비 사용량을 추적합니다. 이전 요청이 시간이 지남에 따라 점진적으로 리셋됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用后,命令会在终端中运行,而不是发送到聊天" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟踪 Anthropic 7 天滚动限制的用量。旧请求过期后会逐步恢复。" } } } }, - "Write heap snapshot for memory diagnostics": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Write heap snapshot for memory diagnostics" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메모리 진단을 위한 힙 스냅샷 저장" + "Tracks usage against Codex's rolling 5-hour limit. Resets gradually as older requests age out." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟踪 Codex 滚动 5 小时限制下的用量。较早请求过期后会逐步重置。" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "写入堆快照以进行内存诊断" + } + } + }, + "Tracks usage against Codex's rolling 7-day limit. Resets gradually as older requests age out." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟踪 Codex 滚动 7 天限制下的用量。较早请求过期后会逐步重置。" } } } }, - "accepts input": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "accepts input" + "Try a different keyword" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Try a different keyword" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력 허용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다른 키워드로 검색해 보세요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受输入" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尝试其他关键词" } } } }, - "acceptsInput: true lets users type additional text after the command.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "acceptsInput: true lets users type additional text after the command." + "Turn off plan mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Turn off plan mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "acceptsInput: true이면 커맨드 뒤에 추가 텍스트를 입력할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플랜 모드 끄기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "acceptsInput:设为 true 后,用户可以在命令后输入额外文本。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭计划模式" } } } }, - "agentProvider: agent this command applies to (claudeCode, codex, acp). Use null or omit it for all agents.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "agentProvider: agent this command applies to (claudeCode, codex, acp). Use null or omit it for all agents." + "Turns" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Turns" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화 횟수" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "agentProvider:此命令适用的代理(claudeCode、codex、acp)。设为 null 或省略表示适用于所有代理。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "轮次" } } } }, - "context": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "context" + "Type a message..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type a message..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "컨텍스트" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지를 입력하세요..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上下文" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入消息..." } } } }, - "default": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "default" + "Upgrade plan" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Upgrade plan" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상위 요금제로 업그레이드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "升级套餐" } } } }, - "description: short text shown in the command picker.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "description: short text shown in the command picker." + "Usage" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Usage" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "description: 커맨드 선택기에 표시되는 짧은 설명입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용량" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "description:显示在命令选择器中的简短文本。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用量" } } } }, - "detailDescription: optional longer text shown in command details. Use null or omit it when empty.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "detailDescription: optional longer text shown in command details. Use null or omit it when empty." + "Usage:" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Usage:" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "detailDescription: 커맨드 상세에 표시되는 선택적 긴 설명입니다. 비어 있으면 null을 쓰거나 생략하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용법:" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "detailDescription:显示在命令详情中的可选长文本。为空时使用 null 或省略。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用法:" } } } }, - "error": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "error" + "Use the Add menu or Shift-Tab to ask the agent for a read-only plan before edits begin." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在开始编辑前,使用“添加”菜单或 Shift-Tab 请求智能体提供只读计划。" } } } }, - "id: optional unique identifier (UUID). Auto-generated on import if omitted.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "id: optional unique identifier (UUID). Auto-generated on import if omitted." + "Version, model, and account status" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Version, model, and account status" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "id: 선택적 고유 식별자 (UUID). 가져올 때 생략하면 자동 생성됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "버전, 모델, 계정 상태" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "id:可选的唯一标识符(UUID)。导入时省略则自动生成。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "版本、模型和账号状态" } } } }, - "isInteractive: true runs the command in the interactive terminal.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "isInteractive: true runs the command in the interactive terminal." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "isInteractive: true이면 인터랙티브 터미널에서 실행됩니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "isInteractive:设为 true 后,命令会在交互式终端中运行。" + "View" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看" } } } }, - "isTerminalCommand: true runs the message as a terminal command instead of sending it to chat.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "isTerminalCommand: true runs the message as a terminal command instead of sending it to chat." + "View changelog" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "View changelog" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "isTerminalCommand: true이면 채팅 대신 터미널 커맨드로 실행됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "변경 로그 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "isTerminalCommand:设为 true 后,会把消息作为终端命令运行,而不是发送到聊天。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看更新日志" } } } }, - "loading...": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "loading..." + "View hook configuration" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "View hook configuration" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "불러오는 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "훅 구성 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看 hook 配置" } } } }, - "message: text sent to Claude, or command run in the terminal.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "message: text sent to Claude, or command run in the terminal." + "View Result" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "View Result" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "message: Claude에 전송할 텍스트 또는 터미널에서 실행할 커맨드입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "결과 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "message:发送给 Claude 的文本,或在终端中运行的命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看结果" } } } }, - "name: command name without the leading slash.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "name: command name without the leading slash." + "Visualize context usage" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Visualize context usage" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "name: 앞의 /를 제외한 커맨드 이름입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "컨텍스트 사용량 시각화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "name:不含开头斜杠的命令名称。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "可视化上下文用量" } } } }, - "name: label shown on the shortcut button.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "name: label shown on the shortcut button." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "name: 단축키 버튼에 표시되는 이름입니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "name:显示在快捷方式按钮上的标签。" + "Waiting for answer" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "等待回答" } } } }, - "ok": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "ok" + "What should we build in %@?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What should we build in %@?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "我们要在 %@ 中构建什么?" } } } }, - "terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "terminal" + "What would you like changed?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What would you like changed?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "终端" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "你希望修改什么?" } } } }, - "tok": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "tok" + "When enabled, the command runs in the terminal instead of chat" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "When enabled, the command runs in the terminal instead of chat" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "토큰" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "활성화하면 커맨드가 채팅 대신 터미널에서 실행됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "tok" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用后,命令会在终端中运行,而不是发送到聊天" } } } }, - "tokens": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "tokens" + "Write heap snapshot for memory diagnostics" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Write heap snapshot for memory diagnostics" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "토큰" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메모리 진단을 위한 힙 스냅샷 저장" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "token" - } - } - } - }, - "·": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "·" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "写入堆快照以进行内存诊断" } } } } }, - "version": "1.1" -} + "version" : "1.1" +} \ No newline at end of file diff --git a/Packages/Sources/RxCodeChatKit/SlashCommandManagerView.swift b/Packages/Sources/RxCodeChatKit/SlashCommandManagerView.swift index 72eb23c5..43612159 100644 --- a/Packages/Sources/RxCodeChatKit/SlashCommandManagerView.swift +++ b/Packages/Sources/RxCodeChatKit/SlashCommandManagerView.swift @@ -318,9 +318,16 @@ public struct SlashCommandManagerView: View { /// Capsule showing which agent a command applies to. @ViewBuilder private func agentScopeBadge(_ provider: AgentProvider?) -> some View { - let label = provider?.displayName ?? String(localized: "All Agents", bundle: .module) let tint: Color = provider == nil ? .secondary : Color.accentColor - Text(label) + if let provider { + agentScopeBadgeLabel(Text(provider.displayName), tint: tint) + } else { + agentScopeBadgeLabel(Text("All Agents", bundle: .module), tint: tint) + } + } + + private func agentScopeBadgeLabel(_ label: Text, tint: Color) -> some View { + label .font(.system(size: ClaudeTheme.size(9), weight: .medium)) .foregroundStyle(tint) .padding(.horizontal, 5) diff --git a/Packages/Sources/RxCodeChatKit/StatusLineView.swift b/Packages/Sources/RxCodeChatKit/StatusLineView.swift index b02ad81c..a2a003e1 100644 --- a/Packages/Sources/RxCodeChatKit/StatusLineView.swift +++ b/Packages/Sources/RxCodeChatKit/StatusLineView.swift @@ -132,7 +132,7 @@ struct StatusLineView: View { .menuStyle(.borderlessButton) .menuIndicator(.hidden) .fixedSize() - .help("Client: \(chatBridge.agentProvider.displayName)") + .help("Client: \(chatBridge.agentProvider.displayNameText)") } // MARK: - Usage Segments diff --git a/Packages/Sources/RxCodeChatKit/ToolResultView.swift b/Packages/Sources/RxCodeChatKit/ToolResultView.swift index b832d6a5..51308abc 100644 --- a/Packages/Sources/RxCodeChatKit/ToolResultView.swift +++ b/Packages/Sources/RxCodeChatKit/ToolResultView.swift @@ -7,6 +7,7 @@ struct ToolResultView: View { @State private var isExpanded: Bool @State private var isDiffExpanded = false @State private var showBashSheet = false + @State private var showMCPDetailSheet = false @Environment(WindowState.self) private var windowState /// Lowercased tool name (avoids repeated lowercased() calls) @@ -51,7 +52,7 @@ struct ToolResultView: View { Group { if isCardTool { cardBody - .bubbleStyle(toolCall.isError ? .toolError : .tool) + .bubbleStyle(displayIsError ? .toolError : .tool) .padding(.vertical, 6) .transition(.asymmetric( insertion: .opacity @@ -103,7 +104,7 @@ struct ToolResultView: View { Spacer() Group { - if toolCall.isError { + if displayIsError { Image(systemName: "exclamationmark.circle.fill") .foregroundStyle(ClaudeTheme.statusError) .font(.caption) @@ -165,7 +166,7 @@ struct ToolResultView: View { result, size: ClaudeTheme.messageSize(12), design: .monospaced, - color: toolCall.isError ? ClaudeTheme.statusError : ClaudeTheme.textPrimary + color: displayIsError ? ClaudeTheme.statusError : ClaudeTheme.textPrimary ) .frame(maxWidth: .infinity, alignment: .leading) } @@ -196,7 +197,9 @@ struct ToolResultView: View { private var minimalBody: some View { VStack(alignment: .leading, spacing: 4) { Button { - if isBashTool, toolCall.result != nil { + if isMCPTool { + showMCPDetailSheet = true + } else if isBashTool, toolCall.result != nil { showBashSheet = true } else { withAnimation(.easeInOut(duration: 0.2)) { @@ -205,7 +208,7 @@ struct ToolResultView: View { } } label: { HStack(spacing: 6) { - if toolCall.isError { + if displayIsError { Image(systemName: "exclamationmark.triangle.fill") .font(.system(size: ClaudeTheme.messageSize(11))) .foregroundStyle(ClaudeTheme.statusError) @@ -226,19 +229,19 @@ struct ToolResultView: View { } } .font(.system(size: ClaudeTheme.messageSize(12))) - .foregroundStyle(toolCall.isError ? ClaudeTheme.statusError : ClaudeTheme.textTertiary) + .foregroundStyle(displayIsError ? ClaudeTheme.statusError : ClaudeTheme.textTertiary) .frame(maxWidth: .infinity, alignment: .leading) .contentShape(Rectangle()) } .buttonStyle(.plain) - if isExpanded, !isBashTool, let result = toolCall.result, !result.isEmpty { + if isExpanded, !isBashTool, !isMCPTool, let result = toolCall.result, !result.isEmpty { ScrollView { ChatTextContentView( result, size: ClaudeTheme.messageSize(12), design: .monospaced, - color: toolCall.isError ? ClaudeTheme.statusError : ClaudeTheme.textSecondary + color: displayIsError ? ClaudeTheme.statusError : ClaudeTheme.textSecondary ) .frame(maxWidth: .infinity, alignment: .leading) } @@ -249,12 +252,26 @@ struct ToolResultView: View { .sheet(isPresented: $showBashSheet) { BashTerminalSheet(toolCall: toolCall) } + .sheet(isPresented: $showMCPDetailSheet) { + MCPToolDetailSheet(toolCall: toolCall) + .mcpToolDetailSheetPresentation() + } } private var isBashTool: Bool { toolNameLower == "bash" } + private var isMCPTool: Bool { + ToolCategory(toolName: toolCall.name) == .mcp + } + + private var displayIsError: Bool { + guard toolCall.isError else { return false } + let result = toolCall.result?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + return !(isMCPTool && result.isEmpty) + } + private var isCardTool: Bool { isEditTool } @@ -453,7 +470,8 @@ struct ToolResultView: View { case .execution: return ClaudeTheme.accent case .fileModification: return ClaudeTheme.statusWarning case .readOnly: return ClaudeTheme.textSecondary - case .mcp, .unknown: return ClaudeTheme.textTertiary + case .mcp: return ClaudeTheme.accent + case .unknown: return ClaudeTheme.textTertiary } } } @@ -490,10 +508,10 @@ struct ToolResultView: View { .font(.system(size: ClaudeTheme.messageSize(12))) .foregroundStyle(ClaudeTheme.textTertiary) fileActionLink(label: "diff") { - windowState.diffFile = PreviewFile( + windowState.diffFile = Self.editDiffPreviewFile( path: filePath, name: fileName, - editHunks: hunks + hunks: hunks ) } } @@ -513,6 +531,19 @@ struct ToolResultView: View { } } + nonisolated static func editDiffPreviewFile( + path: String, + name: String, + hunks: [PreviewFile.EditHunk] + ) -> PreviewFile { + PreviewFile( + path: path, + name: name, + editHunks: hunks, + showFullFileDiff: true + ) + } + private var inputSummary: String { if toolNameLower == "agent" { if let desc = toolCall.input["description"]?.stringValue { @@ -532,6 +563,10 @@ struct ToolResultView: View { return toolDescriptionPrefix } + if isMCPTool { + return mcpDisplayName + } + if let filePath = toolCall.input["file_path"]?.stringValue { let fileName = URL(fileURLWithPath: filePath).lastPathComponent return "\(toolDescriptionPrefix) — \(fileName)" @@ -554,6 +589,15 @@ struct ToolResultView: View { return toolDescriptionPrefix } + private var mcpDisplayName: String { + if toolNameLower == "mcptoolcall" { + return "MCP tool call" + } + return toolCall.name + .replacingOccurrences(of: "mcp__", with: "") + .replacingOccurrences(of: "__", with: " / ") + } + private var toolDescriptionPrefix: String { switch toolNameLower { case "read": "Read file" @@ -567,7 +611,162 @@ struct ToolResultView: View { case "agent": "Subagent" case "skill": "Skill" case InteractiveTerminalState.toolName: "Interactive terminal" - default: toolCall.name + default: isMCPTool ? "MCP tool" : toolCall.name + } + } +} + +struct MCPToolDetailSheet: View { + let toolCall: ToolCall + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + HStack(spacing: 10) { + Image(systemName: "puzzlepiece.extension") + .font(.system(size: ClaudeTheme.messageSize(16), weight: .medium)) + .foregroundStyle(ClaudeTheme.accent) + + VStack(alignment: .leading, spacing: 2) { + Text(displayName) + .font(.system(size: ClaudeTheme.messageSize(15), weight: .semibold)) + .foregroundStyle(ClaudeTheme.textPrimary) + Text(statusText) + .font(.system(size: ClaudeTheme.messageSize(12))) + .foregroundStyle(statusColor) + } + + Spacer() + + Button { + dismiss() + } label: { + Image(systemName: "xmark") + .font(.system(size: ClaudeTheme.messageSize(12), weight: .semibold)) + .frame(width: 24, height: 24) + } + .buttonStyle(.plain) + .help("Close") + } + .padding(16) + + ClaudeThemeDivider() + + ScrollView { + VStack(alignment: .leading, spacing: 14) { + JSONCodeBlock(title: "Call Params", code: Self.prettyJSONString(.object(toolCall.input))) + JSONCodeBlock(title: "Result", code: Self.prettyResultString(toolCall.result)) + } + .padding(16) + } + } + .mcpToolDetailFrame() + .background(ClaudeTheme.surfacePrimary) + } + + private var displayName: String { + if toolCall.name.lowercased() == "mcptoolcall" { + return "MCP tool call" + } + return toolCall.name + .replacingOccurrences(of: "mcp__", with: "") + .replacingOccurrences(of: "__", with: " / ") + } + + private var statusText: String { + if toolCall.isError, !(toolCall.result ?? "").trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + return "Failed" } + if toolCall.result != nil { + return "Completed" + } + return "Running" + } + + private var statusColor: Color { + statusText == "Failed" ? ClaudeTheme.statusError : ClaudeTheme.textTertiary + } + + private static func prettyResultString(_ result: String?) -> String { + guard let result else { return "null" } + if result.isEmpty { return "\"\"" } + if let data = result.data(using: .utf8), + let object = try? JSONSerialization.jsonObject(with: data), + JSONSerialization.isValidJSONObject(object), + let pretty = try? JSONSerialization.data(withJSONObject: object, options: [.prettyPrinted, .sortedKeys]), + let string = String(data: pretty, encoding: .utf8) { + return string + } + return prettyJSONString(.string(result)) + } + + private static func prettyJSONString(_ value: JSONValue) -> String { + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted, .sortedKeys] + guard let data = try? encoder.encode(value), + let string = String(data: data, encoding: .utf8) + else { + return value.description + } + return string + } +} + +private extension View { + @ViewBuilder + func mcpToolDetailSheetPresentation() -> some View { +#if os(iOS) + self + .presentationDetents([.large]) + .presentationDragIndicator(.visible) +#else + self +#endif + } + + @ViewBuilder + func mcpToolDetailFrame() -> some View { +#if os(macOS) + self.frame(minWidth: 640, minHeight: 460) +#else + self.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) +#endif + } +} + +private struct JSONCodeBlock: View { + let title: String + let code: String + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + HStack { + Text(title) + .font(.system(size: ClaudeTheme.messageSize(12), weight: .medium)) + .foregroundStyle(ClaudeTheme.textSecondary) + Spacer() + Text("json") + .font(.system(size: ClaudeTheme.messageSize(11), weight: .medium, design: .monospaced)) + .foregroundStyle(ClaudeTheme.textTertiary) + } + .padding(.horizontal, 10) + .padding(.vertical, 7) + .background(ClaudeTheme.codeHeaderBackground) + + ScrollView([.horizontal, .vertical]) { + Text(SyntaxHighlighter.highlight(code, language: "json", fontSize: ClaudeTheme.messageSize(12))) + .textSelection(.enabled) + .fixedSize() + .padding(10) + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxHeight: 240) + .background(ClaudeTheme.codeBackground) + } + .clipShape(RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall)) + .overlay( + RoundedRectangle(cornerRadius: ClaudeTheme.cornerRadiusSmall) + .strokeBorder(ClaudeTheme.border, lineWidth: 0.5) + ) } } diff --git a/Packages/Sources/RxCodeCore/Models/AgentModel.swift b/Packages/Sources/RxCodeCore/Models/AgentModel.swift index 93bced1f..5b31cd2a 100644 --- a/Packages/Sources/RxCodeCore/Models/AgentModel.swift +++ b/Packages/Sources/RxCodeCore/Models/AgentModel.swift @@ -5,7 +5,7 @@ public enum AgentProvider: String, Codable, CaseIterable, Sendable, Hashable { case codex case acp - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .claudeCode: return "Claude Code" case .codex: return "Codex" @@ -13,6 +13,10 @@ public enum AgentProvider: String, Codable, CaseIterable, Sendable, Hashable { } } + public var displayNameText: String { + String(localized: displayName) + } + /// Default `SessionOrigin` for sessions originated by this provider. /// Used when creating placeholder summaries and computing the persistence /// route for newly-saved sessions. diff --git a/Packages/Sources/RxCodeCore/Models/ChatMessage.swift b/Packages/Sources/RxCodeCore/Models/ChatMessage.swift index b8246bfa..e8be47f3 100644 --- a/Packages/Sources/RxCodeCore/Models/ChatMessage.swift +++ b/Packages/Sources/RxCodeCore/Models/ChatMessage.swift @@ -249,7 +249,8 @@ public struct ToolCall: Identifiable, Codable, Sendable, Equatable { /// Completed read/execution tools may have an empty result, but the chat UI /// still needs the block so it can count them in the collapsed tool summary. public var keepsEmptyResult: Bool { - isKeepAlways || ToolCategory(toolName: name).isTransient + let category = ToolCategory(toolName: name) + return isKeepAlways || category.isTransient || category == .mcp } public init( @@ -356,11 +357,23 @@ public struct FileEditSummary: Identifiable, Sendable { /// True if any contributing tool was Write — old content was overwritten, /// not surgically edited. public let containsWrite: Bool + /// File contents captured at the moment this thread first touched the path. + /// When present, the diff view uses it as the "before" side and the + /// current file on disk as the "after" side, instead of reconstructing + /// from hunks. + public let originalContent: String? - public init(path: String, name: String, hunks: [PreviewFile.EditHunk], containsWrite: Bool) { + public init( + path: String, + name: String, + hunks: [PreviewFile.EditHunk], + containsWrite: Bool, + originalContent: String? = nil + ) { self.path = path self.name = name self.hunks = hunks self.containsWrite = containsWrite + self.originalContent = originalContent } } diff --git a/Packages/Sources/RxCodeCore/Models/MCPServer.swift b/Packages/Sources/RxCodeCore/Models/MCPServer.swift index 86eabd27..90fb192e 100644 --- a/Packages/Sources/RxCodeCore/Models/MCPServer.swift +++ b/Packages/Sources/RxCodeCore/Models/MCPServer.swift @@ -9,13 +9,17 @@ public enum MCPTransport: String, Codable, Sendable, CaseIterable, Identifiable public var id: String { rawValue } - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .stdio: return "stdio" case .http: return "HTTP" case .sse: return "SSE" } } + + public var displayNameText: String { + String(localized: displayName) + } } public enum MCPScope: String, Codable, Sendable, CaseIterable, Identifiable { @@ -25,7 +29,7 @@ public enum MCPScope: String, Codable, Sendable, CaseIterable, Identifiable { public var id: String { rawValue } - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .user: return "User" case .project: return "Project" @@ -33,13 +37,21 @@ public enum MCPScope: String, Codable, Sendable, CaseIterable, Identifiable { } } - public var subtitle: String { + public var displayNameText: String { + String(localized: displayName) + } + + public var subtitle: LocalizedStringResource { switch self { case .user: return "Available in all projects" case .project: return "Shared via .mcp.json" case .local: return "This project, this machine only" } } + + public var subtitleText: String { + String(localized: subtitle) + } } public enum MCPProjectOverride: String, Codable, Sendable, CaseIterable, Identifiable { @@ -49,13 +61,17 @@ public enum MCPProjectOverride: String, Codable, Sendable, CaseIterable, Identif public var id: String { rawValue } - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .inherit: return "Inherit" case .enabled: return "On" case .disabled: return "Off" } } + + public var displayNameText: String { + String(localized: displayName) + } } public enum MCPProvider: String, Codable, Sendable, CaseIterable, Identifiable { diff --git a/Packages/Sources/RxCodeCore/Models/PermissionMode.swift b/Packages/Sources/RxCodeCore/Models/PermissionMode.swift index 1461f239..948cb379 100644 --- a/Packages/Sources/RxCodeCore/Models/PermissionMode.swift +++ b/Packages/Sources/RxCodeCore/Models/PermissionMode.swift @@ -10,7 +10,7 @@ public enum PermissionMode: String, CaseIterable, Sendable, Codable { case auto case bypassPermissions - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .default: return "Ask" case .acceptEdits: return "Accept Edits" @@ -20,6 +20,10 @@ public enum PermissionMode: String, CaseIterable, Sendable, Codable { } } + public var displayNameText: String { + String(localized: displayName) + } + public var systemImage: String { switch self { case .default: return "bolt.shield" diff --git a/Packages/Sources/RxCodeCore/Models/PermissionRequest.swift b/Packages/Sources/RxCodeCore/Models/PermissionRequest.swift index aea8fbc7..2ec30438 100644 --- a/Packages/Sources/RxCodeCore/Models/PermissionRequest.swift +++ b/Packages/Sources/RxCodeCore/Models/PermissionRequest.swift @@ -32,7 +32,7 @@ public struct PermissionRequest: Identifiable, Sendable { // MARK: - Tool Category -public enum ToolCategory: Sendable { +public enum ToolCategory: Sendable, Equatable { case readOnly case fileModification case execution @@ -48,7 +48,8 @@ public enum ToolCategory: Sendable { case "bash", "execute": self = .execution default: - if toolName.lowercased().hasPrefix("mcp__") { + let normalized = toolName.lowercased() + if normalized.hasPrefix("mcp__") || normalized == "mcptoolcall" { self = .mcp } else { self = .unknown diff --git a/Packages/Sources/RxCodeCore/Models/PreviewFile.swift b/Packages/Sources/RxCodeCore/Models/PreviewFile.swift index 5a3dc81c..7dfbd9d7 100644 --- a/Packages/Sources/RxCodeCore/Models/PreviewFile.swift +++ b/Packages/Sources/RxCodeCore/Models/PreviewFile.swift @@ -26,16 +26,26 @@ public struct PreviewFile: Identifiable, Sendable { public let name: String public let editHunks: [EditHunk] public let gitDiffMode: GitDiffMode? + public let showFullFileDiff: Bool + /// File contents captured before this thread's first edit to the path. + /// When non-nil, `FileDiffView` diffs this snapshot against the current + /// on-disk content and ignores `editHunks` — yielding an exact diff even + /// when other agents have concurrently modified the file. + public let originalContent: String? public init( path: String, name: String, editHunks: [EditHunk] = [], - gitDiffMode: GitDiffMode? = nil + gitDiffMode: GitDiffMode? = nil, + showFullFileDiff: Bool = false, + originalContent: String? = nil ) { self.path = path self.name = name self.editHunks = editHunks self.gitDiffMode = gitDiffMode + self.showFullFileDiff = showFullFileDiff + self.originalContent = originalContent } } diff --git a/Packages/Sources/RxCodeCore/Models/ThreadFileEdit.swift b/Packages/Sources/RxCodeCore/Models/ThreadFileEdit.swift index 797cf448..c800958d 100644 --- a/Packages/Sources/RxCodeCore/Models/ThreadFileEdit.swift +++ b/Packages/Sources/RxCodeCore/Models/ThreadFileEdit.swift @@ -14,6 +14,12 @@ public final class ThreadFileEdit { public var hunksData: Data public var firstEditedAt: Date public var updatedAt: Date + /// Full file content captured the first time this session's stream sees an + /// Edit/MultiEdit/Write tool_use for this path. Used by the diff inspector + /// as the "before" side of the diff so concurrent edits from other agents + /// don't break hunk anchoring. Optional for legacy rows persisted before + /// snapshot capture was added — those still render via hunk reverse-apply. + public var originalContent: String? public init( sessionId: String, @@ -21,6 +27,7 @@ public final class ThreadFileEdit { name: String, hunks: [PreviewFile.EditHunk], containsWrite: Bool, + originalContent: String? = nil, firstEditedAt: Date = .now, updatedAt: Date = .now ) { @@ -29,6 +36,7 @@ public final class ThreadFileEdit { self.name = name self.containsWrite = containsWrite self.hunksData = Self.encode(hunks) + self.originalContent = originalContent self.firstEditedAt = firstEditedAt self.updatedAt = updatedAt } @@ -49,7 +57,7 @@ public final class ThreadFileEdit { } public func toSummary() -> FileEditSummary { - FileEditSummary(path: path, name: name, hunks: hunks, containsWrite: containsWrite) + FileEditSummary(path: path, name: name, hunks: hunks, containsWrite: containsWrite, originalContent: originalContent) } private static func encode(_ hunks: [PreviewFile.EditHunk]) -> Data { diff --git a/Packages/Sources/RxCodeCore/Models/ThreadSummaryRecord.swift b/Packages/Sources/RxCodeCore/Models/ThreadSummaryRecord.swift index 638e8f90..6322e06c 100644 --- a/Packages/Sources/RxCodeCore/Models/ThreadSummaryRecord.swift +++ b/Packages/Sources/RxCodeCore/Models/ThreadSummaryRecord.swift @@ -26,6 +26,34 @@ public struct ThreadSummaryItem: Identifiable, Sendable, Equatable { self.summary = summary self.updatedAt = updatedAt } + + public static func titleSeed( + sessionId: String, + projectId: UUID, + branch: String, + title: String, + updatedAt: Date = .now + ) -> ThreadSummaryItem { + ThreadSummaryItem( + sessionId: sessionId, + projectId: projectId, + branch: branch, + title: title, + summary: "", + updatedAt: updatedAt + ) + } + + public func updatingTitle(projectId: UUID, branch: String, title: String, updatedAt: Date = .now) -> ThreadSummaryItem { + ThreadSummaryItem( + sessionId: sessionId, + projectId: projectId, + branch: branch, + title: title, + summary: summary, + updatedAt: updatedAt + ) + } } @Model @@ -61,6 +89,13 @@ public final class ThreadSummaryRecord { self.updatedAt = updatedAt } + public func applyTitle(projectId: UUID, branch: String, title: String, updatedAt: Date = .now) { + self.projectId = projectId + self.branch = branch + self.title = title + self.updatedAt = updatedAt + } + public func toItem() -> ThreadSummaryItem { ThreadSummaryItem( sessionId: sessionId, diff --git a/Packages/Sources/RxCodeCore/Theme/AppTheme.swift b/Packages/Sources/RxCodeCore/Theme/AppTheme.swift index befca8e0..388d3676 100644 --- a/Packages/Sources/RxCodeCore/Theme/AppTheme.swift +++ b/Packages/Sources/RxCodeCore/Theme/AppTheme.swift @@ -286,7 +286,7 @@ public enum AppTheme: String, CaseIterable, Identifiable { public var id: String { rawValue } - public var displayName: String { + public var displayName: LocalizedStringResource { switch self { case .claude: "Terracotta (Default)" case .ocean: "Ocean (Blue)" @@ -297,6 +297,10 @@ public enum AppTheme: String, CaseIterable, Identifiable { } } + public var displayNameText: String { + String(localized: displayName) + } + public var colors: ThemeColors { switch self { case .claude: .claude diff --git a/Packages/Sources/RxCodeCore/Utilities/SyntaxHighlighter.swift b/Packages/Sources/RxCodeCore/Utilities/SyntaxHighlighter.swift index 3728792e..19129ab5 100644 --- a/Packages/Sources/RxCodeCore/Utilities/SyntaxHighlighter.swift +++ b/Packages/Sources/RxCodeCore/Utilities/SyntaxHighlighter.swift @@ -136,8 +136,7 @@ public enum SyntaxHighlighter { let start = i i += 3 while i + 2 < chars.count, !(chars[i] == "\"" && chars[i + 1] == "\"" && chars[i + 2] == "\"") { - if chars[i] == "\\" { i += 1 } - i += 1 + advanceStringScanner(&i, chars: chars) } if i + 2 < chars.count { i += 3 } else { i = chars.count } tokens.append(Token(text: String(chars[start.. LanguageConfig { switch ext { case "swift": diff --git a/Packages/Sources/RxCodeCore/WindowState.swift b/Packages/Sources/RxCodeCore/WindowState.swift index 23c68f1d..726f325d 100644 --- a/Packages/Sources/RxCodeCore/WindowState.swift +++ b/Packages/Sources/RxCodeCore/WindowState.swift @@ -8,6 +8,57 @@ public enum AppStorageKeys { /// Persisted visibility of the right inspector sidebar. Views read this /// directly with `@AppStorage` so the panel can be reliably toggled. public static let showRightSidebar = "showRightSidebar" + /// Last visible width of the right inspector sidebar. The panel reads this + /// as its split-view ideal width on the next launch. + public static let rightInspectorWidth = "rightInspectorWidth" +} + +// MARK: - RightInspectorPanelLayout + +public enum RightInspectorPanelLayout { + public static let minimumWidth: Double = 420 + public static let defaultWidth: Double = 520 + public static let maximumWidth: Double = 1_200 + public static let minimumMainContentWidth: Double = 480 + + public static func maximumWidth(in containerWidth: CGFloat) -> CGFloat { + guard containerWidth.isFinite, containerWidth > 0 else { + return CGFloat(maximumWidth) + } + let availableWidth = Double(containerWidth) - minimumMainContentWidth + return CGFloat(max(minimumWidth, min(maximumWidth, availableWidth))) + } + + public static func restoredWidth(from storedWidth: Double, maxAllowedWidth: CGFloat? = nil) -> CGFloat { + guard storedWidth.isFinite, storedWidth >= minimumWidth else { + return clamp(defaultWidth, maxAllowedWidth: maxAllowedWidth) + } + return clamp(storedWidth, maxAllowedWidth: maxAllowedWidth) + } + + public static func persistedWidth(from measuredWidth: CGFloat, isVisible: Bool) -> Double? { + guard isVisible, measuredWidth.isFinite, measuredWidth >= CGFloat(minimumWidth) else { + return nil + } + return Double(measuredWidth) + } + + public static func resizedWidth( + startWidth: Double, + leadingEdgeTranslation: CGFloat, + maxAllowedWidth: CGFloat + ) -> Double { + let proposedWidth = startWidth - Double(leadingEdgeTranslation) + return Double(clamp(proposedWidth, maxAllowedWidth: maxAllowedWidth)) + } + + private static func clamp(_ width: Double, maxAllowedWidth: CGFloat?) -> CGFloat { + let upperBound = max( + minimumWidth, + min(maximumWidth, Double(maxAllowedWidth ?? CGFloat(maximumWidth))) + ) + return CGFloat(max(minimumWidth, min(width, upperBound))) + } } // MARK: - InspectorTab @@ -17,6 +68,18 @@ public enum InspectorTab: String, CaseIterable { case terminal = "Terminal" case run = "Run" + public var title: LocalizedStringResource { + switch self { + case .memo: "Memo" + case .terminal: "Terminal" + case .run: "Run" + } + } + + public var titleText: String { + String(localized: title) + } + public var icon: String { switch self { case .terminal: "apple.terminal" @@ -32,6 +95,18 @@ public enum InspectorReviewTab: String, CaseIterable, Sendable { case thisThread = "This thread" case changes = "Changes" case branch = "Branch" + + public var title: LocalizedStringResource { + switch self { + case .thisThread: "This thread" + case .changes: "Changes" + case .branch: "Branch" + } + } + + public var titleText: String { + String(localized: title) + } } // MARK: - InspectorMode @@ -39,6 +114,17 @@ public enum InspectorReviewTab: String, CaseIterable, Sendable { public enum InspectorMode: String, CaseIterable, Sendable { case review = "Review" case inspector = "Inspector" + + public var title: LocalizedStringResource { + switch self { + case .review: "Review" + case .inspector: "Inspector" + } + } + + public var titleText: String { + String(localized: title) + } } // MARK: - QueuedMessage @@ -121,7 +207,8 @@ public final class WindowState { /// Invoked by the question sheet when the user submits answers for an /// `AskUserQuestion` tool prompt. Parameters: (toolUseId, answersByQuestionIndex). /// Set by `AppState` at window init. - public var submitQuestionAnswersHandler: (@MainActor @Sendable (String, [Int: AskUserQuestion.Answer]) -> Void)? + public var submitQuestionAnswersHandler: + (@MainActor @Sendable (String, [Int: AskUserQuestion.Answer]) -> Void)? /// Invoked by the question sheet when the user dismisses without answering. /// Resolves the underlying PreToolUse hook as `deny`. Parameter: toolUseId. @@ -146,23 +233,29 @@ public final class WindowState { /// Persisted to UserDefaults so the inspector remembers whether the user /// last looked at Review or Inspector. Defaults to Review on first launch. public var inspectorMode: InspectorMode = WindowState.loadInspectorMode() { - didSet { UserDefaults.standard.set(inspectorMode.rawValue, forKey: WindowState.inspectorModeKey) } + didSet { + UserDefaults.standard.set(inspectorMode.rawValue, forKey: WindowState.inspectorModeKey) + } } /// Persisted to UserDefaults. Defaults to Terminal so the Cmd+T workflow /// keeps working out of the box when the user opens Inspector mode. public var inspectorTab: InspectorTab = WindowState.loadInspectorTab() { - didSet { UserDefaults.standard.set(inspectorTab.rawValue, forKey: WindowState.inspectorTabKey) } + didSet { + UserDefaults.standard.set(inspectorTab.rawValue, forKey: WindowState.inspectorTabKey) + } } private static let inspectorModeKey = "inspectorMode" private static let inspectorTabKey = "inspectorTab" private static func loadInspectorMode() -> InspectorMode { guard let raw = UserDefaults.standard.string(forKey: inspectorModeKey), - let mode = InspectorMode(rawValue: raw) else { return .review } + let mode = InspectorMode(rawValue: raw) + else { return .review } return mode } private static func loadInspectorTab() -> InspectorTab { guard let raw = UserDefaults.standard.string(forKey: inspectorTabKey), - let tab = InspectorTab(rawValue: raw) else { return .terminal } + let tab = InspectorTab(rawValue: raw) + else { return .terminal } return tab } /// Currently-selected run profile in the toolbar picker. Persisted only in @@ -177,12 +270,16 @@ public final class WindowState { /// Observed by `RightInspectorPanel`; the value itself is meaningless — only the change matters. public var clearTerminalRequest: UUID? public var inspectorReviewTab: InspectorReviewTab = WindowState.loadInspectorReviewTab() { - didSet { UserDefaults.standard.set(inspectorReviewTab.rawValue, forKey: WindowState.inspectorReviewTabKey) } + didSet { + UserDefaults.standard.set( + inspectorReviewTab.rawValue, forKey: WindowState.inspectorReviewTabKey) + } } private static let inspectorReviewTabKey = "inspectorReviewTab" private static func loadInspectorReviewTab() -> InspectorReviewTab { guard let raw = UserDefaults.standard.string(forKey: inspectorReviewTabKey), - let tab = InspectorReviewTab(rawValue: raw) else { return .thisThread } + let tab = InspectorReviewTab(rawValue: raw) + else { return .thisThread } return tab } public var inspectorFile: PreviewFile? diff --git a/Packages/Sources/RxCodeSync/Protocol/Payload+Sessions.swift b/Packages/Sources/RxCodeSync/Protocol/Payload+Sessions.swift index 185ac1df..cdf2e409 100644 --- a/Packages/Sources/RxCodeSync/Protocol/Payload+Sessions.swift +++ b/Packages/Sources/RxCodeSync/Protocol/Payload+Sessions.swift @@ -389,12 +389,22 @@ public struct SyncFileEdit: Codable, Sendable, Identifiable { /// True if any contributing tool was Write — old content was overwritten. public let containsWrite: Bool public let hunks: [SyncEditHunk] + /// Optional full-file before/after diff for mobile detail views. Older + /// desktop builds omit this and mobile falls back to `hunks`. + public let fullFileDiff: String? - public init(path: String, name: String, containsWrite: Bool, hunks: [SyncEditHunk]) { + public init( + path: String, + name: String, + containsWrite: Bool, + hunks: [SyncEditHunk], + fullFileDiff: String? = nil + ) { self.path = path self.name = name self.containsWrite = containsWrite self.hunks = hunks + self.fullFileDiff = fullFileDiff } } @@ -639,4 +649,3 @@ public struct PongPayload: Codable, Sendable { public let t: Date public init(t: Date = .now) { self.t = t } } - diff --git a/Packages/Tests/MessageListTests/MessageListPinnedTurnSwiftUITests.swift b/Packages/Tests/MessageListTests/MessageListPinnedTurnSwiftUITests.swift new file mode 100644 index 00000000..c115ba20 --- /dev/null +++ b/Packages/Tests/MessageListTests/MessageListPinnedTurnSwiftUITests.swift @@ -0,0 +1,96 @@ +#if os(macOS) +import SwiftUI +import Testing +import ViewInspector +@testable import MessageList + +@MainActor +@Suite("MessageList pinned turn SwiftUI behavior") +struct MessageListPinnedTurnSwiftUITests { + @Test("Pinned user message releases when streaming content fills the reserved space") + func pinnedUserMessageReleasesWhenStreamingContentFillsReservedSpace() async throws { + let model = MessageListPinnedTurnModel() + let view = MessageListPinnedTurnHarness(model: model) + + ViewHosting.host( + view: view, + size: CGSize(width: 260, height: 180), + function: #function + ) + defer { ViewHosting.expel(function: #function) } + + model.messages = [ + .init(text: "user", isUserMessage: true, height: 44), + ] + + try await Task.sleep(for: .milliseconds(450)) + model.shouldObserveRelease = true + model.messages.append(contentsOf: [ + .init(text: "assistant 1", isUserMessage: false, height: 88), + .init(text: "assistant 2", isUserMessage: false, height: 88), + .init(text: "assistant 3", isUserMessage: false, height: 88), + ]) + + try await waitUntil(timeout: .seconds(2)) { + model.observedBottomRelease + } + + #expect(model.isAtBottom) + } +} + +@MainActor +private final class MessageListPinnedTurnModel: ObservableObject { + @Published var messages: [MessageListPinnedTurnMessage] = [] + @Published var isAtBottom = false + var shouldObserveRelease = false + var observedBottomRelease = false + + func updateIsAtBottom(_ value: Bool) { + isAtBottom = value + if shouldObserveRelease, value { + observedBottomRelease = true + } + } +} + +private struct MessageListPinnedTurnHarness: View { + @ObservedObject var model: MessageListPinnedTurnModel + + var body: some View { + MessageList( + messages: model.messages, + isStreaming: true, + isAtBottom: Binding( + get: { model.isAtBottom }, + set: { model.updateIsAtBottom($0) } + ) + ) { message in + Text(message.text) + .frame(maxWidth: .infinity, minHeight: message.height, alignment: .leading) + } + } +} + +private struct MessageListPinnedTurnMessage: MessageListItem { + let id = UUID() + let text: String + let isUserMessage: Bool + let height: CGFloat +} + +private func waitUntil( + timeout: Duration, + interval: Duration = .milliseconds(20), + condition: @MainActor @escaping () -> Bool +) async throws { + let start = ContinuousClock.now + while !(await condition()) { + if ContinuousClock.now - start >= timeout { + Issue.record("Timed out waiting for condition") + return + } + try await Task.sleep(for: interval) + } +} +#endif diff --git a/Packages/Tests/RxCodeChatKitTests/ChangeDiffViewTests.swift b/Packages/Tests/RxCodeChatKitTests/ChangeDiffViewTests.swift new file mode 100644 index 00000000..ba1ff4ed --- /dev/null +++ b/Packages/Tests/RxCodeChatKitTests/ChangeDiffViewTests.swift @@ -0,0 +1,33 @@ +import Testing +import SwiftUI +import ViewInspector +import RxCodeCore +@testable import RxCodeChatKit + +@MainActor +@Suite("ChangeDiffView rendering") +struct ChangeDiffViewTests { + @Test("unified diff rows render a line number gutter") + func unifiedDiffRowsRenderLineNumbers() throws { + let view = ChangeDiffView(unifiedDiff: " one\n+two\n-three") + let strings = try view.inspect().findAll(ViewType.Text.self).compactMap { try? $0.string() } + + #expect(strings.contains("1")) + #expect(strings.contains("2")) + #expect(strings.contains("3")) + #expect(strings.contains("+two")) + } + + @Test("hunk diff rows render a line number gutter") + func hunkDiffRowsRenderLineNumbers() throws { + let view = ChangeDiffView(hunks: [ + PreviewFile.EditHunk(oldString: "old", newString: "new") + ]) + let strings = try view.inspect().findAll(ViewType.Text.self).compactMap { try? $0.string() } + + #expect(strings.contains("1")) + #expect(strings.contains("2")) + #expect(strings.contains("- old")) + #expect(strings.contains("+ new")) + } +} diff --git a/Packages/Tests/RxCodeChatKitTests/FileDiffViewTests.swift b/Packages/Tests/RxCodeChatKitTests/FileDiffViewTests.swift new file mode 100644 index 00000000..6b1063da --- /dev/null +++ b/Packages/Tests/RxCodeChatKitTests/FileDiffViewTests.swift @@ -0,0 +1,151 @@ +import Testing +import RxCodeCore +@testable import RxCodeChatKit + +@Suite("FileDiffView diff building") +@MainActor +struct FileDiffViewTests { + @Test("full-file edit diff includes unchanged context") + func fullFileEditDiffIncludesContext() { + let hunk = PreviewFile.EditHunk(oldString: "two", newString: "TWO") + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: "one\nTWO\nthree\n", + hunks: [hunk] + ) + + #expect(lines.map(\.text) == [ + " one", + "-two", + "+TWO", + " three", + ]) + } + + @Test("full-file edit diff reconstructs multiple edits in reverse order") + func fullFileEditDiffReconstructsMultipleEdits() { + let hunks = [ + PreviewFile.EditHunk(oldString: "alpha", newString: "ALPHA"), + PreviewFile.EditHunk(oldString: "gamma", newString: "GAMMA"), + ] + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: "ALPHA\nbeta\nGAMMA\n", + hunks: hunks + ) + + #expect(lines.map(\.text) == [ + "-alpha", + "+ALPHA", + " beta", + "-gamma", + "+GAMMA", + ]) + } + + @Test("full-file edit diff shows orphan change when reconstruction fails") + func fullFileEditDiffShowsOrphanWhenReconstructionFails() { + let hunk = PreviewFile.EditHunk(oldString: "before", newString: "after") + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: "import SwiftUI\n\nstruct Example {}\n", + hunks: [hunk] + ) + + #expect(lines.map(\.text) == [ + "@@ unmatched change @@", + "-before", + "+after", + " import SwiftUI", + " ", + " struct Example {}", + ]) + } + + @Test("full-file edit diff shows pure deletion as orphan above full file") + func fullFileEditDiffShowsPureDeletionAsOrphan() { + // Pure deletion: hunk removes a line, replacing it with empty. + // The current file no longer contains the removed line, so we can't + // anchor it inline — it's surfaced as an orphan change at the top. + let hunk = PreviewFile.EditHunk( + oldString: " guard Self.hasExplicitMemoryIntent(userMessage) else { return }", + newString: "" + ) + let current = " let userMessage = lastUserMessageText(in: messages)\n let finalResponse = lastAssistantResponseText(in: messages)\n let sourceMessageId = nil\n" + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: current, + hunks: [hunk] + ) + + #expect(lines.map(\.text) == [ + "@@ unmatched change @@", + "- guard Self.hasExplicitMemoryIntent(userMessage) else { return }", + " let userMessage = lastUserMessageText(in: messages)", + " let finalResponse = lastAssistantResponseText(in: messages)", + " let sourceMessageId = nil", + ]) + } + + @Test("full-file edit diff renders a Write as all-added lines") + func fullFileEditDiffRendersWriteAsAllAdded() { + // Write tool surfaces as a single hunk with empty oldString and the + // entire file as newString. Reverse-applied this clears the + // reconstructed pre-edit, so every current line shows as `+`. + let content = "line one\nline two\nline three\n" + let hunk = PreviewFile.EditHunk(oldString: "", newString: content) + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: content, + hunks: [hunk] + ) + + #expect(lines.map(\.text) == [ + "+line one", + "+line two", + "+line three", + ]) + } + + @Test("snapshot diff renders exact changes between pre and post snapshots") + func snapshotDiffRendersExactChanges() { + // The new snapshot-based path doesn't reverse-apply hunks — it just + // diffs two full-file strings. Every line that differs shows up as + // -/+, every shared line as context. No orphan headers. + let original = "alpha\nbeta\ngamma\n" + let current = "alpha\nBETA\ngamma\ndelta\n" + let lines = FileDiffView.buildSnapshotDiffLines( + original: original, + current: current + ) + + #expect(lines.map(\.text) == [ + " alpha", + "-beta", + "+BETA", + " gamma", + "+delta", + ]) + // Old line numbers should track positions in the original snapshot. + #expect(lines.map(\.oldLineNumber) == [1, 2, nil, 3, nil]) + // New line numbers should track positions in the current file. + #expect(lines.map(\.newLineNumber) == [1, nil, 2, 3, 4]) + } + + @Test("full-file edit diff renders an addition with surrounding context") + func fullFileEditDiffRendersAdditionWithContext() { + // Realistic Edit hunk shape: oldString and newString both include the + // anchor line so the replacement is unique. The diff shows the new + // line inserted between alpha and beta. + let hunk = PreviewFile.EditHunk( + oldString: "alpha\nbeta", + newString: "alpha\n// inserted comment\nbeta" + ) + let current = "alpha\n// inserted comment\nbeta\n" + let lines = FileDiffView.buildFullFileEditDiffLines( + currentContent: current, + hunks: [hunk] + ) + + #expect(lines.map(\.text) == [ + " alpha", + "+// inserted comment", + " beta", + ]) + } +} diff --git a/Packages/Tests/RxCodeChatKitTests/MCPToolResultViewTests.swift b/Packages/Tests/RxCodeChatKitTests/MCPToolResultViewTests.swift new file mode 100644 index 00000000..813ed06d --- /dev/null +++ b/Packages/Tests/RxCodeChatKitTests/MCPToolResultViewTests.swift @@ -0,0 +1,84 @@ +import Testing +import SwiftUI +import ViewInspector +import RxCodeCore +@testable import RxCodeChatKit + +@MainActor +@Suite("MCP tool result view") +struct MCPToolResultViewTests { + + private struct Host: View { + let window = WindowState() + let toolCall: ToolCall + + var body: some View { + ToolResultView(toolCall: toolCall, isMessageStreaming: false) + .environment(window) + } + } + + @Test("Tapping an MCP row is handled and the detail sheet renders JSON params and result") + func tappingMCPRowAndRenderingDetailSheet() throws { + let toolCall = makeMCPToolCall() + let view = Host(toolCall: toolCall) + ViewHosting.host(view: view) + defer { ViewHosting.expel() } + + try view.inspect().find(ViewType.Button.self).tap() + + let detail = MCPToolDetailSheet(toolCall: toolCall) + let labels = try detail.inspect().findAll(ViewType.Text.self).compactMap { try? $0.string() } + + #expect(labels.contains("Call Params")) + #expect(labels.contains("Result")) + #expect(labels.contains { $0.contains("\"query\"") }) + #expect(labels.contains { $0.contains("\"ok\"") }) + } + + @Test("MCP detail sheet renders inside a narrow host") + func detailSheetRendersInsideNarrowHost() throws { + let detail = MCPToolDetailSheet(toolCall: makeMCPToolCall()) + .frame(width: 320, height: 560) + ViewHosting.host(view: detail) + defer { ViewHosting.expel() } + + let labels = try detail.inspect().findAll(ViewType.Text.self).compactMap { try? $0.string() } + + #expect(labels.contains("MCP tool call")) + #expect(labels.contains("Completed")) + #expect(labels.contains("Call Params")) + #expect(labels.contains("Result")) + } + +#if os(iOS) + @Test("MCP row opens from the compact mobile chat bubble") + func compactMobileBubbleOpensMCPRow() throws { + let toolCall = makeMCPToolCall() + let message = ChatMessage(role: .assistant, blocks: [.toolCall(toolCall)], isStreaming: false) + let view = ChatMessageBubble(message: message) + ViewHosting.host(view: view) + defer { ViewHosting.expel() } + + try view.inspect().find(ViewType.Button.self).tap() + + let detail = MCPToolDetailSheet(toolCall: toolCall) + let labels = try detail.inspect().findAll(ViewType.Text.self).compactMap { try? $0.string() } + #expect(labels.contains("Call Params")) + #expect(labels.contains("Result")) + } +#endif + + private func makeMCPToolCall() -> ToolCall { + ToolCall( + id: "mcp-1", + name: "mcpToolCall", + input: [ + "query": .string("saved preferences"), + "limit": .number(10) + ], + result: #"{"ok":true,"items":[]}"#, + isError: false + ) + } +} diff --git a/Packages/Tests/RxCodeChatKitTests/ToolResultViewDiffTests.swift b/Packages/Tests/RxCodeChatKitTests/ToolResultViewDiffTests.swift new file mode 100644 index 00000000..d7b21249 --- /dev/null +++ b/Packages/Tests/RxCodeChatKitTests/ToolResultViewDiffTests.swift @@ -0,0 +1,24 @@ +import Testing +import RxCodeCore +@testable import RxCodeChatKit + +@Suite("ToolResultView diff links") +struct ToolResultViewDiffTests { + @Test("edit diff links open full-file diff mode") + func editDiffLinksOpenFullFileDiffMode() { + let hunks = [ + PreviewFile.EditHunk(oldString: "let value = 1", newString: "let value = 2") + ] + + let file = ToolResultView.editDiffPreviewFile( + path: "/tmp/example.swift", + name: "example.swift", + hunks: hunks + ) + + #expect(file.path == "/tmp/example.swift") + #expect(file.name == "example.swift") + #expect(file.editHunks == hunks) + #expect(file.showFullFileDiff == true) + } +} diff --git a/Packages/Tests/RxCodeCoreTests/LocalizedEnumLabelTests.swift b/Packages/Tests/RxCodeCoreTests/LocalizedEnumLabelTests.swift new file mode 100644 index 00000000..f2fed77b --- /dev/null +++ b/Packages/Tests/RxCodeCoreTests/LocalizedEnumLabelTests.swift @@ -0,0 +1,41 @@ +import Foundation +import Testing +@testable import RxCodeCore + +@Suite("Localized enum labels") +struct LocalizedEnumLabelTests { + @Test("Permission mode labels localize through resource helpers") + func permissionModeLabels() { + #expect(PermissionMode.default.displayNameText == String(localized: PermissionMode.default.displayName)) + #expect(PermissionMode.acceptEdits.displayNameText == "Accept Edits") + #expect(PermissionMode.bypassPermissions.displayNameText == "Bypass") + } + + @Test("Agent provider labels keep localized text helpers for payload strings") + func agentProviderLabels() { + #expect(AgentProvider.claudeCode.displayNameText == String(localized: AgentProvider.claudeCode.displayName)) + #expect(AgentProvider.codex.displayNameText == "Codex") + #expect(AgentProvider.acp.displayNameText == "ACP") + } + + @Test("Inspector labels do not rely on persisted raw values for display") + func inspectorLabels() { + #expect(InspectorTab.memo.titleText == String(localized: InspectorTab.memo.title)) + #expect(InspectorReviewTab.thisThread.titleText == "This thread") + #expect(InspectorMode.inspector.titleText == "Inspector") + } + + @Test("MCP enum labels expose localized resources and text fallbacks") + func mcpLabels() { + #expect(MCPScope.user.displayNameText == String(localized: MCPScope.user.displayName)) + #expect(MCPScope.local.subtitleText == "This project, this machine only") + #expect(MCPProjectOverride.enabled.displayNameText == "On") + #expect(MCPTransport.http.displayNameText == "HTTP") + } + + @Test("Theme labels expose localized resources and text fallbacks") + func themeLabels() { + #expect(AppTheme.claude.displayNameText == String(localized: AppTheme.claude.displayName)) + #expect(AppTheme.ocean.displayNameText == "Ocean (Blue)") + } +} diff --git a/Packages/Tests/RxCodeCoreTests/MCPToolCallTests.swift b/Packages/Tests/RxCodeCoreTests/MCPToolCallTests.swift new file mode 100644 index 00000000..813c54ae --- /dev/null +++ b/Packages/Tests/RxCodeCoreTests/MCPToolCallTests.swift @@ -0,0 +1,28 @@ +import Testing +@testable import RxCodeCore + +@Suite("MCP tool calls") +struct MCPToolCallTests { + + @Test("Generic Codex MCP tool calls are categorized as MCP") + func genericCodexMCPToolCallCategory() { + #expect(ToolCategory(toolName: "mcpToolCall") == .mcp) + } + + @Test("Completed MCP calls with empty output are retained") + func emptySuccessfulMCPResultIsRetained() { + var message = ChatMessage(role: .assistant) + message.appendToolCall(ToolCall( + id: "mcp-1", + name: "mcpToolCall", + input: ["query": .string("saved preferences")] + )) + + message.setToolResult(id: "mcp-1", result: "", isError: false) + message.finalizeToolCalls() + + #expect(message.toolCalls.count == 1) + #expect(message.toolCalls.first?.isError == false) + #expect(message.toolCalls.first?.result == "") + } +} diff --git a/Packages/Tests/RxCodeCoreTests/RightInspectorPanelLayoutTests.swift b/Packages/Tests/RxCodeCoreTests/RightInspectorPanelLayoutTests.swift new file mode 100644 index 00000000..8441bf73 --- /dev/null +++ b/Packages/Tests/RxCodeCoreTests/RightInspectorPanelLayoutTests.swift @@ -0,0 +1,101 @@ +import CoreGraphics +import XCTest +@testable import RxCodeCore + +final class RightInspectorPanelLayoutTests: XCTestCase { + func testRestoredWidthUsesStoredVisibleWidth() { + let restored = RightInspectorPanelLayout.restoredWidth(from: 680, maxAllowedWidth: 900) + + XCTAssertEqual(restored, 680) + } + + func testRestoredWidthFallsBackForInvalidStoredWidth() { + XCTAssertEqual( + RightInspectorPanelLayout.restoredWidth(from: 0), + CGFloat(RightInspectorPanelLayout.defaultWidth) + ) + XCTAssertEqual( + RightInspectorPanelLayout.restoredWidth(from: RightInspectorPanelLayout.minimumWidth - 1), + CGFloat(RightInspectorPanelLayout.defaultWidth) + ) + XCTAssertEqual( + RightInspectorPanelLayout.restoredWidth(from: .infinity), + CGFloat(RightInspectorPanelLayout.defaultWidth) + ) + } + + func testRestoredWidthClampsToAvailableSpace() { + XCTAssertEqual( + RightInspectorPanelLayout.restoredWidth(from: 1_000, maxAllowedWidth: 720), + 720 + ) + XCTAssertEqual( + RightInspectorPanelLayout.restoredWidth(from: 1_000, maxAllowedWidth: 200), + CGFloat(RightInspectorPanelLayout.minimumWidth) + ) + } + + func testPersistedWidthStoresOnlyVisiblePanelWidths() { + XCTAssertEqual( + RightInspectorPanelLayout.persistedWidth(from: 640, isVisible: true), + 640 + ) + XCTAssertNil( + RightInspectorPanelLayout.persistedWidth(from: 640, isVisible: false), + "Hidden split-view measurements must not overwrite the saved inspector width." + ) + XCTAssertNil( + RightInspectorPanelLayout.persistedWidth(from: 0, isVisible: true), + "Collapsed measurements must not overwrite the saved inspector width." + ) + XCTAssertNil( + RightInspectorPanelLayout.persistedWidth(from: CGFloat.infinity, isVisible: true) + ) + } + + func testMaximumWidthLeavesRoomForMainContent() { + XCTAssertEqual( + RightInspectorPanelLayout.maximumWidth(in: 1_400), + 920 + ) + XCTAssertEqual( + RightInspectorPanelLayout.maximumWidth(in: 500), + CGFloat(RightInspectorPanelLayout.minimumWidth) + ) + } + + func testResizedWidthUsesLeadingEdgeDragDirectionAndClamps() { + XCTAssertEqual( + RightInspectorPanelLayout.resizedWidth( + startWidth: 640, + leadingEdgeTranslation: -80, + maxAllowedWidth: 900 + ), + 720 + ) + XCTAssertEqual( + RightInspectorPanelLayout.resizedWidth( + startWidth: 640, + leadingEdgeTranslation: 80, + maxAllowedWidth: 900 + ), + 560 + ) + XCTAssertEqual( + RightInspectorPanelLayout.resizedWidth( + startWidth: 640, + leadingEdgeTranslation: 400, + maxAllowedWidth: 900 + ), + RightInspectorPanelLayout.minimumWidth + ) + XCTAssertEqual( + RightInspectorPanelLayout.resizedWidth( + startWidth: 640, + leadingEdgeTranslation: -400, + maxAllowedWidth: 900 + ), + 900 + ) + } +} diff --git a/Packages/Tests/RxCodeCoreTests/SyntaxHighlighterTests.swift b/Packages/Tests/RxCodeCoreTests/SyntaxHighlighterTests.swift new file mode 100644 index 00000000..58f254c3 --- /dev/null +++ b/Packages/Tests/RxCodeCoreTests/SyntaxHighlighterTests.swift @@ -0,0 +1,18 @@ +import Testing +@testable import RxCodeCore + +@Suite("Syntax highlighter") +struct SyntaxHighlighterTests { + @Test("Handles unterminated strings ending with an escape") + func handlesUnterminatedStringsEndingWithEscape() { + let cases = [ + "let single = 'value\\", + "let double = \"value\\", + "let triple = \"\"\"value\\", + ] + + for source in cases { + #expect(SyntaxHighlighter.highlightNS(source, language: "swift").string == source) + } + } +} diff --git a/Packages/Tests/RxCodeSyncTests/PayloadTests.swift b/Packages/Tests/RxCodeSyncTests/PayloadTests.swift index 8c0ddc7f..082f21bb 100644 --- a/Packages/Tests/RxCodeSyncTests/PayloadTests.swift +++ b/Packages/Tests/RxCodeSyncTests/PayloadTests.swift @@ -5,6 +5,55 @@ import RxCodeCore @Suite("Mobile sync payloads") struct PayloadTests { + @Test("thread changes carry optional full-file diff") + func threadChangesCarryFullFileDiff() throws { + let payload = Payload.threadChangesResult( + ThreadChangesResultPayload( + clientRequestID: UUID(uuidString: "11111111-2222-3333-4444-555555555555")!, + sessionID: "thread-1", + ok: true, + turnEdits: [ + SyncFileEdit( + path: "/tmp/example.swift", + name: "example.swift", + containsWrite: false, + hunks: [SyncEditHunk(oldString: "old", newString: "new")], + fullFileDiff: "--- before\n+++ after\n@@ full file @@\n-old\n+new" + ) + ], + uncommitted: [] + ) + ) + + let data = try JSONEncoder().encode(payload) + let decoded = try JSONDecoder().decode(Payload.self, from: data) + guard case .threadChangesResult(let result) = decoded else { + Issue.record("Expected thread changes result payload") + return + } + + #expect(result.turnEdits.first?.fullFileDiff?.contains("@@ full file @@") == true) + } + + @Test("thread changes decode when full-file diff is absent") + func threadChangesDecodeWithoutFullFileDiff() throws { + let json = """ + { + "path": "/tmp/example.swift", + "name": "example.swift", + "containsWrite": false, + "hunks": [ + { "oldString": "old", "newString": "new" } + ] + } + """.data(using: .utf8)! + + let decoded = try JSONDecoder().decode(SyncFileEdit.self, from: json) + + #expect(decoded.fullFileDiff == nil) + #expect(decoded.hunks.first?.newString == "new") + } + @Test("pair request carries APNs environment") func pairRequestCarriesAPNsEnvironment() throws { let payload = Payload.pairRequest( diff --git a/RxCode.xcodeproj/project.pbxproj b/RxCode.xcodeproj/project.pbxproj index 5969cea5..616dd7a6 100644 --- a/RxCode.xcodeproj/project.pbxproj +++ b/RxCode.xcodeproj/project.pbxproj @@ -8,11 +8,15 @@ /* Begin PBXBuildFile section */ 101010102FCB100000000002 /* AppStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101010102FCB100000000001 /* AppStateTests.swift */; }; + 101010112FCB100000000002 /* BranchBriefingPromptContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101010112FCB100000000001 /* BranchBriefingPromptContextTests.swift */; }; 33993F0F87CF4DB09F2813A8 /* AppStateProjectSwitchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4381E755142272EB2DAA9C96 /* AppStateProjectSwitchTests.swift */; }; + 5C2222222FCB200000000002 /* BriefingThreadRowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2222222FCB200000000001 /* BriefingThreadRowTests.swift */; }; + 5C3333332FCB400000000002 /* ThreadStoreThreadSummaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3333332FCB400000000001 /* ThreadStoreThreadSummaryTests.swift */; }; 6E17B0012FC8000100A10001 /* LocalAIProviderAcceptanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E17B0002FC8000100A10001 /* LocalAIProviderAcceptanceTests.swift */; }; 92E180F9B311F3C72D5DE6B7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9993BB72A5307039A88B729 /* Cocoa.framework */; }; DCA8CF4A05C959C4A6EB391F /* RxCodeCore in Frameworks */ = {isa = PBXBuildFile; productRef = CCDF9594876099576D4FD46E /* RxCodeCore */; }; DF06CCD12FB4CAB5005991E1 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = DF06CCD02FB4CAB5005991E1 /* ViewInspector */; }; + DF06CCD22FCB3001005991E1 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = DF06CCD02FB4CAB5005991E1 /* ViewInspector */; }; DF06DCC72FB8552B005991E1 /* UnitTestPlan.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = DF06DCC62FB8552B005991E1 /* UnitTestPlan.xctestplan */; }; DF22D8282FBE025C00E3ABFD /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF22D8272FBE025C00E3ABFD /* WidgetKit.framework */; }; DF22D82A2FBE025C00E3ABFD /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF22D8292FBE025C00E3ABFD /* SwiftUI.framework */; }; @@ -102,7 +106,10 @@ /* Begin PBXFileReference section */ 101010102FCB100000000001 /* AppStateTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppStateTests.swift; sourceTree = ""; }; + 101010112FCB100000000001 /* BranchBriefingPromptContextTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BranchBriefingPromptContextTests.swift; sourceTree = ""; }; 4381E755142272EB2DAA9C96 /* AppStateProjectSwitchTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppStateProjectSwitchTests.swift; sourceTree = ""; }; + 5C2222222FCB200000000001 /* BriefingThreadRowTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BriefingThreadRowTests.swift; sourceTree = ""; }; + 5C3333332FCB400000000001 /* ThreadStoreThreadSummaryTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ThreadStoreThreadSummaryTests.swift; sourceTree = ""; }; 6E17B0002FC8000100A10001 /* LocalAIProviderAcceptanceTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LocalAIProviderAcceptanceTests.swift; sourceTree = ""; }; 6E17B0032FC8000100A10001 /* RxCodeUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxCodeUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6E17B00D2FC8000100A10001 /* UITestplan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UITestplan.xctestplan; sourceTree = ""; }; @@ -119,6 +126,7 @@ DF23F7352FB8C3EC008929A6 /* icon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = icon.icon; sourceTree = ""; }; DF5B0DDA2FC023BE000CE36F /* MobileUITestPlan-iPhone.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "MobileUITestPlan-iPhone.xctestplan"; sourceTree = ""; }; DF5B0DDC2FC023C8000CE36F /* MobileUITestPlan-iPad.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "MobileUITestPlan-iPad.xctestplan"; sourceTree = ""; }; + DF5B0DDE2FCB300100CE36F /* MobileUnitTestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = MobileUnitTestPlan.xctestplan; sourceTree = ""; }; DFA0CCC02FB4CC01005991E1 /* PlanDecisionTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PlanDecisionTests.swift; sourceTree = ""; }; DFA0CCC12FB4CC01005991E1 /* PlanCardViewTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PlanCardViewTests.swift; sourceTree = ""; }; DFA0CCD52FB4CC02005991E1 /* HistoryListArchiveFilterTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HistoryListArchiveFilterTests.swift; sourceTree = ""; }; @@ -243,6 +251,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DF06CCD22FCB3001005991E1 /* ViewInspector in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -284,12 +293,15 @@ isa = PBXGroup; children = ( 101010102FCB100000000001 /* AppStateTests.swift */, + 101010112FCB100000000001 /* BranchBriefingPromptContextTests.swift */, 4381E755142272EB2DAA9C96 /* AppStateProjectSwitchTests.swift */, DFA0CCC02FB4CC01005991E1 /* PlanDecisionTests.swift */, DFA0CCC12FB4CC01005991E1 /* PlanCardViewTests.swift */, - DFA0CCD52FB4CC02005991E1 /* HistoryListArchiveFilterTests.swift */, - E62000002FCB000100000001 /* MemoryIntentTests.swift */, - ); + DFA0CCD52FB4CC02005991E1 /* HistoryListArchiveFilterTests.swift */, + 5C2222222FCB200000000001 /* BriefingThreadRowTests.swift */, + 5C3333332FCB400000000001 /* ThreadStoreThreadSummaryTests.swift */, + E62000002FCB000100000001 /* MemoryIntentTests.swift */, + ); path = RxCodeTests; sourceTree = ""; }; @@ -325,6 +337,7 @@ DF23F7352FB8C3EC008929A6 /* icon.icon */, DF5B0DDC2FC023C8000CE36F /* MobileUITestPlan-iPad.xctestplan */, DF5B0DDA2FC023BE000CE36F /* MobileUITestPlan-iPhone.xctestplan */, + DF5B0DDE2FCB300100CE36F /* MobileUnitTestPlan.xctestplan */, DF06DCC62FB8552B005991E1 /* UnitTestPlan.xctestplan */, 6E17B00D2FC8000100A10001 /* UITestplan.xctestplan */, E673353A2F7356F600FD26C7 /* RxCode */, @@ -469,6 +482,7 @@ ); name = RxCodeMobileTests; packageProductDependencies = ( + DF06CCD02FB4CAB5005991E1 /* ViewInspector */, ); productName = RxCodeMobileTests; productReference = DF230B5F2FBC7368008929A6 /* RxCodeMobileTests.xctest */; @@ -694,12 +708,15 @@ buildActionMask = 2147483647; files = ( 101010102FCB100000000002 /* AppStateTests.swift in Sources */, + 101010112FCB100000000002 /* BranchBriefingPromptContextTests.swift in Sources */, 33993F0F87CF4DB09F2813A8 /* AppStateProjectSwitchTests.swift in Sources */, DFA0CCD12FB4CC01005991E1 /* PlanDecisionTests.swift in Sources */, - DFA0CCD22FB4CC01005991E1 /* PlanCardViewTests.swift in Sources */, - DFA0CCE12FB4CC02005991E1 /* HistoryListArchiveFilterTests.swift in Sources */, - E62000012FCB000100000001 /* MemoryIntentTests.swift in Sources */, - ); + DFA0CCD22FB4CC01005991E1 /* PlanCardViewTests.swift in Sources */, + DFA0CCE12FB4CC02005991E1 /* HistoryListArchiveFilterTests.swift in Sources */, + 5C2222222FCB200000000002 /* BriefingThreadRowTests.swift in Sources */, + 5C3333332FCB400000000002 /* ThreadStoreThreadSummaryTests.swift in Sources */, + E62000012FCB000100000001 /* MemoryIntentTests.swift in Sources */, + ); runOnlyForDeploymentPostprocessing = 0; }; DF22D8222FBE025C00E3ABFD /* Sources */ = { diff --git a/RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme b/RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme index 958bdcb3..eb5f1178 100644 --- a/RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme +++ b/RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme @@ -36,6 +36,9 @@ + + [MemoryItem] { + func systemPromptMemoryItems(projectId: UUID?, provider: AgentProvider, model: String?) async -> [MemoryItem] { let items = await memoryService.allMemories() - return items.filter { item in + var injected: [MemoryItem] = [] + for item in items { if let memoryProjectId = item.projectId { - guard memoryProjectId == projectId else { return false } + guard memoryProjectId == projectId else { continue } } - return Self.shouldInjectMemoryIntoSystemPrompt(item) + if await shouldInjectMemoryIntoSystemPrompt(item, provider: provider, model: model) { + injected.append(item) + } + } + return injected + } + + func shouldInjectMemoryIntoSystemPrompt(_ item: MemoryItem, provider: AgentProvider, model: String?) async -> Bool { + let cacheKey = memoryInjectionIntentCacheKey(for: item, provider: provider, model: model) + if let cached = memoryInjectionIntentCache[cacheKey] { + return cached } + + let rawDecision = await generateMemoryInjectionIntent( + content: item.content, + kind: item.kind, + scope: item.scope, + provider: provider, + model: model + ) + let decision = Self.parseMemoryInjectionDecision(rawDecision) + ?? Self.fallbackShouldInjectMemoryIntoSystemPrompt(item) + memoryInjectionIntentCache[cacheKey] = decision + return decision } @discardableResult @@ -110,6 +133,70 @@ extension AppState { """ } + private func generateMemoryInjectionIntent( + content: String, + kind: String, + scope: String, + provider: AgentProvider, + model: String? + ) async -> String? { + switch summarizationProvider { + case .selectedClient: + let selectedModel = model ?? selectedSummarizationModel(for: provider) + switch provider { + case .claudeCode: + return await claude.determineMemoryInjectionIntent( + content: content, + kind: kind, + scope: scope, + model: selectedModel ?? "haiku" + ) + case .codex: + return await codex.determineMemoryInjectionIntent( + content: content, + kind: kind, + scope: scope, + model: selectedModel + ) + case .acp: + return nil + } + case .openAI: + guard !openAISummarizationModel.isEmpty else { return nil } + return await openAISummarization.determineMemoryInjectionIntent( + content: content, + kind: kind, + scope: scope, + endpoint: openAISummarizationEndpoint, + apiKey: openAISummarizationAPIKey, + model: openAISummarizationModel + ) + case .appleFoundationModel: + return await foundationModelSummarization.determineMemoryInjectionIntent( + content: content, + kind: kind, + scope: scope + ) + } + } + + private func memoryInjectionIntentCacheKey(for item: MemoryItem, provider: AgentProvider, model: String?) -> String { + [ + item.id, + item.updatedAt.timeIntervalSince1970.description, + item.kind, + item.scope, + item.content, + summarizationProvider.rawValue, + provider.rawValue, + model ?? "", + selectedAgentProvider.rawValue, + selectedModel, + openAISummarizationEndpoint, + openAISummarizationModel + ].joined(separator: "\u{1f}") + } + func scheduleMemoryExtraction( sessionId: String, projectId: UUID, @@ -119,7 +206,6 @@ extension AppState { let userMessage = lastUserMessageText(in: messages) let finalResponse = lastAssistantResponseText(in: messages) guard !userMessage.isEmpty, !finalResponse.isEmpty else { return } - guard Self.hasExplicitMemoryIntent(userMessage) else { return } let sourceMessageId = messages.last(where: { $0.role == .user && !$0.isError })?.id let summary = allSessionSummaries.first(where: { $0.id == sessionId }) ?? summaryFor(sessionId: sessionId, projectId: projectId) @@ -235,6 +321,19 @@ extension AppState { } } + static func parseMemoryInjectionDecision(_ raw: String?) -> Bool? { + guard let raw else { return nil } + let trimmed = stripJSONFence(raw) + .trimmingCharacters(in: .whitespacesAndNewlines) + .trimmingCharacters(in: CharacterSet(charactersIn: "\"'`")) + .lowercased() + if ["true", "yes", "inject"].contains(trimmed) { return true } + if ["false", "no", "skip"].contains(trimmed) { return false } + if trimmed.hasPrefix("true") { return true } + if trimmed.hasPrefix("false") { return false } + return nil + } + static func stripJSONFence(_ raw: String) -> String { var text = raw.trimmingCharacters(in: .whitespacesAndNewlines) if text.hasPrefix("```") { diff --git a/RxCode/App/AppState+CrossProject.swift b/RxCode/App/AppState+CrossProject.swift index d52be87d..48cb673f 100644 --- a/RxCode/App/AppState+CrossProject.swift +++ b/RxCode/App/AppState+CrossProject.swift @@ -187,6 +187,20 @@ extension AppState { """ } + static func promptWithBackgroundContext(_ contexts: [String], prompt: String) -> String { + let context = contexts + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + .joined(separator: "\n\n") + guard !context.isEmpty else { return prompt } + return """ + \(context) + + User request: + \(prompt) + """ + } + func processStream( streamId: UUID, prompt: String, @@ -235,13 +249,24 @@ extension AppState { let resolvedMemoryContext: String if memoryEnabled, memoryInjectEnabled { - let systemItems = await systemPromptMemoryItems(projectId: projectId) + let systemItems = await systemPromptMemoryItems(projectId: projectId, provider: agentProvider, model: model) let hits = await memoryService.search(prompt, projectId: projectId, limit: memoryMaxContextItems) resolvedMemoryContext = memoryContextSystemPrompt(systemItems: systemItems, relatedHits: hits) } else { resolvedMemoryContext = "" } + let branchBriefingContext: String + if let branch = await GitHelper.currentBranch(at: cwd), + let briefing = threadStore.branchBriefingItem(projectId: projectId, branch: branch) { + branchBriefingContext = Self.branchBriefingSystemPrompt( + branch: branch, + briefing: briefing.briefing + ) + } else { + branchBriefingContext = "" + } + switch agentProvider { case .claudeCode: // Allocate a per-session IDE-MCP port so the Claude agent can call @@ -256,13 +281,7 @@ extension AppState { mcpClaudeConfigPath = await mcp.writeClaudeConfig(projectPath: cwd, bridgeCommand: bridge) // Surface the accumulated briefing for the project's current branch // to the agent as background context via `--append-system-prompt`. - if let branch = await GitHelper.currentBranch(at: cwd), - let briefing = threadStore.branchBriefingItem(projectId: projectId, branch: branch) { - extraSystemPrompt = Self.branchBriefingSystemPrompt( - branch: branch, - briefing: briefing.briefing - ) - } + appendExtraSystemPrompt(branchBriefingContext) appendExtraSystemPrompt(resolvedMemoryContext) if let skillContext = await marketplace.promptContext(for: .claudeCode) { appendExtraSystemPrompt(skillContext) @@ -279,7 +298,10 @@ extension AppState { let bridge = idePort.map { IDEMCPServer.bridgeCommand(forPort: $0) } mcpCodexOverrides = await mcp.codexConfigOverrides(projectPath: cwd, bridgeCommand: bridge) mcpCodexOverrides += await marketplace.codexConfigOverrides() - resolvedPrompt = memoryContextPromptPrefix(for: resolvedMemoryContext, prompt: resolvedPrompt) + resolvedPrompt = Self.promptWithBackgroundContext( + [branchBriefingContext, resolvedMemoryContext], + prompt: resolvedPrompt + ) if let skillContext = await marketplace.promptContext(for: .codex) { resolvedPrompt = "\(skillContext)\n\nUser request:\n\(resolvedPrompt)" } @@ -298,7 +320,10 @@ extension AppState { projectPath: cwd, bridgeCommand: bridge ) - resolvedPrompt = memoryContextPromptPrefix(for: resolvedMemoryContext, prompt: resolvedPrompt) + resolvedPrompt = Self.promptWithBackgroundContext( + [branchBriefingContext, resolvedMemoryContext], + prompt: resolvedPrompt + ) if let skillContext = await marketplace.promptContext(for: .acp) { resolvedPrompt = "\(skillContext)\n\nUser request:\n\(resolvedPrompt)" } @@ -604,6 +629,19 @@ extension AppState { } case .toolUse(let id, let name, let input): state.isThinking = false + // Kick off a file-content snapshot before any Edit/Write + // tool actually runs. The detached read races with the + // CLI's file write — on typical small source files the + // read wins, giving us the true pre-edit state to diff + // against. The persistence step (in `flushPendingUpdates` + // when the tool_result lands) awaits this task, so we + // capture whatever the read produced even if it lost + // the race. + Self.captureEditingFileSnapshot( + toolName: name, + input: input, + state: &state + ) // Merge updates by id: ACP agents may re-emit the same toolUse // with additional input (e.g. diff content arriving via a // follow-up tool_call_update). Patch the existing block in @@ -695,7 +733,7 @@ extension AppState { window.currentSessionId = resultEvent.sessionId if resultEvent.isError { let errText = await consumeAgentStderr(agentProvider: agentProvider, streamId: streamId) - ?? "\(agentProvider.displayName) returned an error." + ?? "\(agentProvider.displayNameText) returned an error." addErrorMessage(errText, in: window) } } @@ -893,4 +931,45 @@ extension AppState { } } + // MARK: - Editing File Snapshot Capture + + /// Detects Edit/MultiEdit/Write tool_use events and kicks off a detached + /// read of every target file's current on-disk contents. The read result + /// is cached on `state.editingFileSnapshotTasks` keyed by absolute path, + /// and only the FIRST tool_use per (session, path) starts a read — later + /// edits in the same thread keep diffing against the original snapshot. + /// + /// Handles both the Claude/Anthropic shape (`file_path` in input) and the + /// Codex `changes: [{ path, diff }]` shape. Tools that don't touch files + /// (Bash, Read, etc.) are skipped. + nonisolated static func captureEditingFileSnapshot( + toolName: String, + input: [String: JSONValue], + state: inout SessionStreamState + ) { + let nameLower = toolName.lowercased() + let editToolNames: Set = ["edit", "multiedit", "multi_edit", "write"] + guard editToolNames.contains(nameLower) else { return } + + var paths: [String] = [] + if let path = input["file_path"]?.stringValue { + paths.append(path) + } + if nameLower == "edit", let changes = input["changes"]?.arrayValue { + for change in changes { + if let obj = change.objectValue, + let path = obj["path"]?.stringValue { + paths.append(path) + } + } + } + + for path in paths where state.editingFileSnapshotTasks[path] == nil { + let capturedPath = path + state.editingFileSnapshotTasks[path] = Task.detached(priority: .userInitiated) { + try? String(contentsOfFile: capturedPath, encoding: .utf8) + } + } + } + } diff --git a/RxCode/App/AppState+MemoryIntent.swift b/RxCode/App/AppState+MemoryIntent.swift index 61f994b6..012ca3bb 100644 --- a/RxCode/App/AppState+MemoryIntent.swift +++ b/RxCode/App/AppState+MemoryIntent.swift @@ -2,99 +2,12 @@ import Foundation import RxCodeCore extension AppState { - static func hasExplicitMemoryIntent(_ message: String) -> Bool { - let text = normalizedMemoryIntentText(message) - guard !text.isEmpty else { return false } - - return containsAny(text, phrases: explicitMemoryPhrases) - || containsAny(text, phrases: preferencePhrases) - || containsAny(text, phrases: futureInstructionPhrases) - } - - static func shouldAcceptAgentMemoryAdd(content: String, kind: String?) -> Bool { - let text = normalizedMemoryIntentText(content) - guard !text.isEmpty else { return false } - if hasExplicitMemoryIntent(content) { return true } - if containsAny(text, phrases: transientMemoryPhrases) { return false } - - switch kind?.lowercased() { - case "preference": - return true - default: - return false - } - } - - static func shouldInjectMemoryIntoSystemPrompt(_ item: MemoryItem) -> Bool { + static func fallbackShouldInjectMemoryIntoSystemPrompt(_ item: MemoryItem) -> Bool { if item.kind.lowercased() == "preference" { return true } let text = normalizedMemoryIntentText(item.content) return containsAny(text, phrases: systemPromptMemoryPhrases) } - private static let explicitMemoryPhrases = [ - "please remember", - "remember that", - "remember to", - "remember this", - "remember my", - "save this", - "save that", - "store this", - "store that", - "add this to memory", - "add that to memory", - "add to memory", - "keep this in memory", - "keep that in memory", - "memorize this", - "forget that", - "forget this", - "delete that memory", - "delete this memory", - "remove that memory", - "remove this memory", - "that memory is wrong", - "this memory is wrong", - "memory is wrong", - "no longer remember" - ] - - private static let preferencePhrases = [ - "i prefer", - "my preference is", - "my preferred", - "i like to", - "i don't like", - "i do not like", - "i want agents to", - "i want codex to", - "i want the agent to", - "i want you to always", - "i want you to never", - "the user prefers", - "user prefers" - ] - - private static let futureInstructionPhrases = [ - "from now on", - "going forward", - "in the future", - "next time", - "next time you", - "for future", - "in future", - "always use", - "always do", - "always ask", - "always run", - "never use", - "never do", - "never ask", - "never run", - "by default", - "default to" - ] - private static let systemPromptMemoryPhrases = [ "always", "never", @@ -108,23 +21,6 @@ extension AppState { "default to" ] - private static let transientMemoryPhrases = [ - "0 errors", - "0 warnings", - "added ", - "build successfully", - "builds successfully", - "deleted ", - "fixed ", - "i have access", - "implemented ", - "make lint", - "removed ", - "script removed", - "untracked", - "works" - ] - private static func normalizedMemoryIntentText(_ value: String) -> String { value.lowercased() .components(separatedBy: .whitespacesAndNewlines) diff --git a/RxCode/App/AppState+MobileSnapshots.swift b/RxCode/App/AppState+MobileSnapshots.swift index 187dcd39..4f6eace9 100644 --- a/RxCode/App/AppState+MobileSnapshots.swift +++ b/RxCode/App/AppState+MobileSnapshots.swift @@ -450,7 +450,7 @@ extension AppState { selectedEffort: selectedEffort, permissionMode: permissionMode, summarizationProvider: summarizationProvider.rawValue, - summarizationProviderDisplayName: summarizationProvider.displayName, + summarizationProviderDisplayName: summarizationProvider.displayNameText, openAISummarizationEndpoint: openAISummarizationEndpoint, openAISummarizationModel: openAISummarizationModel, notificationsEnabled: notificationsEnabled, @@ -462,7 +462,7 @@ extension AppState { availableModels: models, modelSections: sections, availableSummarizationProviders: SummarizationProvider.availableCases.map { - SummarizationProviderOption(id: $0.rawValue, displayName: $0.displayName) + SummarizationProviderOption(id: $0.rawValue, displayName: $0.displayNameText) }, openAISummarizationModels: openAISummarizationModels ) @@ -714,16 +714,32 @@ extension AppState { let resolvedID = resolveCurrentSessionId(request.sessionID) // This Turn: every file edited in the thread session (SwiftData history). - let turnEdits = threadStore.fetchFileEdits(sessionId: resolvedID).map { edit -> SyncFileEdit in - let summary = edit.toSummary() - return SyncFileEdit( - path: summary.path, - name: summary.name, - containsWrite: summary.containsWrite, - hunks: summary.hunks.map { - SyncEditHunk(oldString: $0.oldString, newString: $0.newString) + let editSummaries = threadStore.fetchFileEdits(sessionId: resolvedID).map { $0.toSummary() } + let turnEdits = await withTaskGroup(of: (Int, SyncFileEdit).self) { group in + for (index, summary) in editSummaries.enumerated() { + group.addTask { + let fullFileDiff = await Self.mobileFullFileDiff( + path: summary.path, + hunks: summary.hunks, + originalContent: summary.originalContent + ) + return (index, SyncFileEdit( + path: summary.path, + name: summary.name, + containsWrite: summary.containsWrite, + hunks: summary.hunks.map { + SyncEditHunk(oldString: $0.oldString, newString: $0.newString) + }, + fullFileDiff: fullFileDiff + )) } - ) + } + + var ordered = Array(repeating: nil, count: editSummaries.count) + for await (index, edit) in group { + ordered[index] = edit + } + return ordered.compactMap(\.self) } func reply(ok: Bool, error: String?, uncommitted: [SyncGitChange]) async { @@ -772,6 +788,129 @@ extension AppState { await reply(ok: true, error: nil, uncommitted: uncommitted) } + nonisolated private static func mobileFullFileDiff( + path: String, + hunks: [PreviewFile.EditHunk], + originalContent: String? + ) async -> String? { + await Task.detached(priority: .utility) { () -> String? in + guard let currentContent = try? String(contentsOfFile: path, encoding: .utf8) else { + return nil + } + // When the thread captured a pre-edit snapshot, diff that against + // the current file directly. This produces a correct diff for + // sequences that hunk reverse-apply can't handle — e.g. + // edit-then-revert where the inserted lines no longer appear on + // disk, which otherwise rendered as a plain context-only dump. + if let originalContent { + return snapshotDiff(original: originalContent, current: currentContent) + } + return fullFileDiff(currentContent: currentContent, hunks: hunks) + }.value + } + + nonisolated private static func fullFileDiff(currentContent: String, hunks: [PreviewFile.EditHunk]) -> String { + return currentContentDiff(currentContent: currentContent, hunks: hunks) + } + + /// Build a unified diff string from a pre-edit snapshot and the file's + /// current content. Mirrors `FileDiffView.buildSnapshotDiffLines` on + /// macOS but emits the wire-format string the mobile renderer parses. + nonisolated private static func snapshotDiff(original: String, current: String) -> String { + let oldLines = contentLines(original) + let newLines = contentLines(current) + let diff = newLines.difference(from: oldLines) + var removalIndices = Set() + var insertionElements: [Int: String] = [:] + for change in diff { + switch change { + case .remove(let offset, _, _): + removalIndices.insert(offset) + case .insert(let offset, let element, _): + insertionElements[offset] = element + } + } + + var lines: [String] = [] + var oldIdx = 0 + var newIdx = 0 + while oldIdx < oldLines.count || newIdx < newLines.count { + if oldIdx < oldLines.count, removalIndices.contains(oldIdx) { + lines.append("-\(oldLines[oldIdx])") + oldIdx += 1 + } else if newIdx < newLines.count, let added = insertionElements[newIdx] { + lines.append("+\(added)") + newIdx += 1 + } else if oldIdx < oldLines.count, newIdx < newLines.count { + lines.append(" \(newLines[newIdx])") + oldIdx += 1 + newIdx += 1 + } else if oldIdx < oldLines.count { + lines.append(" \(oldLines[oldIdx])") + oldIdx += 1 + } else if newIdx < newLines.count { + lines.append(" \(newLines[newIdx])") + newIdx += 1 + } + } + return lines.joined(separator: "\n") + } + + nonisolated private static func currentContentDiff( + currentContent: String, + hunks: [PreviewFile.EditHunk] + ) -> String { + var lines = contentLines(currentContent).map { " \($0)" } + guard !lines.isEmpty else { + return hunks.flatMap { hunk in + contentLines(hunk.oldString).map { "-\($0)" } + contentLines(hunk.newString).map { "+\($0)" } + }.joined(separator: "\n") + } + + for hunk in hunks { + let addedLines = contentLines(hunk.newString) + guard !addedLines.isEmpty else { continue } + let matchStart = firstRange(of: addedLines, in: lines.map(contentWithoutDiffMarker)) + guard let matchStart else { continue } + + let removedLines = contentLines(hunk.oldString) + if !removedLines.isEmpty { + lines.insert(contentsOf: removedLines.map { "-\($0)" }, at: matchStart) + } + + let addedStart = matchStart + removedLines.count + for offset in addedLines.indices where addedStart + offset < lines.count { + lines[addedStart + offset] = "+\(addedLines[offset])" + } + } + + return lines.joined(separator: "\n") + } + + nonisolated private static func firstRange(of needle: [String], in haystack: [String]) -> Int? { + guard !needle.isEmpty, needle.count <= haystack.count else { return nil } + for start in 0...(haystack.count - needle.count) { + if Array(haystack[start..<(start + needle.count)]) == needle { + return start + } + } + return nil + } + + nonisolated private static func contentWithoutDiffMarker(_ text: String) -> String { + guard let first = text.first, first == " " || first == "+" || first == "-" else { + return text + } + return String(text.dropFirst()) + } + + nonisolated private static func contentLines(_ content: String) -> [String] { + guard !content.isEmpty else { return [] } + var lines = content.components(separatedBy: "\n") + if lines.last == "" { lines.removeLast() } + return lines + } + /// User-triggered full reindex of every thread. Wipes cached embeddings, /// then re-embeds every thread. Updates `reindexProgress` so the UI can /// render a counter. diff --git a/RxCode/App/AppState+Model.swift b/RxCode/App/AppState+Model.swift index 8bd216a3..3a311620 100644 --- a/RxCode/App/AppState+Model.swift +++ b/RxCode/App/AppState+Model.swift @@ -29,8 +29,8 @@ extension AppState { func availableAgentModelSections() -> [(id: String, title: String, provider: AgentProvider, iconURL: String?, models: [AgentModel])] { var sections: [(id: String, title: String, provider: AgentProvider, iconURL: String?, models: [AgentModel])] = [ - ("claudeCode", AgentProvider.claudeCode.displayName, .claudeCode, nil, Self.availableClaudeModels), - ("codex", AgentProvider.codex.displayName, .codex, nil, Self.availableCodexModels(codexModels)), + ("claudeCode", AgentProvider.claudeCode.displayNameText, .claudeCode, nil, Self.availableClaudeModels), + ("codex", AgentProvider.codex.displayNameText, .codex, nil, Self.availableCodexModels(codexModels)), ] // Each enabled ACP client becomes its own section, titled with the diff --git a/RxCode/App/AppState+SessionLifecycle.swift b/RxCode/App/AppState+SessionLifecycle.swift index 3ef455d0..2a8324af 100644 --- a/RxCode/App/AppState+SessionLifecycle.swift +++ b/RxCode/App/AppState+SessionLifecycle.swift @@ -102,6 +102,27 @@ extension AppState { archivedAt: stillPlaceholder.archivedAt ) await renameSession(session, to: title) + await storeThreadSummaryTitle(session.summary, title: title) + } + + func storeThreadSummaryTitle(_ summary: ChatSession.Summary, title: String) async { + let projectPath = projects.first(where: { $0.id == summary.projectId })?.path + let branchPath = summary.worktreePath ?? projectPath + let currentBranch: String? + if let branchPath { + currentBranch = await GitHelper.currentBranch(at: branchPath) + } else { + currentBranch = nil + } + let branch = summary.worktreeBranch ?? currentBranch ?? "unknown" + + threadStore.upsertThreadSummaryTitle( + sessionId: summary.id, + projectId: summary.projectId, + branch: branch, + title: title + ) + threadSummaryRevision &+= 1 } func generateSessionTitle(firstUserMessage: String, summary: ChatSession.Summary) async -> String? { diff --git a/RxCode/App/AppState+Stream.swift b/RxCode/App/AppState+Stream.swift index a1b8d46c..9cc8fd8f 100644 --- a/RxCode/App/AppState+Stream.swift +++ b/RxCode/App/AppState+Stream.swift @@ -95,14 +95,29 @@ extension AppState { } if !editPersistInfos.isEmpty { for info in editPersistInfos { - threadStore.appendFileEdit( - sessionId: key, - path: info.path, - hunks: info.hunks, - containsWrite: info.isWrite - ) + // Pull the snapshot task created at tool_use time + // (see `captureEditingFileSnapshot`). Persist via + // an awaiting MainActor Task so the original-content + // field reflects the file as it stood before the + // edit ran, instead of post-edit content. + let snapshotTask = state.editingFileSnapshotTasks[info.path] + let pathLocal = info.path + let hunksLocal = info.hunks + let isWriteLocal = info.isWrite + let keyLocal = key + Task { @MainActor [weak self] in + let snapshot = await snapshotTask?.value ?? nil + guard let self else { return } + self.threadStore.appendFileEdit( + sessionId: keyLocal, + path: pathLocal, + hunks: hunksLocal, + containsWrite: isWriteLocal, + originalContent: snapshot + ) + self.threadFileEditsRevision &+= 1 + } } - threadFileEditsRevision &+= 1 } } } @@ -266,6 +281,19 @@ extension AppState { let blockIdx = state.messages[msgIdx].toolCallIndex(id: toolId) { state.messages[msgIdx].blocks[blockIdx].toolCall?.input = parsed + if let toolName = state.messages[msgIdx].blocks[blockIdx].toolCall?.name { + // Kick off the pre-edit file snapshot now that the tool + // input (and therefore `file_path`) is finally known. + // ACP runtimes hit `captureEditingFileSnapshot` from + // their `.assistant` block; the Claude streaming path + // never delivers `file_path` until input_json_delta + // finishes, so this is the earliest point it can run. + Self.captureEditingFileSnapshot( + toolName: toolName, + input: parsed, + state: &state + ) + } if let toolName = state.messages[msgIdx].blocks[blockIdx].toolCall?.name, toolName.lowercased() == "todowrite" { diff --git a/RxCode/App/AppState.swift b/RxCode/App/AppState.swift index 28d1a02e..3e0a8671 100644 --- a/RxCode/App/AppState.swift +++ b/RxCode/App/AppState.swift @@ -93,6 +93,16 @@ struct SessionStreamState { /// Prevents the early (first-text-delta) trigger and the `.result` fallback /// from kicking off duplicate generations on the same session. var titleGenerationTriggered: Bool = false + + /// File-content snapshots captured the first time this session's stream sees + /// an Edit/MultiEdit/Write tool_use for a given path. Used by the "This + /// thread" diff inspector so the rendered diff compares (file-before-this- + /// thread-touched-it) vs (file-on-disk-now), instead of trying to reverse- + /// apply hunks against the current file — which breaks when concurrent + /// agents modify the same file. The task is kicked off at tool_use time so + /// the read can race ahead of the actual file write. The persistence layer + /// awaits the task when the matching tool_result lands. + var editingFileSnapshotTasks: [String: Task] = [:] } enum SummarizationProvider: String, CaseIterable, Identifiable { @@ -102,7 +112,7 @@ enum SummarizationProvider: String, CaseIterable, Identifiable { var id: String { rawValue } - var displayName: String { + var displayName: LocalizedStringResource { switch self { case .selectedClient: return "Thread Model" case .openAI: return "OpenAI-Compatible Endpoint" @@ -110,6 +120,10 @@ enum SummarizationProvider: String, CaseIterable, Identifiable { } } + var displayNameText: String { + String(localized: displayName) + } + /// Returns the providers that should be offered to the user right now. /// Apple Foundation Model is hidden when the device doesn't support it /// (non-Apple-Silicon Mac, Apple Intelligence disabled, etc.). @@ -332,6 +346,7 @@ final class AppState { } var memoryRevision = 0 + @ObservationIgnored var memoryInjectionIntentCache: [String: Bool] = [:] // MARK: - Notifications diff --git a/RxCode/App/RxCodeApp.swift b/RxCode/App/RxCodeApp.swift index 48aa9641..8802b149 100644 --- a/RxCode/App/RxCodeApp.swift +++ b/RxCode/App/RxCodeApp.swift @@ -66,8 +66,10 @@ struct RxCodeApp: App { } CommandMenu("Theme") { ForEach(AppTheme.allCases) { theme in - Button(theme.displayName) { + Button { appState.selectedTheme = theme + } label: { + Text(theme.displayName) } .disabled(appState.selectedTheme == theme) } @@ -281,7 +283,7 @@ private struct MenuBarContentView: View { private var header: some View { HStack { - Text("\(appState.selectedAgentProvider.displayName) Usage") + Text("\(appState.selectedAgentProvider.displayNameText) Usage") .font(.system(size: ClaudeTheme.size(12), weight: .semibold)) .foregroundStyle(.secondary) .textCase(.uppercase) diff --git a/RxCode/Resources/Localizable.xcstrings b/RxCode/Resources/Localizable.xcstrings index f071ea7f..ae005906 100644 --- a/RxCode/Resources/Localizable.xcstrings +++ b/RxCode/Resources/Localizable.xcstrings @@ -1,14067 +1,14093 @@ { - "sourceLanguage": "en", - "strings": { - "": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "" + "sourceLanguage" : "en", + "strings" : { + "" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "" } } } }, - "\"%@\" will be deleted. This action cannot be undone.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "“%@”将被删除。此操作无法撤销。" + "—" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "—" } } } }, - "%@ Usage": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 用量" + ".env" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : ".env" } } } }, - "%@ installed%@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$@ installed%2$@" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$@ 已安装%2$@" + "·" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "·" } } } }, - "%@ is already running": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 已在运行" + "· %lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "· %lld" } } } }, - "%@ not found": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到 %@" + "\"%@\" will be deleted. This action cannot be undone." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "“%@”将被删除。此操作无法撤销。" } } } }, - "%@ wants to pair": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 想要配对" + "(build only)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "(仅构建)" } } } }, - "%@ · %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$@ · %2$@" + "@ File Popup" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "@ File Popup" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "@ 파일 팝업" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$@ · %2$@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "@ 文件弹出框" } } } }, - "%@ — %@": { - "comment": "Notification body for MCP disconnect: server name and error detail.", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$@ — %2$@" + "@ File References" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "@ File References" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$@ — %2$@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "@ 파일 참조" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "@ 文件引用" } } } }, - "%@%%": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@%%" + "@%@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "@%@" } } } }, - "%d changed": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%d changed" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%d개 변경됨" + "%@ — %@" : { + "comment" : "Notification body for MCP disconnect: server name and error detail.", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ — %2$@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%d 个变更" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ — %2$@" } } } }, - "%d files": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%d files" + "%@ · %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ · %2$@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%d개 파일" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%d 个文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@" } } } }, - "%lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld" + "%@ installed%@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ installed%2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 已安装%2$@" } } } }, - "%lld agents available": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个智能体可用" + "%@ is already running" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 已在运行" } } } }, - "%lld changed": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个已更改" + "%@ not found" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到 %@" } } } }, - "%lld custom Git source%@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$lld custom Git source%2$@" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$lld 个自定义 Git 来源%2$@" + "%@ Usage" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 用量" } } } }, - "%lld day%@ of inactivity": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$lld day%2$@ of inactivity" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "不活跃 %1$lld 天%2$@" + "%@ wants to pair" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 想要配对" } } } }, - "%lld files": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个文件" + "%@, in progress" : { + + }, + "%@%%" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" } } } }, - "%lld of %lld agents": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$lld of %2$lld agents" + "%d changed" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%d changed" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d개 변경됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$lld/%2$lld 个智能体" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d 个变更" } } } }, - "%lld question(s) pending": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%lld question(s) pending" + "%d files" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%d files" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대기 중인 질문 %lld개" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d개 파일" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 个问题待处理" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d 个文件" } } } }, - "%lld%%": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld%%" + "%lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" } } } }, - "%lld/%lld": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$lld/%2$lld" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%1$lld/%2$lld" + "%lld agents available" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个智能体可用" } } } }, - "(build only)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "(仅构建)" + "%lld changed" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个已更改" } } } }, - "+%lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "+%lld" + "%lld custom Git source%@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld custom Git source%2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld 个自定义 Git 来源%2$@" } } } }, - "+%lld more pending": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还有 %lld 个待处理" + "%lld day%@ of inactivity" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld day%2$@ of inactivity" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不活跃 %1$lld 天%2$@" } } } }, - ".env": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": ".env" + "%lld files" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个文件" } } } }, - "5h": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "5h" + "%lld of %lld agents" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld of %2$lld agents" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld/%2$lld 个智能体" } } } }, - "5h limit — API usage over the last 5 hours (bar + % + time until reset)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "5h limit — API usage over the last 5 hours (bar + % + time until reset)" + "%lld question(s) pending" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld question(s) pending" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "5h 한도 — 최근 5시간 API 사용량 (막대 그래프 + % + 리셋까지 남은 시간)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대기 중인 질문 %lld개" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "5 小时限制 — 最近 5 小时的 API 使用量(条形图 + 百分比 + 距离重置时间)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 个问题待处理" } } } }, - "70–89% — caution": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "70–89% — caution" + "%lld/%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld/%2$lld" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "70–89% — 주의" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld/%2$lld" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "70–89% — 注意" + } + } + }, + "%lld%%" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld%%" } } } }, - "7d limit — API usage over the last 7 days (bar + % + time until reset)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "7d limit — API usage over the last 7 days (bar + % + time until reset)" + "•" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "7d 한도 — 최근 7일 API 사용량 (막대 그래프 + % + 리셋까지 남은 시간)" + } + } + }, + "• %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "• %@" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "7 天限制 — 最近 7 天的 API 使用量(条形图 + 百分比 + 距离重置时间)" + } + } + }, + "• last seen %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "• 上次出现 %@" } } } }, - "90% or above — critical": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "90% or above — critical" + "↑↓ Select ↵ Confirm esc Cancel" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "↑↓ Select ↵ Confirm esc Cancel" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "90% 이상 — 위험" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "↑↓ 선택 ↵ 확인 esc 취소" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "90% 或以上 — 严重" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "↑↓ 选择 ↵ 确认 esc 取消" } } } }, - "=": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "=" + "+%lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "+%lld" } } } }, - "@ File Popup": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "@ File Popup" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "@ 파일 팝업" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "@ 文件弹出框" + "+%lld more pending" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还有 %lld 个待处理" } } } }, - "@ File References": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "@ File References" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "@ 파일 참조" + "=" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "=" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "@ 文件引用" + } + } + }, + "−%lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "−%lld" } } } }, - "@%@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "@%@" + "5h" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "5h" } } } }, - "A fixed information bar at the bottom of the chat area. It shows the current project path, model, rate limit usage, context window usage, and total response time at a glance.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "A fixed information bar at the bottom of the chat area. It shows the current project path, model, rate limit usage, context window usage, and total response time at a glance." + "5h limit — API usage over the last 5 hours (bar + % + time until reset)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "5h limit — API usage over the last 5 hours (bar + % + time until reset)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 영역 하단에 고정된 정보 바입니다. 현재 프로젝트 경로, 모델, 사용량 한도, 컨텍스트 사용량, 총 응답 시간을 한눈에 확인할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "5h 한도 — 최근 5시간 API 사용량 (막대 그래프 + % + 리셋까지 남은 시간)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "聊天区域底部的固定信息栏。可一目了然地显示当前项目路径、模型、速率限制用量、上下文窗口用量和总响应时间。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "5 小时限制 — 最近 5 小时的 API 使用量(条形图 + 百分比 + 距离重置时间)" } } } }, - "A native macOS desktop client for the Claude Code CLI. Use all Claude Code features via a polished GUI without needing a terminal.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "A native macOS desktop client for the Claude Code CLI. Use all Claude Code features via a polished GUI without needing a terminal." + "7d limit — API usage over the last 7 days (bar + % + time until reset)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "7d limit — API usage over the last 7 days (bar + % + time until reset)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude Code CLI를 위한 네이티브 macOS 데스크톱 클라이언트입니다. 터미널 없이 세련된 GUI로 Claude Code의 모든 기능을 사용할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "7d 한도 — 최근 7일 API 사용량 (막대 그래프 + % + 리셋까지 남은 시간)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Claude Code CLI 的原生 macOS 桌面客户端。无需终端,即可通过精致的图形界面使用 Claude Code 的全部功能。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "7 天限制 — 最近 7 天的 API 使用量(条形图 + 百分比 + 距离重置时间)" } } } }, - "A per-project rich text memo editor. Notes are auto-saved after a short pause and persist across sessions. Markdown formatting is supported.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "A per-project rich text memo editor. Notes are auto-saved after a short pause and persist across sessions. Markdown formatting is supported." + "70–89% — caution" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "70–89% — caution" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트별 메모 편집기입니다. 메모는 잠시 후 자동 저장되며 세션을 넘어 유지됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "70–89% — 주의" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按项目保存的富文本备忘录编辑器。笔记会在短暂停顿后自动保存,并在不同会话间保留。支持 Markdown 格式。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "70–89% — 注意" } } } }, - "ACP Clients": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "ACP 客户端" + "90% or above — critical" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "90% or above — critical" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "90% 이상 — 위험" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "90% 或以上 — 严重" } } } }, - "ACP error": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "ACP 错误" + "A fixed information bar at the bottom of the chat area. It shows the current project path, model, rate limit usage, context window usage, and total response time at a glance." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "A fixed information bar at the bottom of the chat area. It shows the current project path, model, rate limit usage, context window usage, and total response time at a glance." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 영역 하단에 고정된 정보 바입니다. 현재 프로젝트 경로, 모델, 사용량 한도, 컨텍스트 사용량, 총 응답 시간을 한눈에 확인할 수 있습니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "聊天区域底部的固定信息栏。可一目了然地显示当前项目路径、模型、速率限制用量、上下文窗口用量和总响应时间。" } } } }, - "ACP page": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "ACP 页面" + "A native macOS desktop client for the Claude Code CLI. Use all Claude Code features via a polished GUI without needing a terminal." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "A native macOS desktop client for the Claude Code CLI. Use all Claude Code features via a polished GUI without needing a terminal." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code CLI를 위한 네이티브 macOS 데스크톱 클라이언트입니다. 터미널 없이 세련된 GUI로 Claude Code의 모든 기능을 사용할 수 있습니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code CLI 的原生 macOS 桌面客户端。无需终端,即可通过精致的图形界面使用 Claude Code 的全部功能。" } } } }, - "AI auto-approves safe operations, prompts only for risky ones (requires Max/Team/Enterprise/API plan + Sonnet/Opus 4.6+)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "AI auto-approves safe operations, prompts only for risky ones (requires Max/Team/Enterprise/API plan + Sonnet/Opus 4.6+)" + "A per-project rich text memo editor. Notes are auto-saved after a short pause and persist across sessions. Markdown formatting is supported." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "A per-project rich text memo editor. Notes are auto-saved after a short pause and persist across sessions. Markdown formatting is supported." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "AI가 안전한 작업은 자동 승인, 위험한 작업만 승인 요청 (Max/Team/Enterprise/API 플랜 + Sonnet/Opus 4.6+ 필요)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트별 메모 편집기입니다. 메모는 잠시 후 자동 저장되며 세션을 넘어 유지됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "AI 自动批准安全操作,仅对有风险的操作提示确认(需要 Max/Team/Enterprise/API 套餐 + Sonnet/Opus 4.6+)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按项目保存的富文本备忘录编辑器。笔记会在短暂停顿后自动保存,并在不同会话间保留。支持 Markdown 格式。" } } } }, - "API Key": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "API 密钥" + "About RxCode" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "About RxCode" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 소개" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关于 RxCode" } } } }, - "API_KEY": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "API_KEY" + "Absolute or project-relative path. Leave empty to use the project root." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "绝对路径或项目相对路径。留空则使用项目根目录。" } } } }, - "About RxCode": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "About RxCode" + "Accent color palette (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accent color palette (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode 소개" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "강조 색상 팔레트 (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关于 RxCode" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "强调色调色板(陶土、海洋、森林、薰衣草、午夜、琥珀)" } } } }, - "Absolute or project-relative path. Leave empty to use the project root.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "绝对路径或项目相对路径。留空则使用项目根目录。" + "Accept" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受" } } } }, - "Accent color palette (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Accent color palette (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)" + "Accept Edits" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accept Edits" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "강조 색상 팔레트 (Terracotta, Ocean, Forest, Lavender, Midnight, Amber)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "편집 수락" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "强调色调色板(陶土、海洋、森林、薰衣草、午夜、琥珀)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受编辑" } } } }, - "Accept": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受" + "ACP Clients" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "ACP 客户端" } } } }, - "Accept Edits": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Accept Edits" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "편집 수락" + "ACP error" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "ACP 错误" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "接受编辑" + } + } + }, + "ACP page" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "ACP 页面" } } } }, - "Action": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "操作" + "Action" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "操作" } } } }, - "Actions for %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%@ 的操作" + "Actions for %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 的操作" } } } }, - "Add": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add" + "Add" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加" } } } }, - "Add Git Skill Source": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加 Git 技能来源" + "Add a Git repository by URL" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过 URL 添加 Git 仓库" } } } }, - "Add Git Source": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加 Git 来源" + "Add a preset (e.g. \"dev\", \"prod\") to configure environment variables." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加预设(例如“dev”“prod”)以配置环境变量。" } } } }, - "Add MCP Server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加 MCP 服务器" + "Add a relay server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加中继服务器" } } } }, - "Add Memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加记忆" + "Add a skill catalog from a GitHub repository" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从 GitHub 仓库添加技能目录" } } } }, - "Add Preset": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加预设" + "Add Git Skill Source" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加 Git 技能来源" } } } }, - "Add Profile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加配置" + "Add Git Source" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加 Git 来源" } } } }, - "Add Project": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add Project" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 추가" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加项目" + "Add MCP Server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加 MCP 服务器" } } } }, - "Add Relay Server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加中继服务器" + "Add memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加记忆" } } } }, - "Add Repository": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加仓库" + "Add Memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加记忆" } } } }, - "Add Server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加服务器" + "Add path to message" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add path to message" } - } - } - }, - "Add Source": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加来源" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지에 경로 추가" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将路径添加到消息" } } } }, - "Add Variable": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加变量" + "Add Preset" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加预设" } } } }, - "Add a Git repository by URL": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通过 URL 添加 Git 仓库" + "Add Profile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加配置" } } } }, - "Add a preset (e.g. \"dev\", \"prod\") to configure environment variables.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加预设(例如“dev”“prod”)以配置环境变量。" + "Add Project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add Project" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 추가" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加项目" } } } }, - "Add a relay server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加中继服务器" + "Add Relay Server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加中继服务器" } } } }, - "Add a skill catalog from a GitHub repository": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从 GitHub 仓库添加技能目录" + "Add Repository" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加仓库" } } } }, - "Add memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加记忆" + "Add server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加服务器" } } } }, - "Add path to message": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add path to message" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지에 경로 추가" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将路径添加到消息" + "Add Server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加服务器" } } } }, - "Add server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加服务器" + "Add Source" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加来源" } } } }, - "Add to projects": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Add to projects" + "Add to projects" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add to projects" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트에 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트에 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加到项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加到项目" + } + } + } + }, + "Add tools with MCP" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 MCP 添加工具" } } } }, - "Add tools with MCP": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用 MCP 添加工具" + "Add Variable" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加变量" } } } }, - "Added": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Added" + "Added" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Added" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "추가됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "추가됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已添加" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已添加" } } } }, - "Adding a Project": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adding a Project" + "Adding a Project" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adding a Project" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加项目" } } } }, - "Adding a Repository": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adding a Repository" + "Adding a Repository" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adding a Repository" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장소 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장소 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加仓库" } } } }, - "Adding a Shortcut": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adding a Shortcut" + "Adding a Shortcut" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adding a Shortcut" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축 버튼 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축 버튼 추가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "添加快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加快捷按钮" } } } }, - "Adjust the font size for the app UI (sidebar, toolbars, labels)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adjust the font size for the app UI (sidebar, toolbars, labels)" + "Adjust the font size for the app UI (sidebar, toolbars, labels)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adjust the font size for the app UI (sidebar, toolbars, labels)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "앱 UI(사이드바, 툴바, 레이블)의 폰트 크기를 조절합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "앱 UI(사이드바, 툴바, 레이블)의 폰트 크기를 조절합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "调整应用界面字体大小(边栏、工具栏、标签)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "调整应用界面字体大小(边栏、工具栏、标签)" } } } }, - "Adjust the font size in the chat message area": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adjust the font size in the chat message area" + "Adjust the font size in the chat message area" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adjust the font size in the chat message area" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 메시지 영역의 폰트 크기를 조절합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 메시지 영역의 폰트 크기를 조절합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "调整聊天消息区域的字体大小" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "调整聊天消息区域的字体大小" + } + } + } + }, + "Agent Availability" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "智能体可用性" } } } }, - "Agent Availability": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "智能体可用性" + "Agent Runtimes" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "智能体运行时" } } } }, - "Agent Runtimes": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "智能体运行时" + "AI auto-approves safe operations, prompts only for risky ones (requires Max/Team/Enterprise/API plan + Sonnet/Opus 4.6+)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "AI auto-approves safe operations, prompts only for risky ones (requires Max/Team/Enterprise/API plan + Sonnet/Opus 4.6+)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "AI가 안전한 작업은 자동 승인, 위험한 작업만 승인 요청 (Max/Team/Enterprise/API 플랜 + Sonnet/Opus 4.6+ 필요)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "AI 自动批准安全操作,仅对有风险的操作提示确认(需要 Max/Team/Enterprise/API 套餐 + Sonnet/Opus 4.6+)" } } } }, - "All": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "All" + "All" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "All" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "전체" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전체" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全部" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部" } } } }, - "All Chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有聊天" + "All archived chats in the current project will be deleted. This action cannot be undone." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前项目中的所有已归档聊天都将被删除。此操作无法撤销。" } } } }, - "All archived chats in the current project will be deleted. This action cannot be undone.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前项目中的所有已归档聊天都将被删除。此操作无法撤销。" + "All archived chats will be deleted. This action cannot be undone." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有已归档聊天都将被删除。此操作无法撤销。" } } } }, - "All archived chats will be deleted. This action cannot be undone.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有已归档聊天都将被删除。此操作无法撤销。" + "All branches" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有分支" } } } }, - "All branches": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有分支" + "All Chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有聊天" } } } }, - "All saved memories will be removed. This action cannot be undone.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有保存的记忆都将被移除。此操作无法撤销。" + "All saved memories will be removed. This action cannot be undone." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有保存的记忆都将被移除。此操作无法撤销。" } } } }, - "All sessions in the current project will be deleted. This action cannot be undone.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "All sessions in the current project will be deleted. This action cannot be undone." + "All sessions in the current project will be deleted. This action cannot be undone." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "All sessions in the current project will be deleted. This action cannot be undone." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 프로젝트의 모든 세션이 삭제됩니다. 이 작업은 되돌릴 수 없습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 프로젝트의 모든 세션이 삭제됩니다. 이 작업은 되돌릴 수 없습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前项目中的所有会话都将被删除。此操作无法撤销。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前项目中的所有会话都将被删除。此操作无法撤销。" } } } }, - "All sessions will be deleted. This action cannot be undone.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "All sessions will be deleted. This action cannot be undone." + "All sessions will be deleted. This action cannot be undone." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "All sessions will be deleted. This action cannot be undone." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 세션이 삭제됩니다. 이 작업은 되돌릴 수 없습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 세션이 삭제됩니다. 이 작업은 되돌릴 수 없습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有会话都将被删除。此操作无法撤销。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有会话都将被删除。此操作无法撤销。" } } } }, - "All sync traffic flows through relay servers, end-to-end encrypted. Add relay servers to connect with your mobile devices remotely.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "所有同步流量都会通过中继服务器,并进行端到端加密。添加中继服务器即可远程连接移动设备。" + "All sync traffic flows through relay servers, end-to-end encrypted. Add relay servers to connect with your mobile devices remotely." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有同步流量都会通过中继服务器,并进行端到端加密。添加中继服务器即可远程连接移动设备。" } } } }, - "Allow": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Allow" + "Allow" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Allow" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "허용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "허용" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "允许" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "允许" } } } }, - "Allow this tool for the session": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Allow this tool for the session" + "Allow this tool for the session" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Allow this tool for the session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이 세션 동안 허용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 세션 동안 허용" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在此会话中允许此工具" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在此会话中允许此工具" } } } }, - "Already added to RxCode": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Already added to RxCode" + "Already added to RxCode" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Already added to RxCode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미 RxCode에 추가됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미 RxCode에 추가됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已添加到 RxCode" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已添加到 RxCode" } } } }, - "Always allow this command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Always allow this command" + "Always allow this command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Always allow this command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이 명령 항상 허용" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 명령 항상 허용" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "始终允许此命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "始终允许此命令" } } } }, - "Amber": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Amber" + "Amber" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Amber" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "앰버" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "앰버" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "琥珀" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "琥珀" } } } }, - "An embedded zsh terminal that opens at the current project's directory. Use it to run shell commands, inspect files, or manage git — all without leaving the app.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "An embedded zsh terminal that opens at the current project's directory. Use it to run shell commands, inspect files, or manage git — all without leaving the app." + "An embedded zsh terminal that opens at the current project's directory. Use it to run shell commands, inspect files, or manage git — all without leaving the app." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "An embedded zsh terminal that opens at the current project's directory. Use it to run shell commands, inspect files, or manage git — all without leaving the app." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 프로젝트 디렉토리에서 실행되는 내장 zsh 터미널입니다. 앱을 벗어나지 않고 셸 커맨드 실행, 파일 확인, git 관리 등을 할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 프로젝트 디렉토리에서 실행되는 내장 zsh 터미널입니다. 앱을 벗어나지 않고 셸 커맨드 실행, 파일 확인, git 관리 등을 할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "内置 zsh 终端,会在当前项目目录中打开。可用于运行 shell 命令、查看文件或管理 git,全程无需离开应用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "内置 zsh 终端,会在当前项目目录中打开。可用于运行 shell 命令、查看文件或管理 git,全程无需离开应用。" } } } }, - "Answer": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Answer" + "Answer" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Answer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "답변" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "답변" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "回答" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "回答" + } + } + } + }, + "API Key" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "API 密钥" + } + } + } + }, + "API_KEY" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "API_KEY" } } } }, - "Apply": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "应用" + "Apple Foundation Model" : { + + }, + "Apply" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "应用" } } } }, - "Approval Options": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Approval Options" + "Approval Options" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Approval Options" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "승인 옵션" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "승인 옵션" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "批准选项" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "批准选项" } } } }, - "Approve all future requests of this type for the current session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Approve all future requests of this type for the current session" + "Approve all future requests of this type for the current session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Approve all future requests of this type for the current session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 세션 동안 이 유형의 모든 요청을 승인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 세션 동안 이 유형의 모든 요청을 승인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "批准当前会话中此类型的所有后续请求" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "批准当前会话中此类型的所有后续请求" } } } }, - "Approve this single action": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Approve this single action" + "Approve this single action" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Approve this single action" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이 단일 작업만 승인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 단일 작업만 승인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅批准此操作" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅批准此操作" + } + } + } + }, + "Approve to run %@" : { + "comment" : "Notification body when Claude queues a tool approval. %@ is the tool name.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "批准运行 %@" } } } }, - "Approve to run %@": { - "comment": "Notification body when Claude queues a tool approval. %@ is the tool name.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "批准运行 %@" + "Archive" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "归档" } } } }, - "Archive": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "归档" + "Archive after" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在此之后归档" } } } }, - "Archive after": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在此之后归档" + "archived" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "archived" } } } }, - "Archived": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已归档" + "Archived" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已归档" } } } }, - "Args (one per line)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "参数(每行一个)" + "Args (one per line)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "参数(每行一个)" } } } }, - "Arguments (optional)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "参数(可选)" + "Arguments (optional)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "参数(可选)" } } } }, - "Ask": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Ask" + "Ask" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Ask" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 요청" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 요청" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "询问" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "询问" } } } }, - "Assistant": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "助手" + "Assistant" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "助手" } } } }, - "Assistant has a question": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "助手有一个问题" + "Assistant has a question" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "助手有一个问题" } } } }, - "Assistant has a question%@": { - "comment": "Notification title when Claude invokes AskUserQuestion. %@ is replaced with \" — \" or empty string.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "助手有一个问题%@" + "Assistant has a question%@" : { + "comment" : "Notification title when Claude invokes AskUserQuestion. %@ is replaced with \" — \" or empty string.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "助手有一个问题%@" } } } }, - "Attaching Files": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Attaching Files" + "Attaching Files" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Attaching Files" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 첨부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "附加文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "附加文件" } } } }, - "Authenticate on GitHub": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Authenticate on GitHub" + "Authenticate on GitHub" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Authenticate on GitHub" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub에서 인증" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub에서 인증" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 GitHub 上认证" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 GitHub 上认证" } } } }, - "Authentication Code": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Authentication Code" + "Authentication Code" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Authentication Code" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인증 코드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인증 코드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "认证代码" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "认证代码" } } } }, - "Author": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Author" + "Author" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Author" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작성자" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작성자" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "作者" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "作者" } } } }, - "Auto": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto" + "Auto" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "자동 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "자동 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动" } } } }, - "Auto Effort": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto Effort" + "Auto Effort" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto Effort" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "자동" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "자동" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动强度" } } } }, - "Auto-Preview Settings": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto-Preview Settings" + "Auto-accepts file edits in the working directory (commands still require approval)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto-accepts file edits in the working directory (commands still require approval)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "자동 미리보기 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작업 디렉토리 파일 편집을 자동 수락 (명령어는 여전히 승인 필요)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动预览设置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动接受工作目录中的文件编辑(命令仍需批准)" } } } }, - "Auto-accepts file edits in the working directory (commands still require approval)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto-accepts file edits in the working directory (commands still require approval)" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작업 디렉토리 파일 편집을 자동 수락 (명령어는 여전히 승인 필요)" + "Auto-archive inactive chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动归档不活跃聊天" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动接受工作目录中的文件编辑(命令仍需批准)" + } + } + }, + "Auto-create memories from completed chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从已完成聊天自动创建记忆" } } } }, - "Auto-archive inactive chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动归档不活跃聊天" + "Auto-detected" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动检测" } } } }, - "Auto-create memories from completed chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从已完成聊天自动创建记忆" + "Auto-preview Attachments" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto-preview Attachments" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "첨부 파일 자동 미리보기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动预览附件" } } } }, - "Auto-detected": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动检测" + "Auto-Preview Settings" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto-Preview Settings" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "자동 미리보기 설정" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动预览设置" } } } }, - "Auto-preview Attachments": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto-preview Attachments" + "auto.preview.desc" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "When enabled, pasting the following content types automatically creates an attachment preview. When disabled, the content is inserted as plain text." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "첨부 파일 자동 미리보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "활성화하면 다음 콘텐츠 유형을 붙여넣을 때 자동으로 첨부 파일 미리보기가 생성됩니다. 비활성화하면 일반 텍스트로 삽입됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动预览附件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用后,粘贴以下内容类型时会自动创建附件预览。停用后,内容会作为纯文本插入。" } } } }, - "Autocomplete command": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Autocomplete command" + "Autocomplete command" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Autocomplete command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 자동 완성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 자동 완성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动补全命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动补全命令" } } } }, - "Autocomplete slash command / @ file": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Autocomplete slash command / @ file" + "Autocomplete slash command / @ file" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Autocomplete slash command / @ file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 / @ 파일 자동 완성" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 / @ 파일 자동 완성" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动补全斜杠命令 / @ 文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动补全斜杠命令 / @ 文件" } } } }, - "Automatically convert long text (200+ characters) into an attachment chip when pasted": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Automatically convert long text (200+ characters) into an attachment chip when pasted" + "Automatically convert long text (200+ characters) into an attachment chip when pasted" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatically convert long text (200+ characters) into an attachment chip when pasted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "긴 텍스트(200자 이상) 붙여넣기 시 자동으로 첨부 파일 칩으로 변환합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "긴 텍스트(200자 이상) 붙여넣기 시 자동으로 첨부 파일 칩으로 변환합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粘贴长文本(200+ 个字符)时自动转换为附件标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粘贴长文本(200+ 个字符)时自动转换为附件标签" } } } }, - "Automatically show a preview chip when a URL is pasted": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Automatically show a preview chip when a URL is pasted" + "Automatically show a preview chip when a file path is pasted" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatically show a preview chip when a file path is pasted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "URL 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 경로 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粘贴 URL 时自动显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粘贴文件路径时自动显示预览标签" } } } }, - "Automatically show a preview chip when a file path is pasted": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Automatically show a preview chip when a file path is pasted" + "Automatically show a preview chip when a URL is pasted" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatically show a preview chip when a URL is pasted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 경로 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粘贴文件路径时自动显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粘贴 URL 时自动显示预览标签" } } } }, - "Automatically show a preview chip when image data is pasted": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Automatically show a preview chip when image data is pasted" + "Automatically show a preview chip when image data is pasted" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatically show a preview chip when image data is pasted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미지 데이터 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지 데이터 붙여넣기 시 자동으로 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粘贴图像数据时自动显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粘贴图像数据时自动显示预览标签" } } } }, - "Awaiting check": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "等待检查" + "Awaiting check" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "等待检查" } } } }, - "Back": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Back" + "Back" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Back" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "뒤로" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "뒤로" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "返回" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "返回" } } } }, - "Bash": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Bash" + "Bash" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bash" } } } }, - "Before Claude edits files or runs commands, it pauses and asks for your approval. A modal appears showing the tool name and its arguments.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Before Claude edits files or runs commands, it pauses and asks for your approval. A modal appears showing the tool name and its arguments." + "Before Claude edits files or runs commands, it pauses and asks for your approval. A modal appears showing the tool name and its arguments." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Before Claude edits files or runs commands, it pauses and asks for your approval. A modal appears showing the tool name and its arguments." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude가 파일을 편집하거나 커맨드를 실행하기 전에 잠시 멈추고 승인을 요청합니다. 도구 이름과 인수를 보여주는 모달이 표시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude가 파일을 편집하거나 커맨드를 실행하기 전에 잠시 멈추고 승인을 요청합니다. 도구 이름과 인수를 보여주는 모달이 표시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 Claude 编辑文件或运行命令之前,它会暂停并请求你的批准。弹窗会显示工具名称及其参数。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Claude 编辑文件或运行命令之前,它会暂停并请求你的批准。弹窗会显示工具名称及其参数。" } } } }, - "Below 70% — normal": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Below 70% — normal" + "Below 70% — normal" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Below 70% — normal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "70% 미만 — 정상" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "70% 미만 — 정상" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "低于 70% — 正常" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "低于 70% — 正常" } } } }, - "Binary file — preview not available": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Binary file — preview not available" + "Binary file — preview not available" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Binary file — preview not available" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "바이너리 파일 — 미리보기 불가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "바이너리 파일 — 미리보기 불가" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "二进制文件 — 无法预览" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "二进制文件 — 无法预览" } } } }, - "Bold": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Bold" + "Bold" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Bold" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "굵게" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "굵게" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粗体" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粗体" } } } }, - "Branch name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分支名称" + "Branch name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支名称" } } } }, - "Branch or Ref": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分支或引用" + "Branch or Ref" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支或引用" } } } }, - "Briefing": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "简报" + "Briefing" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "简报" } } } }, - "Briefing rolls recent thread summaries into a branch-focused project update.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "简报会将最近的对话摘要汇总为面向分支的项目更新。" + "Briefing rolls recent thread summaries into a branch-focused project update." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "简报会将最近的对话摘要汇总为面向分支的项目更新。" } } } }, - "Briefings": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "简报" + "Briefings" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "简报" } } } }, - "Browse and manage Claude Code skills": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Browse and manage Claude Code skills" + "Browse and manage Claude Code skills" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Browse and manage Claude Code skills" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude Code 스킬을 탐색하고 관리하세요" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code 스킬을 탐색하고 관리하세요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "浏览和管理 Claude Code 技能" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "浏览和管理 Claude Code 技能" } } } }, - "Browse…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "浏览…" + "Browse…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "浏览…" } } } }, - "Build runs `xcodebuild build`. Run builds, then launches the produced .app (macOS) or installs + launches on the selected simulator. Pick the destination from the Run toolbar.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "构建会运行 `xcodebuild build`。Run 会先构建,然后启动生成的 .app(macOS),或在所选模拟器上安装并启动。请从运行工具栏选择目标。" + "build" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "build" } } } }, - "By default, pasting certain content automatically creates a preview chip. You can toggle each category independently in Settings → Message.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "By default, pasting certain content automatically creates a preview chip. You can toggle each category independently in Settings → Message." + "Build runs `xcodebuild build`. Run builds, then launches the produced .app (macOS) or installs + launches on the selected simulator. Pick the destination from the Run toolbar." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "构建会运行 `xcodebuild build`。Run 会先构建,然后启动生成的 .app(macOS),或在所选模拟器上安装并启动。请从运行工具栏选择目标。" + } + } + } + }, + "By default, pasting certain content automatically creates a preview chip. You can toggle each category independently in Settings → Message." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "By default, pasting certain content automatically creates a preview chip. You can toggle each category independently in Settings → Message." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본적으로 특정 콘텐츠를 붙여넣으면 자동으로 미리보기 칩이 생성됩니다. 설정 → 메시지에서 각 카테고리를 개별적으로 토글할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본적으로 특정 콘텐츠를 붙여넣으면 자동으로 미리보기 칩이 생성됩니다. 설정 → 메시지에서 각 카테고리를 개별적으로 토글할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认情况下,粘贴某些内容会自动创建预览标签。你可以在“设置 → 消息”中分别开关每个类别。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认情况下,粘贴某些内容会自动创建预览标签。你可以在“设置 → 消息”中分别开关每个类别。" } } } }, - "Bypass": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Bypass" + "Bypass" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Bypass" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 건너뛰기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 건너뛰기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "绕过" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "绕过" } } } }, - "Cancel": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cancel" + "Cancel" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cancel" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "취소" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "취소" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "取消" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消" } } } }, - "Category": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Category" + "Category" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Category" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "카테고리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카테고리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分类" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分类" } } } }, - "Change Theme": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Change Theme" + "Change Theme" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Change Theme" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "테마 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "테마 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "更改主题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更改主题" } } } }, - "Changing the Model": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Changing the Model" + "Changing the Model" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Changing the Model" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "更改模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更改模型" } } } }, - "Chat Basics": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Chat Basics" + "Chat Basics" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Chat Basics" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 기본" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 기본" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "聊天基础" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "聊天基础" } } } }, - "Chat is disabled when no project is selected.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Chat is disabled when no project is selected." + "Chat is disabled when no project is selected." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Chat is disabled when no project is selected." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트가 선택되지 않으면 채팅을 사용할 수 없습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트가 선택되지 않으면 채팅을 사용할 수 없습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未选择项目时聊天不可用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未选择项目时聊天不可用。" } } } }, - "Check Again": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Check Again" + "Check Again" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Check Again" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다시 확인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다시 확인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重新检查" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新检查" } } } }, - "Check for Updates...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Check for Updates..." + "Check for Updates..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Check for Updates..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "업데이트 확인..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업데이트 확인..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检查更新..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查更新..." } } } }, - "Check the scheme and container path.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检查 scheme 和容器路径。" + "Check the scheme and container path." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查 scheme 和容器路径。" } } } }, - "Checking for Updates": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Checking for Updates" + "Checking for Updates" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Checking for Updates" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "업데이트 확인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업데이트 확인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检查更新" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查更新" } } } }, - "Checking...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Checking..." + "Checking..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Checking..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "확인 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "확인 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在检查..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在检查..." } } } }, - "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into four tabs: General, Message, Slash Commands, and Shortcuts.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into four tabs: General, Message, Slash Commands, and Shortcuts." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메뉴 막대에서 RxCode → 설정을 선택하거나 ⌘,를 눌러 설정 창을 엽니다. 설정은 일반, 메시지, 슬래시 커맨드, 단축키 네 개의 탭으로 구성되어 있습니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从菜单栏选择“RxCode → 设置”,或按 ⌘, 打开设置窗口。设置分为四个标签页:通用、消息、斜杠命令和快捷按钮。" + "Choose one" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择一个" } } } }, - "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into three tabs: General, Slash Commands, and Shortcuts.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into three tabs: General, Slash Commands, and Shortcuts." + "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into four tabs: General, Message, Slash Commands, and Shortcuts." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into four tabs: General, Message, Slash Commands, and Shortcuts." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从菜单栏选择“RxCode → 设置”,或按 ⌘, 打开设置窗口。设置分为三个标签页:通用、斜杠命令和快捷按钮。" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메뉴 막대에서 RxCode → 설정을 선택하거나 ⌘,를 눌러 설정 창을 엽니다. 설정은 일반, 메시지, 슬래시 커맨드, 단축키 네 개의 탭으로 구성되어 있습니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从菜单栏选择“RxCode → 设置”,或按 ⌘, 打开设置窗口。设置分为四个标签页:通用、消息、斜杠命令和快捷按钮。" } } } }, - "Choose one": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择一个" + "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into three tabs: General, Slash Commands, and Shortcuts." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Choose RxCode → Settings from the menu bar or press ⌘, to open the Settings window. Settings are organized into three tabs: General, Slash Commands, and Shortcuts." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从菜单栏选择“RxCode → 设置”,或按 ⌘, 打开设置窗口。设置分为三个标签页:通用、斜杠命令和快捷按钮。" } } } }, - "Choose the agent for this thread": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "为此对话选择智能体" + "Choose the agent for this thread" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "为此对话选择智能体" } } } }, - "Choose which branches to show briefings for.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择要显示简报的分支。" + "Choose which branches to show briefings for." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择要显示简报的分支。" } } } }, - "Choose…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择…" + "Choose…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择…" } } } }, - "Claude CLI Installation Check": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude CLI Installation Check" + "Claude CLI Installation Check" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude CLI Installation Check" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude CLI 설치 확인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude CLI 설치 확인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Claude CLI 安装检查" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude CLI 安装检查" } } } }, - "Claude CLI not found": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude CLI not found" + "Claude CLI not found" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude CLI not found" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude CLI를 찾을 수 없습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude CLI를 찾을 수 없습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到 Claude CLI" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到 Claude CLI" } } } }, - "Claude Code": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude Code" + "Claude Code" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude Code" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude Code" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Claude Code" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code" } } } }, - "Claude Code Terminal": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude Code Terminal" + "Claude Code Terminal" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude Code Terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude Code 터미널" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code 터미널" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Claude Code 终端" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude Code 终端" } } } }, - "Claude default — warm orange-red": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude default — warm orange-red" + "Claude default — warm orange-red" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude default — warm orange-red" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude 기본값 — 따뜻한 주황빛 레드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude 기본값 — 따뜻한 주황빛 레드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Claude 默认 — 暖橙红" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude 默认 — 暖橙红" } } } }, - "Claude model used when starting a new session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Claude model used when starting a new session" + "Claude model used when starting a new session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Claude model used when starting a new session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션 시작 시 사용할 Claude 모델" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션 시작 시 사용할 Claude 모델" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开始新会话时使用的 Claude 模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开始新会话时使用的 Claude 模型" } } } }, - "Clear Memo": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Clear Memo" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메모 비우기" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "清空备忘录" + "Clear destination — pick again from the toolbar" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除目标 — 从工具栏重新选择" } } } }, - "Clear destination — pick again from the toolbar": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "清除目标 — 从工具栏重新选择" + "Clear Memo" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Clear Memo" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메모 비우기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清空备忘录" } } } }, - "Clear task": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "清除任务" + "Clear task" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除任务" } } } }, - "Click + in the toolbar to add one.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击工具栏中的 + 添加一个。" + "Click + in the toolbar to add one." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击工具栏中的 + 添加一个。" } } } }, - "Click + to add one.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击 + 添加一个。" + "Click + to add one." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击 + 添加一个。" } } } }, - "Click a plugin to view its details, then press Install. An interactive terminal popup opens and runs the install command automatically.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click a plugin to view its details, then press Install. An interactive terminal popup opens and runs the install command automatically." + "Click a plugin to view its details, then press Install. An interactive terminal popup opens and runs the install command automatically." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click a plugin to view its details, then press Install. An interactive terminal popup opens and runs the install command automatically." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플러그인을 클릭하여 상세 정보를 확인한 후 설치 버튼을 누르세요. 대화형 터미널 팝업이 열리고 설치 커맨드가 자동으로 실행됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플러그인을 클릭하여 상세 정보를 확인한 후 설치 버튼을 누르세요. 대화형 터미널 팝업이 열리고 설치 커맨드가 자동으로 실행됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击插件查看详情,然后按“安装”。交互式终端弹窗会打开并自动运行安装命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击插件查看详情,然后按“安装”。交互式终端弹窗会打开并自动运行安装命令。" } } } }, - "Click any file in the Files tab to preview it with syntax highlighting. Press the pencil button to enter edit mode and modify the file directly.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click any file in the Files tab to preview it with syntax highlighting. Press the pencil button to enter edit mode and modify the file directly." + "Click any file in the Files tab to preview it with syntax highlighting. Press the pencil button to enter edit mode and modify the file directly." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click any file in the Files tab to preview it with syntax highlighting. Press the pencil button to enter edit mode and modify the file directly." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 탭에서 파일을 클릭하면 구문 강조와 함께 미리 볼 수 있습니다. 연필 버튼을 눌러 편집 모드로 전환하고 파일을 직접 수정할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 탭에서 파일을 클릭하면 구문 강조와 함께 미리 볼 수 있습니다. 연필 버튼을 눌러 편집 모드로 전환하고 파일을 직접 수정할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在“文件”标签页点击任意文件即可用语法高亮预览。按铅笔按钮进入编辑模式并直接修改文件。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在“文件”标签页点击任意文件即可用语法高亮预览。按铅笔按钮进入编辑模式并直接修改文件。" } } } }, - "Click the + button at the top of the sidebar or drag a folder from Finder. Claude Code uses that folder as its working directory.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the + button at the top of the sidebar or drag a folder from Finder. Claude Code uses that folder as its working directory." + "Click the / button in the toolbar, or open Settings → Slash Commands to add, edit, delete, or disable custom commands. Built-in commands can be edited and enabled or disabled in the app." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the / button in the toolbar, or open Settings → Slash Commands to add, edit, delete, or disable custom commands. Built-in commands can be edited and enabled or disabled in the app." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 상단의 + 버튼을 클릭하거나 Finder에서 폴더를 드래그하세요. Claude Code는 해당 폴더를 작업 디렉토리로 사용합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "툴바의 / 버튼을 클릭하거나 설정 → 슬래시 커맨드를 열어 커스텀 커맨드를 추가, 편집, 삭제 또는 비활성화할 수 있습니다. 기본 커맨드는 앱 안에서 내용 편집과 활성화/비활성화를 할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击边栏顶部的 + 按钮,或从 Finder 拖入文件夹。Claude Code 会将该文件夹用作工作目录。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击工具栏中的 / 按钮,或打开“设置 → 斜杠命令”以添加、编辑、删除或禁用自定义命令。内置命令也可以在应用中编辑、启用或禁用。" } } } }, - "Click the / button in the toolbar, or open Settings → Slash Commands to add, edit, delete, or disable custom commands. Built-in commands can be edited and enabled or disabled in the app.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the / button in the toolbar, or open Settings → Slash Commands to add, edit, delete, or disable custom commands. Built-in commands can be edited and enabled or disabled in the app." + "Click the + button at the top of the sidebar or drag a folder from Finder. Claude Code uses that folder as its working directory." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the + button at the top of the sidebar or drag a folder from Finder. Claude Code uses that folder as its working directory." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "툴바의 / 버튼을 클릭하거나 설정 → 슬래시 커맨드를 열어 커스텀 커맨드를 추가, 편집, 삭제 또는 비활성화할 수 있습니다. 기본 커맨드는 앱 안에서 내용 편집과 활성화/비활성화를 할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 상단의 + 버튼을 클릭하거나 Finder에서 폴더를 드래그하세요. Claude Code는 해당 폴더를 작업 디렉토리로 사용합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击工具栏中的 / 按钮,或打开“设置 → 斜杠命令”以添加、编辑、删除或禁用自定义命令。内置命令也可以在应用中编辑、启用或禁用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击边栏顶部的 + 按钮,或从 Finder 拖入文件夹。Claude Code 会将该文件夹用作工作目录。" } } } }, - "Click the GitHub Mark button at the top of the sidebar to open the GitHub panel. After connecting your GitHub account, your repositories are listed and can be added to RxCode with one click.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the GitHub Mark button at the top of the sidebar to open the GitHub panel. After connecting your GitHub account, your repositories are listed and can be added to RxCode with one click." + "Click the ⚡ button in the toolbar to open the Shortcut Manager, or press the + button on the right side of the shortcut bar. You can set a name, message/command, icon, and color." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the ⚡ button in the toolbar to open the Shortcut Manager, or press the + button on the right side of the shortcut bar. You can set a name, message/command, icon, and color." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 상단의 GitHub 마크 버튼을 클릭하여 GitHub 패널을 열어보세요. GitHub 계정을 연결하면 저장소 목록이 표시되고 한 번의 클릭으로 RxCode에 추가할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "툴바의 ⚡ 버튼을 클릭하여 단축 버튼 관리자를 열거나, 단축 버튼 바 오른쪽의 + 버튼을 누르세요. 이름, 메시지/커맨드, 아이콘, 색상을 설정할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击边栏顶部的 GitHub 标记按钮打开 GitHub 面板。连接 GitHub 账号后,你的仓库会列出,并可一键添加到 RxCode。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击工具栏中的 ⚡ 按钮打开快捷按钮管理器,或按快捷按钮栏右侧的 + 按钮。你可以设置名称、消息/命令、图标和颜色。" } } } }, - "Click the brain icon (🧠) in the toolbar to browse the MCP plugin catalog published on Anthropic's GitHub. Plugins can be filtered by category or searched by name, description, or author.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the brain icon (🧠) in the toolbar to browse the MCP plugin catalog published on Anthropic's GitHub. Plugins can be filtered by category or searched by name, description, or author." + "Click the brain icon (🧠) in the toolbar to browse the MCP plugin catalog published on Anthropic's GitHub. Plugins can be filtered by category or searched by name, description, or author." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the brain icon (🧠) in the toolbar to browse the MCP plugin catalog published on Anthropic's GitHub. Plugins can be filtered by category or searched by name, description, or author." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "툴바의 🧠 아이콘을 클릭하면 Anthropic GitHub에 게시된 MCP 플러그인 카탈로그를 탐색할 수 있습니다. 카테고리별 필터링 또는 이름, 설명, 작성자로 검색이 가능합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "툴바의 🧠 아이콘을 클릭하면 Anthropic GitHub에 게시된 MCP 플러그인 카탈로그를 탐색할 수 있습니다. 카테고리별 필터링 또는 이름, 설명, 작성자로 검색이 가능합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击工具栏中的大脑图标(🧠)浏览 Anthropic GitHub 上发布的 MCP 插件目录。可按类别筛选插件,或按名称、描述、作者搜索。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击工具栏中的大脑图标(🧠)浏览 Anthropic GitHub 上发布的 MCP 插件目录。可按类别筛选插件,或按名称、描述、作者搜索。" } } } }, - "Click the clip icon to the left of the input field, or drag and drop files onto the input field. When dragging, the input field border highlights in the accent color to show the drop zone.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the clip icon to the left of the input field, or drag and drop files onto the input field. When dragging, the input field border highlights in the accent color to show the drop zone." + "Click the clip icon to the left of the input field, or drag and drop files onto the input field. When dragging, the input field border highlights in the accent color to show the drop zone." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the clip icon to the left of the input field, or drag and drop files onto the input field. When dragging, the input field border highlights in the accent color to show the drop zone." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창 왼쪽의 클립 아이콘을 클릭하거나 파일을 입력창으로 드래그하세요. 드래그 중에는 입력창 테두리가 강조 색상으로 표시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창 왼쪽의 클립 아이콘을 클릭하거나 파일을 입력창으로 드래그하세요. 드래그 중에는 입력창 테두리가 강조 색상으로 표시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击输入框左侧的回形针图标,或将文件拖放到输入框。拖动时,输入框边框会以强调色高亮显示投放区域。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击输入框左侧的回形针图标,或将文件拖放到输入框。拖动时,输入框边框会以强调色高亮显示投放区域。" } } } }, - "Click the sidebar.trailing (⊟) button at the top right of the toolbar to toggle the inspector panel. The panel docks to the right side of the window and contains two tabs: Terminal and Memo.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the sidebar.trailing (⊟) button at the top right of the toolbar to toggle the inspector panel. The panel docks to the right side of the window and contains two tabs: Terminal and Memo." + "Click the GitHub Mark button at the top of the sidebar to open the GitHub panel. After connecting your GitHub account, your repositories are listed and can be added to RxCode with one click." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the GitHub Mark button at the top of the sidebar to open the GitHub panel. After connecting your GitHub account, your repositories are listed and can be added to RxCode with one click." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "툴바 오른쪽 상단의 ⊟ 버튼을 클릭하여 인스펙터 패널을 열고 닫습니다. 패널은 창 오른쪽에 고정되며 터미널과 메모 탭을 포함합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 상단의 GitHub 마크 버튼을 클릭하여 GitHub 패널을 열어보세요. GitHub 계정을 연결하면 저장소 목록이 표시되고 한 번의 클릭으로 RxCode에 추가할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击工具栏右上角的 sidebar.trailing(⊟)按钮切换检查器面板。面板停靠在窗口右侧,包含“终端”和“备忘录”两个标签页。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击边栏顶部的 GitHub 标记按钮打开 GitHub 面板。连接 GitHub 账号后,你的仓库会列出,并可一键添加到 RxCode。" } } } }, - "Click the ⚡ button in the toolbar to open the Shortcut Manager, or press the + button on the right side of the shortcut bar. You can set a name, message/command, icon, and color.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Click the ⚡ button in the toolbar to open the Shortcut Manager, or press the + button on the right side of the shortcut bar. You can set a name, message/command, icon, and color." + "Click the sidebar.trailing (⊟) button at the top right of the toolbar to toggle the inspector panel. The panel docks to the right side of the window and contains two tabs: Terminal and Memo." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Click the sidebar.trailing (⊟) button at the top right of the toolbar to toggle the inspector panel. The panel docks to the right side of the window and contains two tabs: Terminal and Memo." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "툴바의 ⚡ 버튼을 클릭하여 단축 버튼 관리자를 열거나, 단축 버튼 바 오른쪽의 + 버튼을 누르세요. 이름, 메시지/커맨드, 아이콘, 색상을 설정할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "툴바 오른쪽 상단의 ⊟ 버튼을 클릭하여 인스펙터 패널을 열고 닫습니다. 패널은 창 오른쪽에 고정되며 터미널과 메모 탭을 포함합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击工具栏中的 ⚡ 按钮打开快捷按钮管理器,或按快捷按钮栏右侧的 + 按钮。你可以设置名称、消息/命令、图标和颜色。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击工具栏右上角的 sidebar.trailing(⊟)按钮切换检查器面板。面板停靠在窗口右侧,包含“终端”和“备忘录”两个标签页。" } } } }, - "Click to select · Command-right-click to add or remove · Right-click for Show Diff": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击选择 · Command-右键添加或移除 · 右键显示差异" + "Click to select · Command-right-click to add or remove · Right-click for Show Diff" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击选择 · Command-右键添加或移除 · 右键显示差异" } } } }, - "Client": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "客户端" + "Client" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "客户端" } } } }, - "Clipboard Detection": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Clipboard Detection" + "Clipboard Detection" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Clipboard Detection" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "클립보드 감지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "클립보드 감지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "剪贴板检测" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "剪贴板检测" } } } }, - "Clone": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "克隆" + "Clone" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "克隆" } } } }, - "Clone & Add": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "克隆并添加" + "Clone & Add" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "克隆并添加" } } } }, - "Close": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close" + "Close" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "닫기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "닫기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" } } } }, - "Close Terminal": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭终端" + "Close — you can answer later from the queue" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭 — 你可以稍后从队列中回答" } } } }, - "Close current window": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close current window" + "Close current window" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close current window" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 창 닫기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 창 닫기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭当前窗口" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭当前窗口" } } } }, - "Close popup": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close popup" + "Close popup" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close popup" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "팝업 닫기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "팝업 닫기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭弹出框" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭弹出框" } } } }, - "Close popup / stop streaming": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Close popup / stop streaming" + "Close popup / stop streaming" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close popup / stop streaming" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "팝업 닫기 / 스트리밍 중지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "팝업 닫기 / 스트리밍 중지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭弹出框 / 停止流式输出" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭弹出框 / 停止流式输出" + } + } + } + }, + "Close Terminal" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭终端" } } } }, - "Close — you can answer later from the queue": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "关闭 — 你可以稍后从队列中回答" + "Collapse chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "折叠聊天" } } } }, - "Collapse chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "折叠聊天" + "command" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "command" } } } }, - "Command": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Command" + "Command" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "命令" } } } }, - "Commands": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "命令" + "Commands" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "命令" } } } }, - "Commit %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "提交 %@" + "Commit %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "提交 %@" } } } }, - "Commit message": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "提交消息" + "Commit message" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "提交消息" } } } }, - "Configuration": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置" + "Configuration" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置" } } } }, - "Configure Model Context Protocol servers used by Claude Code and Codex.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置 Claude Code 和 Codex 使用的模型上下文协议服务器。" + "Configure Model Context Protocol servers used by Claude Code and Codex." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置 Claude Code 和 Codex 使用的模型上下文协议服务器。" } } } }, - "Configure org access →": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Configure org access →" + "Configure org access →" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Configure org access →" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "조직 접근 설정 →" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "조직 접근 설정 →" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配置组织访问权限 →" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置组织访问权限 →" } } } }, - "Connect GitHub": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Connect GitHub" + "Connect GitHub" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connect GitHub" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub 연결" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 연결" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接 GitHub" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接 GitHub" } } } }, - "Connect GitHub to\nimport repos instantly": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Connect GitHub to\nimport repos instantly" + "Connect GitHub to\nimport repos instantly" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connect GitHub to\nimport repos instantly" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub를 연결하여\n저장소를 바로 가져오세요" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub를 연결하여\n저장소를 바로 가져오세요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接 GitHub\n即可快速导入仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接 GitHub\n即可快速导入仓库" } } } }, - "Connect GitHub to fetch your repo list and add projects with a single click.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Connect GitHub to fetch your repo list and add projects with a single click." + "Connect GitHub to fetch your repo list and add projects with a single click." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connect GitHub to fetch your repo list and add projects with a single click." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub를 연결하면 저장소 목록을 가져오고 한 번의 클릭으로 프로젝트를 추가할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub를 연결하면 저장소 목록을 가져오고 한 번의 클릭으로 프로젝트를 추가할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接 GitHub 以获取仓库列表,并一键添加项目。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接 GitHub 以获取仓库列表,并一键添加项目。" } } } }, - "Connect the mobile companion": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接移动伴侣应用" + "Connect the mobile companion" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接移动伴侣应用" } } } }, - "Connect to a relay server before pairing a device.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对设备前先连接到中继服务器。" + "Connect to a relay server before pairing a device." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配对设备前先连接到中继服务器。" } } } }, - "Connect to relay servers to sync with your mobile devices remotely. You can add multiple relays and connect to all of them simultaneously.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接到中继服务器,以便与移动设备远程同步。你可以添加多个中继,并同时连接到它们。" + "Connect to relay servers to sync with your mobile devices remotely. You can add multiple relays and connect to all of them simultaneously." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接到中继服务器,以便与移动设备远程同步。你可以添加多个中继,并同时连接到它们。" } } } }, - "Connected": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Connected" + "Connected" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connected" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "연결됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "연결됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已连接" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已连接" } } } }, - "Connecting…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在连接…" + "Connecting…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在连接…" } } } }, - "Context memories: %lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上下文记忆:%lld" + "connection lost" : { + "comment" : "Fallback MCP disconnect detail when no error message is available.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接已断开" } } } }, - "Convert long text (200+ characters) into an attachment chip": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Convert long text (200+ characters) into an attachment chip" + "context — context window usage for the current session (bar + %)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "context — context window usage for the current session (bar + %)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "긴 텍스트(200자 이상)를 첨부 파일 칩으로 변환합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "context — 현재 세션의 컨텍스트 윈도우 사용률 (막대 그래프 + %)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将长文本(200+ 个字符)转换为附件标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上下文 — 当前会话的上下文窗口用量(条形图 + 百分比)" } } } }, - "Cool blue": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Cool blue" + "Context memories: %lld" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上下文记忆:%lld" + } + } + } + }, + "Convert long text (200+ characters) into an attachment chip" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Convert long text (200+ characters) into an attachment chip" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "시원한 블루" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "긴 텍스트(200자 이상)를 첨부 파일 칩으로 변환합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "冷蓝色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将长文本(200+ 个字符)转换为附件标签" } } } }, - "Copied": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copied" + "Cool blue" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cool blue" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "복사됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시원한 블루" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已复制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "冷蓝色" } } } }, - "Copy": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy" + "Copied" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copied" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "복사됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已复制" } } } }, - "Copy Code": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Copy Code" + "Copy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "코드 복사" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "복사" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制代码" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制" + } + } + } + }, + "Copy briefing text" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制简报文本" } } } }, - "Copy briefing text": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制简报文本" + "Copy Code" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Copy Code" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "코드 복사" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制代码" } } } }, - "Could not load registry. Check your network connection.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无法加载注册表。请检查网络连接。" + "Could not load registry. Check your network connection." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法加载注册表。请检查网络连接。" } } } }, - "Create and checkout": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "创建并检出" + "Create and checkout" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建并检出" } } } }, - "Create and checkout branch": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "创建并检出分支" + "Create and checkout branch" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建并检出分支" } } } }, - "Create new branch…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "创建新分支…" + "Create new branch…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建新分支…" } } } }, - "Creating…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在创建…" + "Creating…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在创建…" } } } }, - "Current branch": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前分支" + "Current branch" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前分支" } } } }, - "Custom": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自定义" + "Custom" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义" } } } }, - "Custom Sources": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自定义来源" + "Custom Sources" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义来源" } } } }, - "Custom target": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自定义目标" + "Custom target" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义目标" } } } }, - "Custom…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自定义…" + "Custom…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义…" } } } }, - "Dark indigo": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Dark indigo" + "Dark indigo" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Dark indigo" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "어두운 인디고" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "어두운 인디고" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "深靛蓝" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "深靛蓝" } } } }, - "Debug": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Debug" + "Debug" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Debug" } } } }, - "Decision": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "决策" + "Decision" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "决策" } } } }, - "Dedicated Project Window": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Dedicated Project Window" + "Dedicated Project Window" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Dedicated Project Window" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "전용 프로젝트 창" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전용 프로젝트 창" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "专用项目窗口" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "专用项目窗口" } } } }, - "Deep green": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Deep green" + "Deep green" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Deep green" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "깊은 그린" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "깊은 그린" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "深绿色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "深绿色" } } } }, - "Default": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Default" + "Default" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Default" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본값" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본값" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认" } } } }, - "Default Effort Level": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Default Effort Level" + "Default — prompts for approval before file edits and commands" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Default — prompts for approval before file edits and commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 작업량 수준 (Effort Level)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 모드 — 파일 편집과 명령어 실행 시 승인 요청" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认推理强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认 — 文件编辑和命令执行前提示批准" } } } }, - "Default Model": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Default Model" + "Default Effort Level" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Default Effort Level" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 모델" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 작업량 수준 (Effort Level)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认推理强度" } } } }, - "Default Permission Mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Default Permission Mode" + "Default Model" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Default Model" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 권한 모드 (Permission Mode)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 모델" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认权限模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认模型" } } } }, - "Default — prompts for approval before file edits and commands": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Default — prompts for approval before file edits and commands" + "Default Permission Mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Default Permission Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 모드 — 파일 편집과 명령어 실행 시 승인 요청" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 권한 모드 (Permission Mode)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "默认 — 文件编辑和命令执行前提示批准" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "默认权限模式" } } } }, - "Delete": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Delete" + "Delete" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Delete" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "삭제" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "삭제" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除" - } - } - } - }, - "Delete \"%@\"?": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除“%@”?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除" } } } }, - "Delete All": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Delete All" + "Delete — remove the session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Delete — remove the session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모두 삭제" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "삭제 — 세션을 삭제합니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全部删除" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除 — 移除会话" } } } }, - "Delete All Archived": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除所有已归档" + "Delete \"%@\"?" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除“%@”?" } } } }, - "Delete All Memories?": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除所有记忆?" + "Delete All" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Delete All" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모두 삭제" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部删除" } } } }, - "Delete Memory?": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除记忆?" + "Delete All Archived" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除所有已归档" } } } }, - "Delete Preset": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除预设" + "Delete all memories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除所有记忆" } } } }, - "Delete Profile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除配置" + "Delete All Memories?" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除所有记忆?" } } } }, - "Delete Project": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Delete Project" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 삭제" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除项目" + "Delete memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除记忆" } } } }, - "Delete Session": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除会话" + "Delete Memory?" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除记忆?" } } } }, - "Delete all memories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除所有记忆" + "Delete Preset" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除预设" } } } }, - "Delete memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除记忆" + "Delete Profile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除配置" } } } }, - "Delete — remove the session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Delete — remove the session" + "Delete Project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Delete Project" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "삭제 — 세션을 삭제합니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 삭제" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除 — 移除会话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除项目" } } } }, - "Deny": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Deny" + "Delete Session" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除会话" + } + } + } + }, + "Deny" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Deny" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "거부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "거부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "拒绝" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "拒绝" + } + } + } + }, + "Destination" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "目标" } } } }, - "Destination": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "目标" + "dev / prod / beta" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "dev / prod / beta" } } } }, - "Device name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设备名称" + "Device name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设备名称" } } } }, - "Disable globally": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局禁用" + "Disable globally" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局禁用" } } } }, - "Disabled": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已禁用" + "Disabled" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已禁用" } } } }, - "Disconnected": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已断开连接" + "Disconnected" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已断开连接" } } } }, - "Display name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示名称" + "Display name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示名称" } } } }, - "Displayed Items": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Displayed Items" + "Displayed Items" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Displayed Items" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "표시 항목" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "표시 항목" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示项" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示项" } } } }, - "Don't see your org repos?": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Don't see your org repos?" + "Don't see your org repos?" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Don't see your org repos?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "조직 저장소가 보이지 않나요?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "조직 저장소가 보이지 않나요?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有看到组织仓库?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有看到组织仓库?" } } } }, - "Don't see your org repos? →": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Don't see your org repos? →" + "Don't see your org repos? →" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Don't see your org repos? →" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "조직 저장소가 보이지 않나요? →" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "조직 저장소가 보이지 않나요? →" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有看到组织仓库?→" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有看到组织仓库?→" } } } }, - "Done": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Done" + "Done" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Done" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "완료" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "완료" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "完成" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完成" } } } }, - "Double-click": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Double-click" + "Double-click" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Double-click" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "더블클릭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "더블클릭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "双击" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "双击" } } } }, - "Double-click a project tab to open it in its own independent window. Each window manages its own sessions independently, allowing you to work on multiple projects at once.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Double-click a project tab to open it in its own independent window. Each window manages its own sessions independently, allowing you to work on multiple projects at once." + "Double-click a project tab to open it in its own independent window. Each window manages its own sessions independently, allowing you to work on multiple projects at once." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Double-click a project tab to open it in its own independent window. Each window manages its own sessions independently, allowing you to work on multiple projects at once." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 탭을 더블 클릭하면 독립적인 전용 창에서 열립니다. 각 창은 세션을 독립적으로 관리하므로 여러 프로젝트를 동시에 작업할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 탭을 더블 클릭하면 독립적인 전용 창에서 열립니다. 각 창은 세션을 독립적으로 관리하므로 여러 프로젝트를 동시에 작업할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "双击项目标签页即可在独立窗口中打开。每个窗口独立管理自己的会话,让你可以同时处理多个项目。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "双击项目标签页即可在独立窗口中打开。每个窗口独立管理自己的会话,让你可以同时处理多个项目。" } } } }, - "Duplicate Profile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "复制配置" + "Duplicate Profile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制配置" } } } }, - "Each inspector tab has a reset button (the circular arrow at the top right of the panel).": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Each inspector tab has a reset button (the circular arrow at the top right of the panel)." + "Each inspector tab has a reset button (the circular arrow at the top right of the panel)." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Each inspector tab has a reset button (the circular arrow at the top right of the panel)." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "각 인스펙터 탭에는 리셋 버튼(패널 오른쪽 상단의 원형 화살표)이 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "각 인스펙터 탭에는 리셋 버튼(패널 오른쪽 상단의 원형 화살표)이 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每个检查器标签页都有一个重置按钮(面板右上角的圆形箭头)。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每个检查器标签页都有一个重置按钮(面板右上角的圆形箭头)。" } } } }, - "Each permission request offers three choices.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Each permission request offers three choices." + "Each permission request offers three choices." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Each permission request offers three choices." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "각 권한 요청은 세 가지 선택지를 제공합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "각 권한 요청은 세 가지 선택지를 제공합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每个权限请求提供三个选项。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每个权限请求提供三个选项。" } } } }, - "Edit": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Edit" + "Edit" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "편집" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "편집" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑" } } } }, - "Edit ACP Client": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑 ACP 客户端" + "Edit ACP Client" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑 ACP 客户端" } } } }, - "Edit Configurations…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑配置…" + "Edit Configurations…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑配置…" } } } }, - "Edit Memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑记忆" + "Edit memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑记忆" } } } }, - "Edit Relay Server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑中继服务器" + "Edit Memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑记忆" } } } }, - "Edit memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "编辑记忆" + "Edit Relay Server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑中继服务器" + } + } + } + }, + "Effort Level" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Effort Level" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작업량 수준" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推理强度" } } } }, - "Effort Level": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Effort Level" + "Effort level (--effort)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Effort level (--effort)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작업량 수준" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작업량(--effort) 설정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "推理强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推理强度 (--effort)" } } } }, - "Effort Picker": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Effort Picker" + "Effort level: %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推理强度:%@" + } + } + } + }, + "Effort Picker" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Effort Picker" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작업량" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작업량" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "推理强度选择器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推理强度选择器" } } } }, - "Effort level (--effort)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Effort level (--effort)" + "effort.desc.auto" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Uses the model's default effort level, chosen automatically based on the active model and plan." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작업량(--effort) 설정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "활성 모델과 플랜에 따라 자동으로 결정되는 모델 기본값을 사용합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "推理强度 (--effort)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用模型的默认推理强度,并根据当前模型和套餐自动选择。" } } } }, - "Effort level: %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "推理强度:%@" + "effort.desc.high" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Balances token usage and intelligence. Good minimum for intelligence-sensitive work." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "토큰 사용량과 지능 수준을 균형 있게 유지합니다. 정확도가 중요한 작업의 최소 권장 수준입니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "平衡 token 用量和智能程度。适合对智能要求较高工作的最低建议。" } } } }, - "Empty Bash Configuration": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "空 Bash 配置" + "effort.desc.low" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reserve for short, scoped, latency-sensitive tasks that are not intelligence-sensitive." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "지연 시간에 민감하고 복잡하지 않은 짧고 범위가 명확한 작업에 사용하세요." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保留给简短、范围明确、对延迟敏感且不需要高智能的任务。" } } } }, - "Empty Make Configuration": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "空 Make 配置" + "effort.desc.max" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Deepest reasoning with no token constraint. Current session only. Best for demanding, complex tasks." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "토큰 제한 없이 가장 깊은 추론을 제공합니다. 현재 세션에만 적용됩니다. 복잡하고 까다로운 작업에 적합합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最深度推理,不限制 token。仅当前会话有效。最适合要求高、复杂的任务。" } } } }, - "Empty Xcode Configuration": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "空 Xcode 配置" + "effort.desc.medium" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reduces token usage for cost-sensitive work that can trade off some intelligence." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일부 정확도를 양보하더라도 토큰 비용을 줄이고 싶을 때 적합합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "为成本敏感型工作减少 token 用量,可接受一定智能折中。" } } } }, - "Enable Focus Mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enable Focus Mode" + "effort.desc.xhigh" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Best results for most coding and agentic tasks. Recommended default on Opus 4.7." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "집중 모드 활성화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대부분의 코딩 및 에이전트 작업에서 최상의 결과를 제공합니다. Opus 4.7의 권장 기본값입니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用专注模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "适合大多数编码和智能体任务,效果最佳。Opus 4.7 的推荐默认值。" + } + } + } + }, + "Empty Bash Configuration" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "空 Bash 配置" + } + } + } + }, + "Empty Make Configuration" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "空 Make 配置" + } + } + } + }, + "Empty Xcode Configuration" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "空 Xcode 配置" } } } }, - "Enable Memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用记忆" + "Enable a focused chat layout that hides the project tab bar and sidebar controls — useful when you want to concentrate on a single conversation" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enable a focused chat layout that hides the project tab bar and sidebar controls — useful when you want to concentrate on a single conversation" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 탭 바와 사이드바 컨트롤을 숨기는 집중 레이아웃을 활성화합니다 — 단일 대화에 집중하고 싶을 때 유용합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用专注聊天布局,隐藏项目标签栏和边栏控件;适合需要专注于单个对话时使用" } } } }, - "Enable a focused chat layout that hides the project tab bar and sidebar controls — useful when you want to concentrate on a single conversation": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enable a focused chat layout that hides the project tab bar and sidebar controls — useful when you want to concentrate on a single conversation" + "Enable Focus Mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enable Focus Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 탭 바와 사이드바 컨트롤을 숨기는 집중 레이아웃을 활성화합니다 — 단일 대화에 집중하고 싶을 때 유용합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "집중 모드 활성화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用专注聊天布局,隐藏项目标签栏和边栏控件;适合需要专注于单个对话时使用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用专注模式" + } + } + } + }, + "Enable globally" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局启用" } } } }, - "Enable globally": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局启用" + "Enable Memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用记忆" } } } }, - "Enable the \"Run as terminal command\" option to execute the shortcut as a shell command in the inspector terminal instead of sending it as a chat message. The project directory is used as the working directory.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Enable the \"Run as terminal command\" option to execute the shortcut as a shell command in the inspector terminal instead of sending it as a chat message. The project directory is used as the working directory." + "Enable the \"Run as terminal command\" option to execute the shortcut as a shell command in the inspector terminal instead of sending it as a chat message. The project directory is used as the working directory." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Enable the \"Run as terminal command\" option to execute the shortcut as a shell command in the inspector terminal instead of sending it as a chat message. The project directory is used as the working directory." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "\"터미널 커맨드로 실행\" 옵션을 활성화하면 채팅 메시지 대신 인스펙터 터미널에서 셸 커맨드로 실행됩니다. 프로젝트 디렉토리가 작업 디렉토리로 사용됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "\"터미널 커맨드로 실행\" 옵션을 활성화하면 채팅 메시지 대신 인스펙터 터미널에서 셸 커맨드로 실행됩니다. 프로젝트 디렉토리가 작업 디렉토리로 사용됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用“作为终端命令运行”选项后,快捷按钮会在检查器终端中作为 shell 命令执行,而不是作为聊天消息发送。项目目录会作为工作目录。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用“作为终端命令运行”选项后,快捷按钮会在检查器终端中作为 shell 命令执行,而不是作为聊天消息发送。项目目录会作为工作目录。" } } } }, - "Enter a new name for this device.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入此设备的新名称。" + "Enter a new name for this device." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入此设备的新名称。" } } } }, - "Enter a valid ws:// or wss:// URL.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "请输入有效的 ws:// 或 wss:// URL。" + "Enter a valid ws:// or wss:// URL." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请输入有效的 ws:// 或 wss:// URL。" } } } }, - "Env File": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "环境文件" + "Env File" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "环境文件" } } } }, - "Environment": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "环境" + "Environment" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "环境" } } } }, - "Environments": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "环境" + "Environments" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "环境" } } } }, - "Erase the memo for the current project (cannot be undone)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Erase the memo for the current project (cannot be undone)" + "Erase the memo for the current project (cannot be undone)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Erase the memo for the current project (cannot be undone)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 프로젝트의 메모를 모두 삭제합니다 (되돌릴 수 없음)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 프로젝트의 메모를 모두 삭제합니다 (되돌릴 수 없음)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "清除当前项目的备忘录(无法撤销)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除当前项目的备忘录(无法撤销)" } } } }, - "Error": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Error" + "Error" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Error" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "오류" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오류" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "错误" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "错误" } } } }, - "Execute command": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Execute command" + "esc" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "esc" + } + } + } + }, + "Execute command" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Execute command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 실행" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 실행" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "执行命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "执行命令" } } } }, - "Execute selected command": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Execute selected command" + "Execute selected command" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Execute selected command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "선택한 커맨드 실행" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "선택한 커맨드 실행" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "执行所选命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "执行所选命令" + } + } + } + }, + "exit %d" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "exit %d" } } } }, - "Exit edit mode": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Exit edit mode" + "exit 0" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "exit 0" + } + } + } + }, + "Exit edit mode" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Exit edit mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "편집 모드 종료" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "편집 모드 종료" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "退出编辑模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出编辑模式" } } } }, - "Expand chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "展开聊天" + "Expand chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "展开聊天" } } } }, - "Expired — generating a new QR code": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已过期 — 正在生成新的二维码" + "Expired — generating a new QR code" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已过期 — 正在生成新的二维码" } } } }, - "Extra environment": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "额外环境" + "Extra environment" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "额外环境" } } } }, - "Fact": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "事实" + "Fact" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "事实" } } } }, - "Failed": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Failed" + "Failed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Failed" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "실패" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "실패" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "失败" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "失败" } } } }, - "Failed to check status": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Failed to check status" + "Failed to check status" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Failed to check status" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상태 확인 실패" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 확인 실패" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检查状态失败" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查状态失败" } } } }, - "Fetch": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "获取" + "Fetch" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "获取" } } } }, - "Fetch Models": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "获取模型" + "Fetch Models" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "获取模型" } } } }, - "Fetch models first": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "请先获取模型" + "Fetch models first" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请先获取模型" } } } }, - "File": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File" + "File" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件" } } } }, - "File & Image Attachments": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File & Image Attachments" + "File & Image Attachments" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File & Image Attachments" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 및 이미지 첨부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 및 이미지 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件和图像附件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件和图像附件" } } } }, - "File Inspector": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File Inspector" + "File Inspector" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File Inspector" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 인스펙터" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 인스펙터" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件检查器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件检查器" } } } }, - "File is too large (>1MB)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File is too large (>1MB)" + "File is too large (>1MB)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File is too large (>1MB)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일이 너무 큽니다 (>1MB)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일이 너무 큽니다 (>1MB)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件太大(>1MB)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件太大(>1MB)" } } } }, - "File path → attached as a file": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File path → attached as a file" + "File path → attached as a file" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File path → attached as a file" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 경로 → 파일로 첨부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 경로 → 파일로 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件路径 → 作为文件附加" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件路径 → 作为文件附加" } } } }, - "File paths": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "File paths" + "File paths" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File paths" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 경로" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 경로" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件路径" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件路径" } } } }, - "Files": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Files" + "Files" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Files" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件" } } } }, - "Files larger than 1 MB cannot be previewed.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Files larger than 1 MB cannot be previewed." + "Files larger than 1 MB cannot be previewed." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Files larger than 1 MB cannot be previewed." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "1 MB를 초과하는 파일은 미리볼 수 없습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 MB를 초과하는 파일은 미리볼 수 없습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "大于 1 MB 的文件无法预览。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大于 1 MB 的文件无法预览。" } } } }, - "Files tab + activate search": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Files tab + activate search" + "Files tab + activate search" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Files tab + activate search" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 탭 + 검색 활성화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 탭 + 검색 활성화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "文件标签页 + 激活搜索" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件标签页 + 激活搜索" } } } }, - "Focus Mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Focus Mode" + "Focus Mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Focus Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "집중 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "집중 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "专注模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "专注模式" } } } }, - "Font Size": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Font Size" + "focus.mode.desc" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide streaming bubbles and show only completed responses in history." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "폰트 크기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스트리밍 중 메시지 버블을 숨기고, 완료된 응답만 히스토리에 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "字体大小" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐藏流式输出气泡,只在历史记录中显示已完成的回复。" } } } }, - "Force off": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "强制关闭" + "Font Size" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Font Size" } - } - } - }, - "Force on": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "强制开启" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "폰트 크기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "字体大小" } } } }, - "Forest": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Forest" + "font.size.hint" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Adjust interface and message font sizes independently." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "포레스트" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인터페이스와 메시지 폰트 크기를 각각 조절합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "森林" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分别调整界面和消息字体大小。" } } } }, - "General": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "General" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일반" + "Force off" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "强制关闭" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通用" + } + } + }, + "Force on" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "强制开启" } } } }, - "General Tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "General Tab" + "Forest" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Forest" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일반 탭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "포레스트" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通用标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "森林" } } } }, - "Generate": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "生成" + "from %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "来自 %@" } } } }, - "Generate a commit message from the staged diff": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "根据已暂存差异生成提交消息" + "General" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "General" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일반" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通用" } } } }, - "Get Started": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Get Started" + "General Tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "General Tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "시작하기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일반 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开始使用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通用标签页" + } + } + } + }, + "Generate" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "生成" } } } }, - "Git Repositories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Git 仓库" + "Generate a commit message from the staged diff" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "根据已暂存差异生成提交消息" } } } }, - "Git Status": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Git Status" + "Get Started" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Get Started" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Git 상태" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시작하기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Git 状态" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开始使用" } } } }, - "Git URL": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Git URL" + "Git Repositories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git 仓库" } } } }, - "GitHub": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "GitHub" + "Git Status" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Git Status" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git 상태" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "GitHub" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git 状态" } } } }, - "GitHub Integration": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "GitHub Integration" + "Git URL" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git URL" + } + } + } + }, + "GitHub" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "GitHub" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub 연동" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "GitHub 集成" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub" } } } }, - "GitHub Repository": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "GitHub 仓库" + "GitHub Integration" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "GitHub Integration" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 연동" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 集成" } } } }, - "Global": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局" + "GitHub Repository" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 仓库" } } } }, - "Global Shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Global Shortcuts" + "Global" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局" } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "전체 단축키" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局快捷键" + } + } + }, + "Global default" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局默认" } } } }, - "Global default": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局默认" + "Global default plus per-project override" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局默认值加项目级覆盖" } } } }, - "Global default plus per-project override": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全局默认值加项目级覆盖" + "Global Shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Global Shortcuts" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전체 단축키" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全局快捷键" } } } }, - "Go to Files tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Go to Files tab" + "Go to Files tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Go to Files tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 탭으로 이동" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 탭으로 이동" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "转到文件标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "转到文件标签页" } } } }, - "Go to History tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Go to History tab" + "Go to History tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Go to History tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록 탭으로 이동" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 탭으로 이동" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "转到历史标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "转到历史标签页" } } } }, - "Headers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "标头" + "Headers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "标头" } } } }, - "Heading levels (# / ## / ###)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Heading levels (# / ## / ###)" + "Heading levels (# / ## / ###)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Heading levels (# / ## / ###)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "제목 수준 (# / ## / ###)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "제목 수준 (# / ## / ###)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "标题级别(# / ## / ###)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "标题级别(# / ## / ###)" } } } }, - "Hidden Files": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Hidden Files" + "Hidden Files" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Hidden Files" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "숨김 파일" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "숨김 파일" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐藏文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐藏文件" } } } }, - "Hide Hidden Files": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐藏隐藏文件" + "Hide details" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐藏详情" } } } }, - "Hide details": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐藏详情" + "Hide Hidden Files" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐藏隐藏文件" } } } }, - "Hide more": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐藏更多" + "Hide more" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐藏更多" } } } }, - "High": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "High" + "High" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "High" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "높음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "높음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "高" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "高" } } } }, - "History": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "History" + "History" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "History" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "历史" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "历史" } } } }, - "History Management": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "History Management" + "History Management" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "History Management" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "历史管理" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "历史管理" } } } }, - "History tab: shows previous conversations\nFiles tab: browse the project file tree": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "History tab: shows previous conversations\nFiles tab: browse the project file tree" + "History tab: shows previous conversations\nFiles tab: browse the project file tree" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "History tab: shows previous conversations\nFiles tab: browse the project file tree" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록 탭: 이전 대화 표시\n파일 탭: 프로젝트 파일 트리 탐색" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 탭: 이전 대화 표시\n파일 탭: 프로젝트 파일 트리 탐색" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "历史标签页:显示之前的对话\n文件标签页:浏览项目文件树" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "历史标签页:显示之前的对话\n文件标签页:浏览项目文件树" } } } }, - "Homepage": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Homepage" + "Homepage" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Homepage" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "홈페이지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "홈페이지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "主页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "主页" } } } }, - "How to Use": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "How to Use" + "How to Use" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "How to Use" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용 방법" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용 방법" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用方法" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用方法" + } + } + } + }, + "https://example.com/mcp" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://example.com/mcp" + } + } + } + }, + "https://github.com/owner/repo" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/owner/repo" + } + } + } + }, + "https://github.com/owner/repo.git or git@github.com:owner/repo.git" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://github.com/owner/repo.git or git@github.com:owner/repo.git" } } } }, - "If no action is taken, the request is automatically denied after 5 minutes. Press Return to Allow, or Escape to Deny.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "If no action is taken, the request is automatically denied after 5 minutes. Press Return to Allow, or Escape to Deny." + "If no action is taken, the request is automatically denied after 5 minutes. Press Return to Allow, or Escape to Deny." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "If no action is taken, the request is automatically denied after 5 minutes. Press Return to Allow, or Escape to Deny." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "5분 안에 응답이 없으면 요청이 자동으로 거부됩니다. Return으로 허용, Escape로 거부할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "5분 안에 응답이 없으면 요청이 자동으로 거부됩니다. Return으로 허용, Escape로 거부할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "如果不采取任何操作,请求会在 5 分钟后自动拒绝。按 Return 允许,或按 Escape 拒绝。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "如果不采取任何操作,请求会在 5 分钟后自动拒绝。按 Return 允许,或按 Escape 拒绝。" } } } }, - "Image data (PNG/TIFF) → attached as an image": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Image data (PNG/TIFF) → attached as an image" + "Image data (PNG/TIFF) → attached as an image" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Image data (PNG/TIFF) → attached as an image" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미지 데이터(PNG/TIFF) → 이미지로 첨부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지 데이터(PNG/TIFF) → 이미지로 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "图像数据(PNG/TIFF)→ 作为图像附加" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图像数据(PNG/TIFF)→ 作为图像附加" } } } }, - "Images": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Images" + "Images" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Images" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "图片" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图片" } } } }, - "In a dedicated project window, only the project name is shown — there are no project tabs.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "In a dedicated project window, only the project name is shown — there are no project tabs." + "In a dedicated project window, only the project name is shown — there are no project tabs." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "In a dedicated project window, only the project name is shown — there are no project tabs." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "전용 프로젝트 창에서는 프로젝트 이름만 표시되며 프로젝트 탭은 없습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전용 프로젝트 창에서는 프로젝트 이름만 표시되며 프로젝트 탭은 없습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在专用项目窗口中,只显示项目名称,不显示项目标签页。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在专用项目窗口中,只显示项目名称,不显示项目标签页。" } } } }, - "In progress": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "进行中" + "In progress" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "进行中" } } } }, - "Inactive chats are moved to the archive automatically. Pinned chats are never auto-archived.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "不活跃聊天会自动移入归档。固定的聊天永远不会自动归档。" + "Inactive chats are moved to the archive automatically. Pinned chats are never auto-archived." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不活跃聊天会自动移入归档。固定的聊天永远不会自动归档。" } } } }, - "Include relevant memories in agent context": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在智能体上下文中包含相关记忆" + "Include relevant memories in agent context" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在智能体上下文中包含相关记忆" } } } }, - "Inherit global default": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "继承全局默认值" + "Inherit global default" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "继承全局默认值" } } } }, - "Inline code": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Inline code" + "Inline code" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Inline code" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인라인 코드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인라인 코드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "行内代码" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "行内代码" } } } }, - "Input": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Input" + "Input" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Input" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入" } } } }, - "Input Field Shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Input Field Shortcuts" + "Input Field Shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Input Field Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창 단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창 단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入框快捷键" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入框快捷键" } } } }, - "Insert file path": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Insert file path" + "Insert file path" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Insert file path" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 경로 삽입" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 경로 삽입" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "插入文件路径" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "插入文件路径" } } } }, - "Insert file path into message": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Insert file path into message" + "Insert file path into message" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Insert file path into message" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지에 파일 경로 삽입" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지에 파일 경로 삽입" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "将文件路径插入消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将文件路径插入消息" } } } }, - "Insert line break": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Insert line break" + "Insert line break" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Insert line break" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "줄 바꿈 삽입" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "줄 바꿈 삽입" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "插入换行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "插入换行" } } } }, - "Insert link": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Insert link" + "Insert link" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Insert link" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "링크 삽입" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "링크 삽입" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "插入链接" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "插入链接" } } } }, - "Inspector Panel": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Inspector Panel" + "Inspector Panel" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Inspector Panel" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인스펙터 패널" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인스펙터 패널" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检查器面板" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查器面板" } } } }, - "Install": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Install" + "Install" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Install" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装" } } } }, - "Install ACP agents": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装 ACP 智能体" + "Install ACP agents" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装 ACP 智能体" } } } }, - "Install Command": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Install Command" + "Install Command" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Install Command" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装命令" } } } }, - "Install command:": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Install command:" + "Install command:" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Install command:" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치 커맨드:" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치 커맨드:" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装命令:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装命令:" } } } }, - "Installed": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Installed" + "Installed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Installed" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치됨" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치됨" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已安装" - } - } - } - }, - "Installed skills are managed by RxCode, sourced from OpenAI Agent Skills and compatible catalogs, and enabled for Claude Code, Codex, and ACP agents where supported.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已安装技能由 RxCode 管理,来源于 OpenAI Agent Skills 和兼容目录,并会在支持的 Claude Code、Codex 和 ACP 智能体中启用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已安装" } } } }, - "Installed — %@": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Installed — %@" + "Installed — %@" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Installed — %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치됨 — %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치됨 — %@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已安装 — %@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已安装 — %@" + } + } + } + }, + "Installed skills are managed by RxCode, sourced from OpenAI Agent Skills and compatible catalogs, and enabled for Claude Code, Codex, and ACP agents where supported." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已安装技能由 RxCode 管理,来源于 OpenAI Agent Skills 和兼容目录,并会在支持的 Claude Code、Codex 和 ACP 智能体中启用。" } } } }, - "Installing Plugins": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Installing Plugins" + "Installing Plugins" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Installing Plugins" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "플러그인 설치" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "플러그인 설치" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "安装插件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "安装插件" } } } }, - "Installing...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Installing..." + "Installing..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Installing..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在安装..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在安装..." } } } }, - "Installing…": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Installing…" + "Installing…" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Installing…" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설치 중…" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치 중…" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在安装…" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在安装…" } } } }, - "Interactive Commands": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interactive Commands" + "Interactive Commands" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interactive Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인터랙티브 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인터랙티브 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "交互式命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "交互式命令" } } } }, - "Interactive Terminal Popup": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interactive Terminal Popup" + "Interactive Terminal Popup" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interactive Terminal Popup" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대화형 터미널 팝업" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "대화형 터미널 팝업" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "交互式终端弹窗" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "交互式终端弹窗" } } } }, - "Interface": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Interface" + "Interface" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Interface" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인터페이스" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인터페이스" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "界面" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "界面" } } } }, - "Italic": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Italic" + "Italic" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Italic" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기울임꼴" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기울임꼴" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜体" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜体" } } } }, - "Items are shown left to right in the status line.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Items are shown left to right in the status line." + "Items are shown left to right in the status line." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Items are shown left to right in the status line." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상태 표시줄 왼쪽부터 오른쪽 순서로 다음 정보가 표시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 표시줄 왼쪽부터 오른쪽 순서로 다음 정보가 표시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "状态行中的项目从左到右显示。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "状态行中的项目从左到右显示。" } } } }, - "JSON import/export backs up or shares custom commands only. Built-in commands in imported files are ignored.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "JSON import/export backs up or shares custom commands only. Built-in commands in imported files are ignored." + "JSON import/export backs up or shares custom commands only. Built-in commands in imported files are ignored." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "JSON import/export backs up or shares custom commands only. Built-in commands in imported files are ignored." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "JSON 가져오기/내보내기는 커스텀 커맨드만 백업하거나 공유합니다. 가져온 파일의 기본 커맨드는 무시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 가져오기/내보내기는 커스텀 커맨드만 백업하거나 공유합니다. 가져온 파일의 기본 커맨드는 무시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "JSON 导入/导出只会备份或共享自定义命令。导入文件中的内置命令会被忽略。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 导入/导出只会备份或共享自定义命令。导入文件中的内置命令会被忽略。" } } } }, - "JSON import/export is supported for backing up or sharing your shortcut set.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "JSON import/export is supported for backing up or sharing your shortcut set." + "JSON import/export is supported for backing up or sharing your shortcut set." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "JSON import/export is supported for backing up or sharing your shortcut set." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축 버튼 세트를 백업하거나 공유하기 위한 JSON 가져오기/내보내기를 지원합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축 버튼 세트를 백업하거나 공유하기 위한 JSON 가져오기/내보내기를 지원합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "支持通过 JSON 导入/导出来备份或共享快捷按钮集。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "支持通过 JSON 导入/导出来备份或共享快捷按钮集。" } } } }, - "KEY": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "KEY" + "Keep summaries on the thread model, or route titles and briefings through an OpenAI-compatible endpoint." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "可使用对话模型生成摘要,或通过 OpenAI 兼容端点处理标题和简报。" } } } }, - "Keep summaries on the thread model, or route titles and briefings through an OpenAI-compatible endpoint.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "可使用对话模型生成摘要,或通过 OpenAI 兼容端点处理标题和简报。" + "KEY" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "KEY" } } } }, - "Keyboard Shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Keyboard Shortcuts" + "Keyboard Shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Keyboard Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "键盘快捷键" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "键盘快捷键" } } } }, - "Kind": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "类型" + "Kind" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "类型" } } } }, - "Lavender": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Lavender" + "Lavender" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Lavender" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "라벤더" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라벤더" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "薰衣草" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "薰衣草" } } } }, - "Line break": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Line break" + "Line break" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Line break" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "줄 바꿈" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "줄 바꿈" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "换行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "换行" } } } }, - "Live channel only": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅实时通道" + "Live channel only" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅实时通道" } } } }, - "Load from .env file": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从 .env 文件加载" + "Load from .env file" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从 .env 文件加载" } } } }, - "Loading catalog...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Loading catalog..." + "Loading catalog..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Loading catalog..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "카탈로그 불러오는 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카탈로그 불러오는 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载目录..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载目录..." + } + } + } + }, + "Loading destinations…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载目标…" } } } }, - "Loading destinations…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载目标…" + "Loading registry…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载注册表…" } } } }, - "Loading registry…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载注册表…" + "Loading repos..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Loading repos..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장소 불러오는 중..." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载仓库..." } } } }, - "Loading repos...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Loading repos..." + "loading..." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "loading..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장소 불러오는 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "불러오는 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载仓库..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载..." } } } }, - "Loading...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Loading..." + "Loading..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Loading..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "불러오는 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "불러오는 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载..." } } } }, - "Local": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Local" + "Local" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Local" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "로컬" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로컬" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "本地" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "本地" } } } }, - "Local on-device search · archived threads included": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "本地设备端搜索 · 包含已归档对话" + "Local on-device search · archived threads included" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "本地设备端搜索 · 包含已归档对话" } } } }, - "Long text (200+ characters)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Long text (200+ characters)" + "Long text (>2 KB) → converted to a text attachment" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Long text (>2 KB) → converted to a text attachment" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "긴 텍스트 (200자 이상)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "장문 텍스트(>2 KB) → 텍스트 첨부 파일로 변환" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "长文本(200 字符以上)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "长文本(>2 KB)→ 转换为文本附件" } } } }, - "Long text (>2 KB) → converted to a text attachment": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Long text (>2 KB) → converted to a text attachment" + "Long text (200+ characters)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Long text (200+ characters)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "장문 텍스트(>2 KB) → 텍스트 첨부 파일로 변환" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "긴 텍스트 (200자 이상)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "长文本(>2 KB)→ 转换为文本附件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "长文本(200 字符以上)" } } } }, - "Low": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Low" + "Low" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Low" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "낮음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "낮음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "低" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "低" } } } }, - "MCP": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "MCP" + "main" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "main" } } } }, - "MCP Servers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "MCP 服务器" + "Main Layout" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Main Layout" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기본 레이아웃" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "主布局" } } } }, - "MCP error": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "MCP 错误" + "Make" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Make" } } } }, - "MCP server disconnected": { - "comment": "Notification title when an MCP server transitions from connected to failed.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "MCP 服务器已断开连接" + "Makefile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Makefile" } } } }, - "Main Layout": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Main Layout" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기본 레이아웃" + "Makefile (optional)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Makefile(可选)" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "主布局" + } + } + }, + "Malformed question payload" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "问题载荷格式错误" } } } }, - "Make": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Make" + "Manage" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理" } } } }, - "Makefile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Makefile" + "Manage agents that speak the Agent Client Protocol. Detected from agentclientprotocol.com." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理使用 Agent Client Protocol 的智能体。从 agentclientprotocol.com 检测。" } } } }, - "Makefile (optional)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Makefile(可选)" + "Manage GitHub Repos" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage GitHub Repos" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 저장소 관리" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理 GitHub 仓库" } } } }, - "Malformed question payload": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "问题载荷格式错误" + "Manage MCP servers once in RxCode, then enable or disable them globally or per project." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 RxCode 中统一管理 MCP 服务器,然后全局或按项目启用/禁用。" } } } }, - "Manage": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理" + "Manage Shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage Shortcuts" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키 관리" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理快捷方式" } } } }, - "Manage GitHub Repos": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage GitHub Repos" + "Manage Slash Commands" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Manage Slash Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub 저장소 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理 GitHub 仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理斜杠命令" } } } }, - "Manage MCP servers once in RxCode, then enable or disable them globally or per project.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 RxCode 中统一管理 MCP 服务器,然后全局或按项目启用/禁用。" + "Managing Commands" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Managing Commands" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 관리" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理命令" } } } }, - "Manage Shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage Shortcuts" + "Managing Shortcuts" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Managing Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축 버튼 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理快捷按钮" + } + } + } + }, + "Manual key/value pairs" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "手动键/值对" } } } }, - "Manage Slash Commands": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Manage Slash Commands" + "Market" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Market" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "마켓" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理斜杠命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "市场" } } } }, - "Manage agents that speak the Agent Client Protocol. Detected from agentclientprotocol.com.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理使用 Agent Client Protocol 的智能体。从 agentclientprotocol.com 检测。" + "Matched on title" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按标题匹配" } } } }, - "Managing Commands": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Managing Commands" + "Max" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Max" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "최대" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最大" + } + } + } + }, + "MCP" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP" + } + } + } + }, + "MCP error" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP 错误" + } + } + } + }, + "MCP server disconnected" : { + "comment" : "Notification title when an MCP server transitions from connected to failed.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP 服务器已断开连接" + } + } + } + }, + "MCP Servers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP 服务器" } } } }, - "Managing Shortcuts": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Managing Shortcuts" + "Medium" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Medium" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축 버튼 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "보통" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "管理快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中" } } } }, - "Manual key/value pairs": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "手动键/值对" + "Memo" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Memo" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메모" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "备忘" } } } }, - "Market": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Market" + "Memo Tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Memo Tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "마켓" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메모 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "市场" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "备忘录标签页" + } + } + } + }, + "Memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "记忆" + } + } + } + }, + "Memory History" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "记忆历史" + } + } + } + }, + "Menu Bar" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "菜单栏" } } } }, - "Matched on title": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按标题匹配" + "Message" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Message" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息" } } } }, - "Max": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Max" + "Message Queue" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Message Queue" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "최대" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 큐" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "最大" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息队列" } } } }, - "Medium": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Medium" + "Message Tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Message Tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "보통" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "中" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息标签页" } } } }, - "Memo": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Memo" + "Messages" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Messages" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메모" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "备忘" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息" } } } }, - "Memo Tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Memo Tab" + "Midnight" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Midnight" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메모 탭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "미드나잇" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "备忘录标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "午夜" } } } }, - "Memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "记忆" + "Mobile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移动端" } } } }, - "Memory History": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "记忆历史" + "Mobile companion" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移动伴侣应用" } } } }, - "Menu Bar": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "菜单栏" + "Model" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模型" } } } }, - "Message": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Message" + "Model — name of the Claude model in use for this session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Model — name of the Claude model in use for this session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델 — 현재 세션에서 사용 중인 Claude 모델 이름" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模型 — 当前会话使用的 Claude 模型名称" } } } }, - "Message Queue": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Message Queue" + "Model Picker" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Model Picker" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 큐" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "消息队列" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模型选择器" } } } }, - "Message Tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Message Tab" + "Model, permission mode, and effort can also be overridden per session from the toolbar — the chosen value sticks to that session." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Model, permission mode, and effort can also be overridden per session from the toolbar — the chosen value sticks to that session." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 탭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델, 권한 모드, 작업량은 툴바에서 세션별로도 변경할 수 있으며, 선택한 값은 해당 세션에만 적용됩니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "也可以从工具栏为每个会话单独覆盖模型、权限模式和推理强度;所选值会保留在该会话中。" + } + } + } + }, + "Model: %@ · %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Model: %1$@ · %2$@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "消息标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模型:%1$@ · %2$@" } } } }, - "Messages": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Messages" + "model.desc.best" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Most capable available model, currently equivalent to Opus" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 사용 가능한 가장 강력한 모델 (현재 Opus와 동일)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前可用的最强模型,目前等同于 Opus" } } } }, - "Midnight": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Midnight" + "model.desc.default" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reverts to the recommended model for your account type" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "미드나잇" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계정 유형에 따른 권장 모델로 되돌림" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "午夜" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "恢复为适合你账户类型的推荐模型" } } } }, - "Mobile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移动端" + "model.desc.haiku" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Fast and efficient model for simple tasks" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "간단한 작업을 위한 빠르고 효율적인 모델" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "适合简单任务的快速高效模型" } } } }, - "Mobile companion": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移动伴侣应用" + "model.desc.opus" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Latest Opus model for complex reasoning tasks" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "복잡한 추론 작업을 위한 최신 Opus 모델" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "适合复杂推理任务的最新 Opus 模型" } } } }, - "Model": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "模型" + "model.desc.opus1m" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Opus with 1 million token context window for long sessions" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "긴 세션을 위한 100만 토큰 컨텍스트 윈도우 Opus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "带 100 万 token 上下文窗口的 Opus,适合长会话" } } } }, - "Model Picker": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Model Picker" + "model.desc.opusplan" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Opus in plan mode, then switches to Sonnet for execution" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plan Mode에서 Opus 사용 후 실행 시 Sonnet으로 전환" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "模型选择器" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在计划模式中使用 Opus,执行时切换到 Sonnet" } } } }, - "Model — name of the Claude model in use for this session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Model — name of the Claude model in use for this session" + "model.desc.sonnet" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Latest Sonnet model for daily coding tasks" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델 — 현재 세션에서 사용 중인 Claude 모델 이름" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일일 코딩 작업을 위한 최신 Sonnet 모델" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "模型 — 当前会话使用的 Claude 模型名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "适合日常编码任务的最新 Sonnet 模型" } } } }, - "Model, permission mode, and effort can also be overridden per session from the toolbar — the chosen value sticks to that session.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Model, permission mode, and effort can also be overridden per session from the toolbar — the chosen value sticks to that session." + "model.desc.sonnet1m" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sonnet with 1 million token context window for long sessions" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델, 권한 모드, 작업량은 툴바에서 세션별로도 변경할 수 있으며, 선택한 값은 해당 세션에만 적용됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "긴 세션을 위한 100만 토큰 컨텍스트 윈도우 Sonnet" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "也可以从工具栏为每个会话单独覆盖模型、权限模式和推理强度;所选值会保留在该会话中。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "带 100 万 token 上下文窗口的 Sonnet,适合长会话" } } } }, - "Model: %@ · %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Model: %1$@ · %2$@" + "Models" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模型" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "模型:%1$@ · %2$@" + } + } + }, + "More" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更多" } } } }, - "Models": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "模型" + "My Relay Server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "我的中继服务器" } } } }, - "More": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "更多" + "my-project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "my-project" } } } }, - "My Relay Server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "我的中继服务器" + "my-server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "my-server" } } } }, - "Name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "名称" + "Name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "名称" } } } }, - "New Chat": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "New Chat" + "New Chat" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "New Chat" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 채팅" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 채팅" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "新建聊天" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建聊天" } } } }, - "New Chat in %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 %@ 中新建聊天" + "New Chat in %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 %@ 中新建聊天" } } } }, - "New Terminal": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "新建终端" + "New Terminal" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建终端" } } } }, - "New Terminal (⌘T)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "新建终端(⌘T)" + "New Terminal (⌘T)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建终端(⌘T)" } } } }, - "Next": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "下一步" + "Next" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "下一步" } } } }, - "Next message / clear input": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Next message / clear input" + "Next message / clear input" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Next message / clear input" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다음 메시지 / 입력 지우기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다음 메시지 / 입력 지우기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "下一条消息 / 清空输入" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "下一条消息 / 清空输入" } } } }, - "No active runs": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有正在运行的任务" + "No active runs" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有正在运行的任务" } } } }, - "No agents match “%@”.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有匹配“%@”的智能体。" + "No agents match “%@”." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有匹配“%@”的智能体。" } } } }, - "No archived chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有已归档聊天" + "No archived chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有已归档聊天" } } } }, - "No changes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No changes" + "No changes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No changes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "변경사항 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "변경사항 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有变更" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有变更" } } } }, - "No chat history": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No chat history" + "No chat history" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No chat history" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 기록 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 기록 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有聊天历史" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有聊天历史" } } } }, - "No chats yet": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还没有聊天" + "No chats yet" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还没有聊天" } } } }, - "No clients installed. Add one from the Registry tab.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未安装客户端。请从“注册表”标签页添加一个。" + "No clients installed. Add one from the Registry tab." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未安装客户端。请从“注册表”标签页添加一个。" } } } }, - "No custom Git sources": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有自定义 Git 来源" + "No custom Git sources" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有自定义 Git 来源" } } } }, - "No custom Git sources added.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "尚未添加自定义 Git 来源。" + "No custom Git sources added." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚未添加自定义 Git 来源。" } } } }, - "No custom repositories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有自定义仓库" + "No custom repositories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有自定义仓库" } } } }, - "No destinations found": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到目标" + "No destinations found" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到目标" } } } }, - "No editors detected": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未检测到编辑器" + "No editors detected" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未检测到编辑器" } } } }, - "No environment variables defined": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未定义环境变量" + "No environment variables defined" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未定义环境变量" } } } }, - "No local branches": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No local branches" + "No local branches" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No local branches" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "로컬 브랜치 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로컬 브랜치 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有本地分支" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有本地分支" } } } }, - "No matching memories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有匹配的记忆" + "No matching memories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有匹配的记忆" } } } }, - "No memories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有记忆" + "No memories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有记忆" } } } }, - "No paired devices yet.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "尚未配对设备。" + "No paired devices yet." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚未配对设备。" } } } }, - "No profiles for this project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此项目没有配置" + "No profiles for this project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此项目没有配置" } } } }, - "No profiles yet": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还没有配置" + "No profiles yet" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还没有配置" } } } }, - "No project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有项目" + "No project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有项目" } } } }, - "No projects yet": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还没有项目" + "No projects yet" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还没有项目" } } } }, - "No relay servers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有中继服务器" + "No relay servers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有中继服务器" } } } }, - "No remote branches": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No remote branches" + "No remote branches" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No remote branches" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "원격 브랜치 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "원격 브랜치 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有远程分支" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有远程分支" } } } }, - "No repos found": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No repos found" + "No repos found" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No repos found" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장소를 찾을 수 없습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장소를 찾을 수 없습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到仓库" } } } }, - "No response received": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No response received" + "No response received" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No response received" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "응답을 받지 못했습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "응답을 받지 못했습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未收到响应" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未收到响应" } } } }, - "No results for '%@'": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No results for '%@'" + "No results for '%@'" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No results for '%@'" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "'%@'에 대한 검색 결과 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@'에 대한 검색 결과 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有“%@”的结果" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有“%@”的结果" } } } }, - "No results found": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "No results found" + "No results found" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No results found" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "검색 결과 없음" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "검색 결과 없음" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到结果" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到结果" } } } }, - "No servers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有服务器" + "No servers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有服务器" } } } }, - "No summary yet": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "还没有摘要" + "No summary yet" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "还没有摘要" } } } }, - "No tasks": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有任务" + "No tasks" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有任务" } } } }, - "No tools advertised.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未声明任何工具。" + "No tools advertised." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未声明任何工具。" } } } }, - "None": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无" + "None" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无" } } } }, - "Normal mode — permission prompts appear as usual": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Normal mode — permission prompts appear as usual" + "Normal mode — permission prompts appear as usual" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Normal mode — permission prompts appear as usual" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일반 모드 — 권한 요청 팝업이 정상 표시됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일반 모드 — 권한 요청 팝업이 정상 표시됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "普通模式 — 权限提示照常显示" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "普通模式 — 权限提示照常显示" } } } }, - "Not a Git repository": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Not a Git repository" + "Not a Git repository" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Not a Git repository" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Git 저장소가 아닙니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git 저장소가 아닙니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "不是 Git 仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不是 Git 仓库" } } } }, - "Not found": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未找到" + "Not found" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未找到" } } } }, - "Not installed": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Not installed" + "Not installed" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Not installed" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "미설치" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "미설치" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "未安装" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未安装" } } } }, - "Notifications": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Notifications" + "Notifications" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Notifications" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "알림" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "알림" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通知" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通知" } } } }, - "Notify when response completes": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Notify when response completes" + "Notify when response completes" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Notify when response completes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "응답 완료 시 알림" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "응답 완료 시 알림" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "回复完成时通知" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "回复完成时通知" + } + } + } + }, + "npx" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "npx" } } } }, - "OK": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "OK" + "Ocean" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Ocean" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "확인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오션" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "确定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "海洋" } } } }, - "Ocean": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Ocean" + "OK" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "OK" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "오션" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "확인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "海洋" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定" } } } }, - "Only enable Skip Permissions on projects you fully trust.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Only enable Skip Permissions on projects you fully trust." + "Only enable Skip Permissions on projects you fully trust." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Only enable Skip Permissions on projects you fully trust." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "완전히 신뢰하는 프로젝트에서만 권한 건너뛰기를 활성화하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "완전히 신뢰하는 프로젝트에서만 권한 건너뛰기를 활성화하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅在你完全信任的项目中启用跳过权限。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅在你完全信任的项目中启用跳过权限。" } } } }, - "Only enable Skip Permissions on projects you fully trust. Mode changes take effect from the next message.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Only enable Skip Permissions on projects you fully trust. Mode changes take effect from the next message." + "Only enable Skip Permissions on projects you fully trust. Mode changes take effect from the next message." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Only enable Skip Permissions on projects you fully trust. Mode changes take effect from the next message." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "완전히 신뢰하는 프로젝트에서만 활성화하세요. 모드 변경은 다음 메시지 전송부터 적용됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "완전히 신뢰하는 프로젝트에서만 활성화하세요. 모드 변경은 다음 메시지 전송부터 적용됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅在你完全信任的项目中启用跳过权限。模式更改会从下一条消息开始生效。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅在你完全信任的项目中启用跳过权限。模式更改会从下一条消息开始生效。" + } + } + } + }, + "Open in External Editor" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在外部编辑器中打开" + } + } + } + }, + "Open in GitHub" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 GitHub 中打开" + } + } + } + }, + "Open in New Window" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在新窗口中打开" + } + } + } + }, + "Open Project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开项目" } } } }, - "Open Project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开项目" + "Open project branch briefing" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开项目分支简报" } } } }, - "Open RxCode": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开 RxCode" + "Open RxCode" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开 RxCode" } } } }, - "Open RxCode → Check for Updates… to run Sparkle's update check manually. Updates are also checked automatically on launch.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Open RxCode → Check for Updates… to run Sparkle's update check manually. Updates are also checked automatically on launch." + "Open RxCode → Check for Updates… to run Sparkle's update check manually. Updates are also checked automatically on launch." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Open RxCode → Check for Updates… to run Sparkle's update check manually. Updates are also checked automatically on launch." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode → 업데이트 확인…을 통해 Sparkle 업데이트 확인을 수동으로 실행할 수 있습니다. 앱 시작 시에도 자동으로 확인됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode → 업데이트 확인…을 통해 Sparkle 업데이트 확인을 수동으로 실행할 수 있습니다. 앱 시작 시에도 자동으로 확인됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开“RxCode → 检查更新…”可手动运行 Sparkle 更新检查。启动时也会自动检查更新。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开“RxCode → 检查更新…”可手动运行 Sparkle 更新检查。启动时也会自动检查更新。" } } } }, - "Open Settings → Shortcuts to reorder, edit, or delete shortcuts. Shortcut configurations are saved per project.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Open Settings → Shortcuts to reorder, edit, or delete shortcuts. Shortcut configurations are saved per project." + "Open Settings → Shortcuts to reorder, edit, or delete shortcuts. Shortcut configurations are saved per project." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Open Settings → Shortcuts to reorder, edit, or delete shortcuts. Shortcut configurations are saved per project." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설정 → 단축키를 열어 단축 버튼을 순서 변경, 편집 또는 삭제할 수 있습니다. 설정은 프로젝트별로 저장됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정 → 단축키를 열어 단축 버튼을 순서 변경, 편집 또는 삭제할 수 있습니다. 설정은 프로젝트별로 저장됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开“设置 → 快捷按钮”可重新排序、编辑或删除快捷按钮。快捷按钮配置按项目保存。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开“设置 → 快捷按钮”可重新排序、编辑或删除快捷按钮。快捷按钮配置按项目保存。" } } } }, - "Open Source": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Open Source" + "Open Source" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Open Source" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "오픈 소스" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오픈 소스" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开源" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开源" } } } }, - "Open Terminal (⌥-click for window)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开终端(⌥-点击打开窗口)" + "Open Terminal (⌥-click for window)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开终端(⌥-点击打开窗口)" } } } }, - "Open in External Editor": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在外部编辑器中打开" + "Open the branch briefing" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开分支简报" } } } }, - "Open in GitHub": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 GitHub 中打开" + "Open thread" : { + "extractionState" : "stale", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开对话" } } } }, - "Open in New Window": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在新窗口中打开" + "OpenAI-Compatible Endpoint" : { + + }, + "Opening Settings" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Opening Settings" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정 열기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开设置" } } } }, - "Open project branch briefing": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开项目分支简报" + "Opening the Inspector Panel" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Opening the Inspector Panel" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인스펙터 패널 열기" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开检查器面板" } } } }, - "Open the branch briefing": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开分支简报" + "Opus 4.6 only" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opus 4.6 only" } } } }, - "Open thread": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开对话" + "Other" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "其他" } } } }, - "Opening Settings": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Opening Settings" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설정 열기" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开设置" + "Override" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "覆盖" } } } }, - "Opening the Inspector Panel": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Opening the Inspector Panel" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인스펙터 패널 열기" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "打开检查器面板" + "Pair a new device" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配对新设备" } } } }, - "Opus 4.6 only": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Opus 4.6 only" + "Pair an iPhone or iPad to review threads, answer approvals, and send messages to your desktop agent." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配对 iPhone 或 iPad,以查看对话、响应批准请求,并向桌面智能体发送消息。" } } } }, - "Other": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "其他" + "Pair an iPhone or iPad to view threads, get notifications, and send messages to your desktop agent." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配对 iPhone 或 iPad,以查看对话、接收通知,并向桌面智能体发送消息。" } } } }, - "Override": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "覆盖" + "Pair new device" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配对新设备" } } } }, - "Pair a new device": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对新设备" + "Paired devices" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已配对设备" } } } }, - "Pair an iPhone or iPad to review threads, answer approvals, and send messages to your desktop agent.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对 iPhone 或 iPad,以查看对话、响应批准请求,并向桌面智能体发送消息。" + "Pasting (⌘V) is smart — RxCode detects what's in the clipboard and handles it automatically." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Pasting (⌘V) is smart — RxCode detects what's in the clipboard and handles it automatically." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "붙여넣기(⌘V)가 스마트합니다 — RxCode가 클립보드 내용을 자동으로 감지하여 처리합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "粘贴(⌘V)是智能的:RxCode 会检测剪贴板内容并自动处理。" } } } }, - "Pair an iPhone or iPad to view threads, get notifications, and send messages to your desktop agent.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对 iPhone 或 iPad,以查看对话、接收通知,并向桌面智能体发送消息。" + "perm.desc.acceptEdits" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto-approves file edits and common filesystem commands (mkdir, touch, mv, cp). Still prompts for other shell commands." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 편집 및 일반 파일시스템 명령(mkdir, touch, mv, cp)을 자동 승인합니다. 다른 셸 명령은 여전히 확인을 요청합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动批准文件编辑和常见文件系统命令(mkdir、touch、mv、cp)。其他 shell 命令仍会提示。" } } } }, - "Pair new device": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对新设备" + "perm.desc.auto" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Runs without permission prompts. A background classifier reviews each action for safety before it executes." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 확인 없이 실행됩니다. 백그라운드 분류기가 각 작업을 실행 전에 안전 여부를 검토합니다." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无需权限提示即可运行。每个操作执行前,后台分类器会检查其安全性。" } } } }, - "Paired devices": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已配对设备" + "perm.desc.bypassPermissions" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skips all permission checks and safety gates. Use only in isolated containers or VMs without internet access." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 권한 확인 및 안전 장치를 건너뜁니다. 인터넷이 차단된 컨테이너나 VM 환경에서만 사용하세요." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过所有权限检查和安全门控。仅在无网络的隔离容器或虚拟机中使用。" } } } }, - "Pasting (⌘V) is smart — RxCode detects what's in the clipboard and handles it automatically.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Pasting (⌘V) is smart — RxCode detects what's in the clipboard and handles it automatically." + "perm.desc.default" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Prompts before each file edit or shell command. Best for sensitive work or getting started." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "붙여넣기(⌘V)가 스마트합니다 — RxCode가 클립보드 내용을 자동으로 감지하여 처리합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 편집이나 셸 명령 실행 전마다 확인을 요청합니다. 민감한 작업이나 처음 시작할 때 적합합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "粘贴(⌘V)是智能的:RxCode 会检测剪贴板内容并自动处理。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每次文件编辑或 shell 命令前都提示确认。适合敏感工作或初次使用。" } } } }, - "Permission Mode": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Permission Mode" + "perm.desc.plan" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Read-only mode. Claude researches and proposes a plan without making any changes. Same prompts as default for other actions." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "읽기 전용 모드입니다. Claude가 변경 없이 코드베이스를 분석하고 계획을 제안합니다. 나머지 작업에는 기본 모드와 동일한 확인을 적용합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "权限模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "只读模式。Claude 会研究并提出计划,不会进行更改。其他操作使用与默认模式相同的提示。" } } } }, - "Permission Request": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Permission Request" + "Permission Mode" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Permission Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 요청" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "权限请求" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "权限模式" } } } }, - "Permission Requests": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Permission Requests" + "Permission mode applied to new sessions" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Permission mode applied to new sessions" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 요청" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션에 적용될 권한 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "权限请求" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "应用于新会话的权限模式" } } } }, - "Permission mode applied to new sessions": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Permission mode applied to new sessions" + "Permission mode: %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Permission mode: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션에 적용될 권한 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 모드: %@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "应用于新会话的权限模式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "权限模式:%@" + } + } + } + }, + "Permission needed%@" : { + "comment" : "Notification title when Claude queues a tool approval. %@ is replaced with \" — \" or empty string.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要权限%@" } } } }, - "Permission mode: %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Permission mode: %@" + "Permission Request" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Permission Request" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 모드: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 요청" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "权限模式:%@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "权限请求" } } } }, - "Permission needed%@": { - "comment": "Notification title when Claude queues a tool approval. %@ is replaced with \" — \" or empty string.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "需要权限%@" + "Permission Requests" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Permission Requests" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 요청" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "权限请求" } } } }, - "Pick a profile in the toolbar and press Run.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在工具栏中选择配置并按“运行”。" + "Pick a profile in the toolbar and press Run." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在工具栏中选择配置并按“运行”。" } } } }, - "Pin": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Pin" + "Pin" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Pin" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "고정" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "고정" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "固定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "固定" } } } }, - "Pin / Unpin — pinned sessions stay at the top of the list": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Pin / Unpin — pinned sessions stay at the top of the list" + "Pin / Unpin — pinned sessions stay at the top of the list" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Pin / Unpin — pinned sessions stay at the top of the list" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "고정 / 고정 해제 — 고정된 세션은 항상 목록 최상단에 표시됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "고정 / 고정 해제 — 고정된 세션은 항상 목록 최상단에 표시됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "固定 / 取消固定 — 固定的会话会保留在列表顶部" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "固定 / 取消固定 — 固定的会话会保留在列表顶部" } } } }, - "Plan": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Plan" + "Plan" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "계획 모드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계획 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "计划" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划" } } } }, - "Platform: %@ • %@": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Platform: %1$@ • %2$@" + "Platform: %@ • %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Platform: %1$@ • %2$@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "平台:%1$@ • %2$@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "平台:%1$@ • %2$@" } } } }, - "Preference": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "偏好" + "Preference" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "偏好" } } } }, - "Preset": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "预设" + "Preset" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "预设" } } } }, - "Preset Name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "预设名称" + "Preset Name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "预设名称" } } } }, - "Press Command-K or use the toolbar search button to find past work across projects.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按 Command-K 或使用工具栏搜索按钮,在各项目中查找过去的工作。" + "Press Command-K or use the toolbar search button to find past work across projects." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按 Command-K 或使用工具栏搜索按钮,在各项目中查找过去的工作。" } } } }, - "Preview": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Preview" + "Preview" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Preview" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "미리보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "미리보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "预览" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "预览" } } } }, - "Previous conversation has been compacted": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Previous conversation has been compacted" + "Previous conversation has been compacted" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Previous conversation has been compacted" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이전 대화가 압축되었습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이전 대화가 압축되었습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "之前的对话已压缩" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "之前的对话已压缩" } } } }, - "Private repository": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Private repository" + "Private repository" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Private repository" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "비공개 저장소" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "비공개 저장소" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "私有仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "私有仓库" } } } }, - "Project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目" + "Project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目" } } } }, - "Project / Workspace": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目 / 工作区" + "Project / Workspace" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目 / 工作区" } } } }, - "Project Management": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project Management" + "Project Management" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project Management" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 관리" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 관리" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目管理" - } - } - } - }, - "Project Name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目管理" } } } }, - "Project Tabs": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project Tabs" + "Project name" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project name" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 탭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 이름" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目名称" + } + } + } + }, + "Project Name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目名称" } } } }, - "Project name": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project name" + "Project path — folder path of the currently selected project (home directory abbreviated as ~)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project path — folder path of the currently selected project (home directory abbreviated as ~)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 이름" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 경로 — 현재 선택된 프로젝트의 폴더 경로 (홈 디렉토리는 ~로 축약)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目路径 — 当前所选项目的文件夹路径(主目录缩写为 ~)" } } } }, - "Project path — folder path of the currently selected project (home directory abbreviated as ~)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project path — folder path of the currently selected project (home directory abbreviated as ~)" + "Project tab — open in dedicated window" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project tab — open in dedicated window" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 경로 — 현재 선택된 프로젝트의 폴더 경로 (홈 디렉토리는 ~로 축약)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 탭 — 전용 창에서 열기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目路径 — 当前所选项目的文件夹路径(主目录缩写为 ~)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目标签页 — 在专用窗口中打开" } } } }, - "Project tab — open in dedicated window": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project tab — open in dedicated window" + "Project Tabs" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project Tabs" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 탭 — 전용 창에서 열기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目标签页 — 在专用窗口中打开" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目标签页" } } } }, - "Project tabs appear at the top of the chat area. Click a tab to switch projects. You can switch even while Claude is streaming — the active stream continues in the background.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Project tabs appear at the top of the chat area. Click a tab to switch projects. You can switch even while Claude is streaming — the active stream continues in the background." + "Project tabs appear at the top of the chat area. Click a tab to switch projects. You can switch even while Claude is streaming — the active stream continues in the background." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Project tabs appear at the top of the chat area. Click a tab to switch projects. You can switch even while Claude is streaming — the active stream continues in the background." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 영역 상단에 프로젝트 탭이 표시됩니다. 탭을 클릭하여 전환하세요. Claude가 스트리밍 중에도 전환 가능하며, 진행 중인 스트림은 백그라운드에서 계속 실행됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 영역 상단에 프로젝트 탭이 표시됩니다. 탭을 클릭하여 전환하세요. Claude가 스트리밍 중에도 전환 가능하며, 진행 중인 스트림은 백그라운드에서 계속 실행됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目标签页显示在聊天区域顶部。点击标签页即可切换项目。即使 Claude 正在流式输出,也可以切换;当前流会在后台继续。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目标签页显示在聊天区域顶部。点击标签页即可切换项目。即使 Claude 正在流式输出,也可以切换;当前流会在后台继续。" } } } }, - "Project-specific override is set": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已设置项目级覆盖" + "Project-specific override is set" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已设置项目级覆盖" } } } }, - "Project: Off": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目:关闭" + "Project: Off" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目:关闭" } } } }, - "Project: On": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目:开启" + "Project: On" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目:开启" } } } }, - "Projects": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Projects" + "Projects" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Projects" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "项目" } } } }, - "Provider": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "提供方" + "Provider" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供方" } } } }, - "Public repository": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Public repository" + "Public repository" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Public repository" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "공개 저장소" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공개 저장소" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "公开仓库" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "公开仓库" } } } }, - "Push": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "推送" + "Push" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推送" } } } }, - "Quick-access buttons shown at the top of the chat area. Run frequently used messages or shell commands with a single click.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Quick-access buttons shown at the top of the chat area. Run frequently used messages or shell commands with a single click." + "Quick-access buttons shown at the top of the chat area. Run frequently used messages or shell commands with a single click." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Quick-access buttons shown at the top of the chat area. Run frequently used messages or shell commands with a single click." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 영역 상단에 표시되는 빠른 접근 버튼입니다. 자주 사용하는 메시지나 셸 커맨드를 한 번의 클릭으로 실행할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 영역 상단에 표시되는 빠른 접근 버튼입니다. 자주 사용하는 메시지나 셸 커맨드를 한 번의 클릭으로 실행할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示在聊天区域顶部的快速访问按钮。单击即可运行常用消息或 shell 命令。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示在聊天区域顶部的快速访问按钮。单击即可运行常用消息或 shell 命令。" } } } }, - "Quit": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "退出" + "Quit" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出" } } } }, - "Re-run %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重新运行 %@" + "Re-run %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新运行 %@" } } } }, - "Read failed: %@": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Read failed: %@" + "Read failed: %@" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Read failed: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "읽기 실패: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "읽기 실패: %@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "读取失败:%@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "读取失败:%@" } } } }, - "Read-only — analyzes and plans without making edits": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Read-only — analyzes and plans without making edits" + "Read-only — analyzes and plans without making edits" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Read-only — analyzes and plans without making edits" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 읽기만 허용, 실제 편집 없이 계획만 제시" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 읽기만 허용, 실제 편집 없이 계획만 제시" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "只读 — 仅分析和规划,不进行编辑" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "只读 — 仅分析和规划,不进行编辑" } } } }, - "Reasoning effort applied to new sessions": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reasoning effort applied to new sessions" + "Reasoning effort applied to new sessions" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reasoning effort applied to new sessions" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션에 적용될 추론 작업량" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션에 적용될 추론 작업량" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "应用于新会话的推理强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "应用于新会话的推理强度" } } } }, - "Recall previous message": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Recall previous message" + "Recall previous message" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Recall previous message" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이전 메시지 불러오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이전 메시지 불러오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "调出上一条消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "调出上一条消息" } } } }, - "Recalling Previous Messages": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Recalling Previous Messages" + "Recalling Previous Messages" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Recalling Previous Messages" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이전 메시지 불러오기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이전 메시지 불러오기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "调出之前的消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "调出之前的消息" } } } }, - "Recent Briefings": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "最近简报" + "Recent Briefings" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最近简报" } } } }, - "Reconnecting in %llds": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "%lld 秒后重新连接" + "Reconnecting in %llds" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 秒后重新连接" } } } }, - "Refresh": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Refresh" + "Refresh" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Refresh" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새로고침" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새로고침" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "刷新" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "刷新" } } } }, - "Refresh & Test All": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "刷新并测试全部" + "Refresh & Test All" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "刷新并测试全部" } } } }, - "Refresh installation status": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "刷新安装状态" + "Refresh installation status" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "刷新安装状态" } } } }, - "Refresh registry": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "刷新注册表" + "Refresh registry" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "刷新注册表" } } } }, - "Refresh usage": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "刷新用量" + "Refresh usage" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "刷新用量" } } } }, - "Regenerate": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重新生成" + "Regenerate" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新生成" } } } }, - "Registry": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "注册表" + "Registry" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "注册表" } } } }, - "Reindex Now": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "立即重新索引" + "Reindex all threads" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新索引所有对话" } } } }, - "Reindex all threads": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重新索引所有对话" + "Reindex Now" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "立即重新索引" } } } }, - "Reject": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "拒绝" + "Reject" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "拒绝" } } } }, - "Reject the action": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reject the action" + "Reject the action" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reject the action" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "작업 거부" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작업 거부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "拒绝操作" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "拒绝操作" } } } }, - "Relay server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "中继服务器" + "Relay server" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中继服务器" } } } }, - "Relay servers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "中继服务器" + "Relay servers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中继服务器" } } } }, - "Relay:": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "中继:" + "Relay:" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中继:" } } } }, - "Remote": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "远程" + "Remote" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "远程" } } } }, - "Remote (origin)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Remote (origin)" + "Remote (origin)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Remote (origin)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "원격 (origin)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "원격 (origin)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "远程 (origin)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "远程 (origin)" } } } }, - "Remove": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Remove" + "Remove" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Remove" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "제거" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "제거" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除" } } } }, - "Remove ACP client?": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除 ACP 客户端?" + "Remove ACP client?" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除 ACP 客户端?" } } } }, - "Remove MCP server?": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除 MCP 服务器?" + "Remove MCP server?" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除 MCP 服务器?" } } } }, - "Remove Variable": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除变量" + "Remove Variable" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除变量" } } } }, - "Remove…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "移除…" + "Remove…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除…" } } } }, - "Rename": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rename" + "Rename" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이름 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이름 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名" - } - } - } - }, - "Rename Device": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名设备" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名" } } } }, - "Rename Project": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rename Project" + "Rename — change the session title" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename — change the session title" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트 이름 변경" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이름 변경 — 세션 제목을 수정합니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名 — 更改会话标题" } } } }, - "Rename Session": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rename Session" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 이름 변경" + "Rename device" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名设备" } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名会话" + } + } + }, + "Rename Device" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名设备" } } } }, - "Rename device": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名设备" + "Rename Project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename Project" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트 이름 변경" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名项目" } } } }, - "Rename — change the session title": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Rename — change the session title" + "Rename Session" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename Session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이름 변경 — 세션 제목을 수정합니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 이름 변경" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名 — 更改会话标题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名会话" } } } }, - "Rename…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重命名…" + "Rename…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重命名…" } } } }, - "Reset": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset" + "Reset" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "초기화" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초기화" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置" } } } }, - "Reset Buttons": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset Buttons" + "Reset Buttons" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset Buttons" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "리셋 버튼" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "리셋 버튼" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置按钮" } } } }, - "Reset Terminal": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reset Terminal" + "Reset Terminal" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Reset Terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 리셋" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 리셋" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置终端" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置终端" } } } }, - "Reset to project root": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置为项目根目录" + "Reset to project root" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置为项目根目录" } } } }, - "Resets %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重置 %@" + "Resets %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置 %@" } } } }, - "Response complete": { - "comment": "Notification body when Claude finishes a response", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Response complete" + "Response complete" : { + "comment" : "Notification body when Claude finishes a response", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Response complete" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "응답 완료" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "응답 완료" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "回复完成" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "回复完成" } } } }, - "Response in progress in the background": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Response in progress in the background" + "Response in progress" : { + + }, + "Response in progress in the background" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Response in progress in the background" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "백그라운드에서 응답 진행 중" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "백그라운드에서 응답 진행 중" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "回复正在后台进行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "回复正在后台进行" + } + } + } + }, + "Response in progress. Todos %lld/%lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Response in progress. Todos %1$lld/%2$lld" } } } }, - "Retry": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Retry" + "Retry" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Retry" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "재시도" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "재시도" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "重试" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重试" } } } }, - "Reveal in Finder": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 Finder 中显示" + "Reveal in Finder" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Finder 中显示" } } } }, - "Review the CLI setup check": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看 CLI 设置检查" + "Review the CLI setup check" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看 CLI 设置检查" } } } }, - "Right-click a session in the History tab for context menu options.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Right-click a session in the History tab for context menu options." + "Right-click a session in the History tab for context menu options." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Right-click a session in the History tab for context menu options." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록 탭에서 세션을 우클릭하면 컨텍스트 메뉴가 표시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 탭에서 세션을 우클릭하면 컨텍스트 메뉴가 표시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在“历史”标签页中右键点击会话可查看上下文菜单选项。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在“历史”标签页中右键点击会话可查看上下文菜单选项。" } } } }, - "Run %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "运行 %@" + "Run %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "运行 %@" } } } }, - "Run/Debug Configurations": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "运行/调试配置" + "Run/Debug Configurations" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "运行/调试配置" } } } }, - "Runs `make [-f ] [arguments]`. Leave Makefile empty to use the default lookup (Makefile / makefile / GNUmakefile).": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "运行 `make [-f ] [arguments]`。留空 Makefile 会使用默认查找(Makefile / makefile / GNUmakefile)。" + "Runs `make [-f ] [arguments]`. Leave Makefile empty to use the default lookup (Makefile / makefile / GNUmakefile)." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "运行 `make [-f ] [arguments]`。留空 Makefile 会使用默认查找(Makefile / makefile / GNUmakefile)。" } } } }, - "Runs on-device with Apple Intelligence. Private, free, and offline.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "通过 Apple Intelligence 在设备端运行。私密、免费且离线。" + "Runs on-device with Apple Intelligence. Private, free, and offline." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过 Apple Intelligence 在设备端运行。私密、免费且离线。" } } } }, - "RxCode": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode" + "RxCode" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode" } } } }, - "RxCode ships with six accent color themes. Preview each one directly from the theme picker — the whole app recolors live as you choose.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "RxCode ships with six accent color themes. Preview each one directly from the theme picker — the whole app recolors live as you choose." + "RxCode ships with six accent color themes. Preview each one directly from the theme picker — the whole app recolors live as you choose." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "RxCode ships with six accent color themes. Preview each one directly from the theme picker — the whole app recolors live as you choose." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode는 6가지 강조 색상 테마를 제공합니다. 테마 선택기에서 바로 각 테마를 미리볼 수 있으며, 선택과 동시에 앱 전체 색상이 즉시 바뀝니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode는 6가지 강조 색상 테마를 제공합니다. 테마 선택기에서 바로 각 테마를 미리볼 수 있으며, 선택과 동시에 앱 전체 색상이 즉시 바뀝니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode 内置六种强调色主题。可直接在主题选择器中预览;选择时整个应用会实时换色。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 内置六种强调色主题。可直接在主题选择器中预览;选择时整个应用会实时换色。" + } + } + } + }, + "RxCode.xcodeproj" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode.xcodeproj" } } } }, - "RxCode.xcodeproj": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode.xcodeproj" + "rxcode/feature-name" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "rxcode/feature-name" } } } }, - "Save": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保存" + "Save" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存" } } } }, - "Save failed: %@": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Save failed: %@" + "Save failed: %@" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Save failed: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장 실패: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장 실패: %@" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保存失败:%@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存失败:%@" } } } }, - "Save file changes": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Save file changes" + "Save file changes" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Save file changes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 변경사항 저장" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 변경사항 저장" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保存文件更改" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存文件更改" } } } }, - "Saved memories are stored locally in SwiftData and embedded on-device.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保存的记忆会存储在本地 SwiftData 中,并在设备端嵌入。" + "Saved memories are stored locally in SwiftData and embedded on-device." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存的记忆会存储在本地 SwiftData 中,并在设备端嵌入。" } } } }, - "Saved memory history is available from Manage.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "可从“管理”查看已保存的记忆历史。" + "Saved memory history is available from Manage." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "可从“管理”查看已保存的记忆历史。" } } } }, - "Saving and probing…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在保存并探测…" + "Saving and probing…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在保存并探测…" } } } }, - "Scan with the RxCode app on your iPhone or iPad.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用 iPhone 或 iPad 上的 RxCode 应用扫描。" + "Scan with the RxCode app on your iPhone or iPad." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 iPhone 或 iPad 上的 RxCode 应用扫描。" } } } }, - "Scheme": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Scheme" + "Scheme" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scheme" } } } }, - "Scope": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "范围" + "Scope" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "范围" } } } }, - "Screenshots can be pasted directly — they are automatically attached as images.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Screenshots can be pasted directly — they are automatically attached as images." + "Screenshots can be pasted directly — they are automatically attached as images." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Screenshots can be pasted directly — they are automatically attached as images." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스크린샷을 바로 붙여넣을 수 있으며 자동으로 이미지로 첨부됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스크린샷을 바로 붙여넣을 수 있으며 자동으로 이미지로 첨부됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "截图可以直接粘贴,并会自动作为图像附加。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "截图可以直接粘贴,并会自动作为图像附加。" } } } }, - "Search Files (⌘F)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search Files (⌘F)" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 검색 (⌘F)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索文件 (⌘F)" + "Search agents" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索智能体" } } } }, - "Search Index": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索索引" + "Search every thread" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索每个对话" } } } }, - "Search Threads (⌘K)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索对话(⌘K)" + "Search filename..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search filename..." } - } - } - }, - "Search agents": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索智能体" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 이름 검색..." } - } - } - }, - "Search every thread": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索每个对话" + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索文件名..." } } } }, - "Search filename...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search filename..." + "Search Files (⌘F)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search Files (⌘F)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 이름 검색..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 검색 (⌘F)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索文件名..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索文件 (⌘F)" } } } }, - "Search for a repository by name, then click Add. RxCode clones it automatically and opens it as a new project.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search for a repository by name, then click Add. RxCode clones it automatically and opens it as a new project." + "Search for a repository by name, then click Add. RxCode clones it automatically and opens it as a new project." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search for a repository by name, then click Add. RxCode clones it automatically and opens it as a new project." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이름으로 저장소를 검색한 후 추가 버튼을 클릭하세요. RxCode가 자동으로 클론하고 새 프로젝트로 엽니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이름으로 저장소를 검색한 후 추가 버튼을 클릭하세요. RxCode가 자동으로 클론하고 새 프로젝트로 엽니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按名称搜索仓库,然后点击“添加”。RxCode 会自动克隆该仓库并将其作为新项目打开。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按名称搜索仓库,然后点击“添加”。RxCode 会自动克隆该仓库并将其作为新项目打开。" + } + } + } + }, + "Search Index" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索索引" } } } }, - "Search memory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索记忆" + "Search memory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索记忆" } } } }, - "Search repos...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search repos..." + "Search repos..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search repos..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장소 검색..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장소 검색..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索仓库..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索仓库..." } } } }, - "Search skills...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Search skills..." + "Search skills..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Search skills..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스킬 검색..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스킬 검색..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "搜索技能..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索技能..." } } } }, - "Search threads by topic, keyword, or feel…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "按主题、关键词或感觉搜索对话…" + "Search Threads (⌘K)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜索对话(⌘K)" } } } }, - "Select All in Section": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择本节全部" + "Search threads by topic, keyword, or feel…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按主题、关键词或感觉搜索对话…" } } } }, - "Select Effort Level": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select Effort Level" + "Select a Project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select a Project" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Effort 수준 선택" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로젝트를 선택하세요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择推理强度" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择项目" } } } }, - "Select Model": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select Model" + "Select a project from the sidebar or add a new one." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select a project from the sidebar or add a new one." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델 선택" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바에서 프로젝트를 선택하거나 새로 추가하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从侧边栏选择一个项目,或添加新项目。" } } } }, - "Select Run Destination": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择运行目标" + "Select a target…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择目标…" } } } }, - "Select Run Profile": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择运行配置" + "Select All in Section" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择本节全部" } } } }, - "Select a Project": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select a Project" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "프로젝트를 선택하세요" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择项目" + "Select all that apply" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择所有适用项" } } } }, - "Select a project from the sidebar or add a new one.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select a project from the sidebar or add a new one." + "Select Effort Level" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select Effort Level" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바에서 프로젝트를 선택하거나 새로 추가하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effort 수준 선택" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "从侧边栏选择一个项目,或添加新项目。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择推理强度" } } } }, - "Select a target…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择目标…" + "Select item" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select item" } - } - } - }, - "Select all that apply": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择所有适用项" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "항목 선택" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择项目" } } } }, - "Select item": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select item" + "Select Model" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select Model" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "항목 선택" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델 선택" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择模型" } } } }, - "Select or add a profile to edit": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择或添加要编辑的配置" + "Select or add a profile to edit" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择或添加要编辑的配置" } } } }, - "Select popup item or navigate message history": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Select popup item or navigate message history" + "Select popup item or navigate message history" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select popup item or navigate message history" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "팝업 항목 선택 또는 메시지 기록 탐색" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "팝업 항목 선택 또는 메시지 기록 탐색" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择弹出项或浏览消息历史" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择弹出项或浏览消息历史" } } } }, - "Select relay": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "选择中继" + "Select relay" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择中继" } } } }, - "Send message": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Send message" + "Select Run Destination" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择运行目标" + } + } + } + }, + "Select Run Profile" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择运行配置" + } + } + } + }, + "Send message" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Send message" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 전송" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 전송" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送消息" } } } }, - "Send message (alternative)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Send message (alternative)" + "Send message (alternative)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Send message (alternative)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 전송 (대체)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 전송 (대체)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送消息(备用)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送消息(备用)" } } } }, - "Send test notification": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送测试通知" + "Send test notification" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送测试通知" } } } }, - "Sending Messages": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sending Messages" + "Sending Messages" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sending Messages" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 전송" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 전송" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "发送消息" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送消息" } } } }, - "Sends a system notification while RxCode is in the background.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sends a system notification while RxCode is in the background." + "Sends a system notification while RxCode is in the background." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sends a system notification while RxCode is in the background." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode가 백그라운드에 있을 때 시스템 알림을 보냅니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode가 백그라운드에 있을 때 시스템 알림을 보냅니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当 RxCode 在后台时发送系统通知。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当 RxCode 在后台时发送系统通知。" } } } }, - "Servers": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "服务器" + "Servers" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "服务器" } } } }, - "Session name": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Session name" + "Session name" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Session name" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "세션 이름" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "세션 이름" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "会话名称" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "会话名称" } } } }, - "Set the summarization model": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置摘要模型" + "Set the summarization model" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置摘要模型" } } } }, - "Settings": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置" + "Settings" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置" } } } }, - "Settings & Themes": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Settings & Themes" + "Settings & Themes" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Settings & Themes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "설정 및 테마" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정 및 테마" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置和主题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置和主题" } } } }, - "Share session history with the terminal CLI in ~/.claude/projects/. Turn off to keep RxCode sessions separate. You can change this later in Settings.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Share session history with the terminal CLI in ~/.claude/projects/. Turn off to keep RxCode sessions separate. You can change this later in Settings." + "Share session history with the terminal CLI in ~/.claude/projects/. Turn off to keep RxCode sessions separate. You can change this later in Settings." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Share session history with the terminal CLI in ~/.claude/projects/. Turn off to keep RxCode sessions separate. You can change this later in Settings." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "~/.claude/projects/의 터미널 CLI와 세션 기록을 공유합니다. 끄면 RxCode 세션을 분리해서 사용합니다. 이후 설정에서 변경할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "~/.claude/projects/의 터미널 CLI와 세션 기록을 공유합니다. 끄면 RxCode 세션을 분리해서 사용합니다. 이후 설정에서 변경할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "与 ~/.claude/projects/ 中的终端 CLI 共享会话历史。关闭后,RxCode 会话将单独保存。你之后可在设置中更改。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "与 ~/.claude/projects/ 中的终端 CLI 共享会话历史。关闭后,RxCode 会话将单独保存。你之后可在设置中更改。" } } } }, - "Shortcut Buttons": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Shortcut Buttons" + "Shortcut Buttons" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Shortcut Buttons" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축 버튼" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축 버튼" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷按钮" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷按钮" } } } }, - "Shortcuts": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Shortcuts" + "Shortcuts" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Shortcuts" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축키" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축키" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "快捷方式" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "快捷方式" } } } }, - "Show Hidden Files": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示隐藏文件" - } - } - } - }, - "Show Onboarding": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示入门引导" - } - } - } - }, - "Show a preview chip when a URL is detected": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show a preview chip when a URL is detected" + "Show a preview chip when a file path is detected" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show a preview chip when a file path is detected" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "URL 감지 시 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 경로 감지 시 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检测到 URL 时显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检测到文件路径时显示预览标签" } } } }, - "Show a preview chip when a file path is detected": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show a preview chip when a file path is detected" + "Show a preview chip when a URL is detected" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show a preview chip when a URL is detected" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 경로 감지 시 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL 감지 시 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检测到文件路径时显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检测到 URL 时显示预览标签" } } } }, - "Show a preview chip when image data is detected": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show a preview chip when image data is detected" + "Show a preview chip when image data is detected" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show a preview chip when image data is detected" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이미지 데이터 감지 시 미리보기 칩을 표시합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지 데이터 감지 시 미리보기 칩을 표시합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "检测到图像数据时显示预览标签" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检测到图像数据时显示预览标签" } } } }, - "Show a system notification when a response completes while RxCode is in the background": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show a system notification when a response completes while RxCode is in the background" + "Show a system notification when a response completes while RxCode is in the background" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show a system notification when a response completes while RxCode is in the background" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode가 백그라운드에 있을 때 응답이 완료되면 시스템 알림 표시" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode가 백그라운드에 있을 때 응답이 완료되면 시스템 알림 표시" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "RxCode 在后台时,响应完成后显示系统通知" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode 在后台时,响应完成后显示系统通知" } } } }, - "Show active chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示活跃聊天" + "Show active chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示活跃聊天" } } } }, - "Show all chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示所有聊天" + "Show all chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示所有聊天" } } } }, - "Show all projects": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show all projects" + "Show all projects" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show all projects" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 프로젝트 표시" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 프로젝트 표시" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示所有项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示所有项目" } } } }, - "Show all threads in this project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示此项目中的所有对话" + "Show all threads in this project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示此项目中的所有对话" } } } }, - "Show archived chats": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示已归档聊天" + "Show archived chats" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示已归档聊天" } } } }, - "Show current project only": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show current project only" + "Show current project only" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show current project only" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 프로젝트만 표시" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 프로젝트만 표시" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅显示当前项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅显示当前项目" } } } }, - "Show in Finder": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Show in Finder" + "Show Hidden Files" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示隐藏文件" + } + } + } + }, + "Show in Finder" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show in Finder" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Finder에서 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finder에서 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 Finder 中显示" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Finder 中显示" } } } }, - "Show menu bar icon": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示菜单栏图标" + "Show menu bar icon" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示菜单栏图标" } } } }, - "Show more": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示更多" + "Show more" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示更多" } } } }, - "Show only the first five threads": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "仅显示前五个对话" + "Show Onboarding" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示入门引导" } } } }, - "Show thread summary": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示对话摘要" + "Show only the first five threads" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅显示前五个对话" } } } }, - "Showing effective MCP state for this project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示此项目的有效 MCP 状态" + "Show thread summary" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示对话摘要" } } } }, - "Showing global MCP defaults": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "显示全局 MCP 默认值" + "Showing effective MCP state for this project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示此项目的有效 MCP 状态" } } } }, - "Shows in-progress chat counts and Claude Code usage limits in the macOS menu bar.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 macOS 菜单栏中显示进行中的聊天数量和 Claude Code 用量限制。" + "Showing global MCP defaults" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示全局 MCP 默认值" } } } }, - "Sidebar Tabs": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sidebar Tabs" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 탭" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "边栏标签页" + "Shows in-progress chat counts and Claude Code usage limits in the macOS menu bar." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 macOS 菜单栏中显示进行中的聊天数量和 Claude Code 用量限制。" } } } }, - "Sidebar — Files tab (expands sidebar if hidden)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sidebar — Files tab (expands sidebar if hidden)" + "Sidebar — Files tab (expands sidebar if hidden)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sidebar — Files tab (expands sidebar if hidden)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 — 파일 탭 (숨겨진 경우 사이드바 펼침)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 — 파일 탭 (숨겨진 경우 사이드바 펼침)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "边栏 — 文件标签页(如果边栏隐藏则展开)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "边栏 — 文件标签页(如果边栏隐藏则展开)" } } } }, - "Sidebar — Files tab + search": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sidebar — Files tab + search" + "Sidebar — Files tab + search" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sidebar — Files tab + search" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 — 파일 탭 + 검색" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 — 파일 탭 + 검색" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "边栏 — 文件标签页 + 搜索" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "边栏 — 文件标签页 + 搜索" } } } }, - "Sidebar — History tab (expands sidebar if hidden)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sidebar — History tab (expands sidebar if hidden)" + "Sidebar — History tab (expands sidebar if hidden)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sidebar — History tab (expands sidebar if hidden)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 — 기록 탭 (숨겨진 경우 사이드바 펼침)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 — 기록 탭 (숨겨진 경우 사이드바 펼침)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "边栏 — 历史标签页(如果边栏隐藏则展开)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "边栏 — 历史标签页(如果边栏隐藏则展开)" } } } }, - "Sign in with GitHub": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sign in with GitHub" + "Sidebar Tabs" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sidebar Tabs" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GitHub로 로그인" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用 GitHub 登录" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "边栏标签页" } } } }, - "Skill Marketplace": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skill Marketplace" + "Sign in with GitHub" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Sign in with GitHub" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스킬 마켓플레이스" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub로 로그인" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "技能市场" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 GitHub 登录" } } } }, - "Skip All Questions": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过所有问题" + "sk-..." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "sk-..." } } } }, - "Skip Permissions": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skip Permissions" + "Skill Marketplace" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skill Marketplace" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 건너뛰기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스킬 마켓플레이스" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过权限" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "技能市场" } } } }, - "Skip Permissions Mode": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skip Permissions Mode" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 건너뛰기 모드" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过权限模式" + "Skip All Questions" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过所有问题" } } } }, - "Skip Permissions: OFF": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skip Permissions: OFF" + "Skip mode — all permissions auto-approved" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip mode — all permissions auto-approved" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 건너뛰기: 꺼짐" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "건너뛰기 모드 — 모든 권한이 자동 승인됩니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过权限:关" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过模式 — 自动批准所有权限" } } } }, - "Skip Permissions: ON": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skip Permissions: ON" + "Skip Permissions" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip Permissions" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 건너뛰기: 켜짐" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 건너뛰기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过权限:开" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过权限" } } } }, - "Skip mode — all permissions auto-approved": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skip mode — all permissions auto-approved" + "Skip Permissions Mode" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip Permissions Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "건너뛰기 모드 — 모든 권한이 자동 승인됩니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 건너뛰기 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过模式 — 自动批准所有权限" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过权限模式" } } } }, - "Skips all permission checks — use only in isolated environments": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skips all permission checks — use only in isolated environments" + "Skip Permissions: OFF" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip Permissions: OFF" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 권한 검사 생략 — 격리된 환경에서만 사용 권장" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 건너뛰기: 꺼짐" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过所有权限检查 — 仅在隔离环境中使用" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过权限:关" } } } }, - "Skips all permission checks — writes to .git/.vscode/.claude directories still require approval": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skips all permission checks — writes to .git/.vscode/.claude directories still require approval" + "Skip Permissions: ON" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip Permissions: ON" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 권한 검사 생략 — .git/.vscode/.claude 디렉토리 쓰기는 여전히 승인 필요" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 건너뛰기: 켜짐" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过所有权限检查 — 写入 .git/.vscode/.claude 目录仍需批准" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过权限:开" } } } }, - "Slash Command Popup": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Slash Command Popup" + "Skips all permission checks — use only in isolated environments" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skips all permission checks — use only in isolated environments" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 팝업" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 권한 검사 생략 — 격리된 환경에서만 사용 권장" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜杠命令弹出框" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过所有权限检查 — 仅在隔离环境中使用" } } } }, - "Slash Commands": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Slash Commands" + "Skips all permission checks — writes to .git/.vscode/.claude directories still require approval" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skips all permission checks — writes to .git/.vscode/.claude directories still require approval" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 권한 검사 생략 — .git/.vscode/.claude 디렉토리 쓰기는 여전히 승인 필요" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜杠命令" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳过所有权限检查 — 写入 .git/.vscode/.claude 目录仍需批准" } } } }, - "Slash Commands & Shortcuts Tabs": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Slash Commands & Shortcuts Tabs" + "Slash Command Popup" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slash Command Popup" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 및 단축키 탭" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 팝업" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "斜杠命令和快捷按钮标签页" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜杠命令弹出框" } } } }, - "Soft purple": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Soft purple" + "Slash Commands" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slash Commands" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "부드러운 퍼플" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "柔紫色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜杠命令" } } } }, - "Some commands (such as /config, /permissions, /model) open in a full interactive terminal popup sheet, where you can use the interactive CLI interface. The popup closes automatically when the command finishes.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Some commands (such as /config, /permissions, /model) open in a full interactive terminal popup sheet, where you can use the interactive CLI interface. The popup closes automatically when the command finishes." + "Slash Commands & Shortcuts Tabs" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slash Commands & Shortcuts Tabs" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "/config, /permissions, /model 등 일부 커맨드는 별도의 인터랙티브 터미널 팝업 시트에서 실행됩니다. 커맨드가 완료되면 자동으로 닫힙니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 및 단축키 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "某些命令(如 /config、/permissions、/model)会在完整的交互式终端弹窗表单中打开,你可以在其中使用交互式 CLI 界面。命令完成后弹窗会自动关闭。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "斜杠命令和快捷按钮标签页" } } } }, - "Some slash commands (such as /config, /permissions, /model) open in a separate interactive terminal sheet. The popup runs the command automatically and closes when it exits.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Some slash commands (such as /config, /permissions, /model) open in a separate interactive terminal sheet. The popup runs the command automatically and closes when it exits." + "Soft purple" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Soft purple" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일부 슬래시 커맨드(/config, /permissions, /model 등)는 별도의 대화형 터미널 시트에서 열립니다. 팝업이 커맨드를 자동으로 실행하고 종료 시 닫힙니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "부드러운 퍼플" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "某些斜杠命令(如 /config、/permissions、/model)会在单独的交互式终端表单中打开。弹窗会自动运行命令,并在退出时关闭。" - } - } - } - }, - "Source": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "来源" - } - } - } - }, - "Start New Chat": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开始新聊天" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "柔紫色" } } } }, - "Start new chat": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Start new chat" + "Some commands (such as /config, /permissions, /model) open in a full interactive terminal popup sheet, where you can use the interactive CLI interface. The popup closes automatically when the command finishes." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Some commands (such as /config, /permissions, /model) open in a full interactive terminal popup sheet, where you can use the interactive CLI interface. The popup closes automatically when the command finishes." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 채팅 시작" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "/config, /permissions, /model 등 일부 커맨드는 별도의 인터랙티브 터미널 팝업 시트에서 실행됩니다. 커맨드가 완료되면 자동으로 닫힙니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "开始新聊天" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "某些命令(如 /config、/permissions、/model)会在完整的交互式终端弹窗表单中打开,你可以在其中使用交互式 CLI 界面。命令完成后弹窗会自动关闭。" } } } }, - "Status Line": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Status Line" + "Some slash commands (such as /config, /permissions, /model) open in a separate interactive terminal sheet. The popup runs the command automatically and closes when it exits." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Some slash commands (such as /config, /permissions, /model) open in a separate interactive terminal sheet. The popup runs the command automatically and closes when it exits." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상태 표시줄" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일부 슬래시 커맨드(/config, /permissions, /model 등)는 별도의 대화형 터미널 시트에서 열립니다. 팝업이 커맨드를 자동으로 실행하고 종료 시 닫힙니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "状态行" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "某些斜杠命令(如 /config、/permissions、/model)会在单独的交互式终端表单中打开。弹窗会自动运行命令,并在退出时关闭。" } } } }, - "Stop %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "停止 %@" + "Source" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "来源" } } } }, - "Stop '%@'": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "停止“%@”" - } - } - } - }, - "Stop All": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "全部停止" - } - } - } - }, - "Stop running tasks": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "停止正在运行的任务" - } - } - } - }, - "Stop streaming (cancel response generation)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Stop streaming (cancel response generation)" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스트리밍 중지 (응답 생성 취소)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "停止流式输出(取消响应生成)" - } - } - } - }, - "Strikethrough": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Strikethrough" + "Start new chat" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Start new chat" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "취소선" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 채팅 시작" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "删除线" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开始新聊天" } } } }, - "Submit": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "提交" + "Start New Chat" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开始新聊天" } } } }, - "Summarization Model": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "摘要模型" - } - } - } - }, - "Switch Branch": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Switch Branch" + "Status Line" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Status Line" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "브랜치 전환" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 표시줄" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换分支" - } - } - } - }, - "Switch between Claude Code, Codex, and installed ACP agents without changing the global default.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在 Claude Code、Codex 和已安装的 ACP 智能体之间切换,而不更改全局默认值。" - } - } - } - }, - "Switch branch": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换分支" - } - } - } - }, - "Tap to answer": { - "comment": "Notification body when Claude invokes AskUserQuestion.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "点击回答" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "状态行" } } } }, - "Target": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "目标" + "Stop '%@'" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "停止“%@”" } } } }, - "Terminal": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Terminal" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "终端" + "Stop %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "停止 %@" } } } }, - "Terminal Command Mode": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Terminal Command Mode" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 커맨드 모드" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "终端命令模式" + "Stop All" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部停止" } } } }, - "Terminal Tab": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Terminal Tab" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "터미널 탭" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "终端标签页" + "Stop running tasks" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "停止正在运行的任务" } } } }, - "Terminate the current shell and start a fresh zsh session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Terminate the current shell and start a fresh zsh session" + "Stop streaming (cancel response generation)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Stop streaming (cancel response generation)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 셸을 종료하고 새 zsh 세션을 시작합니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스트리밍 중지 (응답 생성 취소)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "终止当前 shell 并启动新的 zsh 会话" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "停止流式输出(取消响应生成)" } } } }, - "Terracotta": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Terracotta" + "Strikethrough" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Strikethrough" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "테라코타" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "취소선" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "陶土" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除线" } } } }, - "Test connection": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "测试连接" + "Submit" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "提交" } } } }, - "Testing…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在测试…" + "Summarization Model" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "摘要模型" } } } }, - "The CLI sent an AskUserQuestion call this app could not parse.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "CLI 发送了此应用无法解析的 AskUserQuestion 调用。" + "Switch between Claude Code, Codex, and installed ACP agents without changing the global default." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Claude Code、Codex 和已安装的 ACP 智能体之间切换,而不更改全局默认值。" } } } }, - "The General tab configures session defaults. Changes apply to newly created sessions — existing sessions keep their current values.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The General tab configures session defaults. Changes apply to newly created sessions — existing sessions keep their current values." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일반 탭에서 세션 기본값을 설정합니다. 변경사항은 새로 생성되는 세션에 적용되며, 기존 세션은 현재 값을 유지합니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "“通用”标签页配置会话默认值。更改会应用到新建会话;现有会话会保留当前值。" + "Switch branch" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换分支" } } } }, - "The Git status panel at the bottom of the sidebar shows changed-file counts and the current branch. Click the branch name to switch between local or remote branches.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The Git status panel at the bottom of the sidebar shows changed-file counts and the current branch. Click the branch name to switch between local or remote branches." + "Switch Branch" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Switch Branch" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사이드바 하단의 Git 상태 패널에서 변경된 파일 수와 현재 브랜치를 확인할 수 있습니다. 브랜치 이름을 클릭하면 로컬 또는 원격 브랜치로 전환할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브랜치 전환" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "边栏底部的 Git 状态面板显示已更改文件数量和当前分支。点击分支名称可在本地或远程分支之间切换。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换分支" } } } }, - "The Message tab controls chat display and attachment behavior.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The Message tab controls chat display and attachment behavior." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지 탭에서 채팅 표시 및 첨부 파일 동작을 설정합니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "“消息”标签页控制聊天显示和附件行为。" + "Tap to answer" : { + "comment" : "Notification body when Claude invokes AskUserQuestion.", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击回答" } } } }, - "The Slash Commands tab manages built-in and custom commands — edit, enable/disable, add, or delete. JSON import/export covers custom commands only. The Shortcuts tab manages shortcut buttons with JSON import/export support.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The Slash Commands tab manages built-in and custom commands — edit, enable/disable, add, or delete. JSON import/export covers custom commands only. The Shortcuts tab manages shortcut buttons with JSON import/export support." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드 탭에서는 기본 및 커스텀 커맨드를 관리합니다 — 편집, 활성화/비활성화, 추가, 삭제가 가능합니다. JSON 가져오기/내보내기는 커스텀 커맨드만 지원합니다. 단축키 탭에서는 단축 버튼을 관리하며 JSON 가져오기/내보내기를 지원합니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "“斜杠命令”标签页管理内置和自定义命令:编辑、启用/禁用、添加或删除。JSON 导入/导出仅涵盖自定义命令。“快捷按钮”标签页管理快捷按钮,并支持 JSON 导入/导出。" + "Target" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "目标" } } } }, - "The bar graph and percentage change color based on usage level.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The bar graph and percentage change color based on usage level." + "Terminal" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Terminal" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "막대 그래프와 퍼센트 수치는 사용량에 따라 색이 바뀝니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "条形图和百分比会根据使用级别改变颜色。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "终端" } } } }, - "The catalog refreshes automatically every 5 minutes.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The catalog refreshes automatically every 5 minutes." + "Terminal Command Mode" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Terminal Command Mode" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "카탈로그는 5분마다 자동으로 새로고침됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 커맨드 모드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "目录每 5 分钟自动刷新。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "终端命令模式" } } } }, - "The exit code is shown at the bottom — \"exit 0\" means the command completed successfully.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The exit code is shown at the bottom — \"exit 0\" means the command completed successfully." + "Terminal Tab" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Terminal Tab" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "하단에 종료 코드가 표시됩니다 — \"exit 0\"은 커맨드가 성공적으로 완료되었음을 의미합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "터미널 탭" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "退出代码显示在底部;“exit 0”表示命令已成功完成。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "终端标签页" } } } }, - "The left sidebar has History and Files tabs. Project tabs appear at the top of the chat area — click to switch projects. The right inspector panel contains the Terminal and Memo tabs.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The left sidebar has History and Files tabs. Project tabs appear at the top of the chat area — click to switch projects. The right inspector panel contains the Terminal and Memo tabs." + "Terminate the current shell and start a fresh zsh session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Terminate the current shell and start a fresh zsh session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "왼쪽 사이드바에는 기록 및 파일 탭이 있습니다. 채팅 영역 상단에 프로젝트 탭이 표시되며 클릭하여 전환할 수 있습니다. 오른쪽 인스펙터 패널에는 터미널과 메모 탭이 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 셸을 종료하고 새 zsh 세션을 시작합니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "左侧边栏包含“历史”和“文件”标签页。项目标签页显示在聊天区域顶部,点击即可切换项目。右侧检查器面板包含“终端”和“备忘录”标签页。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "终止当前 shell 并启动新的 zsh 会话" } } } }, - "The number of changed files is shown at the bottom of the sidebar.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The number of changed files is shown at the bottom of the sidebar." + "Terracotta" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Terracotta" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "변경된 파일 수가 사이드바 하단에 표시됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "테라코타" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已更改文件数量显示在边栏底部。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "陶土" } } } }, - "The other two Settings tabs manage per-project slash commands and shortcut buttons. Slash command JSON import/export includes custom commands only; shortcut JSON import/export backs up the shortcut set.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The other two Settings tabs manage per-project slash commands and shortcut buttons. Slash command JSON import/export includes custom commands only; shortcut JSON import/export backs up the shortcut set." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "另外两个设置标签页管理每个项目的斜杠命令和快捷按钮。斜杠命令的 JSON 导入/导出仅包含自定义命令;快捷按钮的 JSON 导入/导出会备份快捷按钮集。" + "Test connection" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "测试连接" } } } }, - "The toolbar contains: New Chat, Manage Slash Commands, Manage Shortcut Buttons, Skip Permissions toggle, Model picker, Inspector panel toggle, Settings, and the GitHub integration button.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "The toolbar contains: New Chat, Manage Slash Commands, Manage Shortcut Buttons, Skip Permissions toggle, Model picker, Inspector panel toggle, Settings, and the GitHub integration button." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "툴바 구성: 새 채팅, 슬래시 커맨드 관리, 단축 버튼 관리, 권한 건너뛰기 토글, 모델 선택, 인스펙터 패널 토글, 설정, GitHub 연동 버튼." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "工具栏包含:新聊天、管理斜杠命令、管理快捷按钮、跳过权限开关、模型选择器、检查器面板开关、设置和 GitHub 集成按钮。" + "Testing…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在测试…" } } } }, - "Theme": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Theme" + "The bar graph and percentage change color based on usage level." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The bar graph and percentage change color based on usage level." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "테마" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "막대 그래프와 퍼센트 수치는 사용량에 따라 색이 바뀝니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "主题" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "条形图和百分比会根据使用级别改变颜色。" } } } }, - "Themes": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Themes" + "The catalog refreshes automatically every 5 minutes." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The catalog refreshes automatically every 5 minutes." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "테마" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카탈로그는 5분마다 자동으로 새로고침됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "主题" - } - } - } - }, - "There are no tasks to run %@.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有可运行 %@ 的任务。" - } - } - } - }, - "This agent didn't advertise a model selector. The model picker shows a single \"Default\" entry — the agent picks its own model at runtime. Click Fetch to retry.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此智能体未声明模型选择器。模型选择器只显示一个“默认”项,智能体会在运行时自行选择模型。点击“获取”重试。" - } - } - } - }, - "This agent reports its models over ACP. RxCode refreshes the list every session start.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此智能体通过 ACP 报告模型。RxCode 会在每次会话开始时刷新列表。" - } - } - } - }, - "This memory will be removed from future agent context.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此记忆将从后续智能体上下文中移除。" - } - } - } - }, - "This project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此项目" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "目录每 5 分钟自动刷新。" } } } }, - "This session will be deleted. This action cannot be undone.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "此会话将被删除。此操作无法撤销。" + "The CLI sent an AskUserQuestion call this app could not parse." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "CLI 发送了此应用无法解析的 AskUserQuestion 调用。" } } } }, - "This will remove the project from RxCode. The files on disk will not be deleted.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "This will remove the project from RxCode. The files on disk will not be deleted." + "The exit code is shown at the bottom — \"exit 0\" means the command completed successfully." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The exit code is shown at the bottom — \"exit 0\" means the command completed successfully." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode에서 프로젝트가 제거됩니다. 디스크의 파일은 삭제되지 않습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "하단에 종료 코드가 표시됩니다 — \"exit 0\"은 커맨드가 성공적으로 완료되었음을 의미합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "这会从 RxCode 中移除该项目。磁盘上的文件不会被删除。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出代码显示在底部;“exit 0”表示命令已成功完成。" } } } }, - "Threads": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "对话" - } - } - } - }, - "Todos (%lld/%lld)": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Todos (%1$lld/%2$lld)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "待办(%1$lld/%2$lld)" - } - } - } - }, - "Toggle Inspector": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换检查器" - } - } - } - }, - "Toggle checkbox": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle checkbox" + "The General tab configures session defaults. Changes apply to newly created sessions — existing sessions keep their current values." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The General tab configures session defaults. Changes apply to newly created sessions — existing sessions keep their current values." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "체크박스 토글" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일반 탭에서 세션 기본값을 설정합니다. 변경사항은 새로 생성되는 세션에 적용되며, 기존 세션은 현재 값을 유지합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换复选框" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "“通用”标签页配置会话默认值。更改会应用到新建会话;现有会话会保留当前值。" } } } }, - "Toggle left sidebar": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle left sidebar" + "The Git status panel at the bottom of the sidebar shows changed-file counts and the current branch. Click the branch name to switch between local or remote branches." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The Git status panel at the bottom of the sidebar shows changed-file counts and the current branch. Click the branch name to switch between local or remote branches." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "왼쪽 사이드바 펼치기/숨기기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사이드바 하단의 Git 상태 패널에서 변경된 파일 수와 현재 브랜치를 확인할 수 있습니다. 브랜치 이름을 클릭하면 로컬 또는 원격 브랜치로 전환할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换左侧边栏" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "边栏底部的 Git 状态面板显示已更改文件数量和当前分支。点击分支名称可在本地或远程分支之间切换。" } } } }, - "Toggle right inspector panel": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle right inspector panel" + "The left sidebar has History and Files tabs. Project tabs appear at the top of the chat area — click to switch projects. The right inspector panel contains the Terminal and Memo tabs." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The left sidebar has History and Files tabs. Project tabs appear at the top of the chat area — click to switch projects. The right inspector panel contains the Terminal and Memo tabs." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "오른쪽 인스펙터 패널 펼치기/숨기기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "왼쪽 사이드바에는 기록 및 파일 탭이 있습니다. 채팅 영역 상단에 프로젝트 탭이 표시되며 클릭하여 전환할 수 있습니다. 오른쪽 인스펙터 패널에는 터미널과 메모 탭이 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换右侧检查器面板" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "左侧边栏包含“历史”和“文件”标签页。项目标签页显示在聊天区域顶部,点击即可切换项目。右侧检查器面板包含“终端”和“备忘录”标签页。" } } } }, - "Toggle the eye icon in the Files tab header to show or hide dotfiles (files starting with a period, such as .env or .gitignore).": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle the eye icon in the Files tab header to show or hide dotfiles (files starting with a period, such as .env or .gitignore)." + "The Message tab controls chat display and attachment behavior." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The Message tab controls chat display and attachment behavior." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 탭 헤더의 눈 아이콘을 토글하여 점(.)으로 시작하는 파일(예: .env, .gitignore)의 표시 여부를 전환할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지 탭에서 채팅 표시 및 첨부 파일 동작을 설정합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换“文件”标签页标题栏中的眼睛图标,以显示或隐藏点文件(以句点开头的文件,如 .env 或 .gitignore)。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "“消息”标签页控制聊天显示和附件行为。" } } } }, - "Toggle the shield icon at the top of the chat to auto-approve all permission prompts. Use with caution.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle the shield icon at the top of the chat to auto-approve all permission prompts. Use with caution." + "The number of changed files is shown at the bottom of the sidebar." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The number of changed files is shown at the bottom of the sidebar." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 상단의 방패 아이콘을 토글하면 모든 권한 요청이 자동으로 승인됩니다. 주의해서 사용하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "변경된 파일 수가 사이드바 하단에 표시됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换聊天顶部的盾牌图标,以自动批准所有权限提示。请谨慎使用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已更改文件数量显示在边栏底部。" } } } }, - "Toggle the shield icon at the top of the chat to auto-approve all permission requests. This speeds up tasks but also auto-executes potentially dangerous operations — use with caution.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Toggle the shield icon at the top of the chat to auto-approve all permission requests. This speeds up tasks but also auto-executes potentially dangerous operations — use with caution." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 상단의 방패 아이콘을 토글하면 모든 권한 요청이 자동으로 승인됩니다. 작업 속도는 빨라지지만 잠재적으로 위험한 작업도 자동 실행되므로 주의해서 사용하세요." + "The other two Settings tabs manage per-project slash commands and shortcut buttons. Slash command JSON import/export includes custom commands only; shortcut JSON import/export backs up the shortcut set." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The other two Settings tabs manage per-project slash commands and shortcut buttons. Slash command JSON import/export includes custom commands only; shortcut JSON import/export backs up the shortcut set." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "切换聊天顶部的盾牌图标,以自动批准所有权限请求。这会加快任务速度,但也会自动执行潜在危险操作,请谨慎使用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "另外两个设置标签页管理每个项目的斜杠命令和快捷按钮。斜杠命令的 JSON 导入/导出仅包含自定义命令;快捷按钮的 JSON 导入/导出会备份快捷按钮集。" } } } }, - "Top Toolbar": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Top Toolbar" + "The Slash Commands tab manages built-in and custom commands — edit, enable/disable, add, or delete. JSON import/export covers custom commands only. The Shortcuts tab manages shortcut buttons with JSON import/export support." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The Slash Commands tab manages built-in and custom commands — edit, enable/disable, add, or delete. JSON import/export covers custom commands only. The Shortcuts tab manages shortcut buttons with JSON import/export support." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상단 툴바" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드 탭에서는 기본 및 커스텀 커맨드를 관리합니다 — 편집, 활성화/비활성화, 추가, 삭제가 가능합니다. JSON 가져오기/내보내기는 커스텀 커맨드만 지원합니다. 단축키 탭에서는 단축 버튼을 관리하며 JSON 가져오기/내보내기를 지원합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "顶部工具栏" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "“斜杠命令”标签页管理内置和自定义命令:编辑、启用/禁用、添加或删除。JSON 导入/导出仅涵盖自定义命令。“快捷按钮”标签页管理快捷按钮,并支持 JSON 导入/导出。" } } } }, - "Total response time — cumulative time Claude spent generating responses in this session": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Total response time — cumulative time Claude spent generating responses in this session" + "The toolbar contains: New Chat, Manage Slash Commands, Manage Shortcut Buttons, Skip Permissions toggle, Model picker, Inspector panel toggle, Settings, and the GitHub integration button." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The toolbar contains: New Chat, Manage Slash Commands, Manage Shortcut Buttons, Skip Permissions toggle, Model picker, Inspector panel toggle, Settings, and the GitHub integration button." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "총 응답 시간 — 현재 세션에서 Claude가 응답하는 데 걸린 시간의 합계" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "툴바 구성: 새 채팅, 슬래시 커맨드 관리, 단축 버튼 관리, 권한 건너뛰기 토글, 모델 선택, 인스펙터 패널 토글, 설정, GitHub 연동 버튼." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "总响应时间 — Claude 在当前会话中生成响应所花费的累计时间" - } - } - } - }, - "Transport": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "传输" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "工具栏包含:新聊天、管理斜杠命令、管理快捷按钮、跳过权限开关、模型选择器、检查器面板开关、设置和 GitHub 集成按钮。" } } } }, - "Type": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "类型" - } - } - } - }, - "Type / in the input field to open a popup list of available commands. Slash commands let you quickly trigger Claude Code CLI operations without typing them manually.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Type / in the input field to open a popup list of available commands. Slash commands let you quickly trigger Claude Code CLI operations without typing them manually." + "Theme" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Theme" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창에 /를 입력하면 사용 가능한 커맨드 팝업 목록이 열립니다. 슬래시 커맨드를 사용하면 Claude Code CLI 작업을 빠르게 실행할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "테마" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在输入框中输入 / 可打开可用命令弹出列表。斜杠命令可让你快速触发 Claude Code CLI 操作,无需手动输入。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "主题" } } } }, - "Type / to open the popup, then continue typing to filter results. Use ↑/↓ to navigate.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Type / to open the popup, then continue typing to filter results. Use ↑/↓ to navigate." + "Themes" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Themes" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "/를 입력하여 팝업을 열고 계속 입력하면 결과가 필터링됩니다. ↑/↓로 탐색하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "테마" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入 / 打开弹出框,然后继续输入以筛选结果。使用 ↑/↓ 导航。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "主题" } } } }, - "Type @ in the input field to open a project file search popup. Files are filtered in real time as you type.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Type @ in the input field to open a project file search popup. Files are filtered in real time as you type." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창에 @를 입력하면 프로젝트 파일 검색 팝업이 열립니다. 입력할수록 실시간으로 필터링됩니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在输入框中输入 @ 可打开项目文件搜索弹出框。输入时文件会实时筛选。" + "There are no tasks to run %@." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有可运行 %@ 的任务。" } } } }, - "Type a message in the input field and press Return or the send button.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Type a message in the input field and press Return or the send button." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창에 메시지를 입력하고 Return 키 또는 전송 버튼을 누르세요." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在输入框中输入消息,然后按 Return 或发送按钮。" + "This agent didn't advertise a model selector. The model picker shows a single \"Default\" entry — the agent picks its own model at runtime. Click Fetch to retry." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此智能体未声明模型选择器。模型选择器只显示一个“默认”项,智能体会在运行时自行选择模型。点击“获取”重试。" } } } }, - "Type your answer…": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入你的回答…" + "This agent reports its models over ACP. RxCode refreshes the list every session start." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此智能体通过 ACP 报告模型。RxCode 会在每次会话开始时刷新列表。" } } } }, - "URL": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "URL" + "This memory will be removed from future agent context." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此记忆将从后续智能体上下文中移除。" } } } }, - "URL links": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "URL links" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "URL 링크" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "URL 链接" + "This project" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此项目" } } } }, - "URL → attached as a URL reference": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "URL → attached as a URL reference" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "URL → URL 참조로 첨부" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "URL → 作为 URL 引用附加" + "This session will be deleted. This action cannot be undone." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此会话将被删除。此操作无法撤销。" } } } }, - "Unable to load files": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Unable to load files" + "This will remove the project from RxCode. The files on disk will not be deleted." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "This will remove the project from RxCode. The files on disk will not be deleted." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일을 불러올 수 없습니다" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode에서 프로젝트가 제거됩니다. 디스크의 파일은 삭제되지 않습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无法加载文件" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "这会从 RxCode 中移除该项目。磁盘上的文件不会被删除。" } } } }, - "Unarchive": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "取消归档" - } - } - } + "Thread Model" : { + }, - "Underline": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Underline" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "밑줄" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "下划线" + "Threads" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "对话" } } } }, - "Unordered list (auto-continues on Return)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Unordered list (auto-continues on Return)" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "순서 없는 목록 (Return 시 자동 계속)" + "Todos (%lld/%lld)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Todos (%1$lld/%2$lld)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无序列表(按 Return 自动延续)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "待办(%1$lld/%2$lld)" } } } }, - "Unpin": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Unpin" + "Toggle checkbox" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle checkbox" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "고정 해제" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "체크박스 토글" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "取消固定" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换复选框" } } } }, - "Updated %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已更新 %@" + "Toggle Inspector" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换检查器" } } } }, - "Usage Colors": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Usage Colors" + "Toggle left sidebar" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle left sidebar" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용량 색상" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "왼쪽 사이드바 펼치기/숨기기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用量颜色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换左侧边栏" } } } }, - "Usage data refreshes automatically after each response. If the initial fetch fails on launch, it retries once after 5 seconds.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Usage data refreshes automatically after each response. If the initial fetch fails on launch, it retries once after 5 seconds." + "Toggle right inspector panel" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle right inspector panel" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용량 정보는 응답이 완료될 때마다 자동으로 갱신됩니다. 앱 시작 시 초기 조회에 실패하면 5초 후 한 번 재시도합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오른쪽 인스펙터 패널 펼치기/숨기기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用量数据会在每次响应后自动刷新。如果启动时首次获取失败,会在 5 秒后重试一次。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换右侧检查器面板" } } } }, - "Use Workspace (.xcworkspace)": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用工作区(.xcworkspace)" + "Toggle the eye icon in the Files tab header to show or hide dotfiles (files starting with a period, such as .env or .gitignore)." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle the eye icon in the Files tab header to show or hide dotfiles (files starting with a period, such as .env or .gitignore)." } - } - } - }, - "Use a GitHub repository that exposes .claude-plugin/marketplace.json.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用暴露 .claude-plugin/marketplace.json 的 GitHub 仓库。" - } - } - } - }, - "Use default Makefile lookup": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用默认 Makefile 查找" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일 탭 헤더의 눈 아이콘을 토글하여 점(.)으로 시작하는 파일(예: .env, .gitignore)의 표시 여부를 전환할 수 있습니다." } - } - } - }, - "Use hosted relay": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用托管中继" + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换“文件”标签页标题栏中的眼睛图标,以显示或隐藏点文件(以句点开头的文件,如 .env 或 .gitignore)。" } } } }, - "Use the effort dropdown next to the model picker to control how much reasoning Claude applies. The selection is per-session.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the effort dropdown next to the model picker to control how much reasoning Claude applies. The selection is per-session." + "Toggle the shield icon at the top of the chat to auto-approve all permission prompts. Use with caution." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle the shield icon at the top of the chat to auto-approve all permission prompts. Use with caution." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모델 선택기 옆의 작업량 드롭다운에서 Claude가 사용할 추론 강도를 조절할 수 있습니다. 선택값은 세션별로 저장됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 상단의 방패 아이콘을 토글하면 모든 권한 요청이 자동으로 승인됩니다. 주의해서 사용하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用模型选择器旁边的推理强度下拉菜单来控制 Claude 使用多少推理。该选择按会话保存。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换聊天顶部的盾牌图标,以自动批准所有权限提示。请谨慎使用。" } } } }, - "Use the model dropdown at the top of the chat area to switch Claude models.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the model dropdown at the top of the chat area to switch Claude models." + "Toggle the shield icon at the top of the chat to auto-approve all permission requests. This speeds up tasks but also auto-executes potentially dangerous operations — use with caution." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Toggle the shield icon at the top of the chat to auto-approve all permission requests. This speeds up tasks but also auto-executes potentially dangerous operations — use with caution." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 영역 상단의 모델 드롭다운을 사용하여 Claude 모델을 전환하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 상단의 방패 아이콘을 토글하면 모든 권한 요청이 자동으로 승인됩니다. 작업 속도는 빨라지지만 잠재적으로 위험한 작업도 자동 실행되므로 주의해서 사용하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用聊天区域顶部的模型下拉菜单切换 Claude 模型。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换聊天顶部的盾牌图标,以自动批准所有权限请求。这会加快任务速度,但也会自动执行潜在危险操作,请谨慎使用。" } } } }, - "Use the permission mode dropdown at the top of the chat to control how Claude requests approval before running actions.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the permission mode dropdown at the top of the chat to control how Claude requests approval before running actions." + "Top Toolbar" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Top Toolbar" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 상단의 권한 모드 드롭다운에서 Claude가 작업 전에 승인을 요청하는 방식을 제어할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상단 툴바" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用聊天顶部的权限模式下拉菜单控制 Claude 在运行操作前如何请求批准。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "顶部工具栏" } } } }, - "Use the permission mode dropdown at the top of the chat to switch how Claude handles permissions.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the permission mode dropdown at the top of the chat to switch how Claude handles permissions." + "Total response time — cumulative time Claude spent generating responses in this session" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Total response time — cumulative time Claude spent generating responses in this session" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "채팅 상단의 권한 모드 드롭다운에서 Claude의 권한 처리 방식을 전환할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "총 응답 시간 — 현재 세션에서 Claude가 응답하는 데 걸린 시간의 합계" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用聊天顶部的权限模式下拉菜单切换 Claude 处理权限的方式。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "总响应时间 — Claude 在当前会话中生成响应所花费的累计时间" } } } }, - "Use the registry to add Agent Client Protocol tools, then pick them from the thread model menu.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用注册表添加 Agent Client Protocol 工具,然后从对话模型菜单中选择。" + "Transport" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "传输" } } } }, - "Use the toolbar at the bottom for formatting, or the keyboard shortcuts below.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the toolbar at the bottom for formatting, or the keyboard shortcuts below." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "하단 툴바를 사용하거나 아래 단축키로 서식을 지정할 수 있습니다." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用底部工具栏进行格式设置,或使用下面的键盘快捷键。" + "Type" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "类型" } } } }, - "Use the trash icon in the History header to delete all sessions at once.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Use the trash icon in the History header to delete all sessions at once." + "Type @ in the input field to open a project file search popup. Files are filtered in real time as you type." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type @ in the input field to open a project file search popup. Files are filtered in real time as you type." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기록 헤더의 휴지통 아이콘을 사용하면 모든 세션을 한 번에 삭제할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창에 @를 입력하면 프로젝트 파일 검색 팝업이 열립니다. 입력할수록 실시간으로 필터링됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用“历史”标题栏中的废纸篓图标可一次删除所有会话。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在输入框中输入 @ 可打开项目文件搜索弹出框。输入时文件会实时筛选。" } } } }, - "Used for new sessions. You can override the effort level per session from the toolbar.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Used for new sessions. You can override the effort level per session from the toolbar." + "Type / in the input field to open a popup list of available commands. Slash commands let you quickly trigger Claude Code CLI operations without typing them manually." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type / in the input field to open a popup list of available commands. Slash commands let you quickly trigger Claude Code CLI operations without typing them manually." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션의 기본 Effort 수준입니다. 툴바에서 세션별로 변경할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창에 /를 입력하면 사용 가능한 커맨드 팝업 목록이 열립니다. 슬래시 커맨드를 사용하면 Claude Code CLI 작업을 빠르게 실행할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用于新会话。你可以在工具栏中为每个会话单独更改推理强度。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在输入框中输入 / 可打开可用命令弹出列表。斜杠命令可让你快速触发 Claude Code CLI 操作,无需手动输入。" } } } }, - "Used for new sessions. You can override the model per session from the toolbar.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Used for new sessions. You can override the model per session from the toolbar." + "Type / to open the popup, then continue typing to filter results. Use ↑/↓ to navigate." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type / to open the popup, then continue typing to filter results. Use ↑/↓ to navigate." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션의 기본 모델입니다. 툴바에서 세션별로 모델을 변경할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "/를 입력하여 팝업을 열고 계속 입력하면 결과가 필터링됩니다. ↑/↓로 탐색하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用于新会话。你可以在工具栏中为每个会话单独更改模型。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入 / 打开弹出框,然后继续输入以筛选结果。使用 ↑/↓ 导航。" } } } }, - "Used for new sessions. You can override the permission mode per session from the toolbar.": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Used for new sessions. You can override the permission mode per session from the toolbar." + "Type a message in the input field and press Return or the send button." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type a message in the input field and press Return or the send button." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "새 세션의 기본 권한 모드입니다. 툴바에서 세션별로 변경할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창에 메시지를 입력하고 Return 키 또는 전송 버튼을 누르세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用于新会话。你可以在工具栏中为每个会话单独更改权限模式。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在输入框中输入消息,然后按 Return 或发送按钮。" } } } }, - "Used to generate short session titles. The default follows each thread's model.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用于生成简短会话标题。默认跟随每个对话的模型。" + "Type your answer…" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入你的回答…" } } } }, - "User Guide": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "User Guide" + "Unable to load files" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unable to load files" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "사용 가이드" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "파일을 불러올 수 없습니다" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "用户指南" - } - } - } - }, - "Uses the model saved on the current thread.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用当前对话中保存的模型。" - } - } - } - }, - "VAR=value -j8": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "VAR=value -j8" - } - } - } - }, - "Value": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "值" - } - } - } - }, - "Via:": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "经由:" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法加载文件" } } } }, - "View and manage saved memories": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看和管理保存的记忆" + "Unarchive" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消归档" } } } }, - "View command details": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "View command details" + "Underline" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Underline" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "커맨드 상세 보기" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "밑줄" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看命令详情" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "下划线" } } } }, - "View details": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "查看详情" - } - } - } - }, - "Waiting for authentication...": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Waiting for authentication..." + "Unordered list (auto-continues on Return)" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unordered list (auto-continues on Return)" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인증 대기 중..." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "순서 없는 목록 (Return 시 자동 계속)" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "等待认证..." + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无序列表(按 Return 自动延续)" } } } }, - "Warm yellow": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Warm yellow" + "Unpin" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpin" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "따뜻한 옐로우" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "고정 해제" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "暖黄色" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消固定" } } } }, - "What are Permission Requests?": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What are Permission Requests?" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 요청이란?" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "什么是权限请求?" + "Updated %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已更新 %@" } } } }, - "What are Shortcut Buttons?": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What are Shortcut Buttons?" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "단축 버튼이란?" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "什么是快捷按钮?" + "URL" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL" } } } }, - "What are Slash Commands?": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What are Slash Commands?" + "URL → attached as a URL reference" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "URL → attached as a URL reference" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "슬래시 커맨드란?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL → URL 참조로 첨부" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "什么是斜杠命令?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL → 作为 URL 引用附加" } } } }, - "What is RxCode?": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What is RxCode?" + "URL links" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "URL links" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "RxCode란?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL 링크" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "什么是 RxCode?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL 链接" } } } }, - "What is the Status Line?": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "What is the Status Line?" + "Usage Colors" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Usage Colors" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "상태 표시줄이란?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용량 색상" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "什么是状态行?" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用量颜色" } } } }, - "When the input field is empty, use ↑/↓ to navigate your message history.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "When the input field is empty, use ↑/↓ to navigate your message history." + "Usage data refreshes automatically after each response. If the initial fetch fails on launch, it retries once after 5 seconds." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Usage data refreshes automatically after each response. If the initial fetch fails on launch, it retries once after 5 seconds." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "입력창이 비어 있을 때 ↑/↓를 눌러 메시지 기록을 탐색할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용량 정보는 응답이 완료될 때마다 자동으로 갱신됩니다. 앱 시작 시 초기 조회에 실패하면 5초 후 한 번 재시도합니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "输入框为空时,使用 ↑/↓ 浏览消息历史。" - } - } - } - }, - "Wipe cached embeddings and re-embed every thread for semantic search. Use this if global search results look stale or empty.": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "清除缓存的嵌入并为每个对话重新生成嵌入,以用于语义搜索。如果全局搜索结果过旧或为空,请使用此操作。" - } - } - } - }, - "Working Directory": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "工作目录" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用量数据会在每次响应后自动刷新。如果启动时首次获取失败,会在 5 秒后重试一次。" } } } }, - "XHigh": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "XHigh" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "매우 높음" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "极高" + "Use a GitHub repository that exposes .claude-plugin/marketplace.json." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用暴露 .claude-plugin/marketplace.json 的 GitHub 仓库。" } } } }, - "Xcode": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "Xcode" + "Use default Makefile lookup" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用默认 Makefile 查找" } } } }, - "You": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "你" + "Use hosted relay" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用托管中继" } } } }, - "You can send messages even while Claude is responding. New messages are queued automatically and sent once the current response finishes. Queued messages appear as a badge above the input field — click the × on each item to remove it from the queue.": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "You can send messages even while Claude is responding. New messages are queued automatically and sent once the current response finishes. Queued messages appear as a badge above the input field — click the × on each item to remove it from the queue." + "Use the effort dropdown next to the model picker to control how much reasoning Claude applies. The selection is per-session." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the effort dropdown next to the model picker to control how much reasoning Claude applies. The selection is per-session." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Claude가 응답하는 동안에도 메시지를 전송할 수 있습니다. 새 메시지는 자동으로 큐에 추가되고 현재 응답이 완료되면 전송됩니다. 대기 중인 메시지는 입력창 위에 배지로 표시되며, 각 항목의 × 버튼으로 제거할 수 있습니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모델 선택기 옆의 작업량 드롭다운에서 Claude가 사용할 추론 강도를 조절할 수 있습니다. 선택값은 세션별로 저장됩니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "即使 Claude 正在响应,你也可以发送消息。新消息会自动排队,并在当前响应完成后发送。排队消息会以徽标显示在输入框上方;点击每项上的 × 可将其从队列中移除。" - } - } - } - }, - "archived": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "archived" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用模型选择器旁边的推理强度下拉菜单来控制 Claude 使用多少推理。该选择按会话保存。" } } } }, - "auto.preview.desc": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "When enabled, pasting the following content types automatically creates an attachment preview. When disabled, the content is inserted as plain text." + "Use the model dropdown at the top of the chat area to switch Claude models." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the model dropdown at the top of the chat area to switch Claude models." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "활성화하면 다음 콘텐츠 유형을 붙여넣을 때 자동으로 첨부 파일 미리보기가 생성됩니다. 비활성화하면 일반 텍스트로 삽입됩니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 영역 상단의 모델 드롭다운을 사용하여 Claude 모델을 전환하세요." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "启用后,粘贴以下内容类型时会自动创建附件预览。停用后,内容会作为纯文本插入。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用聊天区域顶部的模型下拉菜单切换 Claude 模型。" } } } }, - "build": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "build" + "Use the permission mode dropdown at the top of the chat to control how Claude requests approval before running actions." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the permission mode dropdown at the top of the chat to control how Claude requests approval before running actions." } - } - } - }, - "command": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "command" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 상단의 권한 모드 드롭다운에서 Claude가 작업 전에 승인을 요청하는 방식을 제어할 수 있습니다." } - } - } - }, - "connection lost": { - "comment": "Fallback MCP disconnect detail when no error message is available.", - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接已断开" + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用聊天顶部的权限模式下拉菜单控制 Claude 在运行操作前如何请求批准。" } } } }, - "context — context window usage for the current session (bar + %)": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "context — context window usage for the current session (bar + %)" + "Use the permission mode dropdown at the top of the chat to switch how Claude handles permissions." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the permission mode dropdown at the top of the chat to switch how Claude handles permissions." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "context — 현재 세션의 컨텍스트 윈도우 사용률 (막대 그래프 + %)" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "채팅 상단의 권한 모드 드롭다운에서 Claude의 권한 처리 방식을 전환할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上下文 — 当前会话的上下文窗口用量(条形图 + 百分比)" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用聊天顶部的权限模式下拉菜单切换 Claude 处理权限的方式。" } } } }, - "dev / prod / beta": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "dev / prod / beta" + "Use the registry to add Agent Client Protocol tools, then pick them from the thread model menu." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用注册表添加 Agent Client Protocol 工具,然后从对话模型菜单中选择。" } } } }, - "effort.desc.auto": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Uses the model's default effort level, chosen automatically based on the active model and plan." + "Use the toolbar at the bottom for formatting, or the keyboard shortcuts below." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the toolbar at the bottom for formatting, or the keyboard shortcuts below." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "활성 모델과 플랜에 따라 자동으로 결정되는 모델 기본값을 사용합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "하단 툴바를 사용하거나 아래 단축키로 서식을 지정할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "使用模型的默认推理强度,并根据当前模型和套餐自动选择。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用底部工具栏进行格式设置,或使用下面的键盘快捷键。" } } } }, - "effort.desc.high": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Balances token usage and intelligence. Good minimum for intelligence-sensitive work." + "Use the trash icon in the History header to delete all sessions at once." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use the trash icon in the History header to delete all sessions at once." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "토큰 사용량과 지능 수준을 균형 있게 유지합니다. 정확도가 중요한 작업의 최소 권장 수준입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 헤더의 휴지통 아이콘을 사용하면 모든 세션을 한 번에 삭제할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "平衡 token 用量和智能程度。适合对智能要求较高工作的最低建议。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用“历史”标题栏中的废纸篓图标可一次删除所有会话。" } } } }, - "effort.desc.low": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reserve for short, scoped, latency-sensitive tasks that are not intelligence-sensitive." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "지연 시간에 민감하고 복잡하지 않은 짧고 범위가 명확한 작업에 사용하세요." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "保留给简短、范围明确、对延迟敏感且不需要高智能的任务。" + "Use Workspace (.xcworkspace)" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用工作区(.xcworkspace)" } } } }, - "effort.desc.max": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Deepest reasoning with no token constraint. Current session only. Best for demanding, complex tasks." + "Used for new sessions. You can override the effort level per session from the toolbar." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Used for new sessions. You can override the effort level per session from the toolbar." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "토큰 제한 없이 가장 깊은 추론을 제공합니다. 현재 세션에만 적용됩니다. 복잡하고 까다로운 작업에 적합합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션의 기본 Effort 수준입니다. 툴바에서 세션별로 변경할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "最深度推理,不限制 token。仅当前会话有效。最适合要求高、复杂的任务。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用于新会话。你可以在工具栏中为每个会话单独更改推理强度。" } } } }, - "effort.desc.medium": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reduces token usage for cost-sensitive work that can trade off some intelligence." + "Used for new sessions. You can override the model per session from the toolbar." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Used for new sessions. You can override the model per session from the toolbar." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일부 정확도를 양보하더라도 토큰 비용을 줄이고 싶을 때 적합합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션의 기본 모델입니다. 툴바에서 세션별로 모델을 변경할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "为成本敏感型工作减少 token 用量,可接受一定智能折中。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用于新会话。你可以在工具栏中为每个会话单独更改模型。" } } } }, - "effort.desc.xhigh": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Best results for most coding and agentic tasks. Recommended default on Opus 4.7." + "Used for new sessions. You can override the permission mode per session from the toolbar." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Used for new sessions. You can override the permission mode per session from the toolbar." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "대부분의 코딩 및 에이전트 작업에서 최상의 결과를 제공합니다. Opus 4.7의 권장 기본값입니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "새 세션의 기본 권한 모드입니다. 툴바에서 세션별로 변경할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "适合大多数编码和智能体任务,效果最佳。Opus 4.7 的推荐默认值。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用于新会话。你可以在工具栏中为每个会话单独更改权限模式。" } } } }, - "esc": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "esc" + "Used to generate short session titles. The default follows each thread's model." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用于生成简短会话标题。默认跟随每个对话的模型。" } } } }, - "exit %d": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "exit %d" - } - } - } - }, - "exit 0": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "exit 0" - } - } - } - }, - "focus.mode.desc": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Hide streaming bubbles and show only completed responses in history." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스트리밍 중 메시지 버블을 숨기고, 완료된 응답만 히스토리에 표시합니다." + "User Guide" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "User Guide" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "隐藏流式输出气泡,只在历史记录中显示已完成的回复。" - } - } - } - }, - "font.size.hint": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Adjust interface and message font sizes independently." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "인터페이스와 메시지 폰트 크기를 각각 조절합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용 가이드" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分别调整界面和消息字体大小。" - } - } - } - }, - "from %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "来自 %@" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用户指南" } } } }, - "https://example.com/mcp": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "https://example.com/mcp" + "Uses the model saved on the current thread." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用当前对话中保存的模型。" } } } }, - "https://github.com/owner/repo": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "https://github.com/owner/repo" + "v%@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "v%@" } } } }, - "https://github.com/owner/repo.git or git@github.com:owner/repo.git": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "https://github.com/owner/repo.git or git@github.com:owner/repo.git" + "value" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "value" } } } }, - "loading...": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "loading..." - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "불러오는 중..." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在加载..." - } - } - } - }, - "main": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "main" + "Value" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "值" } } } }, - "model.desc.best": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Most capable available model, currently equivalent to Opus" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 사용 가능한 가장 강력한 모델 (현재 Opus와 동일)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "当前可用的最强模型,目前等同于 Opus" + "VAR=value -j8" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "VAR=value -j8" } } } }, - "model.desc.default": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Reverts to the recommended model for your account type" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "계정 유형에 따른 권장 모델로 되돌림" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "恢复为适合你账户类型的推荐模型" + "Via:" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "经由:" } } } }, - "model.desc.haiku": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Fast and efficient model for simple tasks" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "간단한 작업을 위한 빠르고 효율적인 모델" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "适合简单任务的快速高效模型" + "View and manage saved memories" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看和管理保存的记忆" } } } }, - "model.desc.opus": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Latest Opus model for complex reasoning tasks" + "View command details" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "View command details" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "복잡한 추론 작업을 위한 최신 Opus 모델" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커맨드 상세 보기" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "适合复杂推理任务的最新 Opus 模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看命令详情" } } } }, - "model.desc.opus1m": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Opus with 1 million token context window for long sessions" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "긴 세션을 위한 100만 토큰 컨텍스트 윈도우 Opus" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "带 100 万 token 上下文窗口的 Opus,适合长会话" + "View details" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看详情" } } } }, - "model.desc.opusplan": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Opus in plan mode, then switches to Sonnet for execution" + "Waiting for authentication..." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Waiting for authentication..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "Plan Mode에서 Opus 사용 후 실행 시 Sonnet으로 전환" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "인증 대기 중..." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "在计划模式中使用 Opus,执行时切换到 Sonnet" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "等待认证..." } } } }, - "model.desc.sonnet": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Latest Sonnet model for daily coding tasks" + "Warm yellow" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Warm yellow" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "일일 코딩 작업을 위한 최신 Sonnet 모델" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "따뜻한 옐로우" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "适合日常编码任务的最新 Sonnet 模型" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "暖黄色" } } } }, - "model.desc.sonnet1m": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Sonnet with 1 million token context window for long sessions" + "What are Permission Requests?" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What are Permission Requests?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "긴 세션을 위한 100만 토큰 컨텍스트 윈도우 Sonnet" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "권한 요청이란?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "带 100 万 token 上下文窗口的 Sonnet,适合长会话" - } - } - } - }, - "my-project": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "my-project" - } - } - } - }, - "my-server": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "my-server" - } - } - } - }, - "npx": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "npx" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "什么是权限请求?" } } } }, - "perm.desc.acceptEdits": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Auto-approves file edits and common filesystem commands (mkdir, touch, mv, cp). Still prompts for other shell commands." + "What are Shortcut Buttons?" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What are Shortcut Buttons?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 편집 및 일반 파일시스템 명령(mkdir, touch, mv, cp)을 자동 승인합니다. 다른 셸 명령은 여전히 확인을 요청합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "단축 버튼이란?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "自动批准文件编辑和常见文件系统命令(mkdir、touch、mv、cp)。其他 shell 命令仍会提示。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "什么是快捷按钮?" } } } }, - "perm.desc.auto": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Runs without permission prompts. A background classifier reviews each action for safety before it executes." + "What are Slash Commands?" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What are Slash Commands?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "권한 확인 없이 실행됩니다. 백그라운드 분류기가 각 작업을 실행 전에 안전 여부를 검토합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "슬래시 커맨드란?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无需权限提示即可运行。每个操作执行前,后台分类器会检查其安全性。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "什么是斜杠命令?" } } } }, - "perm.desc.bypassPermissions": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Skips all permission checks and safety gates. Use only in isolated containers or VMs without internet access." + "What is RxCode?" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What is RxCode?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "모든 권한 확인 및 안전 장치를 건너뜁니다. 인터넷이 차단된 컨테이너나 VM 환경에서만 사용하세요." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "RxCode란?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "跳过所有权限检查和安全门控。仅在无网络的隔离容器或虚拟机中使用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "什么是 RxCode?" } } } }, - "perm.desc.default": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Prompts before each file edit or shell command. Best for sensitive work or getting started." + "What is the Status Line?" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What is the Status Line?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "파일 편집이나 셸 명령 실행 전마다 확인을 요청합니다. 민감한 작업이나 처음 시작할 때 적합합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 표시줄이란?" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每次文件编辑或 shell 命令前都提示确认。适合敏感工作或初次使用。" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "什么是状态行?" } } } }, - "perm.desc.plan": { - "extractionState": "stale", - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "Read-only mode. Claude researches and proposes a plan without making any changes. Same prompts as default for other actions." + "When the input field is empty, use ↑/↓ to navigate your message history." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "When the input field is empty, use ↑/↓ to navigate your message history." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "읽기 전용 모드입니다. Claude가 변경 없이 코드베이스를 분석하고 계획을 제안합니다. 나머지 작업에는 기본 모드와 동일한 확인을 적용합니다." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "입력창이 비어 있을 때 ↑/↓를 눌러 메시지 기록을 탐색할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "只读模式。Claude 会研究并提出计划,不会进行更改。其他操作使用与默认模式相同的提示。" - } - } - } - }, - "rxcode/feature-name": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "rxcode/feature-name" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入框为空时,使用 ↑/↓ 浏览消息历史。" } } } }, - "sk-...": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "sk-..." + "Wipe cached embeddings and re-embed every thread for semantic search. Use this if global search results look stale or empty." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除缓存的嵌入并为每个对话重新生成嵌入,以用于语义搜索。如果全局搜索结果过旧或为空,请使用此操作。" } } } }, - "v%@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "v%@" + "Working Directory" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "工作目录" } } } }, - "value": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "value" + "wss://relay.example.com" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "wss://relay.example.com" } } } }, - "wss://relay.example.com": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "wss://relay.example.com" + "Xcode" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xcode" } } } }, - "·": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "·" + "XHigh" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "XHigh" } - } - } - }, - "· %lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "· %lld" - } - } - } - }, - "—": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "—" - } - } - } - }, - "•": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "•" + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "매우 높음" } - } - } - }, - "• %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "• %@" + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "极高" } } } }, - "• last seen %@": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "• 上次出现 %@" + "You" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "你" } } } }, - "↑↓ Select ↵ Confirm esc Cancel": { - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "↑↓ Select ↵ Confirm esc Cancel" + "You can send messages even while Claude is responding. New messages are queued automatically and sent once the current response finishes. Queued messages appear as a badge above the input field — click the × on each item to remove it from the queue." : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "You can send messages even while Claude is responding. New messages are queued automatically and sent once the current response finishes. Queued messages appear as a badge above the input field — click the × on each item to remove it from the queue." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "↑↓ 선택 ↵ 확인 esc 취소" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Claude가 응답하는 동안에도 메시지를 전송할 수 있습니다. 새 메시지는 자동으로 큐에 추가되고 현재 응답이 완료되면 전송됩니다. 대기 중인 메시지는 입력창 위에 배지로 표시되며, 각 항목의 × 버튼으로 제거할 수 있습니다." } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "↑↓ 选择 ↵ 确认 esc 取消" - } - } - } - }, - "−%lld": { - "localizations": { - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "−%lld" + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "即使 Claude 正在响应,你也可以发送消息。新消息会自动排队,并在当前响应完成后发送。排队消息会以徽标显示在输入框上方;点击每项上的 × 可将其从队列中移除。" } } } } }, - "version": "1.1" -} + "version" : "1.1" +} \ No newline at end of file diff --git a/RxCode/Services/ClaudeService+Summaries.swift b/RxCode/Services/ClaudeService+Summaries.swift index 38f165c6..5c308661 100644 --- a/RxCode/Services/ClaudeService+Summaries.swift +++ b/RxCode/Services/ClaudeService+Summaries.swift @@ -120,6 +120,20 @@ extension ClaudeCodeServer { return await generatePlainSummary(prompt: prompt, model: model, limit: 3000) } + func determineMemoryInjectionIntent( + content: String, + kind: String, + scope: String, + model: String = "claude-haiku-4-5-20251001" + ) async -> String? { + let prompt = OpenAISummarizationService.memoryInjectionIntentPrompt( + content: content, + kind: kind, + scope: scope + ) + return await generatePlainSummary(prompt: prompt, model: model, limit: 16) + } + func generateBranchBriefing( threadSummaries: [(title: String, summary: String)], model: String = "claude-haiku-4-5-20251001" diff --git a/RxCode/Services/CodexAppServer+Parsing.swift b/RxCode/Services/CodexAppServer+Parsing.swift index 1f450605..bb5d87f5 100644 --- a/RxCode/Services/CodexAppServer+Parsing.swift +++ b/RxCode/Services/CodexAppServer+Parsing.swift @@ -4,6 +4,10 @@ import os extension CodexAppServer { func toolName(from item: [String: JSONValue]) -> String? { + if let mcpName = mcpToolName(from: item) { + return mcpName + } + if let type = Self.firstString(in: item, keys: ["type", "kind"]) { let normalizedType = type.lowercased() if normalizedType.contains("command") { return "Bash" } @@ -15,6 +19,93 @@ extension CodexAppServer { return name.lowercased().contains("message") ? "message" : name } + private func mcpToolName(from item: [String: JSONValue]) -> String? { + let type = Self.firstString(in: item, keys: ["type", "kind"])?.lowercased() + let looksLikeMCP = type?.contains("mcp") == true + || item["serverName"] != nil + || item["server_name"] != nil + || item["server"] != nil + + guard looksLikeMCP else { return nil } + + let rawToolName = Self.firstString(in: item, keys: [ + "toolName", "tool_name", "name" + ]).flatMap { value -> String? in + let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty, trimmed.lowercased() != "mcptoolcall" else { return nil } + return trimmed + } + let serverName = Self.firstString(in: item, keys: [ + "serverName", "server_name", "server", "mcpServerName", "mcp_server_name" + ])?.trimmingCharacters(in: .whitespacesAndNewlines) + + if let rawToolName, rawToolName.hasPrefix("mcp__") { + return rawToolName + } + if let serverName, !serverName.isEmpty, let rawToolName { + return "mcp__\(serverName)__\(rawToolName)" + } + if let rawToolName { + return "mcp__\(rawToolName)" + } + if let serverName, !serverName.isEmpty { + return "mcp__\(serverName)" + } + return "mcpToolCall" + } + + static func toolOutput(from item: [String: JSONValue]) -> String { + if let output = firstPresentValue(in: item, keys: ["output", "result", "summary", "message"]) { + return stringForToolOutput(output) + } + if let error = item["error"], toolValueIndicatesError(error) { + return stringForToolOutput(error) + } + return "" + } + + static func toolValueIndicatesError(_ value: JSONValue?) -> Bool { + guard let value else { return false } + switch value { + case .null: + return false + case .bool(let flag): + return flag + case .string(let text): + let normalized = text.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() + return !normalized.isEmpty && normalized != "false" && normalized != "null" && normalized != "none" + case .number(let number): + return number != 0 + case .array(let values): + return !values.isEmpty + case .object(let object): + return !object.isEmpty + } + } + + private static func firstPresentValue(in object: [String: JSONValue], keys: [String]) -> JSONValue? { + for key in keys { + if let value = object[key], !value.isNull { + return value + } + } + return nil + } + + private static func stringForToolOutput(_ value: JSONValue) -> String { + if let string = value.stringValue { + return string + } + return prettyJSONString(value) ?? value.description + } + + private static func prettyJSONString(_ value: JSONValue) -> String? { + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted, .sortedKeys] + guard let data = try? encoder.encode(value) else { return nil } + return String(data: data, encoding: .utf8) + } + static func parseModels(from value: JSONValue) -> [AgentModel] { let root = value.objectValue let rawModels = root?["data"]?.arrayValue ?? root?["models"]?.arrayValue ?? root?["items"]?.arrayValue ?? value.arrayValue ?? [] diff --git a/RxCode/Services/CodexAppServer+Summaries.swift b/RxCode/Services/CodexAppServer+Summaries.swift index 6fafe098..2dfb4a61 100644 --- a/RxCode/Services/CodexAppServer+Summaries.swift +++ b/RxCode/Services/CodexAppServer+Summaries.swift @@ -179,6 +179,21 @@ extension CodexAppServer { return cleanSummary(raw, limit: 3000) } + func determineMemoryInjectionIntent( + content: String, + kind: String, + scope: String, + model: String? + ) async -> String? { + let prompt = OpenAISummarizationService.memoryInjectionIntentPrompt( + content: content, + kind: kind, + scope: scope + ) + guard let raw = await generateCodexPlainSummary(prompt: prompt, model: model) else { return nil } + return cleanSummary(raw, limit: 16) + } + func generateBranchBriefing( threadSummaries: [(title: String, summary: String)], model: String? diff --git a/RxCode/Services/CodexAppServer+Turn.swift b/RxCode/Services/CodexAppServer+Turn.swift index f14bbc07..48fc1f66 100644 --- a/RxCode/Services/CodexAppServer+Turn.swift +++ b/RxCode/Services/CodexAppServer+Turn.swift @@ -221,8 +221,8 @@ extension CodexAppServer { func emitToolCompletion(item: [String: JSONValue], continuation: AsyncStream.Continuation) { guard let name = toolName(from: item), name != "message" else { return } let id = Self.firstString(in: item, keys: ["id", "itemId", "callId"]) ?? UUID().uuidString - let output = Self.firstString(in: item, keys: ["output", "result", "summary", "message"]) ?? "" - let isError = item["error"] != nil || item["isError"]?.boolValue == true + let output = Self.toolOutput(from: item) + let isError = Self.toolValueIndicatesError(item["error"]) || item["isError"]?.boolValue == true continuation.yield(.user(UserMessage(toolUseId: id, content: output, isError: isError))) } diff --git a/RxCode/Services/FoundationModelSummarizationService.swift b/RxCode/Services/FoundationModelSummarizationService.swift index c103c3fb..b03e570a 100644 --- a/RxCode/Services/FoundationModelSummarizationService.swift +++ b/RxCode/Services/FoundationModelSummarizationService.swift @@ -109,6 +109,19 @@ actor FoundationModelSummarizationService { return cleanSummary(raw, limit: 3000) } + func determineMemoryInjectionIntent(content: String, kind: String, scope: String) async -> String? { + let prompt = OpenAISummarizationService.memoryInjectionIntentPrompt( + content: content, + kind: kind, + scope: scope + ) + let raw = await respond( + instructions: "You classify durable IDE memories. Output only true or false.", + prompt: prompt + ) + return cleanSummary(raw, limit: 16) + } + func generateBranchBriefing( threadSummaries: [(title: String, summary: String)] ) async -> String? { diff --git a/RxCode/Services/IDEServer/AppState+IDEToolHandling.swift b/RxCode/Services/IDEServer/AppState+IDEToolHandling.swift index bc7dbf2f..d6832e8b 100644 --- a/RxCode/Services/IDEServer/AppState+IDEToolHandling.swift +++ b/RxCode/Services/IDEServer/AppState+IDEToolHandling.swift @@ -258,11 +258,6 @@ extension AppState: IDEToolHandling { } let scope = arguments["scope"]?.stringValue ?? "project" let kind = arguments["kind"]?.stringValue ?? "fact" - guard Self.shouldAcceptAgentMemoryAdd(content: content, kind: kind) else { - throw IDEToolError.invalidArguments( - "memory_add requires an explicit user preference, future instruction, or remember-this request" - ) - } let projectId = try parseOptionalProjectId(arguments["project_id"]?.stringValue) guard let item = await addMemoryItem( content: content, diff --git a/RxCode/Services/OpenAISummarizationService.swift b/RxCode/Services/OpenAISummarizationService.swift index 7e334fc1..271050fc 100644 --- a/RxCode/Services/OpenAISummarizationService.swift +++ b/RxCode/Services/OpenAISummarizationService.swift @@ -169,6 +169,18 @@ actor OpenAISummarizationService { return await generateSummary(prompt: prompt, endpoint: endpoint, apiKey: apiKey, model: model, maxTokens: 512) } + func determineMemoryInjectionIntent( + content: String, + kind: String, + scope: String, + endpoint: String, + apiKey: String, + model: String + ) async -> String? { + let prompt = Self.memoryInjectionIntentPrompt(content: content, kind: kind, scope: scope) + return await generateSummary(prompt: prompt, endpoint: endpoint, apiKey: apiKey, model: model, maxTokens: 8) + } + func generateBranchBriefing( threadSummaries: [(title: String, summary: String)], endpoint: String, @@ -302,6 +314,23 @@ actor OpenAISummarizationService { """ } + static func memoryInjectionIntentPrompt(content: String, kind: String, scope: String) -> String { + """ + Decide whether this saved memory should be injected into every future agent system prompt. + + Reply with ONLY true or false. + + Return true only when the memory captures the user's durable intent: a reusable preference, recurring workflow instruction, naming/style convention, default behavior, "always/never" rule, or explicitly requested remember-this note. + + Return false for ordinary facts, completed work, build/test results, files changed, temporary task state, one-off decisions, tool availability, debugging details, or any memory that is useful only when retrieved by related search. + + Memory kind: \(kind) + Memory scope: \(scope) + Memory content: + \(String(content.prefix(1200))) + """ + } + private func generateSummary(prompt: String, endpoint: String, apiKey: String, model: String, maxTokens: Double) async -> String? { let body: JSONValue = .object([ "model": .string(model), diff --git a/RxCode/Services/ThreadStore.swift b/RxCode/Services/ThreadStore.swift index de144181..cf0a416e 100644 --- a/RxCode/Services/ThreadStore.swift +++ b/RxCode/Services/ThreadStore.swift @@ -149,6 +149,40 @@ final class ThreadStore { save() } + func upsertThreadSummaryTitle( + sessionId: String, + projectId: UUID, + branch: String, + title: String, + updatedAt: Date = .now + ) { + if let existing = fetchThreadSummary(sessionId: sessionId) { + existing.applyTitle( + projectId: projectId, + branch: branch, + title: title, + updatedAt: updatedAt + ) + } else { + let seed = ThreadSummaryItem.titleSeed( + sessionId: sessionId, + projectId: projectId, + branch: branch, + title: title, + updatedAt: updatedAt + ) + context.insert(ThreadSummaryRecord( + sessionId: seed.sessionId, + projectId: seed.projectId, + branch: seed.branch, + title: seed.title, + summary: seed.summary, + updatedAt: seed.updatedAt + )) + } + save() + } + func upsertBranchBriefing(projectId: UUID, branch: String, briefing: String, updatedAt: Date = .now) { if let existing = fetchBranchBriefing(projectId: projectId, branch: branch) { existing.apply(briefing: briefing, updatedAt: updatedAt) @@ -457,24 +491,34 @@ final class ThreadStore { /// Append edit hunks to the file's row for this session, creating the row if it /// does not yet exist. Hunks are aggregated across turns; `containsWrite` becomes /// sticky once any Write contributes. + /// + /// `originalContent` is the file's contents captured at the very first edit + /// to this path within this session. It's stored only on row creation — + /// subsequent calls preserve the original snapshot rather than overwriting + /// it, so the diff view always compares against the true thread-start state. func appendFileEdit( sessionId: String, path: String, hunks: [PreviewFile.EditHunk], - containsWrite: Bool + containsWrite: Bool, + originalContent: String? = nil ) { guard !hunks.isEmpty else { return } let name = (path as NSString).lastPathComponent if let existing = fetchFileEdit(sessionId: sessionId, path: path) { existing.append(hunks: hunks, containsWrite: containsWrite) existing.name = name + if existing.originalContent == nil, let originalContent { + existing.originalContent = originalContent + } } else { context.insert(ThreadFileEdit( sessionId: sessionId, path: path, name: name, hunks: hunks, - containsWrite: containsWrite + containsWrite: containsWrite, + originalContent: originalContent )) } save() diff --git a/RxCode/Views/ChatSettingsTab.swift b/RxCode/Views/ChatSettingsTab.swift index 6d7deb6e..8b082b5a 100644 --- a/RxCode/Views/ChatSettingsTab.swift +++ b/RxCode/Views/ChatSettingsTab.swift @@ -355,7 +355,7 @@ struct ChatSettingsTab: View { Picker("", selection: $appState.permissionMode) { ForEach(PermissionMode.allCases, id: \.self) { mode in - Text(LocalizedStringKey(mode.displayName)).tag(mode) + Text(mode.displayName).tag(mode) } } .labelsHidden() diff --git a/RxCode/Views/ChatToolbarComponents.swift b/RxCode/Views/ChatToolbarComponents.swift index 65e4faff..68dcf36c 100644 --- a/RxCode/Views/ChatToolbarComponents.swift +++ b/RxCode/Views/ChatToolbarComponents.swift @@ -49,14 +49,14 @@ struct ChatToolbarControls: View { Button { appState.setSessionPermissionMode(mode, in: windowState) } label: { - Text(LocalizedStringKey(mode.displayName)) + Text(mode.displayName) if effectiveMode == mode { Image(systemName: "checkmark") } } } } } label: { controlLabel( - title: effectiveMode.displayName, + title: effectiveMode.displayNameText, icon: nil, isAccent: placement == .composer, isActive: false @@ -64,7 +64,7 @@ struct ChatToolbarControls: View { } .menuStyle(.borderlessButton) .fixedSize() - .help("Permission mode: \(effectiveMode.displayName)") + .help("Permission mode: \(effectiveMode.displayNameText)") .accessibilityIdentifier("permission-mode-menu") Menu { @@ -102,7 +102,7 @@ struct ChatToolbarControls: View { } .menuStyle(.borderlessButton) .fixedSize() - .help("Model: \(effectiveProvider.displayName) · \(appState.modelDisplayLabel(effectiveModel, provider: effectiveProvider))") + .help("Model: \(effectiveProvider.displayNameText) · \(appState.modelDisplayLabel(effectiveModel, provider: effectiveProvider))") .accessibilityIdentifier("provider-model-menu") .popoverTip(RxCodeTips.AgentSelectionTip(), arrowEdge: .top) diff --git a/RxCode/Views/Inspector/RightInspectorHeaderControls.swift b/RxCode/Views/Inspector/RightInspectorHeaderControls.swift index 5a5a30b4..b4c3d7fa 100644 --- a/RxCode/Views/Inspector/RightInspectorHeaderControls.swift +++ b/RxCode/Views/Inspector/RightInspectorHeaderControls.swift @@ -14,7 +14,7 @@ struct ModeSwitchControl: View { Button { withAnimation(.easeInOut(duration: 0.18)) { selection = mode } } label: { - Text(LocalizedStringKey(mode.rawValue)) + Text(mode.title) .font(.system(size: ClaudeTheme.size(12), weight: .semibold)) .lineLimit(1) .fixedSize(horizontal: true, vertical: false) @@ -45,7 +45,7 @@ struct ModeSwitchControl: View { /// Shared chevron-down dropdown label used by both Review and Inspector mode. struct HeaderPickerLabel: View { let icon: String? - let title: String + let title: LocalizedStringResource @State private var isHovered = false var body: some View { @@ -55,7 +55,7 @@ struct HeaderPickerLabel: View { .font(.system(size: ClaudeTheme.size(11), weight: .semibold)) .foregroundStyle(ClaudeTheme.textSecondary) } - Text(LocalizedStringKey(title)) + Text(title) .font(.system(size: ClaudeTheme.size(13), weight: .semibold)) .foregroundStyle(ClaudeTheme.textPrimary) Image(systemName: "chevron.down") @@ -90,13 +90,13 @@ struct ReviewTabPicker: View { selection = tab } label: { HStack { - Text(LocalizedStringKey(tab.rawValue)) + Text(tab.title) if selection == tab { Image(systemName: "checkmark") } } } } } label: { - HeaderPickerLabel(icon: nil, title: selection.rawValue) + HeaderPickerLabel(icon: nil, title: selection.title) } .menuStyle(.borderlessButton) .menuIndicator(.hidden) @@ -119,13 +119,13 @@ struct InspectorTabPicker: View { } label: { HStack { Image(systemName: tab.icon) - Text(LocalizedStringKey(tab.rawValue)) + Text(tab.title) if selection == tab { Image(systemName: "checkmark") } } } } } label: { - HeaderPickerLabel(icon: selection.icon, title: selection.rawValue) + HeaderPickerLabel(icon: selection.icon, title: selection.title) } .menuStyle(.borderlessButton) .menuIndicator(.hidden) diff --git a/RxCode/Views/Inspector/RightInspectorPanel.swift b/RxCode/Views/Inspector/RightInspectorPanel.swift index d0840a4a..35fa9e11 100644 --- a/RxCode/Views/Inspector/RightInspectorPanel.swift +++ b/RxCode/Views/Inspector/RightInspectorPanel.swift @@ -17,8 +17,11 @@ struct InspectorTerminal: Identifiable { } struct RightInspectorPanel: View { + let maxAllowedWidth: CGFloat + @Environment(WindowState.self) private var windowState @AppStorage(AppStorageKeys.showRightSidebar) private var showRightSidebar = false + @AppStorage(AppStorageKeys.rightInspectorWidth) private var rightInspectorWidth = RightInspectorPanelLayout.defaultWidth // Per-thread terminal storage. Each session/thread can have multiple // terminals; all stay alive across thread switches. @@ -27,11 +30,19 @@ struct RightInspectorPanel: View { @State private var memoClearID: UUID? = nil @State private var terminalFocusID: UUID? = nil @State private var memoFocusID: UUID? = nil + @State private var resizeStartWidth: Double? private var currentSessionKey: String { windowState.currentSessionId ?? windowState.newSessionKey } + private var visibleWidth: CGFloat { + RightInspectorPanelLayout.restoredWidth( + from: rightInspectorWidth, + maxAllowedWidth: maxAllowedWidth + ) + } + private var currentTerminals: [InspectorTerminal] { terminalsBySession[currentSessionKey] ?? [] } @@ -154,9 +165,13 @@ struct RightInspectorPanel: View { .frame(width: 0.5) } .frame( - minWidth: showRightSidebar ? 420 : 0, - maxWidth: showRightSidebar ? .infinity : 0 + width: showRightSidebar ? visibleWidth : 0 ) + .overlay(alignment: .leading) { + if showRightSidebar { + resizeHandle + } + } .opacity(showRightSidebar ? 1 : 0) .clipped() .background(terminalShortcuts) @@ -269,4 +284,34 @@ struct RightInspectorPanel: View { BranchInfoView() } } + + private var resizeHandle: some View { + Rectangle() + .fill(Color.clear) + .frame(width: 8) + .contentShape(Rectangle()) + .gesture( + DragGesture(minimumDistance: 0) + .onChanged { value in + let startWidth = resizeStartWidth ?? Double(visibleWidth) + resizeStartWidth = startWidth + rightInspectorWidth = RightInspectorPanelLayout.resizedWidth( + startWidth: startWidth, + leadingEdgeTranslation: value.translation.width, + maxAllowedWidth: maxAllowedWidth + ) + } + .onEnded { _ in + resizeStartWidth = nil + } + ) + .onHover { hovering in + if hovering { + NSCursor.resizeLeftRight.push() + } else { + NSCursor.pop() + } + } + .accessibilityHidden(true) + } } diff --git a/RxCode/Views/Inspector/ThisThreadDiffView.swift b/RxCode/Views/Inspector/ThisThreadDiffView.swift index 5d74c816..efaa59d4 100644 --- a/RxCode/Views/Inspector/ThisThreadDiffView.swift +++ b/RxCode/Views/Inspector/ThisThreadDiffView.swift @@ -60,7 +60,9 @@ struct ThisThreadFileRow: View { windowState.diffFile = PreviewFile( path: summary.path, name: summary.name, - editHunks: summary.hunks + editHunks: summary.hunks, + showFullFileDiff: true, + originalContent: summary.originalContent ) } label: { HStack(spacing: 8) { diff --git a/RxCode/Views/MainView.swift b/RxCode/Views/MainView.swift index 10e793f9..41aa9da2 100644 --- a/RxCode/Views/MainView.swift +++ b/RxCode/Views/MainView.swift @@ -26,6 +26,13 @@ struct MainView: View { case history = "History" case files = "Files" + var title: LocalizedStringResource { + switch self { + case .history: "History" + case .files: "Files" + } + } + var icon: String { switch self { case .files: "folder" @@ -56,32 +63,37 @@ struct MainView: View { } private var mainContent: some View { - HSplitView { - navigationContent - .id(appState.themeRevision) - .onChange(of: showRightSidebar) { _, isShowing in - if isShowing, !inspectorStarted { inspectorStarted = true } - } - .onChange(of: appState.focusMode) { _, newValue in - windowState.focusMode = newValue - } - .onAppear { - windowState.focusMode = appState.focusMode - // The panel is built lazily; if it was left open in a - // previous launch, start it now so it reappears. - if showRightSidebar { inspectorStarted = true } - } - .toolbar(removing: .title) - .toolbarBackground(.hidden, for: .windowToolbar) - .background(UnifiedTitleBarAccessor()) - .accessibilityElement(children: .contain) - .accessibilityIdentifier("rxcode-main-view") - .toolbar { - toolbarContent - } + GeometryReader { proxy in + HStack(spacing: 0) { + navigationContent + .frame(maxWidth: .infinity, maxHeight: .infinity) + .id(appState.themeRevision) + .onChange(of: showRightSidebar) { _, isShowing in + if isShowing, !inspectorStarted { inspectorStarted = true } + } + .onChange(of: appState.focusMode) { _, newValue in + windowState.focusMode = newValue + } + .onAppear { + windowState.focusMode = appState.focusMode + // The panel is built lazily; if it was left open in a + // previous launch, start it now so it reappears. + if showRightSidebar { inspectorStarted = true } + } + .toolbar(removing: .title) + .toolbarBackground(.hidden, for: .windowToolbar) + .background(UnifiedTitleBarAccessor()) + .accessibilityElement(children: .contain) + .accessibilityIdentifier("rxcode-main-view") + .toolbar { + toolbarContent + } - if inspectorStarted { - RightInspectorPanel() + if inspectorStarted { + RightInspectorPanel( + maxAllowedWidth: RightInspectorPanelLayout.maximumWidth(in: proxy.size.width) + ) + } } } } @@ -266,7 +278,9 @@ struct MainView: View { filePath: file.path, fileName: file.name, editHunks: file.editHunks, - gitDiffMode: file.gitDiffMode + gitDiffMode: file.gitDiffMode, + showFullFileDiff: file.showFullFileDiff, + originalContent: file.originalContent ) .frame(minWidth: 1000, idealWidth: 1400, maxWidth: 1920, minHeight: 600, idealHeight: 1000, maxHeight: 1200) @@ -402,7 +416,7 @@ struct InspectorTabControl: View { selection = tab onTabClick(tab) } label: { - Text(LocalizedStringKey(tab.rawValue)) + Text(tab.title) .font(.system(size: ClaudeTheme.size(13), weight: .medium)) .lineLimit(1) .fixedSize(horizontal: true, vertical: false) @@ -436,7 +450,7 @@ struct ClaudeSegmentedControl: View { HStack(spacing: 4) { Image(systemName: tab.icon) .font(.system(size: ClaudeTheme.size(10), weight: .medium)) - Text(LocalizedStringKey(tab.rawValue)) + Text(tab.title) .font(.system(size: ClaudeTheme.size(12), weight: .medium)) } .frame(maxWidth: .infinity) diff --git a/RxCode/Views/ProjectWindowView.swift b/RxCode/Views/ProjectWindowView.swift index 4ad868cd..559d1121 100644 --- a/RxCode/Views/ProjectWindowView.swift +++ b/RxCode/Views/ProjectWindowView.swift @@ -25,34 +25,39 @@ struct ProjectWindowView: View { var body: some View { Group { if windowState.isInitialized { - HSplitView { - NavigationSplitView(columnVisibility: $columnVisibility) { - sidebarContent - } detail: { - detailContent - } - .background { - Button("") { - columnVisibility = (columnVisibility == .all) ? .detailOnly : .all + GeometryReader { proxy in + HStack(spacing: 0) { + NavigationSplitView(columnVisibility: $columnVisibility) { + sidebarContent + } detail: { + detailContent + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background { + Button("") { + columnVisibility = (columnVisibility == .all) ? .detailOnly : .all + } + .keyboardShortcut("3", modifiers: .command) + .hidden() + } + .id(appState.themeRevision) + .navigationTitle(navigationTitleText) + .onChange(of: showRightSidebar) { _, isShowing in + if isShowing, !inspectorStarted { inspectorStarted = true } + } + .onChange(of: appState.focusMode) { _, newValue in + windowState.focusMode = newValue + } + .onAppear { + windowState.focusMode = appState.focusMode + if showRightSidebar { inspectorStarted = true } } - .keyboardShortcut("3", modifiers: .command) - .hidden() - } - .id(appState.themeRevision) - .navigationTitle(navigationTitleText) - .onChange(of: showRightSidebar) { _, isShowing in - if isShowing, !inspectorStarted { inspectorStarted = true } - } - .onChange(of: appState.focusMode) { _, newValue in - windowState.focusMode = newValue - } - .onAppear { - windowState.focusMode = appState.focusMode - if showRightSidebar { inspectorStarted = true } - } - if inspectorStarted { - RightInspectorPanel() + if inspectorStarted { + RightInspectorPanel( + maxAllowedWidth: RightInspectorPanelLayout.maximumWidth(in: proxy.size.width) + ) + } } } } else { @@ -75,7 +80,9 @@ struct ProjectWindowView: View { filePath: file.path, fileName: file.name, editHunks: file.editHunks, - gitDiffMode: file.gitDiffMode + gitDiffMode: file.gitDiffMode, + showFullFileDiff: file.showFullFileDiff, + originalContent: file.originalContent ) .frame(minWidth: 1000, idealWidth: 1400, maxWidth: 1920, minHeight: 600, idealHeight: 1000, maxHeight: 1200) diff --git a/RxCode/Views/Settings/ACPClientSettingsTab.swift b/RxCode/Views/Settings/ACPClientSettingsTab.swift index 3d37e3f4..1aac3c90 100644 --- a/RxCode/Views/Settings/ACPClientSettingsTab.swift +++ b/RxCode/Views/Settings/ACPClientSettingsTab.swift @@ -8,7 +8,7 @@ private enum ACPClientSettingsPage: String, CaseIterable, Identifiable { var id: Self { self } - var title: String { + var title: LocalizedStringResource { switch self { case .installed: return "Installed" case .registry: return "Registry" diff --git a/RxCode/Views/Settings/MCPServerEditorSheet.swift b/RxCode/Views/Settings/MCPServerEditorSheet.swift index 1ed3c773..da7d37bb 100644 --- a/RxCode/Views/Settings/MCPServerEditorSheet.swift +++ b/RxCode/Views/Settings/MCPServerEditorSheet.swift @@ -94,12 +94,12 @@ struct MCPServerEditorSheet: View { .foregroundStyle(.secondary) Picker("", selection: $scope) { ForEach(MCPScope.allCases) { s in - Text(LocalizedStringKey(s.displayName)).tag(s) + Text(s.displayName).tag(s) } } .labelsHidden() .pickerStyle(.segmented) - Text(LocalizedStringKey(scope.subtitle)) + Text(scope.subtitle) .font(.system(size: ClaudeTheme.size(10))) .foregroundStyle(.secondary) } @@ -112,7 +112,7 @@ struct MCPServerEditorSheet: View { .foregroundStyle(.secondary) Picker("", selection: $spec.transport) { ForEach(MCPTransport.allCases) { t in - Text(verbatim: t.displayName).tag(t) + Text(verbatim: t.displayNameText).tag(t) } } .labelsHidden() diff --git a/RxCode/Views/Settings/MCPSettingsTab.swift b/RxCode/Views/Settings/MCPSettingsTab.swift index d6a1457d..6ea7807f 100644 --- a/RxCode/Views/Settings/MCPSettingsTab.swift +++ b/RxCode/Views/Settings/MCPSettingsTab.swift @@ -394,7 +394,7 @@ private struct MCPServerRow: View { } private var transportBadge: some View { - Text(verbatim: server.transport.displayName) + Text(verbatim: server.transport.displayNameText) .font(.system(size: ClaudeTheme.size(10), weight: .medium)) .padding(.horizontal, 6) .padding(.vertical, 2) diff --git a/RxCode/Views/Sidebar/BriefingView.swift b/RxCode/Views/Sidebar/BriefingView.swift index a81b6b4b..9010a926 100644 --- a/RxCode/Views/Sidebar/BriefingView.swift +++ b/RxCode/Views/Sidebar/BriefingView.swift @@ -597,37 +597,13 @@ struct BriefingView: View { } private func threadRow(_ item: ThreadSummaryItem) -> some View { - Button { + BriefingThreadRow( + item: item, + isInProgress: appState.sessionStates[item.sessionId]?.isStreaming == true, + todoProgress: appState.todoProgress(forSessionId: item.sessionId) + ) { appState.selectSession(id: item.sessionId, in: windowState) - } label: { - HStack(alignment: .center, spacing: 8) { - Image(systemName: "bubble.left.and.text.bubble.right") - .font(.system(size: 10, weight: .semibold)) - .foregroundStyle(ClaudeTheme.accent) - .frame(width: 14) - - Text(item.title) - .font(.system(size: 12.5, weight: .medium)) - .foregroundStyle(ClaudeTheme.textPrimary) - .lineLimit(1) - .truncationMode(.tail) - .frame(maxWidth: .infinity, alignment: .leading) - - Text(Self.compactDate(item.updatedAt)) - .font(.system(size: 10.5, weight: .medium)) - .foregroundStyle(ClaudeTheme.textTertiary) - .lineLimit(1) - } - .padding(.horizontal, 6) - .padding(.vertical, 5) - .contentShape(Rectangle()) - .background( - RoundedRectangle(cornerRadius: 6, style: .continuous) - .fill(ClaudeTheme.surfaceSecondary.opacity(0.4)) - ) } - .buttonStyle(.plain) - .help("Open thread") } // MARK: - Empty State @@ -661,6 +637,111 @@ struct BriefingView: View { } } +// MARK: - Briefing Thread Row + +struct BriefingThreadRow: View { + let item: ThreadSummaryItem + let isInProgress: Bool + let todoProgress: ChatTodoProgress? + let onSelect: () -> Void + + var body: some View { + Button(action: onSelect) { + HStack(alignment: .center, spacing: 8) { + Image(systemName: "bubble.left.and.text.bubble.right") + .font(.system(size: 10, weight: .semibold)) + .foregroundStyle(ClaudeTheme.accent) + .frame(width: 14) + + Text(item.title) + .font(.system(size: 12.5, weight: .medium)) + .foregroundStyle(ClaudeTheme.textPrimary) + .lineLimit(1) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + + if isInProgress { + BriefingThreadProgressBadge(progress: todoProgress) + } else { + Text(Self.compactDate(item.updatedAt)) + .font(.system(size: 10.5, weight: .medium)) + .foregroundStyle(ClaudeTheme.textTertiary) + .lineLimit(1) + } + } + .padding(.horizontal, 6) + .padding(.vertical, 5) + .contentShape(Rectangle()) + .background( + RoundedRectangle(cornerRadius: 6, style: .continuous) + .fill(ClaudeTheme.surfaceSecondary.opacity(0.4)) + ) + } + .buttonStyle(.plain) + .help(isInProgress ? progressHelpText : "Open thread") + .accessibilityLabel(accessibilityLabel) + } + + private var progressHelpText: String { + guard let todoProgress, todoProgress.total > 0 else { + return String(localized: "Response in progress") + } + return String(localized: "Response in progress. Todos \(todoProgress.done)/\(todoProgress.total)") + } + + private var accessibilityLabel: String { + if isInProgress { + return String(localized: "\(item.title), in progress") + } + return item.title + } + + static func compactDate(_ date: Date, relativeTo now: Date = .now) -> String { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .short + return formatter.localizedString(for: date, relativeTo: now) + } +} + +private struct BriefingThreadProgressBadge: View { + let progress: ChatTodoProgress? + + private var fraction: Double? { + guard let progress, progress.total > 0 else { return nil } + return min(1, max(0, Double(progress.done) / Double(progress.total))) + } + + var body: some View { + HStack(spacing: 4) { + Group { + if let fraction { + ProgressView(value: fraction, total: 1) + } else { + ProgressView() + } + } + .progressViewStyle(.circular) + .controlSize(.mini) + .frame(width: 10, height: 10) + + Text("In progress") + .font(.system(size: 10.5, weight: .semibold)) + .lineLimit(1) + } + .foregroundStyle(ClaudeTheme.accent) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background( + Capsule(style: .continuous) + .fill(ClaudeTheme.accent.opacity(0.12)) + ) + .overlay( + Capsule(style: .continuous) + .strokeBorder(ClaudeTheme.accent.opacity(0.25), lineWidth: 0.5) + ) + } +} + // MARK: - Lightweight Markdown Renderer /// Renders simple markdown content (bullets, ordered lists, paragraphs, headings, inline diff --git a/RxCodeMobile/Resources/Localizable.xcstrings b/RxCodeMobile/Resources/Localizable.xcstrings index 4d72c52d..d1d6eacc 100644 --- a/RxCodeMobile/Resources/Localizable.xcstrings +++ b/RxCodeMobile/Resources/Localizable.xcstrings @@ -181,6 +181,23 @@ } } }, + "Accept Edits" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Accept Edits" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受编辑" + } + } + } + }, "Action" : { "localizations" : { "en" : { @@ -229,6 +246,22 @@ } } }, + "Add a branch name after the prefix." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add a branch name after the prefix." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在前缀后添加分支名称。" + } + } + } + }, "Add a project from your Mac" : { "localizations" : { "en" : { @@ -605,6 +638,23 @@ } } }, + "Ask" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Ask" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "询问" + } + } + } + }, "Assistant has a question" : { "localizations" : { "en" : { @@ -637,6 +687,23 @@ } } }, + "Auto" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Auto" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动" + } + } + } + }, "Auto-archive" : { "localizations" : { "en" : { @@ -718,10 +785,68 @@ } }, "Branch name" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Branch name" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支名称" + } + } + } + }, + "Branch name cannot end with “/”." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Branch name cannot end with “/”." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支名称不能以“/”结尾。" + } + } + } + }, + "Branch name is required." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Branch name is required." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支名称为必填项。" + } + } + } }, "Branch operation failed" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Branch operation failed" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分支操作失败" + } + } + } }, "Branch operation failed." : { "localizations" : { @@ -805,6 +930,23 @@ }, "Browser Error" : { + }, + "Bypass" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Bypass" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "绕过" + } + } + } }, "Cancel" : { "localizations" : { @@ -919,7 +1061,20 @@ } }, "Close" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Close" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } }, "Close — answer later from the queue" : { "localizations" : { @@ -1084,6 +1239,22 @@ } } }, + "Connect to your Mac and try again." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Connect to your Mac and try again." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接到你的 Mac 后重试。" + } + } + } + }, "Connecting to %@" : { "localizations" : { "en" : { @@ -1149,7 +1320,20 @@ } }, "Contents" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Contents" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "内容" + } + } + } }, "Control desktop summaries" : { "localizations" : { @@ -1281,7 +1465,20 @@ } }, "Create" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Create" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建" + } + } + } }, "Create a profile to run a command on your Mac." : { "localizations" : { @@ -1300,16 +1497,68 @@ } }, "Create branch" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Create branch" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "创建分支" + } + } + } }, "Create new branch…" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Create new branch…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "新建分支…" + } + } + } }, "Created from %@" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Created from %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从 %@ 创建" + } + } + } }, "Created from the project's current branch" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Created from the project's current branch" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "从项目的当前分支创建" + } + } + } }, "Critical" : { "localizations" : { @@ -1472,10 +1721,36 @@ } }, "Describe a task, paste a snippet, or ask a question." : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Describe a task, paste a snippet, or ask a question." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "描述任务、粘贴片段或提问。" + } + } + } }, "Describe what to build…" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Describe what to build…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "描述要构建的内容…" + } + } + } }, "Desktop Behavior" : { "localizations" : { @@ -1663,7 +1938,20 @@ } }, "Empty Folder" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Empty Folder" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "空文件夹" + } + } + } }, "Enable Plan before sending a new thread so the desktop agent drafts a read-only plan first." : { "localizations" : { @@ -2021,59 +2309,85 @@ "Favorites" : { }, - "File paths" : { + "File paths" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "File paths" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文件路径" + } + } + } + }, + "Filter Skills" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Filter Skills" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "筛选技能" + } + } + } + }, + "Focus mode" : { "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "File paths" + "value" : "Focus mode" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "文件路径" + "value" : "专注模式" } } } }, - "Filter Skills" : { + "Folders" : { "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "Filter Skills" + "value" : "Folders" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "筛选技能" + "value" : "文件夹" } } } }, - "Focus mode" : { + "Folders Unavailable" : { "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "Focus mode" + "value" : "Folders Unavailable" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "专注模式" + "value" : "文件夹不可用" } } } - }, - "Folders" : { - - }, - "Folders Unavailable" : { - }, "Git Source" : { "localizations" : { @@ -2342,7 +2656,20 @@ } }, "Loading folders" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Loading folders" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载文件夹" + } + } + } }, "Loading messages" : { @@ -2741,6 +3068,23 @@ } } }, + "No branch" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No branch" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无分支" + } + } + } + }, "No briefings for the current branch." : { "localizations" : { "en" : { @@ -2871,7 +3215,20 @@ } }, "No Folders" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No Folders" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有文件夹" + } + } + } }, "No MCP servers configured. Tap + to add one." : { "localizations" : { @@ -2890,7 +3247,20 @@ } }, "No models available" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No models available" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有可用模型" + } + } + } }, "No Projects" : { "localizations" : { @@ -3115,7 +3485,20 @@ } }, "Off" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Off" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } }, "OK" : { "localizations" : { @@ -3134,7 +3517,20 @@ } }, "On" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "On" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开启" + } + } + } }, "Open **RxCode** on your Mac." : { "localizations" : { @@ -3316,8 +3712,38 @@ } } }, + "Plan" : { + "extractionState" : "stale", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划" + } + } + } + }, "Plan mode" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Plan mode" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "计划模式" + } + } + } }, "Plan ready to review" : { "extractionState" : "stale", @@ -3972,7 +4398,20 @@ } }, "Select Folder" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Select Folder" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择文件夹" + } + } + } }, "Select which Mac this device controls. Removing one pairing does not reset this device's identity." : { "localizations" : { @@ -4271,7 +4710,20 @@ } }, "Switch branch" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Switch branch" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "切换分支" + } + } + } }, "Switch to %@" : { "localizations" : { @@ -4373,10 +4825,36 @@ }, "This location has no visible folders." : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "This location has no visible folders." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此位置没有可见文件夹。" + } + } + } }, "This location has nothing to show." : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "This location has nothing to show." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此位置没有可显示内容。" + } + } + } }, "this Mac" : { "extractionState" : "stale", @@ -4411,6 +4889,22 @@ } } }, + "this project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "this project" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "此项目" + } + } + } + }, "This QR has expired. Generate a new one on your Mac." : { "localizations" : { "en" : { @@ -4616,7 +5110,20 @@ } }, "Unable to Add Project" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unable to Add Project" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法添加项目" + } + } + } }, "Unable to connect to your Mac. Make sure RxCode is running on your desktop and both devices are on the same network." : { "localizations" : { @@ -4635,7 +5142,20 @@ } }, "Unable to Load Folder" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unable to Load Folder" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法加载文件夹" + } + } + } }, "Uncommitted" : { "localizations" : { @@ -4669,6 +5189,22 @@ } } }, + "Unknown error." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Unknown error." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未知错误。" + } + } + } + }, "Unknown Mac" : { "extractionState" : "stale", "localizations" : { @@ -4905,7 +5441,20 @@ } }, "What should we build in %@?" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "What should we build in %@?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "要在 %@ 中构建什么?" + } + } + } }, "Working Directory" : { "localizations" : { @@ -4955,6 +5504,22 @@ } } }, + "Xcode Project" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Xcode Project" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xcode 项目" + } + } + } + }, "Your Mac declined the pairing request." : { "localizations" : { "en" : { diff --git a/RxCodeMobile/Views/MobileBriefingDetailView.swift b/RxCodeMobile/Views/MobileBriefingDetailView.swift index 1f57e6b7..ec529b2e 100644 --- a/RxCodeMobile/Views/MobileBriefingDetailView.swift +++ b/RxCodeMobile/Views/MobileBriefingDetailView.swift @@ -174,7 +174,11 @@ struct MobileBriefingDetailView: View { VStack(spacing: 12) { ForEach(threads) { thread in NavigationLink(value: thread.sessionId) { - ThreadCard(thread: thread, namespace: glassNamespace) + MobileBriefingThreadCard( + thread: thread, + isStreaming: isThreadStreaming(thread.sessionId), + namespace: glassNamespace + ) } .buttonStyle(.plain) .accessibilityIdentifier("briefing-thread-row-\(thread.sessionId)") @@ -207,6 +211,10 @@ struct MobileBriefingDetailView: View { .glassEffect(.regular, in: .rect(cornerRadius: 16)) } + private func isThreadStreaming(_ sessionId: String) -> Bool { + state.sessions.first(where: { $0.id == sessionId })?.isStreaming ?? false + } + // MARK: - Accent Gradient private var accentGradient: LinearGradient { @@ -223,8 +231,9 @@ struct MobileBriefingDetailView: View { // MARK: - Thread Card -private struct ThreadCard: View { +struct MobileBriefingThreadCard: View { let thread: MobileThreadSummary + let isStreaming: Bool let namespace: Namespace.ID var body: some View { @@ -257,9 +266,13 @@ private struct ThreadCard: View { ) } - Text(thread.updatedAt.formatted(.relative(presentation: .named))) - .font(.caption2) - .foregroundStyle(.tertiary) + if isStreaming { + MobileBriefingThreadLoadingBadge() + } else { + Text(thread.updatedAt.formatted(.relative(presentation: .named))) + .font(.caption2) + .foregroundStyle(.tertiary) + } } Spacer(minLength: 0) @@ -274,5 +287,31 @@ private struct ThreadCard: View { .glassEffect(.regular.interactive(), in: .rect(cornerRadius: 16)) .glassEffectID(thread.id, in: namespace) .contentShape(.rect(cornerRadius: 16)) + .accessibilityLabel(accessibilityLabel) + } + + private var accessibilityLabel: String { + let title = thread.title.isEmpty ? "Untitled" : thread.title + if isStreaming { + return "\(title), response in progress" + } + return title + } +} + +private struct MobileBriefingThreadLoadingBadge: View { + var body: some View { + HStack(spacing: 5) { + ProgressView() + .controlSize(.mini) + + Text("Response in progress") + .font(.caption2.weight(.semibold)) + .lineLimit(1) + } + .foregroundStyle(.tint) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(.tint.opacity(0.12), in: Capsule()) } } diff --git a/RxCodeMobile/Views/MobileBriefingView.swift b/RxCodeMobile/Views/MobileBriefingView.swift index a20cd98d..224245ba 100644 --- a/RxCodeMobile/Views/MobileBriefingView.swift +++ b/RxCodeMobile/Views/MobileBriefingView.swift @@ -523,7 +523,7 @@ private struct BriefingListCard: View { Circle() .fill(.green) .frame(width: 5, height: 5) - Text("\(activeJobCount) active") + Text("\(activeJobCount) active", tableName: "Localizable") .font(.system(size: 11, weight: .medium)) } .foregroundStyle(.green) @@ -789,7 +789,7 @@ private struct ActiveJobsChip: View { .frame(width: 6, height: 6) .opacity(isPulsing ? 0.35 : 1) .scaleEffect(isPulsing ? 0.85 : 1) - Text("\(count) active") + Text("\(count) active", tableName: "Localizable") .font(.caption.weight(.medium)) } .foregroundStyle(.green) @@ -801,7 +801,7 @@ private struct ActiveJobsChip: View { isPulsing = true } } - .accessibilityLabel("\(count) active jobs") + .accessibilityLabel(Text("\(count) active jobs", tableName: "Localizable")) } } diff --git a/RxCodeMobile/Views/NewThreadSheet.swift b/RxCodeMobile/Views/NewThreadSheet.swift index d5d58b4d..e04a5d64 100644 --- a/RxCodeMobile/Views/NewThreadSheet.swift +++ b/RxCodeMobile/Views/NewThreadSheet.swift @@ -38,7 +38,7 @@ struct NewThreadSheet: View { } private var projectName: String { - state.projects.first(where: { $0.id == projectID })?.name ?? "this project" + state.projects.first(where: { $0.id == projectID })?.name ?? String(localized: "this project") } var body: some View { @@ -60,7 +60,7 @@ struct NewThreadSheet: View { .padding(.top, 12) .padding(.bottom, 32) } - .scrollDismissesKeyboard(.interactively) + .mobileDismissesKeyboardOnScroll(.interactively) .background(Color(.systemGroupedBackground).ignoresSafeArea()) .navigationTitle("New Thread") .navigationBarTitleDisplayMode(.inline) @@ -71,8 +71,6 @@ struct NewThreadSheet: View { } } } - .presentationDetents([.large]) - .presentationDragIndicator(.visible) .interactiveDismissDisabled(true) .onAppear { seedConfigIfNeeded() @@ -361,7 +359,7 @@ struct NewThreadConfigStrip: View { return seen.map { provider in AgentModelSection( id: provider.rawValue, - title: provider.displayName, + title: provider.displayNameText, provider: provider, models: flatModels.filter { $0.provider == provider } ) @@ -379,7 +377,7 @@ struct NewThreadConfigStrip: View { return match.displayName } if let id = selectedModelID, !id.isEmpty { return id } - return selectedProvider?.displayName ?? "Model" + return selectedProvider?.displayNameText ?? String(localized: "Model") } private var modelMenu: some View { @@ -429,7 +427,11 @@ struct NewThreadConfigStrip: View { selectedPermissionMode = mode } label: { HStack { - Label(mode.displayName, systemImage: mode.systemImage) + Label { + Text(mode.displayName) + } icon: { + Image(systemName: mode.systemImage) + } if selectedPermissionMode == mode { Spacer() Image(systemName: "checkmark") @@ -438,7 +440,7 @@ struct NewThreadConfigStrip: View { } } } label: { - chipLabel(icon: selectedPermissionMode.systemImage, title: selectedPermissionMode.displayName) + chipLabel(icon: selectedPermissionMode.systemImage, title: selectedPermissionMode.displayNameText) } } @@ -454,17 +456,21 @@ struct NewThreadConfigStrip: View { } label: { chipLabel( icon: PermissionMode.plan.systemImage, - title: "Plan", + title: PermissionMode.plan.displayNameText, showsChevron: false, active: planModeEnabled ) } .buttonStyle(.plain) .accessibilityLabel("Plan mode") - .accessibilityValue(planModeEnabled ? "On" : "Off") + .accessibilityValue(Text(planModeAccessibilityValue)) .popoverTip(MobileTips.PlanModeTip(), arrowEdge: .top) } + private var planModeAccessibilityValue: LocalizedStringResource { + planModeEnabled ? "On" : "Off" + } + // MARK: Chip private func chipLabel( @@ -513,7 +519,7 @@ struct CreateBranchSheet: View { branchText.trimmingCharacters(in: .whitespacesAndNewlines) } - private var validationError: String? { + private var validationError: LocalizedStringResource? { if trimmed.isEmpty { return "Branch name is required." } if trimmed.hasSuffix("/") { return "Branch name cannot end with “/”." } if trimmed == "rxcode/" { return "Add a branch name after the prefix." } diff --git a/RxCodeMobile/Views/RemoteFolderPickerView.swift b/RxCodeMobile/Views/RemoteFolderPickerView.swift index ed389661..15468bbd 100644 --- a/RxCodeMobile/Views/RemoteFolderPickerView.swift +++ b/RxCodeMobile/Views/RemoteFolderPickerView.swift @@ -9,7 +9,7 @@ struct RemoteFolderPickerView: View { /// Describes a "pick an entry" job — a file or bundle the user taps to /// select, rather than navigating into. struct EntryPick { - let title: String + let title: LocalizedStringResource let startPath: String? /// Ask the desktop to include plain files in the tree. let includeFiles: Bool @@ -25,7 +25,7 @@ struct RemoteFolderPickerView: View { case addProject /// Hands the chosen folder path back to the caller. `startPath` is where /// browsing begins (`nil` = the picker roots). - case pickFolder(title: String, startPath: String?, onSelect: (String) -> Void) + case pickFolder(title: LocalizedStringResource, startPath: String?, onSelect: (String) -> Void) /// Hands back a file or bundle the user taps in the tree. case pickEntry(EntryPick) } @@ -50,7 +50,7 @@ struct RemoteFolderPickerView: View { return nil } - private var navigationTitle: String { + private var navigationTitle: LocalizedStringResource { switch mode { case .addProject: return "Add Project" case .pickFolder(let title, _, _): return title @@ -105,12 +105,12 @@ struct RemoteFolderPickerView: View { .alert("Unable to Load Folder", isPresented: folderErrorBinding) { Button("OK", role: .cancel) { state.remoteFolderError = nil } } message: { - Text(state.remoteFolderError ?? "Unknown error.") + Text(state.remoteFolderError ?? String(localized: "Unknown error.")) } .alert("Unable to Add Project", isPresented: createErrorBinding) { Button("OK", role: .cancel) { state.remoteProjectCreateError = nil } } message: { - Text(state.remoteProjectCreateError ?? "Unknown error.") + Text(state.remoteProjectCreateError ?? String(localized: "Unknown error.")) } .onChange(of: state.lastCreatedProjectID) { _, newValue in if case .addProject = mode, newValue != nil { @@ -126,23 +126,16 @@ struct RemoteFolderPickerView: View { currentFolderRow(currentNode) } - Section(includeFiles ? "Contents" : "Folders") { + Section { if currentNode.children.isEmpty, !state.remoteFolderIsLoading { - ContentUnavailableView( - includeFiles ? "Empty Folder" : "No Folders", - systemImage: "folder", - description: Text( - includeFiles - ? "This location has nothing to show." - : "This location has no visible folders." - ) - ) - .listRowBackground(Color.clear) + emptyFolderView } else { ForEach(currentNode.children) { child in childRow(child) } } + } header: { + Text(contentsSectionTitle) } } else if state.remoteFolderIsLoading { loadingRow @@ -150,7 +143,7 @@ struct RemoteFolderPickerView: View { ContentUnavailableView( "Folders Unavailable", systemImage: "wifi.exclamationmark", - description: Text(state.remoteFolderError ?? "Connect to your Mac and try again.") + description: Text(state.remoteFolderError ?? String(localized: "Connect to your Mac and try again.")) ) .listRowBackground(Color.clear) } @@ -171,7 +164,7 @@ struct RemoteFolderPickerView: View { } label: { Image(systemName: isPickFolder ? "checkmark" : "plus") } - .accessibilityLabel(isPickFolder ? "Select Folder" : "Add Project") + .accessibilityLabel(Text(confirmButtonAccessibilityLabel)) .disabled(!canConfirmCurrentFolder || state.remoteProjectCreateInFlight) } @@ -191,6 +184,33 @@ struct RemoteFolderPickerView: View { } } + private var contentsSectionTitle: LocalizedStringResource { + includeFiles ? "Contents" : "Folders" + } + + private var confirmButtonAccessibilityLabel: LocalizedStringResource { + isPickFolder ? "Select Folder" : "Add Project" + } + + @ViewBuilder + private var emptyFolderView: some View { + if includeFiles { + ContentUnavailableView( + "Empty Folder", + systemImage: "folder", + description: Text("This location has nothing to show.") + ) + .listRowBackground(Color.clear) + } else { + ContentUnavailableView( + "No Folders", + systemImage: "folder", + description: Text("This location has no visible folders.") + ) + .listRowBackground(Color.clear) + } + } + private var loadingRow: some View { HStack(spacing: 10) { ProgressView() diff --git a/RxCodeMobile/Views/ThreadChangesSheet.swift b/RxCodeMobile/Views/ThreadChangesSheet.swift index 8e6341eb..34238a0a 100644 --- a/RxCodeMobile/Views/ThreadChangesSheet.swift +++ b/RxCodeMobile/Views/ThreadChangesSheet.swift @@ -129,9 +129,7 @@ struct ThreadChangesSheet: View { ThreadChangeDetailView( title: edit.name, subtitle: edit.path, - diff: .hunks(edit.hunks.map { - PreviewFile.EditHunk(oldString: $0.oldString, newString: $0.newString) - }), + diff: turnDiff(edit), truncated: false ) } label: { @@ -149,6 +147,15 @@ struct ThreadChangesSheet: View { } } + private func turnDiff(_ edit: SyncFileEdit) -> ThreadChangeDetailView.Diff { + if let fullFileDiff = edit.fullFileDiff, !fullFileDiff.isEmpty { + return .unified(fullFileDiff) + } + return .hunks(edit.hunks.map { + PreviewFile.EditHunk(oldString: $0.oldString, newString: $0.newString) + }) + } + // MARK: - Uncommitted @ViewBuilder diff --git a/RxCodeMobileTests/MobileBriefingThreadCardTests.swift b/RxCodeMobileTests/MobileBriefingThreadCardTests.swift new file mode 100644 index 00000000..66b08b0e --- /dev/null +++ b/RxCodeMobileTests/MobileBriefingThreadCardTests.swift @@ -0,0 +1,55 @@ +import XCTest +import SwiftUI +import ViewInspector +import RxCodeSync +@testable import RxCodeMobile + +@MainActor +final class MobileBriefingThreadCardTests: XCTestCase { + + func testStreamingThreadShowsLoadingBadge() throws { + let view = MobileBriefingThreadCardPreview(isStreaming: true) + + let labels = try view.inspect() + .findAll(ViewType.Text.self) + .compactMap { try? $0.string() } + + XCTAssertTrue( + labels.contains("Response in progress"), + "Mobile briefing rows must show loading state for streaming threads. Labels: \(labels)" + ) + } + + func testIdleThreadHidesLoadingBadge() throws { + let view = MobileBriefingThreadCardPreview(isStreaming: false) + + let labels = try view.inspect() + .findAll(ViewType.Text.self) + .compactMap { try? $0.string() } + + XCTAssertFalse( + labels.contains("Response in progress"), + "Finished mobile briefing rows should keep the updated-at label instead of a loading badge. Labels: \(labels)" + ) + } +} + +private struct MobileBriefingThreadCardPreview: View { + @Namespace private var namespace + let isStreaming: Bool + + var body: some View { + MobileBriefingThreadCard( + thread: MobileThreadSummary( + sessionId: "thread-1", + projectId: UUID(), + branch: "main", + title: "Streaming thread", + summary: "Summary", + updatedAt: Date(timeIntervalSince1970: 1_700_000_000) + ), + isStreaming: isStreaming, + namespace: namespace + ) + } +} diff --git a/RxCodeTests/BranchBriefingPromptContextTests.swift b/RxCodeTests/BranchBriefingPromptContextTests.swift new file mode 100644 index 00000000..6ba07b4d --- /dev/null +++ b/RxCodeTests/BranchBriefingPromptContextTests.swift @@ -0,0 +1,49 @@ +import XCTest +@testable import RxCode + +@MainActor +final class BranchBriefingPromptContextTests: XCTestCase { + func testBranchBriefingSystemPromptWrapsRecentWorkAsBackgroundContext() { + let prompt = AppState.branchBriefingSystemPrompt( + branch: "feature/search", + briefing: "- Added natural-language thread search.\n- Updated indexing." + ) + + XCTAssertTrue(prompt.contains("# Current branch briefing")) + XCTAssertTrue(prompt.contains("project's current branch (`feature/search`)")) + XCTAssertTrue(prompt.contains("- Added natural-language thread search.")) + XCTAssertTrue(prompt.contains("may be incomplete or slightly out of date")) + } + + func testBranchBriefingSystemPromptIgnoresBlankBriefings() { + XCTAssertEqual( + AppState.branchBriefingSystemPrompt(branch: "main", briefing: " \n\t "), + "" + ) + } + + func testPromptWithBackgroundContextPrefixesCodexAndACPContext() { + let briefingContext = AppState.branchBriefingSystemPrompt( + branch: "main", + briefing: "- Recent work updated MCP tool rendering." + ) + let memoryContext = "# Relevant user memory\n\nAlways write unit tests." + + let prompt = AppState.promptWithBackgroundContext( + [briefingContext, memoryContext], + prompt: "Implement it for all clients." + ) + + XCTAssertTrue(prompt.contains("# Current branch briefing")) + XCTAssertTrue(prompt.contains("- Recent work updated MCP tool rendering.")) + XCTAssertTrue(prompt.contains("# Relevant user memory")) + XCTAssertTrue(prompt.hasSuffix("User request:\nImplement it for all clients.")) + } + + func testPromptWithBackgroundContextLeavesPromptUntouchedWhenContextIsEmpty() { + XCTAssertEqual( + AppState.promptWithBackgroundContext(["", " \n\t "], prompt: "Only the request."), + "Only the request." + ) + } +} diff --git a/RxCodeTests/BriefingThreadRowTests.swift b/RxCodeTests/BriefingThreadRowTests.swift new file mode 100644 index 00000000..e63acd82 --- /dev/null +++ b/RxCodeTests/BriefingThreadRowTests.swift @@ -0,0 +1,70 @@ +import XCTest +import SwiftUI +import ViewInspector +import RxCodeCore +@testable import RxCode + +@MainActor +final class BriefingThreadRowTests: XCTestCase { + + func testInProgressThreadShowsStatusBadge() throws { + let row = BriefingThreadRow( + item: item(title: "Streaming thread"), + isInProgress: true, + todoProgress: ChatTodoProgress(done: 1, total: 3, inProgress: true), + onSelect: {} + ) + + let labels = try row.inspect() + .findAll(ViewType.Text.self) + .compactMap { try? $0.string() } + + XCTAssertTrue( + labels.contains("In progress"), + "Briefing thread rows must surface active thread status. Labels: \(labels)" + ) + } + + func testIdleThreadDoesNotShowInProgressBadge() throws { + let row = BriefingThreadRow( + item: item(title: "Finished thread"), + isInProgress: false, + todoProgress: nil, + onSelect: {} + ) + + let labels = try row.inspect() + .findAll(ViewType.Text.self) + .compactMap { try? $0.string() } + + XCTAssertFalse( + labels.contains("In progress"), + "Finished briefing thread rows should keep the compact updated-at label instead of an active status. Labels: \(labels)" + ) + } + + func testTappingThreadRowSelectsThread() throws { + var didSelect = false + let row = BriefingThreadRow( + item: item(title: "Selectable thread"), + isInProgress: true, + todoProgress: nil, + onSelect: { didSelect = true } + ) + + try row.inspect().find(ViewType.Button.self).tap() + + XCTAssertTrue(didSelect, "Tapping the briefing thread row must still open the thread.") + } + + private func item(title: String) -> ThreadSummaryItem { + ThreadSummaryItem( + sessionId: UUID().uuidString, + projectId: UUID(), + branch: "main", + title: title, + summary: "Summary", + updatedAt: Date(timeIntervalSince1970: 1_700_000_000) + ) + } +} diff --git a/RxCodeTests/MemoryIntentTests.swift b/RxCodeTests/MemoryIntentTests.swift index f7eb1c70..46a1c658 100644 --- a/RxCodeTests/MemoryIntentTests.swift +++ b/RxCodeTests/MemoryIntentTests.swift @@ -4,75 +4,30 @@ import RxCodeCore @MainActor final class MemoryIntentTests: XCTestCase { - func testRoutineTaskDoesNotAllowAutomaticMemoryExtraction() { - XCTAssertFalse( - AppState.hasExplicitMemoryIntent("Run make lint and fix the warnings.") - ) - } - - func testTaskResultDoesNotAllowAgentMemoryAdd() { - XCTAssertFalse( - AppState.shouldAcceptAgentMemoryAdd( - content: "Added Makefile to include make lint and make lint-ci commands.", - kind: "fact" - ) - ) - } - - func testRememberRequestAllowsAutomaticMemoryExtraction() { - XCTAssertTrue( - AppState.hasExplicitMemoryIntent("Please remember to use English for project text.") - ) - } - - func testFutureInstructionAllowsAutomaticMemoryExtraction() { - XCTAssertTrue( - AppState.hasExplicitMemoryIntent("From now on, run make lint before finishing.") - ) - } - - func testPreferenceAllowsAutomaticMemoryExtraction() { - XCTAssertTrue( - AppState.hasExplicitMemoryIntent("I prefer concise final answers.") - ) - } - - func testPreferenceKindAllowsAgentMemoryAdd() { - XCTAssertTrue( - AppState.shouldAcceptAgentMemoryAdd( - content: "Use English for project text.", - kind: "preference" - ) - ) - } - - func testExplicitFutureInstructionAllowsAgentMemoryAddEvenAsFact() { - XCTAssertTrue( - AppState.shouldAcceptAgentMemoryAdd( - content: "Always run make lint before finishing.", - kind: "fact" - ) - ) - } - func testPreferenceMemoryInjectsIntoSystemPrompt() { XCTAssertTrue( - AppState.shouldInjectMemoryIntoSystemPrompt(memory(content: "Use English for project text.", kind: "preference")) + AppState.fallbackShouldInjectMemoryIntoSystemPrompt(memory(content: "Use English for project text.", kind: "preference")) ) } func testAlwaysFactMemoryInjectsIntoSystemPrompt() { XCTAssertTrue( - AppState.shouldInjectMemoryIntoSystemPrompt(memory(content: "Always run make lint before finishing.", kind: "fact")) + AppState.fallbackShouldInjectMemoryIntoSystemPrompt(memory(content: "Always run make lint before finishing.", kind: "fact")) ) } func testRoutineFactMemoryDoesNotInjectIntoSystemPrompt() { XCTAssertFalse( - AppState.shouldInjectMemoryIntoSystemPrompt(memory(content: "Added Makefile lint commands.", kind: "fact")) + AppState.fallbackShouldInjectMemoryIntoSystemPrompt(memory(content: "Added Makefile lint commands.", kind: "fact")) ) } + func testParsesMemoryInjectionDecision() { + XCTAssertEqual(AppState.parseMemoryInjectionDecision("true"), true) + XCTAssertEqual(AppState.parseMemoryInjectionDecision("false"), false) + XCTAssertNil(AppState.parseMemoryInjectionDecision("maybe")) + } + private func memory(content: String, kind: String) -> MemoryItem { MemoryItem( id: UUID().uuidString, diff --git a/RxCodeTests/ThreadStoreThreadSummaryTests.swift b/RxCodeTests/ThreadStoreThreadSummaryTests.swift new file mode 100644 index 00000000..66d110a4 --- /dev/null +++ b/RxCodeTests/ThreadStoreThreadSummaryTests.swift @@ -0,0 +1,82 @@ +import XCTest +import RxCodeCore + +@MainActor +final class ThreadStoreThreadSummaryTests: XCTestCase { + + func testTitleSeedRecordUsesEmptySummary() { + let sessionId = "session-title-created" + let projectId = UUID() + let date = Date(timeIntervalSince1970: 1_700_000_000) + + let item = ThreadSummaryItem.titleSeed( + sessionId: sessionId, + projectId: projectId, + branch: "mcp-server", + title: "Panel Width Reset", + updatedAt: date + ) + + XCTAssertEqual(item.sessionId, sessionId) + XCTAssertEqual(item.projectId, projectId) + XCTAssertEqual(item.branch, "mcp-server") + XCTAssertEqual(item.title, "Panel Width Reset") + XCTAssertEqual(item.summary, "") + XCTAssertEqual(item.updatedAt, date) + } + + func testFinishSummaryUpdatesTitleSeedRecord() { + let sessionId = "session-finished" + let projectId = UUID() + let createdAt = Date(timeIntervalSince1970: 1_700_000_000) + let finishedAt = Date(timeIntervalSince1970: 1_700_000_060) + + let seed = ThreadSummaryItem.titleSeed( + sessionId: sessionId, + projectId: projectId, + branch: "mcp-server", + title: "Mobile Briefing", + updatedAt: createdAt + ) + let finished = ThreadSummaryItem( + sessionId: seed.sessionId, + projectId: seed.projectId, + branch: seed.branch, + title: seed.title, + summary: "The briefing now includes live titled threads.", + updatedAt: finishedAt + ) + + XCTAssertEqual(finished.sessionId, sessionId) + XCTAssertEqual(finished.title, "Mobile Briefing") + XCTAssertEqual(finished.summary, "The briefing now includes live titled threads.") + XCTAssertEqual(finished.updatedAt, finishedAt) + } + + func testTitleUpdatePreservesExistingGeneratedSummary() { + let sessionId = "session-renamed-after-summary" + let projectId = UUID() + let summaryAt = Date(timeIntervalSince1970: 1_700_000_000) + let renameAt = Date(timeIntervalSince1970: 1_700_000_120) + + let existing = ThreadSummaryItem( + sessionId: sessionId, + projectId: projectId, + branch: "main", + title: "Old Title", + summary: "Existing generated summary.", + updatedAt: summaryAt + ) + let updated = existing.updatingTitle( + projectId: projectId, + branch: "mcp-server", + title: "New Title", + updatedAt: renameAt + ) + + XCTAssertEqual(updated.branch, "mcp-server") + XCTAssertEqual(updated.title, "New Title") + XCTAssertEqual(updated.summary, "Existing generated summary.") + XCTAssertEqual(updated.updatedAt, renameAt) + } +}