diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 10f60e85d719..72d8a82fefcb 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -6805,7 +6805,8 @@ struct CMUXCLI { guard let target = optionValue(commandArgs, name: "--window"), let windowID = try normalizeWindowHandle(target, client: client) else { throw CLIError(message: "close-window requires --window") } - let response = try sendV1Command("close_window \(windowID)", client: client) + let force = commandArgs.contains("--force") + let response = try sendV1Command("close_window \(windowID)\(force ? " --force" : "")", client: client) print(response) case "resize-window": @@ -7321,6 +7322,7 @@ struct CMUXCLI { sfId = try normalizeSurfaceHandle(surfaceRaw, client: client, workspaceHandle: wsId, windowHandle: winId) } if let sfId { params["surface_id"] = sfId } + params["force"] = commandArgs.contains("--force") let payload = try client.sendV2(method: "surface.close", params: params) if let closedWorkspaceId = (payload["workspace_id"] as? String) ?? wsId, let closedSurfaceId = (payload["surface_id"] as? String) ?? sfId { @@ -10451,7 +10453,7 @@ struct CMUXCLI { let (descriptionOpt, rem4) = parseOption(rem3, name: "--description") let (windowOpt, rem5) = parseOption(rem4, name: "--window") - var positional = rem5 + var positional = rem5.filter { $0 != "--force" } let actionRaw: String if let actionOpt { actionRaw = actionOpt @@ -10515,6 +10517,7 @@ struct CMUXCLI { if let description, !description.isEmpty { params["description"] = description } + params["force"] = commandArgs.contains("--force") let payload = try client.sendV2(method: "workspace.action", params: params) var summaryParts = ["OK", "action=\(action)"] @@ -10552,7 +10555,7 @@ struct CMUXCLI { let (focusOpt, rem6) = parseOption(rem5, name: "--focus") let (windowOpt, rem7) = parseOption(rem6, name: "--window") - var positional = rem7 + var positional = rem7.filter { $0 != "--force" } let actionRaw: String if let actionOpt { actionRaw = actionOpt @@ -10617,6 +10620,7 @@ struct CMUXCLI { if let urlOpt, !urlOpt.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { params["url"] = urlOpt.trimmingCharacters(in: .whitespacesAndNewlines) } + params["force"] = commandArgs.contains("--force") try applyTabActionFocusOption(focusOpt, to: ¶ms) let payload = try client.sendV2(method: "tab.action", params: params) var summaryParts = ["OK", "action=\(action)"] @@ -10927,10 +10931,12 @@ struct CMUXCLI { } var params: [String: Any] = [:] + let force = commandArgs.contains("--force") let winId = try normalizeWindowHandle(windowFromArgsOrOverride(commandArgs, windowOverride: windowOverride), client: client) if let winId { params["window_id"] = winId } let wsId = try normalizeWorkspaceHandle(target, client: client, windowHandle: winId) if let wsId { params["workspace_id"] = wsId } + if force { params["force"] = true } let payload = try client.sendV2(method: "workspace.close", params: params) if let closedWorkspaceId = (payload["workspace_id"] as? String) ?? wsId { try? tmuxPruneCompatWorkspaceState(workspaceId: closedWorkspaceId) @@ -19431,12 +19437,13 @@ struct CMUXCLI { """ case "close-window": return """ - Usage: cmux close-window --window + Usage: cmux close-window --window [--force] Close the specified window. Flags: --window Window to close (required) + --force Close even when live processes would be terminated Example: cmux close-window --window 0 @@ -19608,6 +19615,7 @@ struct CMUXCLI { --title Title for rename --color Color for set-color (name or #RRGGBB hex) --description Description for set-description + --force Close even when a live process would be killed Named colors: Red, Crimson, Orange, Amber, Olive, Green, Teal, Aqua, @@ -19647,6 +19655,7 @@ struct CMUXCLI { --title Title for rename (or pass trailing title text) --url Optional URL for new-browser-right --focus Focus the destination when supported (default: false for move-to-new-workspace) + --force Close even when a live process would be killed Example: cmux tab-action --tab tab:3 --action pin @@ -20113,6 +20122,7 @@ struct CMUXCLI { --panel Alias for --surface --workspace Workspace context (default: $CMUX_WORKSPACE_ID) --window Window context for workspace/surface refs and indexes + --force Close even when a live process would be killed Example: cmux close-surface diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlCommandCoordinator+SidebarPaneV1.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlCommandCoordinator+SidebarPaneV1.swift index 0fb77ffdff20..82a503d1faa0 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlCommandCoordinator+SidebarPaneV1.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlCommandCoordinator+SidebarPaneV1.swift @@ -248,14 +248,19 @@ extension ControlCommandCoordinator { return "ERROR: TabManager not available" } - let trimmed = args.trimmingCharacters(in: .whitespacesAndNewlines) - switch sidebarContext?.controlSidebarCloseSurface(surfaceArg: trimmed.isEmpty ? nil : trimmed) ?? .noTabSelected { + let parts = args.split(whereSeparator: { $0.isWhitespace }).map(String.init) + let force = parts.contains("--force") + let surfaceParts = parts.filter { $0 != "--force" } + let trimmed = surfaceParts.joined(separator: " ") + switch sidebarContext?.controlSidebarCloseSurface(surfaceArg: trimmed.isEmpty ? nil : trimmed, force: force) ?? .noTabSelected { case .noTabSelected, .closeFailed: - return "ERROR: Failed to close surface" + return "ERROR: \(sidebarContext?.controlSidebarCloseStrings().failed ?? "Failed to close surface")" case .surfaceNotFound: return "ERROR: Surface not found" case .lastSurface: return "ERROR: Cannot close the last surface" + case .confirmationRequired: + return "ERROR: \(sidebarContext?.controlSidebarCloseStrings().confirmationRequired ?? "Surface has a running process; retry with --force")" case .closed: return "OK" } diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseStrings.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseStrings.swift new file mode 100644 index 000000000000..7d5ddf0760cd --- /dev/null +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseStrings.swift @@ -0,0 +1,21 @@ +public import Foundation + +/// App-bundle-resolved messages for the legacy `close_surface` command. +public struct ControlSidebarCloseStrings: Sendable, Equatable { + public let failed: String + public let confirmationRequired: String + + public init(failed: String, confirmationRequired: String) { + self.failed = failed + self.confirmationRequired = confirmationRequired + } +} + +public extension ControlSidebarContext { + func controlSidebarCloseStrings() -> ControlSidebarCloseStrings { + ControlSidebarCloseStrings( + failed: "Failed to close surface", + confirmationRequired: "Surface has a running process; retry with --force" + ) + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseSurfaceResolution.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseSurfaceResolution.swift index e64d64d4d148..47195cba2ffb 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseSurfaceResolution.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarCloseSurfaceResolution.swift @@ -8,6 +8,8 @@ public enum ControlSidebarCloseSurfaceResolution: Sendable, Equatable { case surfaceNotFound /// Refused: the surface is the workspace's last. case lastSurface + /// The surface has a live foreground process and requires `force`. + case confirmationRequired /// The surface closed. case closed /// The close call returned failure. diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarContext.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarContext.swift index f9455c91e953..6e8343c40cfd 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarContext.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Sidebar/ControlSidebarContext.swift @@ -46,6 +46,9 @@ public protocol ControlSidebarContext: AnyObject { /// `guard let tabManager` head of several v1 bodies). func controlSidebarTabManagerAvailable() -> Bool + /// App-bundle-resolved messages for the legacy close command. + func controlSidebarCloseStrings() -> ControlSidebarCloseStrings + // MARK: Scheduled sidebar mutations (status / agent / blocks) /// Enqueues the `set_status`/`report_meta` upsert mutation. @@ -315,7 +318,7 @@ public protocol ControlSidebarContext: AnyObject { func controlSidebarNewSurface(isBrowser: Bool, paneArg: String?, url: URL?) -> ControlSidebarNewSurfaceResolution /// Closes a surface (`close_surface`; empty argument = focused surface). - func controlSidebarCloseSurface(surfaceArg: String?) -> ControlSidebarCloseSurfaceResolution + func controlSidebarCloseSurface(surfaceArg: String?, force: Bool) -> ControlSidebarCloseSurfaceResolution // MARK: Misc ops @@ -333,3 +336,10 @@ public protocol ControlSidebarContext: AnyObject { /// can't resolve. func controlSidebarSurfaceHealth(tabArg: String) -> [ControlSidebarSurfaceHealthRow]? } + +public extension ControlSidebarContext { + /// Backward-compatible non-forced close for legacy socket callers. + func controlSidebarCloseSurface(surfaceArg: String?) -> ControlSidebarCloseSurfaceResolution { + controlSidebarCloseSurface(surfaceArg: surfaceArg, force: false) + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift index 237ce8d4a333..07be443feebc 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift @@ -644,7 +644,8 @@ extension ControlCommandCoordinator { let resolution = context.controlSurfaceClose( routing: routing, surfaceID: surfaceID, - hasSurfaceIDParam: hasSurfaceIDParam + hasSurfaceIDParam: hasSurfaceIDParam, + force: bool(params, "force") ?? false ) switch resolution { case .tabManagerUnavailable: @@ -663,10 +664,16 @@ extension ControlCommandCoordinator { ) case .lastSurface: return .err(code: "invalid_state", message: "Cannot close the last surface", data: nil) + case .confirmationRequired(let id): + return .err( + code: "confirmation_required", + message: context.controlSurfaceCloseStrings().confirmationRequired, + data: .object(["surface_id": .string(id.uuidString)]) + ) case .closeFailed(let id): return .err( code: "internal_error", - message: "Failed to close surface", + message: context.controlSurfaceCloseStrings().failed, data: .object(["surface_id": .string(id.uuidString)]) ) case .closed(let windowID, let workspaceID, let closedSurfaceID): diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseResolution.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseResolution.swift index 7e4495a5acaa..9b4185805f90 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseResolution.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseResolution.swift @@ -22,6 +22,8 @@ public enum ControlSurfaceCloseResolution: Sendable, Equatable { /// The workspace has only one surface left (legacy `invalid_state` / "Cannot /// close the last surface"). case lastSurface + /// The surface has a live foreground process and requires `force`. + case confirmationRequired(UUID) /// The close call failed (legacy `internal_error` / "Failed to close surface", /// `data: {"surface_id": …}`). Carries the surface id. case closeFailed(UUID) diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseStrings.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseStrings.swift new file mode 100644 index 000000000000..a8518d7d0cec --- /dev/null +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceCloseStrings.swift @@ -0,0 +1,21 @@ +public import Foundation + +/// App-bundle-resolved messages returned by `surface.close`. +public struct ControlSurfaceCloseStrings: Sendable, Equatable { + public let confirmationRequired: String + public let failed: String + + public init(confirmationRequired: String, failed: String) { + self.confirmationRequired = confirmationRequired + self.failed = failed + } +} + +public extension ControlSurfaceContext { + func controlSurfaceCloseStrings() -> ControlSurfaceCloseStrings { + ControlSurfaceCloseStrings( + confirmationRequired: "Surface has a running process; retry with force=true", + failed: "Failed to close surface" + ) + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceContext.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceContext.swift index 67151610477e..69c2deba25ac 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceContext.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlSurfaceContext.swift @@ -60,6 +60,9 @@ public protocol ControlSurfaceContext: AnyObject { /// - Returns: The localized surface-not-found message. func controlSurfaceNotFoundMessage() -> String + /// App-bundle-resolved messages for close failures. + func controlSurfaceCloseStrings() -> ControlSurfaceCloseStrings + // MARK: - focus / split / respawn / create / close /// Focuses a surface for `surface.focus`. @@ -120,7 +123,8 @@ public protocol ControlSurfaceContext: AnyObject { func controlSurfaceClose( routing: ControlRoutingSelectors, surfaceID: UUID?, - hasSurfaceIDParam: Bool + hasSurfaceIDParam: Bool, + force: Bool ) -> ControlSurfaceCloseResolution // MARK: - move / reorder @@ -429,3 +433,19 @@ public protocol ControlSurfaceContext: AnyObject { /// - Returns: The bridged payload, or `nil` when unavailable. func controlDebugTerminals() -> JSONValue? } + +public extension ControlSurfaceContext { + /// Backward-compatible non-forced close for app-owned callers. + func controlSurfaceClose( + routing: ControlRoutingSelectors, + surfaceID: UUID?, + hasSurfaceIDParam: Bool + ) -> ControlSurfaceCloseResolution { + controlSurfaceClose( + routing: routing, + surfaceID: surfaceID, + hasSurfaceIDParam: hasSurfaceIDParam, + force: false + ) + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlCommandCoordinator+SystemTabAction.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlCommandCoordinator+SystemTabAction.swift index 8a3a32369d85..6c08586e4f15 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlCommandCoordinator+SystemTabAction.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlCommandCoordinator+SystemTabAction.swift @@ -34,6 +34,7 @@ extension ControlCommandCoordinator { rawURL: string(params, "url"), surfaceID: surfaceID ?? tabID, requestedFocus: bool(params, "focus") ?? false, + force: bool(params, "force") ?? false, moveParams: params ) @@ -86,6 +87,15 @@ extension ControlCommandCoordinator { return .err(code: "invalid_state", message: "Failed to toggle full-width tab mode", data: nil) case .tabNotFoundInPane: return .err(code: "not_found", message: "Tab not found in pane", data: nil) + case .confirmationRequired(let surfaceIDs): + return .err( + code: "confirmation_required", + message: context?.controlSystemCloseStrings().confirmationRequired + ?? "One or more surfaces have a running process; retry with force=true", + data: .object([ + "surface_ids": .array(surfaceIDs.map { .string($0.uuidString) }) + ]) + ) case .createFailed: return .err(code: "internal_error", message: "Failed to create tab", data: nil) case .duplicateFailed: diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemCloseStrings.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemCloseStrings.swift new file mode 100644 index 000000000000..3b3a07aa24d1 --- /dev/null +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemCloseStrings.swift @@ -0,0 +1,18 @@ +public import Foundation + +/// App-bundle-resolved messages for system tab-action close failures. +public struct ControlSystemCloseStrings: Sendable, Equatable { + public let confirmationRequired: String + + public init(confirmationRequired: String) { + self.confirmationRequired = confirmationRequired + } +} + +public extension ControlSystemContext { + func controlSystemCloseStrings() -> ControlSystemCloseStrings { + ControlSystemCloseStrings( + confirmationRequired: "One or more surfaces have a running process; retry with force=true" + ) + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemContext.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemContext.swift index cea908426899..7673e49fec6e 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemContext.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlSystemContext.swift @@ -111,6 +111,7 @@ public protocol ControlSystemContext: AnyObject { /// - surfaceID: The explicit `surface_id` / `tab_id`, if any. /// - requestedFocus: The requested `focus` flag (the app applies the /// focus-allowance policy). + /// - force: Whether a close batch may terminate active processes. /// - moveParams: The raw request params, passed through to the /// still-app-side move-to-new-workspace family. /// - Returns: The action resolution. @@ -121,6 +122,7 @@ public protocol ControlSystemContext: AnyObject { rawURL: String?, surfaceID: UUID?, requestedFocus: Bool, + force: Bool, moveParams: [String: JSONValue] ) -> ControlTabActionResolution @@ -136,6 +138,9 @@ public protocol ControlSystemContext: AnyObject { /// - Returns: The localized tab-not-found message. func controlSystemTabNotFoundMessage() -> String + /// App-bundle-resolved message for active-process batch close refusal. + func controlSystemCloseStrings() -> ControlSystemCloseStrings + /// Splits a surface off into its own pane for `surface.split_off` / /// `surface.drag_to_split`, delegating to the shared app-side /// `v2SurfaceSplitOff` (also driven by the v1 `drag_surface_to_split` diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlTabActionResolution.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlTabActionResolution.swift index be977ba087d5..c89c84971190 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlTabActionResolution.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/System/ControlTabActionResolution.swift @@ -92,6 +92,9 @@ public enum ControlTabActionResolution: Sendable, Equatable { case fullWidthTabToggleFailed /// The anchor tab was not found in its pane (`close_left` / `close_right`). case tabNotFoundInPane + /// A non-forced close batch would terminate one or more active processes. + /// Carries the affected surface ids so callers can retry with `force`. + case confirmationRequired([UUID]) /// Surface creation failed (`new_terminal_right` / `new_browser_right`). case createFailed /// Browser duplication failed. diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlCommandCoordinator+Window.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlCommandCoordinator+Window.swift index 676db76d4765..8b657186c75f 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlCommandCoordinator+Window.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlCommandCoordinator+Window.swift @@ -151,14 +151,29 @@ extension ControlCommandCoordinator { guard let windowID = uuid(params, "window_id") else { return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) } - let ok = context?.controlCloseWindow(id: windowID) ?? false let identity: JSONValue = .object([ "window_id": .string(windowID.uuidString), "window_ref": ref(.window, windowID), ]) - return ok - ? .ok(identity) - : .err(code: "not_found", message: "Window not found", data: identity) + let force = bool(params, "force") ?? false + switch context?.controlCloseWindow(id: windowID, force: force) ?? .notFound { + case .resolved: + return .ok(identity) + case .notFound: + return .err(code: "not_found", message: "Window not found", data: identity) + case .confirmationRequired(let workspaceIDs): + var data: [String: JSONValue] = [ + "window_id": .string(windowID.uuidString), + "window_ref": ref(.window, windowID), + ] + data["workspace_ids"] = .array(workspaceIDs.map { .string($0.uuidString) }) + return .err( + code: "confirmation_required", + message: context?.controlWindowCloseStrings().confirmationRequired + ?? "One or more workspaces or Dock surfaces have a running process; retry with --force", + data: .object(data) + ) + } } /// `window.displays` — every connected display. diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseResolution.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseResolution.swift new file mode 100644 index 000000000000..480b95568614 --- /dev/null +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseResolution.swift @@ -0,0 +1,8 @@ +public import Foundation + +/// The result of a non-interactive window close request. +public enum ControlWindowCloseResolution: Sendable, Equatable { + case resolved + case confirmationRequired(workspaceIDs: [UUID]) + case notFound +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseStrings.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseStrings.swift new file mode 100644 index 000000000000..49befb00df33 --- /dev/null +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowCloseStrings.swift @@ -0,0 +1,24 @@ +public import Foundation + +/// App-bundle-resolved messages returned by non-interactive window close. +public struct ControlWindowCloseStrings: Sendable, Equatable { + public let confirmationRequired: String + + public init(confirmationRequired: String) { + self.confirmationRequired = confirmationRequired + } +} + +public extension ControlWindowContext { + func controlWindowCloseStrings() -> ControlWindowCloseStrings { + ControlWindowCloseStrings( + confirmationRequired: "One or more workspaces or Dock surfaces have a running process; retry with --force" + ) + } + + func controlCloseWindow(id: UUID, force: Bool) -> ControlWindowCloseResolution { + controlCloseWindow(id: id) + ? .resolved + : .notFound + } +} diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowContext.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowContext.swift index c432d7c32455..6acd1ba4f9c1 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowContext.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Window/ControlWindowContext.swift @@ -41,6 +41,14 @@ public protocol ControlWindowContext: AnyObject { /// - Returns: Whether a matching window was found and closed. func controlCloseWindow(id: UUID) -> Bool + /// Closes a window for a non-interactive caller, returning a safety outcome + /// when a live process would be terminated. The default preserves the + /// legacy boolean witness for test and transitional conformers. + func controlCloseWindow(id: UUID, force: Bool) -> ControlWindowCloseResolution + + /// App-bundle-resolved messages for non-interactive window close. + func controlWindowCloseStrings() -> ControlWindowCloseStrings + /// Snapshots every connected display for `window.displays`, in screen order. func controlAvailableDisplays() -> [ControlDisplayInfo] diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+WorkspaceClose.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+WorkspaceClose.swift index d6c5a85bcc44..8382a7aa6040 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+WorkspaceClose.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+WorkspaceClose.swift @@ -12,9 +12,11 @@ extension ControlCommandCoordinator { guard let workspaceID = uuid(params, "workspace_id") else { return .err(code: "invalid_params", message: "Missing or invalid workspace_id", data: nil) } + let force = bool(params, "force") ?? false let resolution = context?.controlCloseWorkspace( routing: routing, - workspaceID: workspaceID + workspaceID: workspaceID, + force: force ) ?? .tabManagerUnavailable switch resolution { case .tabManagerUnavailable: @@ -28,6 +30,15 @@ extension ControlCommandCoordinator { "workspace_ref": ref(.workspace, workspaceID), "pinned": .bool(true), ])) + case .confirmationRequired: + let message = context?.controlWorkspaceStrings().closeConfirmationRequired + ?? "Workspace has a running process; retry with --force" + return .err(code: "confirmation_required", message: message, data: .object([ + "window_id": .null, + "window_ref": .null, + "workspace_id": .string(workspaceID.uuidString), + "workspace_ref": ref(.workspace, workspaceID), + ])) case .notFound: return .err(code: "not_found", message: "Workspace not found", data: .object([ "workspace_id": .string(workspaceID.uuidString), diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceCloseResolution.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceCloseResolution.swift index 58db1019cf86..415fa7ef4b48 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceCloseResolution.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceCloseResolution.swift @@ -11,6 +11,9 @@ public enum ControlWorkspaceCloseResolution: Sendable, Equatable { /// `protected`). Carries the owning window id (may be absent); the localized /// message is supplied via ``ControlWorkspaceStrings``. case protected(windowID: UUID?) + /// The workspace contains a live foreground process. Callers may retry + /// with `force: true` after deciding to terminate it. + case confirmationRequired /// The workspace was not in the resolved TabManager (legacy `not_found` / /// "Workspace not found"). The legacy failure payload carries only the /// workspace identity. diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceContext.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceContext.swift index 78c4f6127f79..4d9a3ba3b51f 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceContext.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceContext.swift @@ -76,7 +76,8 @@ public protocol ControlWorkspaceContext: AnyObject { /// - Returns: The close resolution. func controlCloseWorkspace( routing: ControlRoutingSelectors, - workspaceID: UUID + workspaceID: UUID, + force: Bool ) -> ControlWorkspaceCloseResolution /// Moves a workspace to another window for `workspace.move_to_window`. diff --git a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceStrings.swift b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceStrings.swift index fe8ad43f63f9..da605ed6fdc4 100644 --- a/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceStrings.swift +++ b/Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlWorkspaceStrings.swift @@ -13,6 +13,8 @@ public struct ControlWorkspaceStrings: Sendable, Equatable { public let closeProtected: String /// The `workspace.close` local-teardown failure message. public let closeFailed: String + /// The active-process safety message for `workspace.close`. + public let closeConfirmationRequired: String /// `socket.workspace.reorderMany.missingOrder`. public let reorderManyMissingOrder: String /// `socket.workspace.reorderMany.duplicateWorkspace`. @@ -55,6 +57,7 @@ public struct ControlWorkspaceStrings: Sendable, Equatable { public init( closeProtected: String, closeFailed: String, + closeConfirmationRequired: String = "Workspace has a running process; retry with force=true", reorderManyMissingOrder: String, reorderManyDuplicateWorkspace: String, workspaceNotFound: String, @@ -68,6 +71,7 @@ public struct ControlWorkspaceStrings: Sendable, Equatable { ) { self.closeProtected = closeProtected self.closeFailed = closeFailed + self.closeConfirmationRequired = closeConfirmationRequired self.reorderManyMissingOrder = reorderManyMissingOrder self.reorderManyDuplicateWorkspace = reorderManyDuplicateWorkspace self.workspaceNotFound = workspaceNotFound diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+SidebarBrowser.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+SidebarBrowser.swift index 4c683b124318..0ca3fe9e88c2 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+SidebarBrowser.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+SidebarBrowser.swift @@ -234,7 +234,7 @@ extension ControlSidebarContext { .noTabSelected } - func controlSidebarCloseSurface(surfaceArg: String?) -> ControlSidebarCloseSurfaceResolution { .noTabSelected } + func controlSidebarCloseSurface(surfaceArg: String?, force: Bool) -> ControlSidebarCloseSurfaceResolution { .noTabSelected } func controlSidebarReloadConfig( completion: @escaping @MainActor () -> Void diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+System.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+System.swift index a0a565154a2e..b9f43947c5fd 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+System.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs+System.swift @@ -46,6 +46,7 @@ extension ControlSystemContext { rawURL: String?, surfaceID: UUID?, requestedFocus: Bool, + force: Bool, moveParams: [String: JSONValue] ) -> ControlTabActionResolution { .tabManagerUnavailable } func controlSystemSurfaceNotFoundMessage() -> String { "Surface not found" } diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift index ebf4fc940def..abc6095a8977 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift @@ -291,6 +291,7 @@ extension ControlWorkspaceContext { func controlWorkspaceStrings() -> ControlWorkspaceStrings { ControlWorkspaceStrings( closeProtected: "", closeFailed: "", + closeConfirmationRequired: "", reorderManyMissingOrder: "", reorderManyDuplicateWorkspace: "", workspaceNotFound: "", @@ -323,7 +324,8 @@ extension ControlWorkspaceContext { func controlCloseWorkspace( routing: ControlRoutingSelectors, - workspaceID: UUID + workspaceID: UUID, + force: Bool ) -> ControlWorkspaceCloseResolution { .tabManagerUnavailable } func controlMoveWorkspaceToWindow( @@ -488,7 +490,8 @@ extension ControlSurfaceContext { func controlSurfaceClose( routing: ControlRoutingSelectors, surfaceID: UUID?, - hasSurfaceIDParam: Bool + hasSurfaceIDParam: Bool, + force: Bool ) -> ControlSurfaceCloseResolution { .tabManagerUnavailable } func controlSurfaceMove(params: [String: JSONValue]) -> ControlCallResult { diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorTabActionTests.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorTabActionTests.swift index 29b4dcc3e67b..e199b446a607 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorTabActionTests.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorTabActionTests.swift @@ -133,4 +133,31 @@ struct ControlCommandCoordinatorTabActionTests { #expect(message == "Failed to toggle full-width tab mode") #expect(data == nil) } + + @Test func closeBatchRequiresForceWhenActiveProcessesAreReported() throws { + let activeSurfaceID = UUID() + let context = FakeTabActionControlCommandContext() + context.resolution = .confirmationRequired([activeSurfaceID]) + let coordinator = ControlCommandCoordinator(context: context) + + let result = coordinator.handle(ControlRequest( + id: .int(1), + method: "tab.action", + params: [ + "action": .string("close-right"), + "force": .bool(false), + ] + )) + + guard case .err(let code, let message, let data) = result else { + Issue.record("expected confirmation_required tab.action error") + return + } + #expect(context.force == false) + #expect(code == "confirmation_required") + #expect(message == "One or more surfaces have a running process; retry with force=true") + #expect(data == .object([ + "surface_ids": .array([.string(activeSurfaceID.uuidString)]) + ])) + } } diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWindowTests.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWindowTests.swift index f7d47bb634c9..8eace6abc5cb 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWindowTests.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWindowTests.swift @@ -14,6 +14,8 @@ private final class FakeControlCommandContext: ControlCommandContext { var createResult: UUID? var closeResult = false var closedID: UUID? + var closedForce: Bool? + var closeResolution: ControlWindowCloseResolution? var displays: [ControlDisplayInfo] = [] var existingWindowIDs: Set = [] var moveWindowResult: String? @@ -39,6 +41,12 @@ private final class FakeControlCommandContext: ControlCommandContext { return closeResult } + func controlCloseWindow(id: UUID, force: Bool) -> ControlWindowCloseResolution { + closedID = id + closedForce = force + return closeResolution ?? (closeResult ? .resolved : .notFound) + } + func controlAvailableDisplays() -> [ControlDisplayInfo] { displays } func controlWindowExists(id: UUID) -> Bool { existingWindowIDs.contains(id) } @@ -220,6 +228,45 @@ struct ControlCommandCoordinatorWindowTests { ]))) } + @Test func windowCloseForwardsForce() { + let (coordinator, context) = makeCoordinator() + let windowID = UUID() + context.closeResolution = .resolved + + #expect(coordinator.handle(request("window.close", [ + "window_id": .string(windowID.uuidString), + "force": .bool(true), + ])) == .ok(.object([ + "window_id": .string(windowID.uuidString), + "window_ref": .string("window:1"), + ]))) + #expect(context.closedID == windowID) + #expect(context.closedForce == true) + } + + @Test func windowCloseConfirmationIncludesWorkspaceIDs() { + let (coordinator, context) = makeCoordinator() + let windowID = UUID() + let firstWorkspaceID = UUID() + let secondWorkspaceID = UUID() + context.closeResolution = .confirmationRequired(workspaceIDs: [firstWorkspaceID, secondWorkspaceID]) + + #expect(coordinator.handle(request("window.close", [ + "window_id": .string(windowID.uuidString), + ])) == .err(code: "confirmation_required", message: + "One or more workspaces or Dock surfaces have a running process; retry with --force", + data: .object([ + "window_id": .string(windowID.uuidString), + "window_ref": .string("window:1"), + "workspace_ids": .array([ + .string(firstWorkspaceID.uuidString), + .string(secondWorkspaceID.uuidString), + ]), + ]))) + #expect(context.closedID == windowID) + #expect(context.closedForce == false) + } + @Test func windowDisplaysBuildsPayload() { let (coordinator, context) = makeCoordinator() context.displays = [ diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWorkspaceTests.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWorkspaceTests.swift index bf06bd497d44..c3b9c557a81c 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWorkspaceTests.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorWorkspaceTests.swift @@ -133,6 +133,25 @@ struct ControlCommandCoordinatorWorkspaceTests { #expect(data["workspace_id"] == .string(workspaceID.uuidString)) } + @Test func workspaceCloseRequiresForceForActiveProcesses() throws { + let (coordinator, context) = coordinator() + let workspaceID = UUID() + context.closeResolution = .confirmationRequired + + guard case .err(let code, let message, .object(let data)) = coordinator.handle(request( + "workspace.close", + ["workspace_id": .string(workspaceID.uuidString)] + )) else { + Issue.record("unexpected workspace.close result") + return + } + + #expect(context.closeForce == false) + #expect(code == "confirmation_required") + #expect(message == "Workspace has a running process; retry with --force") + #expect(data["workspace_id"] == .string(workspaceID.uuidString)) + } + @Test func workspaceGroupAddForwardsPlacementAndReference() throws { let (coordinator, context) = coordinator() let groupID = UUID() diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeSurfaceControlCommandContext.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeSurfaceControlCommandContext.swift index 9eb132afe82b..9f0e11174b30 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeSurfaceControlCommandContext.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeSurfaceControlCommandContext.swift @@ -57,7 +57,8 @@ final class FakeSurfaceControlCommandContext: ControlCommandContext { func controlSurfaceClose( routing: ControlRoutingSelectors, surfaceID: UUID?, - hasSurfaceIDParam: Bool + hasSurfaceIDParam: Bool, + force: Bool ) -> ControlSurfaceCloseResolution { onSurfaceClose?() return closeResolution diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeTabActionControlCommandContext.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeTabActionControlCommandContext.swift index 72e8eb267d23..1a92b3e68db0 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeTabActionControlCommandContext.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeTabActionControlCommandContext.swift @@ -6,6 +6,7 @@ final class FakeTabActionControlCommandContext: ControlCommandContext { var resolution: ControlTabActionResolution = .tabManagerUnavailable private(set) var actionKey: String? private(set) var surfaceID: UUID? + private(set) var force = false func controlTabAction( routing: ControlRoutingSelectors, @@ -14,10 +15,12 @@ final class FakeTabActionControlCommandContext: ControlCommandContext { rawURL: String?, surfaceID: UUID?, requestedFocus: Bool, + force: Bool, moveParams: [String: JSONValue] ) -> ControlTabActionResolution { self.actionKey = actionKey self.surfaceID = surfaceID + self.force = force return resolution } } diff --git a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeWorkspaceControlCommandContext.swift b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeWorkspaceControlCommandContext.swift index 63a112c310a0..9a9c99748e47 100644 --- a/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeWorkspaceControlCommandContext.swift +++ b/Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/FakeWorkspaceControlCommandContext.swift @@ -12,6 +12,7 @@ final class FakeWorkspaceControlCommandContext: ControlCommandContext { var listResolution: ControlWorkspaceListResolution = .tabManagerUnavailable var currentResolution: ControlWorkspaceCurrentResolution = .tabManagerUnavailable var closeResolution: ControlWorkspaceCloseResolution = .tabManagerUnavailable + var closeForce = false var reorderResolution: ControlWorkspaceReorderResolution = .notFound var reorderCall: (workspaceID: UUID, index: Int?, before: UUID?, after: UUID?, dryRun: Bool)? var addWorkspaceToGroupResolution: ControlWorkspaceGroupAddResolution = .tabManagerUnavailable @@ -102,6 +103,7 @@ final class FakeWorkspaceControlCommandContext: ControlCommandContext { ControlWorkspaceStrings( closeProtected: "close protected", closeFailed: "close failed", + closeConfirmationRequired: "Workspace has a running process; retry with --force", reorderManyMissingOrder: "missing order", reorderManyDuplicateWorkspace: "duplicate workspace", workspaceNotFound: "workspace not found", @@ -128,9 +130,11 @@ final class FakeWorkspaceControlCommandContext: ControlCommandContext { func controlCloseWorkspace( routing: ControlRoutingSelectors, - workspaceID: UUID + workspaceID: UUID, + force: Bool ) -> ControlWorkspaceCloseResolution { - closeResolution + closeForce = force + return closeResolution } func controlAddWorkspaceToGroup( diff --git a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CloseTabWarningReading.swift b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CloseTabWarningReading.swift index 9ee495553259..3184f6b43ce9 100644 --- a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CloseTabWarningReading.swift +++ b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CloseTabWarningReading.swift @@ -50,4 +50,25 @@ extension CloseTabWarningReading { ) -> Bool { !warningKinds(requiresConfirmation: requiresConfirmation, source: source).isEmpty } + + /// Whether a close should be gated by either the user's warning setting or + /// an active process that must never be killed silently. + public func shouldConfirmCloseIncludingSafety( + requiresConfirmation: Bool, + source: CloseTabCloseSource + ) -> Bool { + requiresConfirmation || shouldConfirmClose( + requiresConfirmation: requiresConfirmation, + source: source + ) + } + + public func warningKindsIncludingSafety( + requiresConfirmation: Bool, + source: CloseTabCloseSource + ) -> CloseWarningKinds { + var kinds = warningKinds(requiresConfirmation: requiresConfirmation, source: source) + if requiresConfirmation { kinds.insert(.safety) } + return kinds + } } diff --git a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/CloseWarningKinds.swift b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/CloseWarningKinds.swift index 9df70383e239..f32b3bc0d28d 100644 --- a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/CloseWarningKinds.swift +++ b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/CloseWarningKinds.swift @@ -22,4 +22,7 @@ public struct CloseWarningKinds: OptionSet, Sendable, Hashable { /// `app.warnBeforeClosingWindow`: the "Close window?" prompts. public static let window = CloseWarningKinds(rawValue: 1 << 3) + + /// An active foreground process requires a warning regardless of settings. + public static let safety = CloseWarningKinds(rawValue: 1 << 4) } diff --git a/Resources/Localizable.xcstrings b/Resources/Localizable.xcstrings index e8afbf15e76b..28d221709e3e 100644 --- a/Resources/Localizable.xcstrings +++ b/Resources/Localizable.xcstrings @@ -569771,1446 +569771,1481 @@ } } }, - "socket.mainActorHop.timeout.mayHaveRun": { + "terminal.clipboardReadConfirmation.deny": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux did not respond within 10 seconds after the command started, so its result is unknown. Check the effect before retrying." + "value": "Deny" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "コマンドの開始後 10 秒以内に cmux が応答しなかったため、結果は不明です。再試行する前に効果を確認してください。" + "value": "رفض" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "命令开始后 10 秒内 cmux 没有响应,因此结果未知。请先确认效果再重试。" + "value": "Ablehnen" } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "cmux hat innerhalb von 10 Sekunden nach dem Start des Befehls nicht geantwortet, das Ergebnis ist daher unbekannt. Prüfe die Auswirkung, bevor du es erneut versuchst." + "value": "Denegar" } }, "fr": { "stringUnit": { "state": "translated", - "value": "cmux n’a pas répondu dans les 10 secondes suivant le démarrage de la commande, son résultat est donc inconnu. Vérifiez l’effet avant de réessayer." + "value": "Refuser" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "لم يستجب cmux خلال 10 ثوانٍ بعد بدء الأمر، لذا فإن نتيجته غير معروفة. تحقق من الأثر قبل إعادة المحاولة." + "value": "拒否" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "cmux no respondió en los 10 segundos posteriores al inicio del comando, por lo que su resultado es desconocido. Comprueba el efecto antes de reintentar." + "value": "거부" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "命令開始後 10 秒內 cmux 沒有回應,因此結果未知。請先確認效果再重試。" + "value": "拒绝" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "명령이 시작된 후 10초 안에 cmux가 응답하지 않아 결과를 알 수 없습니다. 다시 시도하기 전에 효과를 확인하세요." - } - } - } - }, - "socket.mainActorHop.timeout.notRun": { - "extractionState": "manual", - "localizations": { - "en": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux did not respond within 10 seconds, so the command was not run. Retry in a moment." + "value": "拒絕" } }, - "ja": { + "bs": { "stringUnit": { "state": "translated", - "value": "cmux が 10 秒以内に応答しなかったため、コマンドは実行されませんでした。しばらくしてから再試行してください。" + "value": "Odbij" } }, - "zh-Hans": { + "da": { "stringUnit": { "state": "translated", - "value": "cmux 在 10 秒内没有响应,因此未运行该命令。请稍后重试。" + "value": "Afvis" } }, - "de": { + "it": { "stringUnit": { "state": "translated", - "value": "cmux hat innerhalb von 10 Sekunden nicht geantwortet, der Befehl wurde daher nicht ausgeführt. Versuche es gleich noch einmal." + "value": "Nega" } }, - "fr": { + "km": { "stringUnit": { "state": "translated", - "value": "cmux n’a pas répondu dans les 10 secondes, la commande n’a donc pas été exécutée. Réessayez dans un instant." + "value": "បដិសេធ" } }, - "ar": { + "nb": { "stringUnit": { "state": "translated", - "value": "لم يستجب cmux خلال 10 ثوانٍ، لذا لم يتم تنفيذ الأمر. أعد المحاولة بعد لحظات." + "value": "Avslå" } }, - "es": { + "pl": { "stringUnit": { "state": "translated", - "value": "cmux no respondió en 10 segundos, por lo que el comando no se ejecutó. Reintenta en un momento." + "value": "Odmów" } }, - "zh-Hant": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "cmux 在 10 秒內沒有回應,因此未執行該命令。請稍後重試。" + "value": "Negar" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "cmux가 10초 안에 응답하지 않아 명령이 실행되지 않았습니다. 잠시 후 다시 시도하세요." - } - } - } - }, - "socket.overloaded.message": { - "extractionState": "manual", - "localizations": { - "en": { + "ru": { "stringUnit": { "state": "translated", - "value": "cmux is handling too many control-socket requests right now, so this one was not run. Retry in a moment." + "value": "Запретить" } }, - "ja": { + "th": { "stringUnit": { "state": "translated", - "value": "cmux は現在、制御ソケットの要求を処理しきれないため、この要求は実行されませんでした。しばらくしてから再試行してください。" + "value": "ปฏิเสธ" } }, - "zh-Hans": { + "tr": { "stringUnit": { "state": "translated", - "value": "cmux 当前正在处理过多的控制套接字请求,因此未运行此请求。请稍后重试。" + "value": "Reddet" } }, - "de": { + "uk": { "stringUnit": { "state": "translated", - "value": "cmux verarbeitet gerade zu viele Control-Socket-Anfragen, diese wurde daher nicht ausgeführt. Versuche es gleich noch einmal." + "value": "Заборонити" } - }, - "fr": { + } + } + }, + "terminal.clipboardReadConfirmation.message": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "cmux traite actuellement trop de requêtes du socket de contrôle, celle-ci n’a donc pas été exécutée. Réessayez dans un instant." + "value": "A program in this terminal wants to read your clipboard. Allow it only if you trust the program." } }, "ar": { "stringUnit": { "state": "translated", - "value": "يعالج cmux حاليًا عددًا كبيرًا جدًا من طلبات مقبس التحكم، لذا لم يتم تنفيذ هذا الطلب. أعد المحاولة بعد لحظات." + "value": "يريد برنامج في هذه الطرفية قراءة الحافظة. اسمح بذلك فقط إذا كنت تثق بالبرنامج." } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "cmux está gestionando demasiadas solicitudes del socket de control ahora mismo, por lo que esta no se ejecutó. Reintenta en un momento." + "value": "Ein Programm in diesem Terminal möchte deine Zwischenablage lesen. Erlaube es nur, wenn du dem Programm vertraust." } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "cmux 目前正在處理過多的控制 socket 請求,因此未執行此請求。請稍後重試。" + "value": "Un programa de esta terminal quiere leer tu portapapeles. Permítelo solo si confías en el programa." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "cmux가 지금 너무 많은 제어 소켓 요청을 처리하고 있어 이 요청은 실행되지 않았습니다. 잠시 후 다시 시도하세요." - } - } - } - }, - "socket.request.cancelled": { - "extractionState": "manual", - "localizations": { - "en": { + "fr": { "stringUnit": { "state": "translated", - "value": "Request was cancelled" + "value": "Un programme de ce terminal veut lire votre presse-papiers. Ne l’autorisez que si vous faites confiance à ce programme." } }, "ja": { "stringUnit": { "state": "translated", - "value": "リクエストはキャンセルされました" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "请求已取消" + "value": "このターミナルのプログラムがクリップボードを読み取ろうとしています。信頼できるプログラムの場合にのみ許可してください。" } }, - "de": { + "ko": { "stringUnit": { "state": "translated", - "value": "Die Anfrage wurde abgebrochen" + "value": "이 터미널의 프로그램이 클립보드를 읽으려고 합니다. 프로그램을 신뢰할 수 있을 때만 허용하세요." } }, - "fr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "La requête a été annulée" + "value": "此终端中的程序想要读取你的剪贴板。只有在你信任该程序时才允许。" } }, - "ar": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "تم إلغاء الطلب" + "value": "此終端機中的程式想要讀取你的剪貼簿。只有在你信任該程式時才允許。" } }, - "es": { + "bs": { "stringUnit": { "state": "translated", - "value": "Se canceló la solicitud" + "value": "Program u ovom terminalu želi čitati vaš međuspremnik. Dozvolite samo ako vjerujete programu." } }, - "zh-Hant": { + "da": { "stringUnit": { "state": "translated", - "value": "請求已取消" + "value": "Et program i denne terminal vil læse din udklipsholder. Tillad det kun, hvis du har tillid til programmet." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "요청이 취소되었습니다" - } - } - } - }, - "socket.request.failedBeforeResult": { - "extractionState": "manual", - "localizations": { - "en": { + "it": { "stringUnit": { "state": "translated", - "value": "Request failed before returning a result" + "value": "Un programma in questo terminale vuole leggere gli appunti. Consentilo solo se ti fidi del programma." } }, - "ja": { + "km": { "stringUnit": { "state": "translated", - "value": "結果を返す前にリクエストが失敗しました" + "value": "កម្មវិធីក្នុងស្ថានីយនេះចង់អានក្ដារតម្បៀតខ្ទាស់របស់អ្នក។ អនុញ្ញាតតែបើអ្នកទុកចិត្តកម្មវិធីនេះ។" } }, - "zh-Hans": { + "nb": { "stringUnit": { "state": "translated", - "value": "请求在返回结果之前失败" + "value": "Et program i denne terminalen vil lese utklippstavlen din. Tillat det bare hvis du stoler på programmet." } }, - "de": { + "pl": { "stringUnit": { "state": "translated", - "value": "Die Anfrage ist fehlgeschlagen, bevor ein Ergebnis zurückgegeben wurde" + "value": "Program w tym terminalu chce odczytać schowek. Zezwól tylko, jeśli ufasz temu programowi." } }, - "fr": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "La requête a échoué avant de renvoyer un résultat" + "value": "Um programa neste terminal quer ler sua área de transferência. Permita somente se você confiar no programa." } }, - "ar": { + "ru": { "stringUnit": { "state": "translated", - "value": "فشل الطلب قبل إرجاع نتيجة" + "value": "Программа в этом терминале хочет прочитать буфер обмена. Разрешайте только программам, которым доверяете." } }, - "es": { + "th": { "stringUnit": { "state": "translated", - "value": "La solicitud falló antes de devolver un resultado" + "value": "โปรแกรมในเทอร์มินัลนี้ต้องการอ่านคลิปบอร์ดของคุณ อนุญาตเฉพาะเมื่อคุณเชื่อถือโปรแกรมนี้" } }, - "zh-Hant": { + "tr": { "stringUnit": { "state": "translated", - "value": "請求在傳回結果之前失敗" + "value": "Bu terminaldeki bir program panonuzu okumak istiyor. Yalnızca programa güveniyorsanız izin verin." } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "결과를 반환하기 전에 요청이 실패했습니다" + "value": "Програма в цьому терміналі хоче прочитати ваш буфер обміну. Дозволяйте, лише якщо довіряєте програмі." } } } }, - "agent.codex.fork.notice.body": { + "terminal.clipboardReadConfirmation.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux could not identify the new fork session. Start the fork again from the parent pane." + "value": "Allow Clipboard Access?" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "cmux は新しいフォーク セッションを特定できませんでした。親ペインからもう一度フォークしてください。" + "value": "السماح بالوصول إلى الحافظة؟" } }, "de": { "stringUnit": { "state": "translated", - "value": "cmux konnte die neue Fork-Sitzung nicht erkennen. Starten Sie den Fork erneut im übergeordneten Pane." + "value": "Zugriff auf die Zwischenablage erlauben?" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "cmux n’a pas pu identifier la nouvelle session forkée. Relancez le fork depuis le volet parent." + "value": "¿Permitir el acceso al portapapeles?" } }, - "ar": { + "fr": { "stringUnit": { "state": "translated", - "value": "تعذر على cmux تحديد جلسة التفريع الجديدة. ابدأ التفريع مرة أخرى من الجزء الأصلي." + "value": "Autoriser l’accès au presse-papiers ?" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "cmux no pudo identificar la nueva sesión bifurcada. Inicia el fork de nuevo desde el panel principal." + "value": "クリップボードへのアクセスを許可しますか?" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "cmux 無法識別新的分支工作階段。請從父窗格重新開始分支。" + "value": "클립보드 접근을 허용하시겠습니까?" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 无法识别新的分支会话。请从父窗格重新开始分支。" + "value": "允许访问剪贴板?" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux가 새 포크 세션을 식별하지 못했습니다. 부모 패널에서 포크를 다시 시작하세요." + "value": "允許存取剪貼簿?" } }, "bs": { "stringUnit": { "state": "translated", - "value": "cmux nije mogao prepoznati novu sesiju račvanja. Ponovo pokrenite račvanje iz nadređenog okna." + "value": "Dozvoliti pristup međuspremniku?" } }, "da": { "stringUnit": { "state": "translated", - "value": "cmux kunne ikke identificere den nye forgreningssession. Start forgreningen igen fra forældreruden." + "value": "Tillad adgang til udklipsholderen?" } }, "it": { "stringUnit": { "state": "translated", - "value": "cmux non ha potuto identificare la nuova sessione fork. Avvia di nuovo il fork dal riquadro principale." + "value": "Consentire l'accesso agli appunti?" } }, "km": { "stringUnit": { "state": "translated", - "value": "cmux មិនអាចកំណត់អត្តសញ្ញាណសម័យ fork ថ្មីបានទេ។ ចាប់ផ្ដើម fork ម្ដងទៀតពីផ្ទាំងមេ។" + "value": "អនុញ្ញាតឱ្យចូលប្រើក្ដារតម្បៀតខ្ទាស់?" } }, "nb": { "stringUnit": { "state": "translated", - "value": "cmux kunne ikke identifisere den nye forgreningsøkten. Start forgreningen på nytt fra den overordnede ruten." + "value": "Tillat tilgang til utklippstavlen?" } }, "pl": { "stringUnit": { "state": "translated", - "value": "cmux nie mógł zidentyfikować nowej sesji forka. Uruchom fork ponownie z panelu nadrzędnego." + "value": "Zezwolić na dostęp do schowka?" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "O cmux não conseguiu identificar a nova sessão bifurcada. Inicie o fork novamente no painel principal." + "value": "Permitir acesso à área de transferência?" } }, "ru": { "stringUnit": { "state": "translated", - "value": "cmux не удалось определить новый сеанс форка. Запустите форк снова из родительской панели." + "value": "Разрешить доступ к буферу обмена?" } }, "th": { "stringUnit": { "state": "translated", - "value": "cmux ไม่สามารถระบุเซสชันที่แยกใหม่ได้ เริ่มการแยกอีกครั้งจากบานหน้าต่างหลัก" + "value": "อนุญาตให้เข้าถึงคลิปบอร์ดหรือไม่?" } }, "tr": { "stringUnit": { "state": "translated", - "value": "cmux yeni fork oturumunu belirleyemedi. Fork'u üst panelden yeniden başlatın." + "value": "Panoya erişime izin verilsin mi?" } }, "uk": { "stringUnit": { "state": "translated", - "value": "cmux не вдалося визначити новий сеанс форка. Запустіть форк ще раз із батьківської панелі." + "value": "Дозволити доступ до буфера обміну?" } } } }, - "agent.codex.fork.notice.parentClearFailed.body": { + "notification.remoteRelay.hostFallback": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux could not safely bind the new fork session. Retry the fork from the parent pane." + "value": "Remote host" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "cmux は新しいフォーク セッションを安全にバインドできませんでした。親ペインからもう一度フォークしてください。" + "value": "مضيف بعيد" } }, "de": { "stringUnit": { "state": "translated", - "value": "cmux konnte die neue Fork-Sitzung nicht sicher binden. Starten Sie den Fork erneut im übergeordneten Pane." + "value": "Remote-Host" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "cmux n’a pas pu lier la nouvelle session forkée en toute sécurité. Relancez le fork depuis le volet parent." + "value": "Host remoto" } }, - "ar": { + "fr": { "stringUnit": { "state": "translated", - "value": "تعذر على cmux ربط جلسة التفريع الجديدة بأمان. أعد بدء التفريع من الجزء الأصلي." + "value": "Hôte distant" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "cmux no pudo vincular de forma segura la nueva sesión bifurcada. Inicia el fork de nuevo desde el panel principal." + "value": "リモートホスト" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "cmux 無法安全繫結新的分支工作階段。請從父窗格重新開始分支。" + "value": "원격 호스트" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 无法安全绑定新的分支会话。请从父窗格重新开始分支。" + "value": "远程主机" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux가 새 포크 세션을 안전하게 연결하지 못했습니다. 부모 패널에서 포크를 다시 시작하세요." + "value": "遠端主機" } }, "bs": { "stringUnit": { "state": "translated", - "value": "cmux nije mogao sigurno povezati novu sesiju račvanja. Ponovo pokrenite račvanje iz nadređenog okna." + "value": "Udaljeni host" } }, "da": { "stringUnit": { "state": "translated", - "value": "cmux kunne ikke binde den nye forgreningssession sikkert. Start forgreningen igen fra forældreruden." + "value": "Fjernvært" } }, "it": { "stringUnit": { "state": "translated", - "value": "cmux non ha potuto associare in sicurezza la nuova sessione fork. Avvia di nuovo il fork dal riquadro principale." + "value": "Host remoto" } }, "km": { "stringUnit": { "state": "translated", - "value": "cmux មិនអាចភ្ជាប់សម័យ fork ថ្មីដោយសុវត្ថិភាពបានទេ។ ចាប់ផ្ដើម fork ម្ដងទៀតពីផ្ទាំងមេ។" + "value": "ម៉ាស៊ីនពីចម្ងាយ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "cmux kunne ikke binde den nye forgreningsøkten på en trygg måte. Start forgreningen på nytt fra den overordnede ruten." + "value": "Ekstern vert" } }, "pl": { "stringUnit": { "state": "translated", - "value": "cmux nie mógł bezpiecznie powiązać nowej sesji forka. Uruchom fork ponownie z panelu nadrzędnego." + "value": "Zdalny host" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "O cmux não conseguiu vincular com segurança a nova sessão bifurcada. Inicie o fork novamente no painel principal." + "value": "Host remoto" } }, "ru": { "stringUnit": { "state": "translated", - "value": "cmux не удалось безопасно привязать новый сеанс форка. Запустите форк снова из родительской панели." + "value": "Удалённый хост" } }, "th": { "stringUnit": { "state": "translated", - "value": "cmux ไม่สามารถผูกเซสชันที่แยกใหม่ได้อย่างปลอดภัย เริ่มการแยกอีกครั้งจากบานหน้าต่างหลัก" + "value": "โฮสต์ระยะไกล" } }, "tr": { "stringUnit": { "state": "translated", - "value": "cmux yeni fork oturumunu güvenli bir şekilde bağlayamadı. Fork'u üst panelden yeniden başlatın." + "value": "Uzak ana bilgisayar" } }, "uk": { "stringUnit": { "state": "translated", - "value": "cmux не вдалося безпечно прив’язати новий сеанс форка. Запустіть форк ще раз із батьківської панелі." + "value": "Віддалений хост" } } } }, - "agent.codex.fork.notice.subtitle": { + "notification.remoteRelay.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Fork unavailable" + "value": "%1$@: %2$@" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "フォークを利用できません" + "value": "%1$@: %2$@" } }, "de": { "stringUnit": { "state": "translated", - "value": "Fork nicht verfügbar" + "value": "%1$@: %2$@" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "Fork indisponible" + "value": "%1$@: %2$@" } }, - "ar": { + "fr": { "stringUnit": { "state": "translated", - "value": "التفريع غير متاح" + "value": "%1$@: %2$@" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Fork no disponible" + "value": "%1$@: %2$@" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "無法使用分支" + "value": "%1$@: %2$@" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "分支不可用" + "value": "%1$@: %2$@" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "포크를 사용할 수 없음" + "value": "%1$@: %2$@" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Račvanje nije dostupno" + "value": "%1$@: %2$@" } }, "da": { "stringUnit": { "state": "translated", - "value": "Fork ikke tilgængelig" + "value": "%1$@: %2$@" } }, "it": { "stringUnit": { "state": "translated", - "value": "Fork non disponibile" + "value": "%1$@: %2$@" } }, "km": { "stringUnit": { "state": "translated", - "value": "មិនអាចប្រើការបំបែកបាន" + "value": "%1$@: %2$@" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Fork utilgjengelig" + "value": "%1$@: %2$@" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Fork niedostępny" + "value": "%1$@: %2$@" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Fork indisponível" + "value": "%1$@: %2$@" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Форк недоступен" + "value": "%1$@: %2$@" } }, "th": { "stringUnit": { "state": "translated", - "value": "ไม่สามารถใช้การแยกสาขาได้" + "value": "%1$@: %2$@" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Fork kullanılamıyor" + "value": "%1$@: %2$@" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Форк недоступний" + "value": "%1$@: %2$@" } } } }, - "agent.codex.fork.notice.title": { + "socket.mainActorHop.timeout.mayHaveRun": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Agent fork" + "value": "cmux did not respond within 10 seconds after the command started, so its result is unknown. Check the effect before retrying." } }, "ja": { "stringUnit": { "state": "translated", - "value": "エージェントフォーク" + "value": "コマンドの開始後 10 秒以内に cmux が応答しなかったため、結果は不明です。再試行する前に効果を確認してください。" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "命令开始后 10 秒内 cmux 没有响应,因此结果未知。请先确认效果再重试。" } }, "de": { "stringUnit": { "state": "translated", - "value": "Agent-Fork" + "value": "cmux hat innerhalb von 10 Sekunden nach dem Start des Befehls nicht geantwortet, das Ergebnis ist daher unbekannt. Prüfe die Auswirkung, bevor du es erneut versuchst." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Fork d’agent" + "value": "cmux n’a pas répondu dans les 10 secondes suivant le démarrage de la commande, son résultat est donc inconnu. Vérifiez l’effet avant de réessayer." } }, "ar": { "stringUnit": { "state": "translated", - "value": "تفريع الوكيل" + "value": "لم يستجب cmux خلال 10 ثوانٍ بعد بدء الأمر، لذا فإن نتيجته غير معروفة. تحقق من الأثر قبل إعادة المحاولة." } }, "es": { "stringUnit": { "state": "translated", - "value": "Fork del agente" + "value": "cmux no respondió en los 10 segundos posteriores al inicio del comando, por lo que su resultado es desconocido. Comprueba el efecto antes de reintentar." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "代理程式分支" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "代理分支" + "value": "命令開始後 10 秒內 cmux 沒有回應,因此結果未知。請先確認效果再重試。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "에이전트 포크" - } - }, - "bs": { - "stringUnit": { - "state": "translated", - "value": "Račvanje agenta" - } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Agentfork" + "value": "명령이 시작된 후 10초 안에 cmux가 응답하지 않아 결과를 알 수 없습니다. 다시 시도하기 전에 효과를 확인하세요." } - }, - "it": { + } + } + }, + "socket.mainActorHop.timeout.notRun": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Fork dell'agente" + "value": "cmux did not respond within 10 seconds, so the command was not run. Retry in a moment." } }, - "km": { + "ja": { "stringUnit": { "state": "translated", - "value": "ការបំបែកភ្នាក់ងារ" + "value": "cmux が 10 秒以内に応答しなかったため、コマンドは実行されませんでした。しばらくしてから再試行してください。" } }, - "nb": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Agentforgrening" + "value": "cmux 在 10 秒内没有响应,因此未运行该命令。请稍后重试。" } }, - "pl": { + "de": { "stringUnit": { "state": "translated", - "value": "Fork agenta" + "value": "cmux hat innerhalb von 10 Sekunden nicht geantwortet, der Befehl wurde daher nicht ausgeführt. Versuche es gleich noch einmal." } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Fork do agente" + "value": "cmux n’a pas répondu dans les 10 secondes, la commande n’a donc pas été exécutée. Réessayez dans un instant." } }, - "ru": { + "ar": { "stringUnit": { "state": "translated", - "value": "Форк агента" + "value": "لم يستجب cmux خلال 10 ثوانٍ، لذا لم يتم تنفيذ الأمر. أعد المحاولة بعد لحظات." } }, - "th": { + "es": { "stringUnit": { "state": "translated", - "value": "การแยกสาขาของเอเจนต์" + "value": "cmux no respondió en 10 segundos, por lo que el comando no se ejecutó. Reintenta en un momento." } }, - "tr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Ajan çatalı" + "value": "cmux 在 10 秒內沒有回應,因此未執行該命令。請稍後重試。" } }, - "uk": { + "ko": { "stringUnit": { "state": "translated", - "value": "Форк агента" + "value": "cmux가 10초 안에 응답하지 않아 명령이 실행되지 않았습니다. 잠시 후 다시 시도하세요." } } } }, - "socket.authTeam.committedStatusTimedOut": { + "socket.overloaded.message": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The team change was applied, but cmux did not report the updated status within 10 seconds. Run `cmux auth status` to confirm." + "value": "cmux is handling too many control-socket requests right now, so this one was not run. Retry in a moment." } }, "ja": { "stringUnit": { "state": "translated", - "value": "チームの変更は適用されましたが、cmux は 10 秒以内に更新後のステータスを報告しませんでした。`cmux auth status` を実行して確認してください。" + "value": "cmux は現在、制御ソケットの要求を処理しきれないため、この要求は実行されませんでした。しばらくしてから再試行してください。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "团队更改已应用,但 cmux 未能在 10 秒内报告更新后的状态。请运行 `cmux auth status` 确认。" + "value": "cmux 当前正在处理过多的控制套接字请求,因此未运行此请求。请稍后重试。" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die Teamänderung wurde übernommen, aber cmux hat den aktualisierten Status nicht innerhalb von 10 Sekunden gemeldet. Führe `cmux auth status` aus, um es zu prüfen." + "value": "cmux verarbeitet gerade zu viele Control-Socket-Anfragen, diese wurde daher nicht ausgeführt. Versuche es gleich noch einmal." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Le changement d’équipe a été appliqué, mais cmux n’a pas signalé le statut mis à jour dans les 10 secondes. Exécutez `cmux auth status` pour confirmer." + "value": "cmux traite actuellement trop de requêtes du socket de contrôle, celle-ci n’a donc pas été exécutée. Réessayez dans un instant." } }, "ar": { "stringUnit": { "state": "translated", - "value": "تم تطبيق تغيير الفريق، لكن cmux لم يُبلّغ عن الحالة المحدّثة خلال 10 ثوانٍ. شغّل `cmux auth status` للتأكيد." + "value": "يعالج cmux حاليًا عددًا كبيرًا جدًا من طلبات مقبس التحكم، لذا لم يتم تنفيذ هذا الطلب. أعد المحاولة بعد لحظات." } }, "es": { "stringUnit": { "state": "translated", - "value": "El cambio de equipo se aplicó, pero cmux no informó el estado actualizado en 10 segundos. Ejecuta `cmux auth status` para confirmarlo." + "value": "cmux está gestionando demasiadas solicitudes del socket de control ahora mismo, por lo que esta no se ejecutó. Reintenta en un momento." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "團隊變更已套用,但 cmux 未能在 10 秒內回報更新後的狀態。請執行 `cmux auth status` 確認。" + "value": "cmux 目前正在處理過多的控制 socket 請求,因此未執行此請求。請稍後重試。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팀 변경은 적용되었지만 cmux가 10초 안에 업데이트된 상태를 보고하지 않았습니다. `cmux auth status`를 실행해 확인하세요." + "value": "cmux가 지금 너무 많은 제어 소켓 요청을 처리하고 있어 이 요청은 실행되지 않았습니다. 잠시 후 다시 시도하세요." } } } }, - "cli.browser.inputFiles.error.usage": { + "socket.request.cancelled": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "set-input-files requires --selector and either --file (repeatable) or --clear" + "value": "Request was cancelled" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يتطلب set-input-files الخيار --selector مع --file (يمكن تكراره) أو --clear" + "value": "リクエストはキャンセルされました" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "set-input-files benötigt --selector und entweder --file (wiederholbar) oder --clear" + "value": "请求已取消" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "set-input-files requiere --selector y --file (repetible) o --clear" + "value": "Die Anfrage wurde abgebrochen" } }, "fr": { "stringUnit": { "state": "translated", - "value": "set-input-files nécessite --selector et soit --file (répétable), soit --clear" + "value": "La requête a été annulée" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "set-input-files には --selector と、--file (複数指定可)または --clear が必要です" + "value": "تم إلغاء الطلب" } }, - "ko": { + "es": { "stringUnit": { "state": "translated", - "value": "set-input-files에는 --selector 와 --file (반복 가능) 또는 --clear가 필요합니다" + "value": "Se canceló la solicitud" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "set-input-files 需要 --selector ,以及 --file (可重复)或 --clear" + "value": "請求已取消" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "set-input-files 需要 --selector ,以及 --file (可重複)或 --clear" + "value": "요청이 취소되었습니다" } } } }, - "cli.browser.inputFiles.help": { + "socket.request.failedBeforeResult": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Select local files (up to 128 files, 32 MiB total) or clear the selection. Directory uploads are unsupported." + "value": "Request failed before returning a result" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n اختر ملفات محلية (حتى 128 ملفًا بإجمالي 32 MiB) أو امسح الاختيار. رفع المجلدات غير مدعوم." + "value": "結果を返す前にリクエストが失敗しました" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Lokale Dateien auswählen (bis zu 128 Dateien, insgesamt 32 MiB) oder die Auswahl leeren. Ordner-Uploads werden nicht unterstützt." + "value": "请求在返回结果之前失败" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Selecciona archivos locales (hasta 128 archivos, 32 MiB en total) o borra la selección. No se admite subir carpetas." + "value": "Die Anfrage ist fehlgeschlagen, bevor ein Ergebnis zurückgegeben wurde" } }, "fr": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Sélectionner des fichiers locaux (jusqu’à 128 fichiers, 32 MiB au total) ou effacer la sélection. L’envoi de dossiers n’est pas pris en charge." + "value": "La requête a échoué avant de renvoyer un résultat" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n ローカルファイルを選択(最大128個、合計32 MiB)するか、選択を解除します。ディレクトリのアップロードには対応していません。" + "value": "فشل الطلب قبل إرجاع نتيجة" } }, - "ko": { + "es": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 로컬 파일을 선택하거나(최대 128개, 총 32 MiB) 선택을 지웁니다. 디렉터리 업로드는 지원되지 않습니다." + "value": "La solicitud falló antes de devolver un resultado" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 选择本地文件(最多 128 个文件,总计 32 MiB)或清除选择。不支持上传目录。" + "value": "請求在傳回結果之前失敗" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 選取本機檔案(最多 128 個檔案,總計 32 MiB)或清除選取。不支援上傳目錄。" + "value": "결과를 반환하기 전에 요청이 실패했습니다" } } } }, - "browser.inputFiles.error.invalidTarget": { + "agent.codex.fork.notice.body": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The selector must match a file input without directory selection" + "value": "cmux could not identify the new fork session. Start the fork again from the parent pane." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يجب أن يطابق المحدد حقل إدخال ملفات لا يستخدم اختيار المجلدات" + "value": "cmux は新しいフォーク セッションを特定できませんでした。親ペインからもう一度フォークしてください。" } }, "de": { "stringUnit": { "state": "translated", - "value": "Der Selektor muss ein Dateieingabefeld ohne Ordnerauswahl treffen" + "value": "cmux konnte die neue Fork-Sitzung nicht erkennen. Starten Sie den Fork erneut im übergeordneten Pane." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "cmux n’a pas pu identifier la nouvelle session forkée. Relancez le fork depuis le volet parent." + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تعذر على cmux تحديد جلسة التفريع الجديدة. ابدأ التفريع مرة أخرى من الجزء الأصلي." } }, "es": { "stringUnit": { "state": "translated", - "value": "El selector debe coincidir con un campo de archivos sin selección de carpetas" + "value": "cmux no pudo identificar la nueva sesión bifurcada. Inicia el fork de nuevo desde el panel principal." } }, - "fr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Le sélecteur doit correspondre à un champ de fichier sans sélection de dossier" + "value": "cmux 無法識別新的分支工作階段。請從父窗格重新開始分支。" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "セレクターはディレクトリ選択を使わないファイル入力欄に一致する必要があります" + "value": "cmux 无法识别新的分支会话。请从父窗格重新开始分支。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "선택자는 디렉터리 선택이 없는 파일 입력 요소와 일치해야 합니다" + "value": "cmux가 새 포크 세션을 식별하지 못했습니다. 부모 패널에서 포크를 다시 시작하세요." } }, - "zh-Hans": { + "bs": { "stringUnit": { "state": "translated", - "value": "选择器必须匹配未启用目录选择的文件输入字段" + "value": "cmux nije mogao prepoznati novu sesiju račvanja. Ponovo pokrenite račvanje iz nadređenog okna." } }, - "zh-Hant": { + "da": { "stringUnit": { "state": "translated", - "value": "選取器必須符合未啟用目錄選取的檔案輸入欄位" + "value": "cmux kunne ikke identificere den nye forgreningssession. Start forgreningen igen fra forældreruden." } - } - } - }, - "browser.inputFiles.error.multipleRequired": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "This file input does not allow multiple files" + "value": "cmux non ha potuto identificare la nuova sessione fork. Avvia di nuovo il fork dal riquadro principale." } }, - "ar": { + "km": { "stringUnit": { "state": "translated", - "value": "لا يسمح حقل إدخال الملفات هذا باختيار عدة ملفات" + "value": "cmux មិនអាចកំណត់អត្តសញ្ញាណសម័យ fork ថ្មីបានទេ។ ចាប់ផ្ដើម fork ម្ដងទៀតពីផ្ទាំងមេ។" } }, - "de": { + "nb": { "stringUnit": { "state": "translated", - "value": "Dieses Dateieingabefeld erlaubt nicht mehrere Dateien" + "value": "cmux kunne ikke identifisere den nye forgreningsøkten. Start forgreningen på nytt fra den overordnede ruten." } }, - "es": { + "pl": { "stringUnit": { "state": "translated", - "value": "Este campo de archivos no permite seleccionar varios archivos" + "value": "cmux nie mógł zidentyfikować nowej sesji forka. Uruchom fork ponownie z panelu nadrzędnego." } }, - "fr": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Ce champ de fichier ne permet pas de sélectionner plusieurs fichiers" + "value": "O cmux não conseguiu identificar a nova sessão bifurcada. Inicie o fork novamente no painel principal." } }, - "ja": { + "ru": { "stringUnit": { "state": "translated", - "value": "このファイル入力欄では複数のファイルを選択できません" + "value": "cmux не удалось определить новый сеанс форка. Запустите форк снова из родительской панели." } }, - "ko": { + "th": { "stringUnit": { "state": "translated", - "value": "이 파일 입력 요소는 여러 파일을 허용하지 않습니다" + "value": "cmux ไม่สามารถระบุเซสชันที่แยกใหม่ได้ เริ่มการแยกอีกครั้งจากบานหน้าต่างหลัก" } }, - "zh-Hans": { + "tr": { "stringUnit": { "state": "translated", - "value": "此文件输入字段不允许选择多个文件" + "value": "cmux yeni fork oturumunu belirleyemedi. Fork'u üst panelden yeniden başlatın." } }, - "zh-Hant": { + "uk": { "stringUnit": { "state": "translated", - "value": "此檔案輸入欄位不允許選取多個檔案" + "value": "cmux не вдалося визначити новий сеанс форка. Запустіть форк ще раз із батьківської панелі." } } } }, - "browser.inputFiles.error.cancelled": { + "agent.codex.fork.notice.parentClearFailed.body": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "File upload preparation was cancelled" + "value": "cmux could not safely bind the new fork session. Retry the fork from the parent pane." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "تم إلغاء تجهيز الملفات للرفع" + "value": "cmux は新しいフォーク セッションを安全にバインドできませんでした。親ペインからもう一度フォークしてください。" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die Vorbereitung des Datei-Uploads wurde abgebrochen" + "value": "cmux konnte die neue Fork-Sitzung nicht sicher binden. Starten Sie den Fork erneut im übergeordneten Pane." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "cmux n’a pas pu lier la nouvelle session forkée en toute sécurité. Relancez le fork depuis le volet parent." + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تعذر على cmux ربط جلسة التفريع الجديدة بأمان. أعد بدء التفريع من الجزء الأصلي." } }, "es": { "stringUnit": { "state": "translated", - "value": "Se canceló la preparación de los archivos para subir" + "value": "cmux no pudo vincular de forma segura la nueva sesión bifurcada. Inicia el fork de nuevo desde el panel principal." } }, - "fr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "La préparation des fichiers à envoyer a été annulée" + "value": "cmux 無法安全繫結新的分支工作階段。請從父窗格重新開始分支。" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "ファイルのアップロード準備がキャンセルされました" + "value": "cmux 无法安全绑定新的分支会话。请从父窗格重新开始分支。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "파일 업로드 준비가 취소되었습니다" + "value": "cmux가 새 포크 세션을 안전하게 연결하지 못했습니다. 부모 패널에서 포크를 다시 시작하세요." } }, - "zh-Hans": { + "bs": { "stringUnit": { "state": "translated", - "value": "已取消准备上传文件" + "value": "cmux nije mogao sigurno povezati novu sesiju račvanja. Ponovo pokrenite račvanje iz nadređenog okna." } }, - "zh-Hant": { + "da": { "stringUnit": { "state": "translated", - "value": "已取消準備上傳檔案" + "value": "cmux kunne ikke binde den nye forgreningssession sikkert. Start forgreningen igen fra forældreruden." } - } - } - }, - "browser.inputFiles.error.invalidParameters": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "set-input-files requires a selector and a files array of absolute paths" + "value": "cmux non ha potuto associare in sicurezza la nuova sessione fork. Avvia di nuovo il fork dal riquadro principale." } }, - "ar": { + "km": { "stringUnit": { "state": "translated", - "value": "يتطلب set-input-files محددًا ومصفوفة files تحتوي على مسارات مطلقة" + "value": "cmux មិនអាចភ្ជាប់សម័យ fork ថ្មីដោយសុវត្ថិភាពបានទេ។ ចាប់ផ្ដើម fork ម្ដងទៀតពីផ្ទាំងមេ។" } }, - "de": { + "nb": { "stringUnit": { "state": "translated", - "value": "set-input-files benötigt einen Selektor und ein files-Array mit absoluten Pfaden" + "value": "cmux kunne ikke binde den nye forgreningsøkten på en trygg måte. Start forgreningen på nytt fra den overordnede ruten." } }, - "es": { + "pl": { "stringUnit": { "state": "translated", - "value": "set-input-files requiere un selector y una matriz files de rutas absolutas" + "value": "cmux nie mógł bezpiecznie powiązać nowej sesji forka. Uruchom fork ponownie z panelu nadrzędnego." } }, - "fr": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "set-input-files nécessite un sélecteur et un tableau files de chemins absolus" + "value": "O cmux não conseguiu vincular com segurança a nova sessão bifurcada. Inicie o fork novamente no painel principal." } }, - "ja": { + "ru": { "stringUnit": { "state": "translated", - "value": "set-input-files にはセレクターと絶対パスを含む files 配列が必要です" + "value": "cmux не удалось безопасно привязать новый сеанс форка. Запустите форк снова из родительской панели." } }, - "ko": { + "th": { "stringUnit": { "state": "translated", - "value": "set-input-files에는 선택자와 절대 경로로 구성된 files 배열이 필요합니다" + "value": "cmux ไม่สามารถผูกเซสชันที่แยกใหม่ได้อย่างปลอดภัย เริ่มการแยกอีกครั้งจากบานหน้าต่างหลัก" } }, - "zh-Hans": { + "tr": { "stringUnit": { "state": "translated", - "value": "set-input-files 需要选择器及包含绝对路径的 files 数组" + "value": "cmux yeni fork oturumunu güvenli bir şekilde bağlayamadı. Fork'u üst panelden yeniden başlatın." } }, - "zh-Hant": { + "uk": { "stringUnit": { "state": "translated", - "value": "set-input-files 需要選取器及包含絕對路徑的 files 陣列" + "value": "cmux не вдалося безпечно прив’язати новий сеанс форка. Запустіть форк ще раз із батьківської панелі." } } } }, - "browser.inputFiles.error.invalidSelection": { + "agent.codex.fork.notice.subtitle": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Select at most 128 files using absolute paths" + "value": "Fork unavailable" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "اختر ما يصل إلى 128 ملفًا باستخدام مسارات مطلقة" + "value": "フォークを利用できません" } }, "de": { "stringUnit": { "state": "translated", - "value": "Wählen Sie höchstens 128 Dateien mit absoluten Pfaden aus" + "value": "Fork nicht verfügbar" } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "Selecciona como máximo 128 archivos mediante rutas absolutas" + "value": "Fork indisponible" } }, - "fr": { + "ar": { "stringUnit": { "state": "translated", - "value": "Sélectionnez au maximum 128 fichiers avec des chemins absolus" + "value": "التفريع غير متاح" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "絶対パスで最大128個のファイルを選択してください" + "value": "Fork no disponible" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "절대 경로를 사용하여 최대 128개의 파일을 선택하세요" + "value": "無法使用分支" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "请使用绝对路径选择最多 128 个文件" + "value": "分支不可用" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "請使用絕對路徑選取最多 128 個檔案" + "value": "포크를 사용할 수 없음" } - } - } - }, - "browser.inputFiles.error.timeout": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "bs": { "stringUnit": { "state": "translated", - "value": "Timed out preparing files for upload" + "value": "Račvanje nije dostupno" } }, - "ar": { + "da": { "stringUnit": { "state": "translated", - "value": "انتهت مهلة تجهيز الملفات للرفع" + "value": "Fork ikke tilgængelig" } }, - "de": { + "it": { "stringUnit": { "state": "translated", - "value": "Zeitüberschreitung beim Vorbereiten der Dateien für den Upload" + "value": "Fork non disponibile" } }, - "es": { + "km": { "stringUnit": { "state": "translated", - "value": "Se agotó el tiempo de preparación de los archivos para subir" + "value": "មិនអាចប្រើការបំបែកបាន" } }, - "fr": { + "nb": { "stringUnit": { "state": "translated", - "value": "Le délai de préparation des fichiers à envoyer a été dépassé" + "value": "Fork utilgjengelig" } }, - "ja": { + "pl": { "stringUnit": { "state": "translated", - "value": "アップロードするファイルの準備がタイムアウトしました" + "value": "Fork niedostępny" } }, - "ko": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "업로드할 파일 준비 시간이 초과되었습니다" + "value": "Fork indisponível" } }, - "zh-Hans": { + "ru": { "stringUnit": { "state": "translated", - "value": "准备上传文件超时" + "value": "Форк недоступен" } }, - "zh-Hant": { + "th": { "stringUnit": { "state": "translated", - "value": "準備上傳檔案逾時" + "value": "ไม่สามารถใช้การแยกสาขาได้" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Fork kullanılamıyor" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Форк недоступний" } } } }, - "browser.inputFiles.error.tooLarge": { + "agent.codex.fork.notice.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The combined upload must be no larger than 32 MiB" + "value": "Agent fork" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يجب ألا يتجاوز الحجم الإجمالي للملفات المرفوعة 32 MiB" + "value": "エージェントフォーク" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die Uploads dürfen insgesamt nicht größer als 32 MiB sein" + "value": "Agent-Fork" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fork d’agent" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تفريع الوكيل" } }, "es": { "stringUnit": { "state": "translated", - "value": "El tamaño total de los archivos para subir no debe superar los 32 MiB" + "value": "Fork del agente" } }, - "fr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "La taille totale des fichiers à envoyer ne doit pas dépasser 32 MiB" + "value": "代理程式分支" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "アップロードするファイルの合計サイズは32 MiB以下にしてください" + "value": "代理分支" } }, "ko": { "stringUnit": { "state": "translated", - "value": "전체 업로드 크기는 32 MiB를 초과할 수 없습니다" + "value": "에이전트 포크" } }, - "zh-Hans": { + "bs": { "stringUnit": { "state": "translated", - "value": "上传文件的总大小不得超过 32 MiB" + "value": "Račvanje agenta" } }, - "zh-Hant": { + "da": { "stringUnit": { "state": "translated", - "value": "上傳檔案的總大小不得超過 32 MiB" + "value": "Agentfork" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Fork dell'agente" + } + }, + "km": { + "stringUnit": { + "state": "translated", + "value": "ការបំបែកភ្នាក់ងារ" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Agentforgrening" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Fork agenta" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Fork do agente" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Форк агента" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การแยกสาขาของเอเจนต์" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Ajan çatalı" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Форк агента" } } } }, - "browser.inputFiles.error.unreadableFile": { + "socket.authTeam.committedStatusTimedOut": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Every upload path must be a readable regular file" + "value": "The team change was applied, but cmux did not report the updated status within 10 seconds. Run `cmux auth status` to confirm." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يجب أن يشير كل مسار للرفع إلى ملف عادي قابل للقراءة" + "value": "チームの変更は適用されましたが、cmux は 10 秒以内に更新後のステータスを報告しませんでした。`cmux auth status` を実行して確認してください。" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Jeder Upload-Pfad muss auf eine lesbare reguläre Datei verweisen" + "value": "团队更改已应用,但 cmux 未能在 10 秒内报告更新后的状态。请运行 `cmux auth status` 确认。" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Cada ruta de subida debe apuntar a un archivo normal que se pueda leer" + "value": "Die Teamänderung wurde übernommen, aber cmux hat den aktualisierten Status nicht innerhalb von 10 Sekunden gemeldet. Führe `cmux auth status` aus, um es zu prüfen." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Chaque chemin à envoyer doit désigner un fichier ordinaire lisible" + "value": "Le changement d’équipe a été appliqué, mais cmux n’a pas signalé le statut mis à jour dans les 10 secondes. Exécutez `cmux auth status` pour confirmer." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "各アップロードパスは読み取り可能な通常ファイルである必要があります" + "value": "تم تطبيق تغيير الفريق، لكن cmux لم يُبلّغ عن الحالة المحدّثة خلال 10 ثوانٍ. شغّل `cmux auth status` للتأكيد." } }, - "ko": { + "es": { "stringUnit": { "state": "translated", - "value": "모든 업로드 경로는 읽을 수 있는 일반 파일이어야 합니다" + "value": "El cambio de equipo se aplicó, pero cmux no informó el estado actualizado en 10 segundos. Ejecuta `cmux auth status` para confirmarlo." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "每个上传路径都必须指向可读取的普通文件" + "value": "團隊變更已套用,但 cmux 未能在 10 秒內回報更新後的狀態。請執行 `cmux auth status` 確認。" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "每個上傳路徑都必須指向可讀取的一般檔案" + "value": "팀 변경은 적용되었지만 cmux가 10초 안에 업데이트된 상태를 보고하지 않았습니다. `cmux auth status`를 실행해 확인하세요." } } } @@ -571451,8536 +571486,8581 @@ } } }, - "cloudTree.group.cloudMachines.usage": { + "cli.browser.inputFiles.error.usage": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files requires --selector and either --file (repeatable) or --clear" } }, - "fr": { + "ar": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "يتطلب set-input-files الخيار --selector مع --file (يمكن تكراره) أو --clear" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files benötigt --selector und entweder --file (wiederholbar) oder --clear" } }, "es": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files requiere --selector y --file (repetible) o --clear" } }, - "zh-Hant": { + "fr": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files nécessite --selector et soit --file (répétable), soit --clear" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files には --selector と、--file (複数指定可)または --clear が必要です" } }, "ko": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files에는 --selector 와 --file (반복 가능) 또는 --clear가 필요합니다" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files 需要 --selector ,以及 --file (可重复)或 --clear" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files 需要 --selector ,以及 --file (可重複)或 --clear" } - }, - "it": { + } + } + }, + "cli.browser.inputFiles.help": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Select local files (up to 128 files, 32 MiB total) or clear the selection. Directory uploads are unsupported." } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n اختر ملفات محلية (حتى 128 ملفًا بإجمالي 32 MiB) أو امسح الاختيار. رفع المجلدات غير مدعوم." } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Lokale Dateien auswählen (bis zu 128 Dateien, insgesamt 32 MiB) oder die Auswahl leeren. Ordner-Uploads werden nicht unterstützt." } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Selecciona archivos locales (hasta 128 archivos, 32 MiB en total) o borra la selección. No se admite subir carpetas." } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n Sélectionner des fichiers locaux (jusqu’à 128 fichiers, 32 MiB au total) ou effacer la sélection. L’envoi de dossiers n’est pas pris en charge." } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n ローカルファイルを選択(最大128個、合計32 MiB)するか、選択を解除します。ディレクトリのアップロードには対応していません。" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 로컬 파일을 선택하거나(최대 128개, 총 32 MiB) 선택을 지웁니다. 디렉터리 업로드는 지원되지 않습니다." } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 选择本地文件(最多 128 个文件,总计 32 MiB)或清除选择。不支持上传目录。" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "%1$d/%2$d" + "value": "set-input-files --selector (--file ... | --clear) [--snapshot-after]\n 選取本機檔案(最多 128 個檔案,總計 32 MiB)或清除選取。不支援上傳目錄。" } } } }, - "shortcut.diffViewerNextHunk.label": { + "browser.inputFiles.error.invalidTarget": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Diff Viewer: Next Hunk" + "value": "The selector must match a file input without directory selection" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "差分ビューア: 次のハンク" + "value": "يجب أن يطابق المحدد حقل إدخال ملفات لا يستخدم اختيار المجلدات" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "差异查看器:下一个块" + "value": "Der Selektor muss ein Dateieingabefeld ohne Ordnerauswahl treffen" } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "Diff-Viewer: Nächster Hunk" + "value": "El selector debe coincidir con un campo de archivos sin selección de carpetas" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Visionneuse de diff : Bloc suivant" + "value": "Le sélecteur doit correspondre à un champ de fichier sans sélection de dossier" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "عارض الفروق: المقطع التالي" + "value": "セレクターはディレクトリ選択を使わないファイル入力欄に一致する必要があります" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "Visor de diff: Siguiente bloque" + "value": "선택자는 디렉터리 선택이 없는 파일 입력 요소와 일치해야 합니다" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "差異檢視器:下一個區塊" + "value": "选择器必须匹配未启用目录选择的文件输入字段" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "비교 뷰어: 다음 헝크" + "value": "選取器必須符合未啟用目錄選取的檔案輸入欄位" } } } }, - "shortcut.diffViewerPreviousHunk.label": { + "browser.inputFiles.error.multipleRequired": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Diff Viewer: Previous Hunk" + "value": "This file input does not allow multiple files" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "差分ビューア: 前のハンク" + "value": "لا يسمح حقل إدخال الملفات هذا باختيار عدة ملفات" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "差异查看器:上一个块" + "value": "Dieses Dateieingabefeld erlaubt nicht mehrere Dateien" } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "Diff-Viewer: Vorheriger Hunk" + "value": "Este campo de archivos no permite seleccionar varios archivos" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Visionneuse de diff : Bloc précédent" + "value": "Ce champ de fichier ne permet pas de sélectionner plusieurs fichiers" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "عارض الفروق: المقطع السابق" + "value": "このファイル入力欄では複数のファイルを選択できません" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "Visor de diff: Bloque anterior" + "value": "이 파일 입력 요소는 여러 파일을 허용하지 않습니다" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "差異檢視器:上一個區塊" + "value": "此文件输入字段不允许选择多个文件" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "비교 뷰어: 이전 헝크" + "value": "此檔案輸入欄位不允許選取多個檔案" } } } }, - "shortcut.diffViewerToggleViewed.label": { + "browser.inputFiles.error.cancelled": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Diff Viewer: Toggle Viewed" + "value": "File upload preparation was cancelled" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "差分ビューア: 確認済みを切り替え" + "value": "تم إلغاء تجهيز الملفات للرفع" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "差异查看器:切换已查看" + "value": "Die Vorbereitung des Datei-Uploads wurde abgebrochen" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "差異檢視器:切換已檢視" + "value": "Se canceló la preparación de los archivos para subir" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Diff-Viewer: Angesehen umschalten" + "value": "La préparation des fichiers à envoyer a été annulée" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Visionneuse de diff : Basculer « vu »" + "value": "ファイルのアップロード準備がキャンセルされました" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "عارض الفروق: تبديل حالة المشاهدة" + "value": "파일 업로드 준비가 취소되었습니다" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Visor de diff: Alternar visto" + "value": "已取消准备上传文件" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "차이 뷰어: 확인함 전환" + "value": "已取消準備上傳檔案" } } } }, - "diffViewer.viewed": { + "browser.inputFiles.error.invalidParameters": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Viewed" + "value": "set-input-files requires a selector and a files array of absolute paths" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "確認済み" + "value": "يتطلب set-input-files محددًا ومصفوفة files تحتوي على مسارات مطلقة" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "已查看" + "value": "set-input-files benötigt einen Selektor und ein files-Array mit absoluten Pfaden" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "已檢視" + "value": "set-input-files requiere un selector y una matriz files de rutas absolutas" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Angesehen" + "value": "set-input-files nécessite un sélecteur et un tableau files de chemins absolus" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Vu" + "value": "set-input-files にはセレクターと絶対パスを含む files 配列が必要です" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "تمت المشاهدة" + "value": "set-input-files에는 선택자와 절대 경로로 구성된 files 배열이 필요합니다" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Visto" + "value": "set-input-files 需要选择器及包含绝对路径的 files 数组" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "확인함" + "value": "set-input-files 需要選取器及包含絕對路徑的 files 陣列" } } } }, - "diffViewer.markViewed": { + "browser.inputFiles.error.invalidSelection": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Mark as viewed" + "value": "Select at most 128 files using absolute paths" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "確認済みにする" + "value": "اختر ما يصل إلى 128 ملفًا باستخدام مسارات مطلقة" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "标记为已查看" + "value": "Wählen Sie höchstens 128 Dateien mit absoluten Pfaden aus" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "標記為已檢視" + "value": "Selecciona como máximo 128 archivos mediante rutas absolutas" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Als angesehen markieren" + "value": "Sélectionnez au maximum 128 fichiers avec des chemins absolus" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Marquer comme vu" + "value": "絶対パスで最大128個のファイルを選択してください" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "وضع علامة تمت المشاهدة" + "value": "절대 경로를 사용하여 최대 128개의 파일을 선택하세요" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Marcar como visto" + "value": "请使用绝对路径选择最多 128 个文件" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "확인함으로 표시" + "value": "請使用絕對路徑選取最多 128 個檔案" } } } }, - "diffViewer.markNotViewed": { + "browser.inputFiles.error.timeout": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Mark as not viewed" + "value": "Timed out preparing files for upload" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "未確認にする" + "value": "انتهت مهلة تجهيز الملفات للرفع" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "标记为未查看" + "value": "Zeitüberschreitung beim Vorbereiten der Dateien für den Upload" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "標記為未檢視" + "value": "Se agotó el tiempo de preparación de los archivos para subir" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Als nicht angesehen markieren" + "value": "Le délai de préparation des fichiers à envoyer a été dépassé" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Marquer comme non vu" + "value": "アップロードするファイルの準備がタイムアウトしました" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "إزالة علامة تمت المشاهدة" + "value": "업로드할 파일 준비 시간이 초과되었습니다" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Marcar como no visto" + "value": "准备上传文件超时" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "확인 안 함으로 표시" + "value": "準備上傳檔案逾時" } } } }, - "diffViewer.changedSinceViewed": { + "browser.inputFiles.error.tooLarge": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Changed since viewed" + "value": "The combined upload must be no larger than 32 MiB" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "確認後に変更あり" + "value": "يجب ألا يتجاوز الحجم الإجمالي للملفات المرفوعة 32 MiB" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "查看后已更改" + "value": "Die Uploads dürfen insgesamt nicht größer als 32 MiB sein" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "檢視後已變更" + "value": "El tamaño total de los archivos para subir no debe superar los 32 MiB" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Seit dem Ansehen geändert" + "value": "La taille totale des fichiers à envoyer ne doit pas dépasser 32 MiB" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Modifié depuis la consultation" + "value": "アップロードするファイルの合計サイズは32 MiB以下にしてください" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "تغيّر منذ المشاهدة" + "value": "전체 업로드 크기는 32 MiB를 초과할 수 없습니다" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Cambiado desde que se vio" + "value": "上传文件的总大小不得超过 32 MiB" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "확인 후 변경됨" + "value": "上傳檔案的總大小不得超過 32 MiB" } } } }, - "diffViewer.filesViewedProgress": { + "browser.inputFiles.error.unreadableFile": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "{viewed} of {total} files viewed" + "value": "Every upload path must be a readable regular file" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "{total} 件中 {viewed} 件のファイルを確認済み" + "value": "يجب أن يشير كل مسار للرفع إلى ملف عادي قابل للقراءة" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "已查看 {viewed}/{total} 个文件" + "value": "Jeder Upload-Pfad muss auf eine lesbare reguläre Datei verweisen" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "已檢視 {viewed}/{total} 個檔案" + "value": "Cada ruta de subida debe apuntar a un archivo normal que se pueda leer" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "{viewed} von {total} Dateien angesehen" + "value": "Chaque chemin à envoyer doit désigner un fichier ordinaire lisible" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "{viewed} fichiers sur {total} vus" + "value": "各アップロードパスは読み取り可能な通常ファイルである必要があります" } }, - "ar": { + "ko": { "stringUnit": { "state": "translated", - "value": "تمت مشاهدة {viewed} من {total} ملفات" + "value": "모든 업로드 경로는 읽을 수 있는 일반 파일이어야 합니다" } }, - "es": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "{viewed} de {total} archivos vistos" + "value": "每个上传路径都必须指向可读取的普通文件" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "{total}개 중 {viewed}개 파일 확인함" + "value": "每個上傳路徑都必須指向可讀取的一般檔案" } } } }, - "diffViewer.filterFiles": { + "cloudTree.group.cloudMachines.usage": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Filter files" + "value": "%1$d/%2$d" } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "ファイルを絞り込む" + "value": "%1$d/%2$d" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "筛选文件" + "value": "%1$d/%2$d" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "%1$d/%2$d" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$d/%2$d" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "篩選檔案" + "value": "%1$d/%2$d" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Dateien filtern" + "value": "%1$d/%2$d" } }, - "fr": { + "ko": { "stringUnit": { "state": "translated", - "value": "Filtrer les fichiers" + "value": "%1$d/%2$d" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "تصفية الملفات" + "value": "%1$d/%2$d" } }, - "es": { + "bs": { "stringUnit": { "state": "translated", - "value": "Filtrar archivos" + "value": "%1$d/%2$d" } }, - "ko": { + "da": { "stringUnit": { "state": "translated", - "value": "파일 필터" + "value": "%1$d/%2$d" } - } - } - }, - "diffViewer.filterAddedFiles": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "Added" + "value": "%1$d/%2$d" } }, - "ja": { + "km": { "stringUnit": { "state": "translated", - "value": "追加" + "value": "%1$d/%2$d" } }, - "zh-Hans": { + "nb": { "stringUnit": { "state": "translated", - "value": "新增" + "value": "%1$d/%2$d" } }, - "zh-Hant": { + "pl": { "stringUnit": { "state": "translated", - "value": "新增" + "value": "%1$d/%2$d" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Hinzugefügt" + "value": "%1$d/%2$d" } }, - "fr": { + "ru": { "stringUnit": { "state": "translated", - "value": "Ajoutés" + "value": "%1$d/%2$d" } }, - "ar": { + "th": { "stringUnit": { "state": "translated", - "value": "مضافة" + "value": "%1$d/%2$d" } }, - "es": { + "tr": { "stringUnit": { "state": "translated", - "value": "Añadidos" + "value": "%1$d/%2$d" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "추가됨" + "value": "%1$d/%2$d" } } } }, - "diffViewer.filterModifiedFiles": { + "cloud.ports.vpnOff.explanation": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Modified" + "value": "Ports open in cmux without setup. To use private addresses in other apps, set up Cloud VPN." } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "変更" + "value": "Ports lassen sich in cmux ohne Einrichtung öffnen. Richte Cloud-VPN ein, um private Adressen in anderen Apps zu verwenden." } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "已修改" + "value": "Les ports s’ouvrent dans cmux sans configuration. Pour utiliser les adresses privées dans d’autres apps, configurez le VPN Cloud." } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "已修改" + "value": "تُفتح المنافذ في cmux دون إعداد. لاستخدام العناوين الخاصة في التطبيقات الأخرى، أعدّ Cloud VPN." } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "Geändert" + "value": "Los puertos se abren en cmux sin configuración. Para usar direcciones privadas en otras apps, configura Cloud VPN." } }, - "fr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Modifiés" + "value": "無需設定即可在 cmux 中開啟連接埠。如要在其他 App 使用私有位址,請設定 Cloud VPN。" } }, - "ar": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "معدّلة" + "value": "无需设置即可在 cmux 中打开端口。要在其他应用中使用私有地址,请设置云 VPN。" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "Modificados" + "value": "별도 설정 없이 cmux에서 포트를 열 수 있습니다. 다른 앱에서 비공개 주소를 사용하려면 Cloud VPN을 설정하세요." } }, - "ko": { + "ja": { "stringUnit": { "state": "translated", - "value": "수정됨" + "value": "設定なしで cmux 内のポートを開けます。他のアプリでプライベートアドレスを使うには、Cloud VPN を設定してください。" } - } - } - }, - "diffViewer.filterDeletedFiles": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "bs": { "stringUnit": { - "state": "translated", - "value": "Deleted" + "state": "needs_review", + "value": "Portovi se otvaraju u cmux-u bez podešavanja. Za korištenje privatnih adresa u drugim aplikacijama podesite Cloud VPN." } }, - "ja": { + "da": { "stringUnit": { - "state": "translated", - "value": "削除" + "state": "needs_review", + "value": "Porte åbnes i cmux uden opsætning. Opsæt Cloud VPN for at bruge private adresser i andre apps." } }, - "zh-Hans": { + "it": { "stringUnit": { - "state": "translated", - "value": "已删除" + "state": "needs_review", + "value": "Le porte si aprono in cmux senza configurazione. Per usare gli indirizzi privati in altre app, configura Cloud VPN." } }, - "zh-Hant": { + "km": { "stringUnit": { - "state": "translated", - "value": "已刪除" + "state": "needs_review", + "value": "ច្រកអាចបើកក្នុង cmux ដោយមិនចាំបាច់រៀបចំ។ ដើម្បីប្រើអាសយដ្ឋានឯកជនក្នុងកម្មវិធីផ្សេងទៀត សូមរៀបចំ Cloud VPN។" } }, - "de": { + "nb": { "stringUnit": { - "state": "translated", - "value": "Gelöscht" + "state": "needs_review", + "value": "Porter åpnes i cmux uten oppsett. Sett opp Cloud VPN for å bruke private adresser i andre apper." } }, - "fr": { + "pl": { "stringUnit": { - "state": "translated", - "value": "Supprimés" + "state": "needs_review", + "value": "Porty otwierają się w cmux bez konfiguracji. Aby używać prywatnych adresów w innych aplikacjach, skonfiguruj Cloud VPN." } }, - "ar": { + "pt-BR": { "stringUnit": { - "state": "translated", - "value": "محذوفة" + "state": "needs_review", + "value": "As portas abrem no cmux sem configuração. Para usar endereços privados em outros apps, configure o Cloud VPN." } }, - "es": { + "ru": { "stringUnit": { - "state": "translated", - "value": "Eliminados" + "state": "needs_review", + "value": "Порты открываются в cmux без настройки. Чтобы использовать приватные адреса в других приложениях, настройте Cloud VPN." } }, - "ko": { + "th": { "stringUnit": { - "state": "translated", - "value": "삭제됨" + "state": "needs_review", + "value": "เปิดพอร์ตใน cmux ได้โดยไม่ต้องตั้งค่า หากต้องการใช้ที่อยู่ส่วนตัวในแอปอื่น ให้ตั้งค่า Cloud VPN" + } + }, + "tr": { + "stringUnit": { + "state": "needs_review", + "value": "Bağlantı noktaları cmux içinde kurulum gerektirmeden açılır. Diğer uygulamalarda özel adresleri kullanmak için Cloud VPN’i kurun." + } + }, + "uk": { + "stringUnit": { + "state": "needs_review", + "value": "Порти відкриваються в cmux без налаштування. Щоб використовувати приватні адреси в інших застосунках, налаштуйте Cloud VPN." } } } }, - "diffViewer.filterRenamedFiles": { + "cloud.ports.vpnOff.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Renamed" + "value": "Optional: Cloud VPN" } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "名前変更" + "value": "Optional: Cloud-VPN" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "已重命名" + "value": "Facultatif : VPN Cloud" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "已重新命名" + "value": "اختياري: Cloud VPN" } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "Umbenannt" + "value": "Opcional: Cloud VPN" } }, - "fr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Renommés" + "value": "選用:Cloud VPN" } }, - "ar": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "معاد تسميتها" + "value": "可选:云 VPN" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "Renombrados" + "value": "선택 사항: Cloud VPN" } }, - "ko": { + "ja": { "stringUnit": { "state": "translated", - "value": "이름 변경됨" + "value": "任意:Cloud VPN" } - } - } - }, - "diffViewer.hideViewedFiles": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "bs": { "stringUnit": { - "state": "translated", - "value": "Hide viewed files" + "state": "needs_review", + "value": "Opcionalno: Cloud VPN" } }, - "ja": { + "da": { "stringUnit": { - "state": "translated", - "value": "確認済みのファイルを隠す" + "state": "needs_review", + "value": "Valgfrit: Cloud VPN" } }, - "zh-Hans": { + "it": { "stringUnit": { - "state": "translated", - "value": "隐藏已查看的文件" + "state": "needs_review", + "value": "Facoltativo: Cloud VPN" } }, - "zh-Hant": { + "km": { "stringUnit": { - "state": "translated", - "value": "隱藏已檢視的檔案" + "state": "needs_review", + "value": "ជាជម្រើស៖ Cloud VPN" } }, - "de": { + "nb": { "stringUnit": { - "state": "translated", - "value": "Angesehene Dateien ausblenden" + "state": "needs_review", + "value": "Valgfritt: Cloud VPN" } }, - "fr": { + "pl": { "stringUnit": { - "state": "translated", - "value": "Masquer les fichiers vus" + "state": "needs_review", + "value": "Opcjonalnie: Cloud VPN" } }, - "ar": { + "pt-BR": { "stringUnit": { - "state": "translated", - "value": "إخفاء الملفات التي تمت مشاهدتها" + "state": "needs_review", + "value": "Opcional: Cloud VPN" } }, - "es": { + "ru": { "stringUnit": { - "state": "translated", - "value": "Ocultar archivos vistos" + "state": "needs_review", + "value": "Необязательно: Cloud VPN" } }, - "ko": { + "th": { "stringUnit": { - "state": "translated", - "value": "확인한 파일 숨기기" + "state": "needs_review", + "value": "ตัวเลือกเพิ่มเติม: Cloud VPN" + } + }, + "tr": { + "stringUnit": { + "state": "needs_review", + "value": "İsteğe bağlı: Cloud VPN" + } + }, + "uk": { + "stringUnit": { + "state": "needs_review", + "value": "Необов’язково: Cloud VPN" } } } }, - "diffViewer.showViewedFiles": { + "cloud.vpn.setup.address.body": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Show viewed files" + "value": "Each machine has its own private IP. Two machines may both expose port 3000, for example 10.40.0.10:3000 and 10.40.0.11:3000. Right-click a Cloud port and choose Copy Private Address URL after connecting. These addresses are private, not public share links." } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "確認済みのファイルを表示" + "value": "Jede Maschine hat eine eigene private IP. Zwei Maschinen können beide Port 3000 verwenden, etwa 10.40.0.10:3000 und 10.40.0.11:3000. Klicken Sie nach dem Verbinden mit der rechten Maustaste auf einen Cloud-Port und wählen Sie URL der privaten Adresse kopieren. Diese Adressen sind privat und keine öffentlichen Freigabelinks." } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "显示已查看的文件" + "value": "Chaque machine a sa propre IP privée. Deux machines peuvent utiliser le port 3000, par exemple 10.40.0.10:3000 et 10.40.0.11:3000. Après connexion, faites un clic droit sur un port Cloud et choisissez Copier l’URL de l’adresse privée. Ces adresses sont privées, ce ne sont pas des liens publics de partage." } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "顯示已檢視的檔案" + "value": "Cada máquina tiene su propia IP privada. Dos máquinas pueden usar el puerto 3000, como 10.40.0.10:3000 y 10.40.0.11:3000. Después de conectar, haz clic derecho en un puerto Cloud y elige Copiar URL de dirección privada. Estas direcciones son privadas, no enlaces públicos para compartir." } }, - "de": { + "ja": { "stringUnit": { "state": "translated", - "value": "Angesehene Dateien anzeigen" + "value": "各マシンには個別のプライベートIPがあります。2台のマシンがどちらもポート3000を使えます(例:10.40.0.10:3000と10.40.0.11:3000)。接続後にCloudポートを右クリックし、「プライベートアドレスURLをコピー」を選びます。これらはプライベートアドレスで、公開共有リンクではありません。" } }, - "fr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Afficher les fichiers vus" + "value": "每台机器都有自己的私有 IP。两台机器可以同时使用端口 3000,例如 10.40.0.10:3000 和 10.40.0.11:3000。连接后右键点击 Cloud 端口,选择“复制私有地址 URL”。这些地址是私有地址,不是公开分享链接。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "每台機器都有自己的私有 IP。兩台機器可以同時使用連接埠 3000,例如 10.40.0.10:3000 和 10.40.0.11:3000。連線後對 Cloud 連接埠按右鍵,選擇「複製私有位址 URL」。這些位址是私有位址,不是公開分享連結。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "각 머신에는 고유한 비공개 IP가 있습니다. 두 머신 모두 포트 3000을 사용할 수 있습니다(예: 10.40.0.10:3000 및 10.40.0.11:3000). 연결 후 Cloud 포트를 오른쪽 클릭하고 비공개 주소 URL 복사를 선택하세요. 이 주소는 비공개이며 공개 공유 링크가 아닙니다." } }, "ar": { "stringUnit": { "state": "translated", - "value": "إظهار الملفات التي تمت مشاهدتها" + "value": "لكل جهاز عنوان IP خاص به. يمكن لجهازين استخدام المنفذ 3000، مثل 10.40.0.10:3000 و10.40.0.11:3000. بعد الاتصال، انقر بزر الماوس الأيمن على منفذ Cloud واختر نسخ رابط العنوان الخاص. هذه عناوين خاصة وليست روابط مشاركة عامة." } }, - "es": { + "bs": { "stringUnit": { "state": "translated", - "value": "Mostrar archivos vistos" + "value": "Svaka mašina ima svoju privatnu IP adresu. Dvije mašine mogu koristiti port 3000, na primjer 10.40.0.10:3000 i 10.40.0.11:3000. Nakon povezivanja kliknite desnim dugmetom na Cloud port i izaberite Kopiraj URL privatne adrese. Ovo su privatne adrese, a ne javne veze za dijeljenje." } }, - "ko": { + "da": { "stringUnit": { "state": "translated", - "value": "확인한 파일 표시" + "value": "Hver maskine har sin egen private IP. To maskiner kan begge bruge port 3000, f.eks. 10.40.0.10:3000 og 10.40.0.11:3000. Højreklik på en Cloud-port efter tilslutning, og vælg Kopiér URL til privat adresse. Adresserne er private, ikke offentlige delelinks." } - } - } - }, - "diffViewer.noFilesMatchFilter": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "No files match the filter." + "value": "Ogni macchina ha il proprio IP privato. Due macchine possono usare entrambe la porta 3000, ad esempio 10.40.0.10:3000 e 10.40.0.11:3000. Dopo la connessione fai clic destro su una porta Cloud e scegli Copia URL indirizzo privato. Sono indirizzi privati, non link pubblici." } }, - "ja": { + "km": { "stringUnit": { "state": "translated", - "value": "絞り込み条件に一致するファイルはありません。" + "value": "ម៉ាស៊ីននីមួយៗមាន IP ឯកជនផ្ទាល់ខ្លួន។ ម៉ាស៊ីនពីរអាចប្រើច្រក 3000 ដូចគ្នា ឧទាហរណ៍ 10.40.0.10:3000 និង 10.40.0.11:3000។ បន្ទាប់ពីភ្ជាប់ ចុចខាងស្តាំលើច្រក Cloud ហើយជ្រើស ចម្លង URL អាសយដ្ឋានឯកជន។ ទាំងនេះជាអាសយដ្ឋានឯកជន មិនមែនតំណចែករំលែកសាធារណៈទេ។" } }, - "zh-Hans": { + "nb": { "stringUnit": { "state": "translated", - "value": "没有符合筛选条件的文件。" + "value": "Hver maskin har sin egen private IP. To maskiner kan bruke port 3000, for eksempel 10.40.0.10:3000 og 10.40.0.11:3000. Høyreklikk en Cloud-port etter tilkobling og velg Kopier URL for privat adresse. Adressene er private, ikke offentlige delingslenker." } }, - "zh-Hant": { + "pl": { "stringUnit": { "state": "translated", - "value": "沒有符合篩選條件的檔案。" + "value": "Każda maszyna ma własny prywatny adres IP. Dwie maszyny mogą używać portu 3000, na przykład 10.40.0.10:3000 i 10.40.0.11:3000. Po połączeniu kliknij prawym przyciskiem port Cloud i wybierz Kopiuj URL prywatnego adresu. To prywatne adresy, nie publiczne linki udostępniania." } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Keine Dateien entsprechen dem Filter." + "value": "Cada máquina tem seu próprio IP privado. Duas máquinas podem usar a porta 3000, por exemplo 10.40.0.10:3000 e 10.40.0.11:3000. Depois de conectar, clique com o botão direito em uma porta Cloud e escolha Copiar URL do endereço privado. Esses endereços são privados, não links públicos de compartilhamento." } }, - "fr": { + "ru": { "stringUnit": { "state": "translated", - "value": "Aucun fichier ne correspond au filtre." + "value": "У каждой машины свой частный IP. Две машины могут использовать порт 3000, например 10.40.0.10:3000 и 10.40.0.11:3000. После подключения щёлкните правой кнопкой мыши порт Cloud и выберите Скопировать URL частного адреса. Это частные адреса, а не публичные ссылки." } }, - "ar": { + "th": { "stringUnit": { "state": "translated", - "value": "لا توجد ملفات مطابقة للتصفية." + "value": "แต่ละเครื่องมี IP ส่วนตัวของตนเอง สองเครื่องสามารถใช้พอร์ต 3000 ได้ เช่น 10.40.0.10:3000 และ 10.40.0.11:3000 หลังเชื่อมต่อ คลิกขวาที่พอร์ต Cloud แล้วเลือกคัดลอก URL ที่อยู่ส่วนตัว ที่อยู่เหล่านี้เป็นส่วนตัว ไม่ใช่ลิงก์สาธารณะ" } }, - "es": { + "tr": { "stringUnit": { "state": "translated", - "value": "Ningún archivo coincide con el filtro." + "value": "Her makinenin kendi özel IP’si vardır. İki makine 3000 bağlantı noktasını kullanabilir; örneğin 10.40.0.10:3000 ve 10.40.0.11:3000. Bağlandıktan sonra bir Cloud portuna sağ tıklayın ve Özel Adres URL’sini Kopyala’yı seçin. Bunlar özel adreslerdir, herkese açık paylaşım bağlantıları değildir." } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "필터와 일치하는 파일이 없습니다." + "value": "Кожна машина має власну приватну IP-адресу. Дві машини можуть використовувати порт 3000, наприклад 10.40.0.10:3000 і 10.40.0.11:3000. Після підключення клацніть правою кнопкою миші порт Cloud і виберіть Копіювати URL приватної адреси. Це приватні адреси, а не публічні посилання для спільного доступу." } } } }, - "diffViewer.generatedFile": { + "cloud.vpn.setup.cancel": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Generated file" + "value": "Cancel" } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "自動生成ファイル" + "value": "Abbrechen" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "生成的文件" + "value": "Annuler" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "產生的檔案" + "value": "Cancelar" } }, - "de": { + "ja": { "stringUnit": { "state": "translated", - "value": "Generierte Datei" + "value": "キャンセル" } }, - "fr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Fichier généré" + "value": "取消" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "取消" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" } }, "ar": { "stringUnit": { "state": "translated", - "value": "ملف مُولَّد" + "value": "إلغاء" } }, - "es": { + "bs": { "stringUnit": { "state": "translated", - "value": "Archivo generado" + "value": "Otkaži" } }, - "ko": { + "da": { "stringUnit": { "state": "translated", - "value": "생성된 파일" + "value": "Annuller" } - } - } - }, - "diffViewer.largeDiff": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "Large diff" + "value": "Annulla" } }, - "ja": { + "km": { "stringUnit": { "state": "translated", - "value": "大きな差分" + "value": "បោះបង់" } }, - "zh-Hans": { + "nb": { "stringUnit": { "state": "translated", - "value": "大型差异" + "value": "Avbryt" } }, - "zh-Hant": { + "pl": { "stringUnit": { "state": "translated", - "value": "大型差異" + "value": "Anuluj" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Großer Diff" + "value": "Cancelar" } }, - "fr": { + "ru": { "stringUnit": { "state": "translated", - "value": "Diff volumineux" + "value": "Отменить" } }, - "ar": { + "th": { "stringUnit": { "state": "translated", - "value": "فرق كبير" + "value": "ยกเลิก" } }, - "es": { + "tr": { "stringUnit": { "state": "translated", - "value": "Diff grande" + "value": "İptal" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "큰 변경 사항" + "value": "Скасувати" } } } }, - "diffViewer.loadDiff": { + "cloud.vpn.setup.connect": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Load diff" + "value": "Connect Cloud VPN" } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "差分を読み込む" + "value": "Cloud-VPN verbinden" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "加载差异" + "value": "Connecter le VPN Cloud" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "載入差異" + "value": "Conectar VPN de Cloud" } }, - "de": { + "ja": { "stringUnit": { "state": "translated", - "value": "Diff laden" + "value": "Cloud VPNに接続" } }, - "fr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Charger le diff" + "value": "连接 Cloud VPN" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "連接 Cloud VPN" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Cloud VPN 연결" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تحميل الفرق" + "value": "توصيل VPN الخاص بـ Cloud" } }, - "es": { + "bs": { "stringUnit": { "state": "translated", - "value": "Cargar diff" + "value": "Poveži Cloud VPN" } }, - "ko": { + "da": { "stringUnit": { "state": "translated", - "value": "변경 사항 불러오기" + "value": "Forbind Cloud VPN" } - } - } - }, - "diffViewer.clearFileFilter": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "it": { "stringUnit": { "state": "translated", - "value": "Clear filter" + "value": "Connetti VPN Cloud" } }, - "ja": { + "km": { "stringUnit": { "state": "translated", - "value": "絞り込みを解除" + "value": "ភ្ជាប់ Cloud VPN" } }, - "zh-Hans": { + "nb": { "stringUnit": { "state": "translated", - "value": "清除筛选" + "value": "Koble til Cloud VPN" } }, - "zh-Hant": { + "pl": { "stringUnit": { "state": "translated", - "value": "清除篩選" + "value": "Połącz z Cloud VPN" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Filter zurücksetzen" + "value": "Conectar Cloud VPN" } }, - "fr": { + "ru": { "stringUnit": { "state": "translated", - "value": "Effacer le filtre" + "value": "Подключить Cloud VPN" } }, - "ar": { + "th": { "stringUnit": { "state": "translated", - "value": "مسح التصفية" + "value": "เชื่อมต่อ Cloud VPN" } }, - "es": { + "tr": { "stringUnit": { "state": "translated", - "value": "Borrar filtro" + "value": "Cloud VPN’e bağlan" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "필터 지우기" + "value": "Підключити Cloud VPN" } } } }, - "terminal.clipboardReadConfirmation.deny": { + "cloud.vpn.setup.connected": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Deny" + "value": "Connected" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "رفض" + "value": "Verbunden" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Ablehnen" + "value": "Connecté" } }, "es": { "stringUnit": { "state": "translated", - "value": "Denegar" + "value": "Conectada" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Refuser" + "value": "接続済み" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "拒否" + "value": "已连接" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "거부" + "value": "已連線" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "拒绝" + "value": "연결됨" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "拒絕" + "value": "متصل" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Odbij" + "value": "Povezano" } }, "da": { "stringUnit": { "state": "translated", - "value": "Afvis" + "value": "Forbundet" } }, "it": { "stringUnit": { "state": "translated", - "value": "Nega" + "value": "Connessa" } }, "km": { "stringUnit": { "state": "translated", - "value": "បដិសេធ" + "value": "បានភ្ជាប់" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Avslå" + "value": "Tilkoblet" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Odmów" + "value": "Połączono" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Negar" + "value": "Conectada" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Запретить" + "value": "Подключено" } }, "th": { "stringUnit": { "state": "translated", - "value": "ปฏิเสธ" + "value": "เชื่อมต่อแล้ว" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Reddet" + "value": "Bağlandı" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Заборонити" + "value": "Підключено" } } } }, - "terminal.clipboardReadConfirmation.message": { + "cloud.vpn.setup.disconnect": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "A program in this terminal wants to read your clipboard. Allow it only if you trust the program." + "value": "Disconnect" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "يريد برنامج في هذه الطرفية قراءة الحافظة. اسمح بذلك فقط إذا كنت تثق بالبرنامج." + "value": "Trennen" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Ein Programm in diesem Terminal möchte deine Zwischenablage lesen. Erlaube es nur, wenn du dem Programm vertraust." + "value": "Déconnecter" } }, "es": { "stringUnit": { "state": "translated", - "value": "Un programa de esta terminal quiere leer tu portapapeles. Permítelo solo si confías en el programa." + "value": "Desconectar" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Un programme de ce terminal veut lire votre presse-papiers. Ne l’autorisez que si vous faites confiance à ce programme." + "value": "切断" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "このターミナルのプログラムがクリップボードを読み取ろうとしています。信頼できるプログラムの場合にのみ許可してください。" + "value": "断开连接" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "이 터미널의 프로그램이 클립보드를 읽으려고 합니다. 프로그램을 신뢰할 수 있을 때만 허용하세요." + "value": "中斷連線" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "此终端中的程序想要读取你的剪贴板。只有在你信任该程序时才允许。" + "value": "연결 해제" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "此終端機中的程式想要讀取你的剪貼簿。只有在你信任該程式時才允許。" + "value": "قطع الاتصال" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Program u ovom terminalu želi čitati vaš međuspremnik. Dozvolite samo ako vjerujete programu." + "value": "Prekini vezu" } }, "da": { "stringUnit": { "state": "translated", - "value": "Et program i denne terminal vil læse din udklipsholder. Tillad det kun, hvis du har tillid til programmet." + "value": "Afbryd" } }, "it": { "stringUnit": { "state": "translated", - "value": "Un programma in questo terminale vuole leggere gli appunti. Consentilo solo se ti fidi del programma." + "value": "Disconnetti" } }, "km": { "stringUnit": { "state": "translated", - "value": "កម្មវិធីក្នុងស្ថានីយនេះចង់អានក្ដារតម្បៀតខ្ទាស់របស់អ្នក។ អនុញ្ញាតតែបើអ្នកទុកចិត្តកម្មវិធីនេះ។" + "value": "ផ្តាច់" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Et program i denne terminalen vil lese utklippstavlen din. Tillat det bare hvis du stoler på programmet." + "value": "Koble fra" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Program w tym terminalu chce odczytać schowek. Zezwól tylko, jeśli ufasz temu programowi." + "value": "Rozłącz" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Um programa neste terminal quer ler sua área de transferência. Permita somente se você confiar no programa." + "value": "Desconectar" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Программа в этом терминале хочет прочитать буфер обмена. Разрешайте только программам, которым доверяете." + "value": "Отключить" } }, "th": { "stringUnit": { "state": "translated", - "value": "โปรแกรมในเทอร์มินัลนี้ต้องการอ่านคลิปบอร์ดของคุณ อนุญาตเฉพาะเมื่อคุณเชื่อถือโปรแกรมนี้" + "value": "ตัดการเชื่อมต่อ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu terminaldeki bir program panonuzu okumak istiyor. Yalnızca programa güveniyorsanız izin verin." + "value": "Bağlantıyı kes" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Програма в цьому терміналі хоче прочитати ваш буфер обміну. Дозволяйте, лише якщо довіряєте програмі." + "value": "Від’єднати" } } } }, - "terminal.clipboardReadConfirmation.title": { + "cloud.vpn.setup.entry.subtitle": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Allow Clipboard Access?" + "value": "Optional private IP access for other apps" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "السماح بالوصول إلى الحافظة؟" + "value": "Optionaler Zugriff auf private IPs für andere Apps" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Zugriff auf die Zwischenablage erlauben?" + "value": "Accès facultatif aux IP privées pour les autres apps" } }, "es": { "stringUnit": { "state": "translated", - "value": "¿Permitir el acceso al portapapeles?" + "value": "Acceso opcional a IP privadas para otras apps" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Autoriser l’accès au presse-papiers ?" + "value": "ほかのアプリからプライベートIPへアクセスする任意の設定" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "クリップボードへのアクセスを許可しますか?" + "value": "为其他应用提供可选的私有 IP 访问" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "클립보드 접근을 허용하시겠습니까?" + "value": "為其他 App 提供選用的私有 IP 存取" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "允许访问剪贴板?" + "value": "다른 앱의 비공개 IP 접근을 위한 선택 설정" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "允許存取剪貼簿?" + "value": "وصول اختياري إلى عناوين IP الخاصة للتطبيقات الأخرى" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Dozvoliti pristup međuspremniku?" + "value": "Opcionalni pristup privatnim IP adresama za druge aplikacije" } }, "da": { "stringUnit": { "state": "translated", - "value": "Tillad adgang til udklipsholderen?" + "value": "Valgfri privat IP-adgang for andre apps" } }, "it": { "stringUnit": { "state": "translated", - "value": "Consentire l'accesso agli appunti?" + "value": "Accesso facoltativo agli IP privati per altre app" } }, "km": { "stringUnit": { "state": "translated", - "value": "អនុញ្ញាតឱ្យចូលប្រើក្ដារតម្បៀតខ្ទាស់?" + "value": "ចូលប្រើ IP ឯកជនសម្រាប់កម្មវិធីផ្សេងៗជាជម្រើស" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Tillat tilgang til utklippstavlen?" + "value": "Valgfri privat IP-tilgang for andre apper" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Zezwolić na dostęp do schowka?" + "value": "Opcjonalny dostęp innych aplikacji do prywatnych adresów IP" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Permitir acesso à área de transferência?" + "value": "Acesso opcional a IPs privados para outros apps" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Разрешить доступ к буферу обмена?" + "value": "Необязательный доступ других приложений к частным IP" } }, "th": { "stringUnit": { "state": "translated", - "value": "อนุญาตให้เข้าถึงคลิปบอร์ดหรือไม่?" + "value": "การเข้าถึง IP ส่วนตัวสำหรับแอปอื่นแบบไม่บังคับ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Panoya erişime izin verilsin mi?" + "value": "Diğer uygulamalar için isteğe bağlı özel IP erişimi" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Дозволити доступ до буфера обміну?" + "value": "Необов’язковий доступ інших програм до приватних IP" } } } }, - "notification.remoteRelay.hostFallback": { + "cloud.vpn.setup.failed": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Remote host" + "value": "Needs attention" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "مضيف بعيد" + "value": "Aktion erforderlich" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Remote-Host" + "value": "Action requise" } }, "es": { "stringUnit": { "state": "translated", - "value": "Host remoto" + "value": "Requiere atención" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Hôte distant" + "value": "対応が必要" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "リモートホスト" + "value": "需要处理" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "원격 호스트" + "value": "需要處理" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "远程主机" + "value": "조치 필요" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "遠端主機" + "value": "يتطلب إجراءً" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Udaljeni host" + "value": "Potrebna pažnja" } }, "da": { "stringUnit": { "state": "translated", - "value": "Fjernvært" + "value": "Kræver opmærksomhed" } }, "it": { "stringUnit": { "state": "translated", - "value": "Host remoto" + "value": "Richiede attenzione" } }, "km": { "stringUnit": { "state": "translated", - "value": "ម៉ាស៊ីនពីចម្ងាយ" + "value": "ត្រូវការការយកចិត្តទុកដាក់" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Ekstern vert" + "value": "Krever handling" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Zdalny host" + "value": "Wymaga uwagi" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Host remoto" + "value": "Requer atenção" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Удалённый хост" + "value": "Требуется действие" } }, "th": { "stringUnit": { "state": "translated", - "value": "โฮสต์ระยะไกล" + "value": "ต้องดำเนินการ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Uzak ana bilgisayar" + "value": "İlgilenilmeli" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Віддалений хост" + "value": "Потрібна увага" } } } }, - "notification.remoteRelay.title": { + "cloud.vpn.setup.off": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Off" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Aus" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Désactivé" } }, "es": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Desactivada" } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "オフ" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "已关闭" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "已關閉" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "꺼짐" } }, - "zh-Hant": { + "ar": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "متوقف" } }, "bs": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Isključeno" } }, "da": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Fra" } }, "it": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Disattivata" } }, "km": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "បិទ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Av" } }, "pl": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Wyłączona" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Desativada" } }, "ru": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Выключено" } }, "th": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "ปิด" } }, "tr": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Kapalı" } }, "uk": { "stringUnit": { "state": "translated", - "value": "%1$@: %2$@" + "value": "Вимкнено" } } } }, - "cloud.ports.vpnOff.explanation": { + "cloud.vpn.setup.openUnavailable": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Ports open in cmux without setup. To use private addresses in other apps, set up Cloud VPN." + "value": "Cloud VPN setup is unavailable" } }, "de": { "stringUnit": { "state": "translated", - "value": "Ports lassen sich in cmux ohne Einrichtung öffnen. Richte Cloud-VPN ein, um private Adressen in anderen Apps zu verwenden." + "value": "Cloud-VPN-Einrichtung ist nicht verfügbar" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les ports s’ouvrent dans cmux sans configuration. Pour utiliser les adresses privées dans d’autres apps, configurez le VPN Cloud." + "value": "La configuration du VPN Cloud est indisponible" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "تُفتح المنافذ في cmux دون إعداد. لاستخدام العناوين الخاصة في التطبيقات الأخرى، أعدّ Cloud VPN." + "value": "La configuración de VPN de Cloud no está disponible" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Los puertos se abren en cmux sin configuración. Para usar direcciones privadas en otras apps, configura Cloud VPN." + "value": "Cloud VPN設定は利用できません" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "無需設定即可在 cmux 中開啟連接埠。如要在其他 App 使用私有位址,請設定 Cloud VPN。" + "value": "Cloud VPN 设置不可用" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "无需设置即可在 cmux 中打开端口。要在其他应用中使用私有地址,请设置云 VPN。" + "value": "無法使用 Cloud VPN 設定" } }, "ko": { "stringUnit": { "state": "translated", - "value": "별도 설정 없이 cmux에서 포트를 열 수 있습니다. 다른 앱에서 비공개 주소를 사용하려면 Cloud VPN을 설정하세요." + "value": "Cloud VPN 설정을 사용할 수 없습니다" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "設定なしで cmux 内のポートを開けます。他のアプリでプライベートアドレスを使うには、Cloud VPN を設定してください。" + "value": "إعداد VPN الخاص بـ Cloud غير متاح" } }, "bs": { "stringUnit": { - "state": "needs_review", - "value": "Portovi se otvaraju u cmux-u bez podešavanja. Za korištenje privatnih adresa u drugim aplikacijama podesite Cloud VPN." + "state": "translated", + "value": "Podešavanje Cloud VPN-a nije dostupno" } }, "da": { "stringUnit": { - "state": "needs_review", - "value": "Porte åbnes i cmux uden opsætning. Opsæt Cloud VPN for at bruge private adresser i andre apps." + "state": "translated", + "value": "Cloud VPN-opsætning er ikke tilgængelig" } }, "it": { "stringUnit": { - "state": "needs_review", - "value": "Le porte si aprono in cmux senza configurazione. Per usare gli indirizzi privati in altre app, configura Cloud VPN." + "state": "translated", + "value": "La configurazione VPN Cloud non è disponibile" } }, "km": { "stringUnit": { - "state": "needs_review", - "value": "ច្រកអាចបើកក្នុង cmux ដោយមិនចាំបាច់រៀបចំ។ ដើម្បីប្រើអាសយដ្ឋានឯកជនក្នុងកម្មវិធីផ្សេងទៀត សូមរៀបចំ Cloud VPN។" + "state": "translated", + "value": "ការរៀបចំ Cloud VPN មិនអាចប្រើបាន" } }, "nb": { "stringUnit": { - "state": "needs_review", - "value": "Porter åpnes i cmux uten oppsett. Sett opp Cloud VPN for å bruke private adresser i andre apper." + "state": "translated", + "value": "Cloud VPN-oppsett er ikke tilgjengelig" } }, "pl": { "stringUnit": { - "state": "needs_review", - "value": "Porty otwierają się w cmux bez konfiguracji. Aby używać prywatnych adresów w innych aplikacjach, skonfiguruj Cloud VPN." + "state": "translated", + "value": "Konfiguracja Cloud VPN jest niedostępna" } }, "pt-BR": { "stringUnit": { - "state": "needs_review", - "value": "As portas abrem no cmux sem configuração. Para usar endereços privados em outros apps, configure o Cloud VPN." + "state": "translated", + "value": "A configuração do Cloud VPN não está disponível" } }, "ru": { "stringUnit": { - "state": "needs_review", - "value": "Порты открываются в cmux без настройки. Чтобы использовать приватные адреса в других приложениях, настройте Cloud VPN." + "state": "translated", + "value": "Настройка Cloud VPN недоступна" } }, "th": { "stringUnit": { - "state": "needs_review", - "value": "เปิดพอร์ตใน cmux ได้โดยไม่ต้องตั้งค่า หากต้องการใช้ที่อยู่ส่วนตัวในแอปอื่น ให้ตั้งค่า Cloud VPN" + "state": "translated", + "value": "การตั้งค่า Cloud VPN ไม่พร้อมใช้งาน" } }, "tr": { "stringUnit": { - "state": "needs_review", - "value": "Bağlantı noktaları cmux içinde kurulum gerektirmeden açılır. Diğer uygulamalarda özel adresleri kullanmak için Cloud VPN’i kurun." + "state": "translated", + "value": "Cloud VPN kurulumu kullanılamıyor" } }, "uk": { "stringUnit": { - "state": "needs_review", - "value": "Порти відкриваються в cmux без налаштування. Щоб використовувати приватні адреси в інших застосунках, налаштуйте Cloud VPN." + "state": "translated", + "value": "Налаштування Cloud VPN недоступне" } } } }, - "cloud.ports.vpnOff.title": { + "cloud.vpn.setup.permission.body": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Optional: Cloud VPN" + "value": "The VPN software is included in cmux. You do not need another app. macOS may require your password or Touch ID during approval." } }, "de": { "stringUnit": { "state": "translated", - "value": "Optional: Cloud-VPN" + "value": "Die VPN-Software ist in cmux enthalten. Sie brauchen keine weitere App. macOS kann bei der Genehmigung Ihr Passwort oder Touch ID verlangen." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Facultatif : VPN Cloud" + "value": "Le logiciel VPN est inclus dans cmux. Aucune autre app n’est nécessaire. macOS peut demander votre mot de passe ou Touch ID lors de l’autorisation." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "اختياري: Cloud VPN" + "value": "El software VPN está incluido en cmux. No necesitas otra app. macOS puede solicitar tu contraseña o Touch ID durante la autorización." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Opcional: Cloud VPN" + "value": "VPNソフトウェアはcmuxに含まれています。別のアプリは不要です。承認時にmacOSがパスワードまたはTouch IDを求めることがあります。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "選用:Cloud VPN" + "value": "cmux 已包含 VPN 软件,无需其他应用。批准时,macOS 可能要求您输入密码或使用触控 ID。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "可选:云 VPN" + "value": "cmux 已包含 VPN 軟體,不需要其他 App。核准時,macOS 可能要求您輸入密碼或使用 Touch ID。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "선택 사항: Cloud VPN" + "value": "VPN 소프트웨어는 cmux에 포함되어 있습니다. 다른 앱은 필요하지 않습니다. 승인 시 macOS에서 암호 또는 Touch ID를 요청할 수 있습니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "任意:Cloud VPN" + "value": "برنامج VPN مضمن في cmux. لا تحتاج إلى تطبيق آخر. قد يطلب macOS كلمة المرور أو Touch ID أثناء الموافقة." } }, "bs": { "stringUnit": { - "state": "needs_review", - "value": "Opcionalno: Cloud VPN" + "state": "translated", + "value": "VPN softver je uključen u cmux. Nije potrebna druga aplikacija. macOS može zatražiti lozinku ili Touch ID tokom odobravanja." } }, "da": { "stringUnit": { - "state": "needs_review", - "value": "Valgfrit: Cloud VPN" + "state": "translated", + "value": "VPN-softwaren er inkluderet i cmux. Du behøver ingen anden app. macOS kan bede om din adgangskode eller Touch ID under godkendelsen." } }, "it": { "stringUnit": { - "state": "needs_review", - "value": "Facoltativo: Cloud VPN" + "state": "translated", + "value": "Il software VPN è incluso in cmux. Non serve un’altra app. macOS potrebbe chiedere la password o Touch ID durante l’autorizzazione." } }, "km": { "stringUnit": { - "state": "needs_review", - "value": "ជាជម្រើស៖ Cloud VPN" + "state": "translated", + "value": "កម្មវិធី VPN មាននៅក្នុង cmux។ អ្នកមិនត្រូវការកម្មវិធីផ្សេងទៀតទេ។ macOS អាចស្នើពាក្យសម្ងាត់ ឬ Touch ID ក្នុងពេលអនុម័ត។" } }, "nb": { "stringUnit": { - "state": "needs_review", - "value": "Valgfritt: Cloud VPN" + "state": "translated", + "value": "VPN-programvaren er inkludert i cmux. Du trenger ingen annen app. macOS kan be om passord eller Touch ID under godkjenningen." } }, "pl": { "stringUnit": { - "state": "needs_review", - "value": "Opcjonalnie: Cloud VPN" + "state": "translated", + "value": "Oprogramowanie VPN jest zawarte w cmux. Nie potrzebujesz innej aplikacji. macOS może poprosić o hasło lub Touch ID podczas zatwierdzania." } }, "pt-BR": { "stringUnit": { - "state": "needs_review", - "value": "Opcional: Cloud VPN" + "state": "translated", + "value": "O software VPN vem incluído no cmux. Você não precisa de outro app. O macOS pode pedir sua senha ou Touch ID durante a aprovação." } }, "ru": { "stringUnit": { - "state": "needs_review", - "value": "Необязательно: Cloud VPN" + "state": "translated", + "value": "VPN-программа уже входит в cmux. Другие приложения не нужны. Во время подтверждения macOS может запросить пароль или Touch ID." } }, "th": { "stringUnit": { - "state": "needs_review", - "value": "ตัวเลือกเพิ่มเติม: Cloud VPN" + "state": "translated", + "value": "ซอฟต์แวร์ VPN รวมอยู่ใน cmux แล้ว ไม่ต้องใช้แอปอื่น macOS อาจขอรหัสผ่านหรือ Touch ID ระหว่างการอนุมัติ" } }, "tr": { "stringUnit": { - "state": "needs_review", - "value": "İsteğe bağlı: Cloud VPN" + "state": "translated", + "value": "VPN yazılımı cmux içinde bulunur. Başka bir uygulama gerekmez. macOS onay sırasında parolanızı veya Touch ID’yi isteyebilir." } }, "uk": { "stringUnit": { - "state": "needs_review", - "value": "Необов’язково: Cloud VPN" + "state": "translated", + "value": "Програмне забезпечення VPN входить до cmux. Інша програма не потрібна. Під час схвалення macOS може попросити пароль або Touch ID." } } } }, - "cloud.vpn.setup.address.body": { + "cloud.vpn.setup.status.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Each machine has its own private IP. Two machines may both expose port 3000, for example 10.40.0.10:3000 and 10.40.0.11:3000. Right-click a Cloud port and choose Copy Private Address URL after connecting. These addresses are private, not public share links." + "value": "Private network status" } }, "de": { "stringUnit": { "state": "translated", - "value": "Jede Maschine hat eine eigene private IP. Zwei Maschinen können beide Port 3000 verwenden, etwa 10.40.0.10:3000 und 10.40.0.11:3000. Klicken Sie nach dem Verbinden mit der rechten Maustaste auf einen Cloud-Port und wählen Sie URL der privaten Adresse kopieren. Diese Adressen sind privat und keine öffentlichen Freigabelinks." + "value": "Status des privaten Netzwerks" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Chaque machine a sa propre IP privée. Deux machines peuvent utiliser le port 3000, par exemple 10.40.0.10:3000 et 10.40.0.11:3000. Après connexion, faites un clic droit sur un port Cloud et choisissez Copier l’URL de l’adresse privée. Ces adresses sont privées, ce ne sont pas des liens publics de partage." + "value": "État du réseau privé" } }, "es": { "stringUnit": { "state": "translated", - "value": "Cada máquina tiene su propia IP privada. Dos máquinas pueden usar el puerto 3000, como 10.40.0.10:3000 y 10.40.0.11:3000. Después de conectar, haz clic derecho en un puerto Cloud y elige Copiar URL de dirección privada. Estas direcciones son privadas, no enlaces públicos para compartir." + "value": "Estado de la red privada" } }, "ja": { "stringUnit": { "state": "translated", - "value": "各マシンには個別のプライベートIPがあります。2台のマシンがどちらもポート3000を使えます(例:10.40.0.10:3000と10.40.0.11:3000)。接続後にCloudポートを右クリックし、「プライベートアドレスURLをコピー」を選びます。これらはプライベートアドレスで、公開共有リンクではありません。" + "value": "プライベートネットワークの状態" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "每台机器都有自己的私有 IP。两台机器可以同时使用端口 3000,例如 10.40.0.10:3000 和 10.40.0.11:3000。连接后右键点击 Cloud 端口,选择“复制私有地址 URL”。这些地址是私有地址,不是公开分享链接。" + "value": "私有网络状态" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "每台機器都有自己的私有 IP。兩台機器可以同時使用連接埠 3000,例如 10.40.0.10:3000 和 10.40.0.11:3000。連線後對 Cloud 連接埠按右鍵,選擇「複製私有位址 URL」。這些位址是私有位址,不是公開分享連結。" + "value": "私有網路狀態" } }, "ko": { "stringUnit": { "state": "translated", - "value": "각 머신에는 고유한 비공개 IP가 있습니다. 두 머신 모두 포트 3000을 사용할 수 있습니다(예: 10.40.0.10:3000 및 10.40.0.11:3000). 연결 후 Cloud 포트를 오른쪽 클릭하고 비공개 주소 URL 복사를 선택하세요. 이 주소는 비공개이며 공개 공유 링크가 아닙니다." + "value": "비공개 네트워크 상태" } }, "ar": { "stringUnit": { "state": "translated", - "value": "لكل جهاز عنوان IP خاص به. يمكن لجهازين استخدام المنفذ 3000، مثل 10.40.0.10:3000 و10.40.0.11:3000. بعد الاتصال، انقر بزر الماوس الأيمن على منفذ Cloud واختر نسخ رابط العنوان الخاص. هذه عناوين خاصة وليست روابط مشاركة عامة." + "value": "حالة الشبكة الخاصة" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Svaka mašina ima svoju privatnu IP adresu. Dvije mašine mogu koristiti port 3000, na primjer 10.40.0.10:3000 i 10.40.0.11:3000. Nakon povezivanja kliknite desnim dugmetom na Cloud port i izaberite Kopiraj URL privatne adrese. Ovo su privatne adrese, a ne javne veze za dijeljenje." + "value": "Status privatne mreže" } }, "da": { "stringUnit": { "state": "translated", - "value": "Hver maskine har sin egen private IP. To maskiner kan begge bruge port 3000, f.eks. 10.40.0.10:3000 og 10.40.0.11:3000. Højreklik på en Cloud-port efter tilslutning, og vælg Kopiér URL til privat adresse. Adresserne er private, ikke offentlige delelinks." + "value": "Status for privat netværk" } }, "it": { "stringUnit": { "state": "translated", - "value": "Ogni macchina ha il proprio IP privato. Due macchine possono usare entrambe la porta 3000, ad esempio 10.40.0.10:3000 e 10.40.0.11:3000. Dopo la connessione fai clic destro su una porta Cloud e scegli Copia URL indirizzo privato. Sono indirizzi privati, non link pubblici." + "value": "Stato della rete privata" } }, "km": { "stringUnit": { "state": "translated", - "value": "ម៉ាស៊ីននីមួយៗមាន IP ឯកជនផ្ទាល់ខ្លួន។ ម៉ាស៊ីនពីរអាចប្រើច្រក 3000 ដូចគ្នា ឧទាហរណ៍ 10.40.0.10:3000 និង 10.40.0.11:3000។ បន្ទាប់ពីភ្ជាប់ ចុចខាងស្តាំលើច្រក Cloud ហើយជ្រើស ចម្លង URL អាសយដ្ឋានឯកជន។ ទាំងនេះជាអាសយដ្ឋានឯកជន មិនមែនតំណចែករំលែកសាធារណៈទេ។" + "value": "ស្ថានភាពបណ្តាញឯកជន" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Hver maskin har sin egen private IP. To maskiner kan bruke port 3000, for eksempel 10.40.0.10:3000 og 10.40.0.11:3000. Høyreklikk en Cloud-port etter tilkobling og velg Kopier URL for privat adresse. Adressene er private, ikke offentlige delingslenker." + "value": "Status for privat nettverk" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Każda maszyna ma własny prywatny adres IP. Dwie maszyny mogą używać portu 3000, na przykład 10.40.0.10:3000 i 10.40.0.11:3000. Po połączeniu kliknij prawym przyciskiem port Cloud i wybierz Kopiuj URL prywatnego adresu. To prywatne adresy, nie publiczne linki udostępniania." + "value": "Stan sieci prywatnej" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Cada máquina tem seu próprio IP privado. Duas máquinas podem usar a porta 3000, por exemplo 10.40.0.10:3000 e 10.40.0.11:3000. Depois de conectar, clique com o botão direito em uma porta Cloud e escolha Copiar URL do endereço privado. Esses endereços são privados, não links públicos de compartilhamento." + "value": "Status da rede privada" } }, "ru": { "stringUnit": { "state": "translated", - "value": "У каждой машины свой частный IP. Две машины могут использовать порт 3000, например 10.40.0.10:3000 и 10.40.0.11:3000. После подключения щёлкните правой кнопкой мыши порт Cloud и выберите Скопировать URL частного адреса. Это частные адреса, а не публичные ссылки." + "value": "Состояние частной сети" } }, "th": { "stringUnit": { "state": "translated", - "value": "แต่ละเครื่องมี IP ส่วนตัวของตนเอง สองเครื่องสามารถใช้พอร์ต 3000 ได้ เช่น 10.40.0.10:3000 และ 10.40.0.11:3000 หลังเชื่อมต่อ คลิกขวาที่พอร์ต Cloud แล้วเลือกคัดลอก URL ที่อยู่ส่วนตัว ที่อยู่เหล่านี้เป็นส่วนตัว ไม่ใช่ลิงก์สาธารณะ" + "value": "สถานะเครือข่ายส่วนตัว" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Her makinenin kendi özel IP’si vardır. İki makine 3000 bağlantı noktasını kullanabilir; örneğin 10.40.0.10:3000 ve 10.40.0.11:3000. Bağlandıktan sonra bir Cloud portuna sağ tıklayın ve Özel Adres URL’sini Kopyala’yı seçin. Bunlar özel adreslerdir, herkese açık paylaşım bağlantıları değildir." + "value": "Özel ağ durumu" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Кожна машина має власну приватну IP-адресу. Дві машини можуть використовувати порт 3000, наприклад 10.40.0.10:3000 і 10.40.0.11:3000. Після підключення клацніть правою кнопкою миші порт Cloud і виберіть Копіювати URL приватної адреси. Це приватні адреси, а не публічні посилання для спільного доступу." + "value": "Стан приватної мережі" } } } }, - "cloud.vpn.setup.cancel": { + "cloud.vpn.setup.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cancel" + "value": "Cloud VPN" } }, "de": { "stringUnit": { "state": "translated", - "value": "Abbrechen" + "value": "Cloud-VPN" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Annuler" + "value": "VPN Cloud" } }, "es": { "stringUnit": { "state": "translated", - "value": "Cancelar" + "value": "VPN de Cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "キャンセル" + "value": "クラウドVPN" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "取消" + "value": "云端 VPN" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "取消" + "value": "雲端 VPN" } }, "ko": { "stringUnit": { "state": "translated", - "value": "취소" + "value": "클라우드 VPN" } }, "ar": { "stringUnit": { "state": "translated", - "value": "إلغاء" + "value": "شبكة Cloud الخاصة" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Otkaži" + "value": "Cloud VPN" } }, "da": { "stringUnit": { "state": "translated", - "value": "Annuller" + "value": "Cloud VPN" } }, "it": { "stringUnit": { "state": "translated", - "value": "Annulla" + "value": "VPN Cloud" } }, "km": { "stringUnit": { "state": "translated", - "value": "បោះបង់" + "value": "Cloud VPN" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Avbryt" + "value": "Cloud VPN" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Anuluj" + "value": "Cloud VPN" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Cancelar" + "value": "Cloud VPN" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Отменить" + "value": "Cloud VPN" } }, "th": { "stringUnit": { "state": "translated", - "value": "ยกเลิก" + "value": "Cloud VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "İptal" + "value": "Cloud VPN" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Скасувати" + "value": "Cloud VPN" } } } }, - "cloud.vpn.setup.connect": { + "cloud.vpn.setup.unavailable": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Connect Cloud VPN" + "value": "This copy of cmux does not include a signed VPN extension. Use a cmux release with Cloud VPN support. Cloud terminals, Ports, and Desktop remain available without the VPN." } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-VPN verbinden" + "value": "Diese cmux-Version enthält keine signierte VPN-Erweiterung. Verwenden Sie eine cmux-Version mit Cloud-VPN-Unterstützung. Cloud-Terminals, Ports und Desktop bleiben ohne VPN verfügbar." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Connecter le VPN Cloud" + "value": "Cette copie de cmux ne contient pas d’extension VPN signée. Utilisez une version de cmux qui prend en charge le VPN Cloud. Les terminaux Cloud, Ports et Bureau restent disponibles sans VPN." } }, "es": { "stringUnit": { "state": "translated", - "value": "Conectar VPN de Cloud" + "value": "Esta copia de cmux no incluye una extensión VPN firmada. Usa una versión de cmux compatible con VPN de Cloud. Los terminales Cloud, Puertos y Escritorio siguen disponibles sin VPN." } }, "ja": { "stringUnit": { "state": "translated", - "value": "Cloud VPNに接続" + "value": "このcmuxには署名済みのVPN機能拡張が含まれていません。Cloud VPN対応のcmuxリリースを使用してください。Cloudのターミナル、ポート、デスクトップはVPNなしでも使えます。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "连接 Cloud VPN" + "value": "此 cmux 副本未包含已签名的 VPN 扩展。请使用支持 Cloud VPN 的 cmux 版本。Cloud 终端、端口和桌面无需 VPN 仍可使用。" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "連接 Cloud VPN" + "value": "此 cmux 副本未包含已簽署的 VPN 延伸功能。請使用支援 Cloud VPN 的 cmux 版本。Cloud 終端機、連接埠和桌面不需要 VPN 仍可使用。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Cloud VPN 연결" + "value": "이 cmux에는 서명된 VPN 확장이 포함되어 있지 않습니다. Cloud VPN을 지원하는 cmux 릴리스를 사용하세요. Cloud 터미널, 포트 및 데스크탑은 VPN 없이도 사용할 수 있습니다." } }, "ar": { "stringUnit": { "state": "translated", - "value": "توصيل VPN الخاص بـ Cloud" + "value": "لا تتضمن هذه النسخة من cmux امتداد VPN موقعًا. استخدم إصدار cmux يدعم VPN الخاص بـ Cloud. تظل طرفيات Cloud والمنافذ وسطح المكتب متاحة بدون VPN." } }, "bs": { "stringUnit": { "state": "translated", - "value": "Poveži Cloud VPN" + "value": "Ova kopija cmux-a nema potpisani VPN dodatak. Koristite cmux izdanje sa Cloud VPN podrškom. Cloud terminali, portovi i radna površina ostaju dostupni bez VPN-a." } }, "da": { "stringUnit": { "state": "translated", - "value": "Forbind Cloud VPN" + "value": "Denne cmux-kopi indeholder ikke en signeret VPN-udvidelse. Brug en cmux-udgave med Cloud VPN-understøttelse. Cloud-terminaler, porte og skrivebord er stadig tilgængelige uden VPN." } }, "it": { "stringUnit": { "state": "translated", - "value": "Connetti VPN Cloud" + "value": "Questa copia di cmux non include un’estensione VPN firmata. Usa una versione di cmux con supporto Cloud VPN. Terminali Cloud, porte e desktop restano disponibili senza VPN." } }, "km": { "stringUnit": { "state": "translated", - "value": "ភ្ជាប់ Cloud VPN" + "value": "cmux ច្បាប់នេះមិនមានផ្នែកបន្ថែម VPN ដែលបានចុះហត្ថលេខាទេ។ ប្រើកំណែ cmux ដែលគាំទ្រ Cloud VPN។ Terminal, Ports និង Desktop របស់ Cloud នៅតែប្រើបានដោយគ្មាន VPN។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Koble til Cloud VPN" + "value": "Denne cmux-kopien har ingen signert VPN-utvidelse. Bruk en cmux-versjon med Cloud VPN-støtte. Cloud-terminaler, porter og skrivebord er tilgjengelige uten VPN." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Połącz z Cloud VPN" + "value": "Ta kopia cmux nie zawiera podpisanego rozszerzenia VPN. Użyj wydania cmux z obsługą Cloud VPN. Terminale Cloud, porty i pulpit pozostają dostępne bez VPN." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Conectar Cloud VPN" + "value": "Esta cópia do cmux não inclui uma extensão VPN assinada. Use uma versão do cmux com suporte a Cloud VPN. Terminais Cloud, portas e área de trabalho continuam disponíveis sem VPN." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Подключить Cloud VPN" + "value": "В этой копии cmux нет подписанного VPN-расширения. Используйте выпуск cmux с поддержкой Cloud VPN. Cloud-терминалы, порты и рабочий стол доступны без VPN." } }, "th": { "stringUnit": { "state": "translated", - "value": "เชื่อมต่อ Cloud VPN" + "value": "cmux รุ่นนี้ไม่มีส่วนขยาย VPN ที่ลงนามแล้ว ใช้รุ่น cmux ที่รองรับ Cloud VPN เทอร์มินัล Cloud พอร์ต และเดสก์ท็อปยังใช้ได้โดยไม่ต้องมี VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Cloud VPN’e bağlan" + "value": "Bu cmux kopyasında imzalı VPN uzantısı bulunmuyor. Cloud VPN destekli bir cmux sürümü kullanın. Cloud terminalleri, portlar ve masaüstü VPN olmadan da kullanılabilir." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Підключити Cloud VPN" + "value": "Ця копія cmux не містить підписаного VPN-розширення. Використовуйте випуск cmux із підтримкою Cloud VPN. Cloud-термінали, порти й робочий стіл доступні без VPN." } } } }, - "cloud.vpn.setup.connected": { + "cloud.vpn.setup.waiting": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Connected" + "value": "Waiting" } }, "de": { "stringUnit": { "state": "translated", - "value": "Verbunden" + "value": "Warten" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Connecté" + "value": "En attente" } }, "es": { "stringUnit": { "state": "translated", - "value": "Conectada" + "value": "En espera" } }, "ja": { "stringUnit": { "state": "translated", - "value": "接続済み" + "value": "待機中" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "已连接" + "value": "等待中" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "已連線" + "value": "等待中" } }, "ko": { "stringUnit": { "state": "translated", - "value": "연결됨" + "value": "대기 중" } }, "ar": { "stringUnit": { "state": "translated", - "value": "متصل" + "value": "قيد الانتظار" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Povezano" + "value": "Čekanje" } }, "da": { "stringUnit": { "state": "translated", - "value": "Forbundet" + "value": "Venter" } }, "it": { "stringUnit": { "state": "translated", - "value": "Connessa" + "value": "In attesa" } }, "km": { "stringUnit": { "state": "translated", - "value": "បានភ្ជាប់" + "value": "កំពុងរង់ចាំ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Tilkoblet" + "value": "Venter" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Połączono" + "value": "Oczekiwanie" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Conectada" + "value": "Aguardando" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Подключено" + "value": "Ожидание" } }, "th": { "stringUnit": { "state": "translated", - "value": "เชื่อมต่อแล้ว" + "value": "กำลังรอ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bağlandı" + "value": "Bekliyor" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Підключено" + "value": "Очікування" } } } }, - "cloud.vpn.setup.disconnect": { + "cloudTree.ports.action.wake": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Disconnect" + "value": "Wake Machine" } }, "de": { "stringUnit": { "state": "translated", - "value": "Trennen" + "value": "Maschine aktivieren" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Déconnecter" + "value": "Réveiller la machine" } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Desconectar" + "value": "إيقاظ الجهاز" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "切断" + "value": "Activar máquina" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "断开连接" + "value": "喚醒機器" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "中斷連線" + "value": "唤醒机器" } }, "ko": { "stringUnit": { "state": "translated", - "value": "연결 해제" + "value": "머신 깨우기" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "قطع الاتصال" + "value": "マシンを起動" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Prekini vezu" + "value": "Probudi mašinu" } }, "da": { "stringUnit": { "state": "translated", - "value": "Afbryd" + "value": "Væk maskine" } }, "it": { "stringUnit": { "state": "translated", - "value": "Disconnetti" + "value": "Riattiva macchina" } }, "km": { "stringUnit": { "state": "translated", - "value": "ផ្តាច់" + "value": "ដាស់ម៉ាស៊ីន" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Koble fra" + "value": "Vekk maskin" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Rozłącz" + "value": "Wybudź maszynę" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Desconectar" + "value": "Despertar máquina" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Отключить" + "value": "Разбудить машину" } }, "th": { "stringUnit": { "state": "translated", - "value": "ตัดการเชื่อมต่อ" + "value": "ปลุกเครื่อง" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bağlantıyı kes" + "value": "Makineyi uyandır" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Від’єднати" + "value": "Розбудити машину" } } } }, - "cloud.vpn.setup.entry.subtitle": { + "cloudTree.ports.asleep.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Optional private IP access for other apps" + "value": "Wake the machine to check its services. cmux’s in-app forwarding does not need Cloud VPN." } }, "de": { "stringUnit": { "state": "translated", - "value": "Optionaler Zugriff auf private IPs für andere Apps" + "value": "Aktivieren Sie die Maschine, um ihre Dienste zu prüfen. Die Weiterleitung in cmux benötigt kein Cloud-VPN." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Accès facultatif aux IP privées pour les autres apps" + "value": "Réveillez la machine pour vérifier ses services. Le transfert intégré à cmux ne nécessite pas de VPN Cloud." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Acceso opcional a IP privadas para otras apps" + "value": "أيقظ الجهاز لفحص خدماته. لا تحتاج إعادة التوجيه داخل cmux إلى Cloud VPN." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "ほかのアプリからプライベートIPへアクセスする任意の設定" + "value": "Activa la máquina para comprobar sus servicios. El reenvío integrado de cmux no necesita Cloud VPN." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "为其他应用提供可选的私有 IP 访问" + "value": "喚醒機器以檢查其服務。cmux 的應用程式內轉送不需要 Cloud VPN。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "為其他 App 提供選用的私有 IP 存取" + "value": "唤醒机器以检查其服务。cmux 的应用内转发无需 Cloud VPN。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "다른 앱의 비공개 IP 접근을 위한 선택 설정" + "value": "머신을 깨워 서비스를 확인하세요. cmux 앱 내 전달에는 Cloud VPN이 필요하지 않습니다." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "وصول اختياري إلى عناوين IP الخاصة للتطبيقات الأخرى" + "value": "マシンを起動してサービスを確認してください。cmux のアプリ内転送に Cloud VPN は不要です。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Opcionalni pristup privatnim IP adresama za druge aplikacije" + "value": "Probudite mašinu da provjerite njene servise. Prosljeđivanje unutar cmux-a ne treba Cloud VPN." } }, "da": { "stringUnit": { "state": "translated", - "value": "Valgfri privat IP-adgang for andre apps" + "value": "Væk maskinen for at kontrollere dens tjenester. Videresendelse i cmux kræver ikke Cloud VPN." } }, "it": { "stringUnit": { "state": "translated", - "value": "Accesso facoltativo agli IP privati per altre app" + "value": "Riattiva la macchina per controllarne i servizi. L’inoltro all’interno di cmux non richiede la VPN Cloud." } }, "km": { "stringUnit": { "state": "translated", - "value": "ចូលប្រើ IP ឯកជនសម្រាប់កម្មវិធីផ្សេងៗជាជម្រើស" + "value": "ដាស់ម៉ាស៊ីនដើម្បីពិនិត្យសេវាកម្មរបស់វា។ ការបញ្ជូនបន្តនៅក្នុង cmux មិនត្រូវការ Cloud VPN ទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Valgfri privat IP-tilgang for andre apper" + "value": "Vekk maskinen for å sjekke tjenestene. Videresending i cmux trenger ikke Cloud VPN." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Opcjonalny dostęp innych aplikacji do prywatnych adresów IP" + "value": "Wybudź maszynę, aby sprawdzić jej usługi. Przekierowywanie w cmux nie wymaga Cloud VPN." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Acesso opcional a IPs privados para outros apps" + "value": "Desperte a máquina para verificar os serviços. O encaminhamento dentro do cmux não precisa do Cloud VPN." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Необязательный доступ других приложений к частным IP" + "value": "Разбудите машину, чтобы проверить её службы. Перенаправлению внутри cmux Cloud VPN не нужен." } }, "th": { "stringUnit": { "state": "translated", - "value": "การเข้าถึง IP ส่วนตัวสำหรับแอปอื่นแบบไม่บังคับ" + "value": "ปลุกเครื่องเพื่อตรวจสอบบริการ การส่งต่อภายใน cmux ไม่ต้องใช้ Cloud VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Diğer uygulamalar için isteğe bağlı özel IP erişimi" + "value": "Hizmetlerini denetlemek için makineyi uyandırın. cmux içi yönlendirme Cloud VPN gerektirmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Необов’язковий доступ інших програм до приватних IP" + "value": "Розбудіть машину, щоб перевірити її служби. Перенаправлення всередині cmux не потребує Cloud VPN." } } } }, - "cloud.vpn.setup.failed": { + "cloudTree.ports.available.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Needs attention" + "value": "Listening services" } }, "de": { "stringUnit": { "state": "translated", - "value": "Aktion erforderlich" + "value": "Lauschende Dienste" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Action requise" + "value": "Services en écoute" } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Requiere atención" + "value": "الخدمات المستمعة" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "対応が必要" + "value": "Servicios en escucha" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "需要处理" + "value": "監聽中的服務" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "需要處理" + "value": "监听中的服务" } }, "ko": { "stringUnit": { "state": "translated", - "value": "조치 필요" + "value": "수신 대기 서비스" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يتطلب إجراءً" + "value": "待ち受け中のサービス" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Potrebna pažnja" + "value": "Servisi koji slušaju" } }, "da": { "stringUnit": { "state": "translated", - "value": "Kræver opmærksomhed" + "value": "Lyttende tjenester" } }, "it": { "stringUnit": { "state": "translated", - "value": "Richiede attenzione" + "value": "Servizi in ascolto" } }, "km": { "stringUnit": { "state": "translated", - "value": "ត្រូវការការយកចិត្តទុកដាក់" + "value": "សេវាកម្មដែលកំពុងស្តាប់" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Krever handling" + "value": "Lyttende tjenester" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Wymaga uwagi" + "value": "Nasłuchujące usługi" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Requer atenção" + "value": "Serviços em escuta" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Требуется действие" + "value": "Прослушивающие службы" } }, "th": { "stringUnit": { "state": "translated", - "value": "ต้องดำเนินการ" + "value": "บริการที่กำลังรับฟัง" } }, "tr": { "stringUnit": { "state": "translated", - "value": "İlgilenilmeli" + "value": "Dinleyen hizmetler" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Потрібна увага" + "value": "Служби, що прослуховують" } } } }, - "cloud.vpn.setup.off": { + "cloudTree.ports.binding.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Off" + "value": "cmux’s browser route connects to 127.0.0.1 on the machine. Bind the service to 127.0.0.1 or 0.0.0.0, then refresh. Turning on Cloud VPN does not change this route." } }, "de": { "stringUnit": { "state": "translated", - "value": "Aus" + "value": "Die Browser-Verbindung von cmux verwendet 127.0.0.1 auf der Maschine. Binden Sie den Dienst an 127.0.0.1 oder 0.0.0.0 und aktualisieren Sie. Cloud-VPN ändert diese Route nicht." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Désactivé" + "value": "Le navigateur cmux se connecte à 127.0.0.1 sur la machine. Liez le service à 127.0.0.1 ou 0.0.0.0, puis actualisez. Activer le VPN Cloud ne change pas cette route." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Desactivada" + "value": "يتصل مسار متصفح cmux بالعنوان 127.0.0.1 على الجهاز. اربط الخدمة بالعنوان 127.0.0.1 أو 0.0.0.0 ثم حدّث. تشغيل Cloud VPN لا يغير هذا المسار." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "オフ" + "value": "La ruta del navegador de cmux conecta a 127.0.0.1 en la máquina. Enlaza el servicio a 127.0.0.1 o 0.0.0.0 y actualiza. Activar Cloud VPN no cambia esta ruta." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "已关闭" + "value": "cmux 的瀏覽器路徑會連線到機器上的 127.0.0.1。請將服務繫結至 127.0.0.1 或 0.0.0.0 後重新整理。開啟 Cloud VPN 不會改變此路徑。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "已關閉" + "value": "cmux 的浏览器路由连接到机器上的 127.0.0.1。请将服务绑定到 127.0.0.1 或 0.0.0.0 后刷新。开启 Cloud VPN 不会改变此路由。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "꺼짐" + "value": "cmux 브라우저 경로는 머신의 127.0.0.1에 연결합니다. 서비스를 127.0.0.1 또는 0.0.0.0에 바인딩한 후 새로 고치세요. Cloud VPN을 켜도 이 경로는 바뀌지 않습니다." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "متوقف" + "value": "cmux のブラウザはマシン上の 127.0.0.1 に接続します。サービスを 127.0.0.1 または 0.0.0.0 にバインドして更新してください。Cloud VPN を有効にしてもこの経路は変わりません。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Isključeno" + "value": "Ruta preglednika u cmux-u povezuje se na 127.0.0.1 na mašini. Vežite servis na 127.0.0.1 ili 0.0.0.0, zatim osvježite. Uključivanje Cloud VPN-a ne mijenja ovu rutu." } }, "da": { "stringUnit": { "state": "translated", - "value": "Fra" + "value": "cmux’ browserrute forbinder til 127.0.0.1 på maskinen. Bind tjenesten til 127.0.0.1 eller 0.0.0.0, og opdater derefter. Aktivering af Cloud VPN ændrer ikke denne rute." } }, "it": { "stringUnit": { "state": "translated", - "value": "Disattivata" + "value": "Il percorso del browser di cmux si connette a 127.0.0.1 sulla macchina. Associa il servizio a 127.0.0.1 o 0.0.0.0, quindi aggiorna. L’attivazione della VPN Cloud non modifica questo percorso." } }, "km": { "stringUnit": { "state": "translated", - "value": "បិទ" + "value": "ផ្លូវកម្មវិធីរុករករបស់ cmux ភ្ជាប់ទៅ 127.0.0.1 នៅលើម៉ាស៊ីន។ ចងសេវាកម្មទៅ 127.0.0.1 ឬ 0.0.0.0 រួចផ្ទុកឡើងវិញ។ ការបើក Cloud VPN មិនផ្លាស់ប្តូរផ្លូវនេះទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Av" + "value": "cmux sin nettleserrute kobler til 127.0.0.1 på maskinen. Bind tjenesten til 127.0.0.1 eller 0.0.0.0, og oppdater deretter. Å slå på Cloud VPN endrer ikke denne ruten." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Wyłączona" + "value": "Trasa przeglądarki cmux łączy się z 127.0.0.1 na maszynie. Powiąż usługę z 127.0.0.1 lub 0.0.0.0, a następnie odśwież. Włączenie Cloud VPN nie zmienia tej trasy." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Desativada" + "value": "A rota de navegador do cmux se conecta a 127.0.0.1 na máquina. Vincule o serviço a 127.0.0.1 ou 0.0.0.0 e atualize. Ativar o Cloud VPN não altera essa rota." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Выключено" + "value": "Браузерный маршрут cmux подключается к 127.0.0.1 на машине. Привяжите службу к 127.0.0.1 или 0.0.0.0, затем обновите. Включение Cloud VPN не меняет этот маршрут." } }, "th": { "stringUnit": { "state": "translated", - "value": "ปิด" + "value": "เส้นทางเบราว์เซอร์ของ cmux เชื่อมต่อกับ 127.0.0.1 บนเครื่อง ผูกบริการกับ 127.0.0.1 หรือ 0.0.0.0 แล้วรีเฟรช การเปิด Cloud VPN ไม่ได้เปลี่ยนเส้นทางนี้" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Kapalı" + "value": "cmux’un tarayıcı yolu makinedeki 127.0.0.1 adresine bağlanır. Hizmeti 127.0.0.1 veya 0.0.0.0 adresine bağlayın, ardından yenileyin. Cloud VPN’i açmak bu yolu değiştirmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Вимкнено" + "value": "Браузерний маршрут cmux підключається до 127.0.0.1 на машині. Прив’яжіть службу до 127.0.0.1 або 0.0.0.0, потім оновіть. Увімкнення Cloud VPN не змінює цей маршрут." } } } }, - "cloud.vpn.setup.openUnavailable": { + "cloudTree.ports.binding.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud VPN setup is unavailable" + "value": "Services use another interface" } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-VPN-Einrichtung ist nicht verfügbar" + "value": "Dienste verwenden eine andere Schnittstelle" } }, "fr": { "stringUnit": { "state": "translated", - "value": "La configuration du VPN Cloud est indisponible" + "value": "Les services utilisent une autre interface" } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "La configuración de VPN de Cloud no está disponible" + "value": "تستخدم الخدمات واجهة أخرى" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "Cloud VPN設定は利用できません" + "value": "Los servicios usan otra interfaz" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Cloud VPN 设置不可用" + "value": "服務使用其他介面" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "無法使用 Cloud VPN 設定" + "value": "服务使用其他接口" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Cloud VPN 설정을 사용할 수 없습니다" + "value": "서비스가 다른 인터페이스를 사용함" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "إعداد VPN الخاص بـ Cloud غير متاح" + "value": "サービスが別のインターフェイスを使用しています" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Podešavanje Cloud VPN-a nije dostupno" + "value": "Servisi koriste drugi interfejs" } }, "da": { "stringUnit": { "state": "translated", - "value": "Cloud VPN-opsætning er ikke tilgængelig" + "value": "Tjenester bruger en anden grænseflade" } }, "it": { "stringUnit": { "state": "translated", - "value": "La configurazione VPN Cloud non è disponibile" + "value": "I servizi usano un’altra interfaccia" } }, "km": { "stringUnit": { "state": "translated", - "value": "ការរៀបចំ Cloud VPN មិនអាចប្រើបាន" + "value": "សេវាកម្មប្រើចំណុចប្រទាក់ផ្សេង" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Cloud VPN-oppsett er ikke tilgjengelig" + "value": "Tjenester bruker et annet grensesnitt" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Konfiguracja Cloud VPN jest niedostępna" + "value": "Usługi używają innego interfejsu" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A configuração do Cloud VPN não está disponível" + "value": "Os serviços usam outra interface" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Настройка Cloud VPN недоступна" + "value": "Службы используют другой интерфейс" } }, "th": { "stringUnit": { "state": "translated", - "value": "การตั้งค่า Cloud VPN ไม่พร้อมใช้งาน" + "value": "บริการใช้อินเทอร์เฟซอื่น" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Cloud VPN kurulumu kullanılamıyor" + "value": "Hizmetler başka bir arabirim kullanıyor" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Налаштування Cloud VPN недоступне" + "value": "Служби використовують інший інтерфейс" } } } }, - "cloud.vpn.setup.permission.body": { + "cloudTree.ports.empty.noService": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The VPN software is included in cmux. You do not need another app. macOS may require your password or Touch ID during approval." + "value": "Start a web server on this machine, then refresh." } }, "de": { "stringUnit": { "state": "translated", - "value": "Die VPN-Software ist in cmux enthalten. Sie brauchen keine weitere App. macOS kann bei der Genehmigung Ihr Passwort oder Touch ID verlangen." + "value": "Starte einen Webserver auf diesem Rechner und aktualisiere dann die Liste." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Le logiciel VPN est inclus dans cmux. Aucune autre app n’est nécessaire. macOS peut demander votre mot de passe ou Touch ID lors de l’autorisation." + "value": "Démarrez un serveur web sur cette machine, puis actualisez." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "El software VPN está incluido en cmux. No necesitas otra app. macOS puede solicitar tu contraseña o Touch ID durante la autorización." + "value": "شغّل خادم ويب على هذا الجهاز، ثم حدّث القائمة." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "VPNソフトウェアはcmuxに含まれています。別のアプリは不要です。承認時にmacOSがパスワードまたはTouch IDを求めることがあります。" + "value": "Inicia un servidor web en esta máquina y luego actualiza." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux 已包含 VPN 软件,无需其他应用。批准时,macOS 可能要求您输入密码或使用触控 ID。" + "value": "在這台機器上啟動網頁伺服器,然後重新整理。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 已包含 VPN 軟體,不需要其他 App。核准時,macOS 可能要求您輸入密碼或使用 Touch ID。" + "value": "在此机器上启动网页服务器,然后刷新。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "VPN 소프트웨어는 cmux에 포함되어 있습니다. 다른 앱은 필요하지 않습니다. 승인 시 macOS에서 암호 또는 Touch ID를 요청할 수 있습니다." + "value": "이 머신에서 웹 서버를 시작한 다음 새로 고치세요." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "برنامج VPN مضمن في cmux. لا تحتاج إلى تطبيق آخر. قد يطلب macOS كلمة المرور أو Touch ID أثناء الموافقة." + "value": "このマシンで Web サーバーを起動してから、更新してください。" } }, "bs": { "stringUnit": { - "state": "translated", - "value": "VPN softver je uključen u cmux. Nije potrebna druga aplikacija. macOS može zatražiti lozinku ili Touch ID tokom odobravanja." + "state": "needs_review", + "value": "Pokrenite web server na ovoj mašini, zatim osvježite." } }, "da": { "stringUnit": { - "state": "translated", - "value": "VPN-softwaren er inkluderet i cmux. Du behøver ingen anden app. macOS kan bede om din adgangskode eller Touch ID under godkendelsen." + "state": "needs_review", + "value": "Start en webserver på denne maskine, og opdater derefter." } }, "it": { "stringUnit": { - "state": "translated", - "value": "Il software VPN è incluso in cmux. Non serve un’altra app. macOS potrebbe chiedere la password o Touch ID durante l’autorizzazione." + "state": "needs_review", + "value": "Avvia un server web su questa macchina, poi aggiorna." } }, "km": { "stringUnit": { - "state": "translated", - "value": "កម្មវិធី VPN មាននៅក្នុង cmux។ អ្នកមិនត្រូវការកម្មវិធីផ្សេងទៀតទេ។ macOS អាចស្នើពាក្យសម្ងាត់ ឬ Touch ID ក្នុងពេលអនុម័ត។" + "state": "needs_review", + "value": "ចាប់ផ្តើមម៉ាស៊ីនមេបណ្តាញនៅលើម៉ាស៊ីននេះ រួចផ្ទុកឡើងវិញ។" } }, "nb": { "stringUnit": { - "state": "translated", - "value": "VPN-programvaren er inkludert i cmux. Du trenger ingen annen app. macOS kan be om passord eller Touch ID under godkjenningen." + "state": "needs_review", + "value": "Start en webserver på denne maskinen, og oppdater deretter." } }, "pl": { "stringUnit": { - "state": "translated", - "value": "Oprogramowanie VPN jest zawarte w cmux. Nie potrzebujesz innej aplikacji. macOS może poprosić o hasło lub Touch ID podczas zatwierdzania." + "state": "needs_review", + "value": "Uruchom serwer WWW na tej maszynie, a następnie odśwież." } }, "pt-BR": { "stringUnit": { - "state": "translated", - "value": "O software VPN vem incluído no cmux. Você não precisa de outro app. O macOS pode pedir sua senha ou Touch ID durante a aprovação." + "state": "needs_review", + "value": "Inicie um servidor web nesta máquina e atualize." } }, "ru": { "stringUnit": { - "state": "translated", - "value": "VPN-программа уже входит в cmux. Другие приложения не нужны. Во время подтверждения macOS может запросить пароль или Touch ID." + "state": "needs_review", + "value": "Запустите веб-сервер на этой машине, затем обновите список." } }, "th": { "stringUnit": { - "state": "translated", - "value": "ซอฟต์แวร์ VPN รวมอยู่ใน cmux แล้ว ไม่ต้องใช้แอปอื่น macOS อาจขอรหัสผ่านหรือ Touch ID ระหว่างการอนุมัติ" + "state": "needs_review", + "value": "เริ่มเว็บเซิร์ฟเวอร์บนเครื่องนี้ แล้วรีเฟรช" } }, "tr": { "stringUnit": { - "state": "translated", - "value": "VPN yazılımı cmux içinde bulunur. Başka bir uygulama gerekmez. macOS onay sırasında parolanızı veya Touch ID’yi isteyebilir." + "state": "needs_review", + "value": "Bu makinede bir web sunucusu başlatın, ardından yenileyin." } }, "uk": { "stringUnit": { - "state": "translated", - "value": "Програмне забезпечення VPN входить до cmux. Інша програма не потрібна. Під час схвалення macOS може попросити пароль або Touch ID." + "state": "needs_review", + "value": "Запустіть вебсервер на цій машині, а потім оновіть список." } } } }, - "cloud.vpn.setup.status.title": { + "cloudTree.ports.hub.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Private network status" + "value": "This build cannot start cmux’s authenticated Cloud forward. Update cmux, then retry." } }, "de": { "stringUnit": { "state": "translated", - "value": "Status des privaten Netzwerks" + "value": "Dieser Build kann die authentifizierte Cloud-Weiterleitung von cmux nicht starten. Aktualisieren Sie cmux und versuchen Sie es erneut." } }, "fr": { "stringUnit": { "state": "translated", - "value": "État du réseau privé" + "value": "Cette version ne peut pas démarrer le transfert Cloud authentifié de cmux. Mettez cmux à jour, puis réessayez." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Estado de la red privada" + "value": "لا يمكن لهذا الإصدار بدء إعادة توجيه Cloud الموثّقة من cmux. حدّث cmux ثم أعد المحاولة." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "プライベートネットワークの状態" + "value": "Esta compilación no puede iniciar el reenvío autenticado de Cloud de cmux. Actualiza cmux y vuelve a intentarlo." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "私有网络状态" + "value": "此版本無法啟動 cmux 的已驗證 Cloud 轉送。請更新 cmux 後重試。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "私有網路狀態" + "value": "此版本无法启动 cmux 的已验证 Cloud 转发。请更新 cmux 后重试。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "비공개 네트워크 상태" + "value": "이 빌드에서는 cmux 인증 Cloud 전달을 시작할 수 없습니다. cmux를 업데이트한 후 다시 시도하세요." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "حالة الشبكة الخاصة" + "value": "このビルドでは cmux の認証済み Cloud 転送を開始できません。cmux を更新して再試行してください。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Status privatne mreže" + "value": "Ova verzija ne može pokrenuti autentificirano Cloud prosljeđivanje cmux-a. Ažurirajte cmux, zatim pokušajte ponovo." } }, "da": { "stringUnit": { "state": "translated", - "value": "Status for privat netværk" + "value": "Denne build kan ikke starte cmux’ godkendte Cloud-videresendelse. Opdater cmux, og prøv igen." } }, "it": { "stringUnit": { "state": "translated", - "value": "Stato della rete privata" + "value": "Questa build non può avviare l’inoltro Cloud autenticato di cmux. Aggiorna cmux, quindi riprova." } }, "km": { "stringUnit": { "state": "translated", - "value": "ស្ថានភាពបណ្តាញឯកជន" + "value": "កំណែនេះមិនអាចចាប់ផ្តើមការបញ្ជូនបន្ត Cloud ដែលបានផ្ទៀងផ្ទាត់របស់ cmux បានទេ។ ធ្វើបច្ចុប្បន្នភាព cmux រួចព្យាយាមម្តងទៀត។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Status for privat nettverk" + "value": "Denne versjonen kan ikke starte cmux sin autentiserte Cloud-videresending. Oppdater cmux, og prøv igjen." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Stan sieci prywatnej" + "value": "Ta kompilacja nie może uruchomić uwierzytelnionego przekierowania Cloud w cmux. Zaktualizuj cmux i spróbuj ponownie." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Status da rede privada" + "value": "Esta versão não consegue iniciar o encaminhamento Cloud autenticado do cmux. Atualize o cmux e tente novamente." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Состояние частной сети" + "value": "Эта сборка не может запустить аутентифицированное перенаправление Cloud в cmux. Обновите cmux и повторите попытку." } }, "th": { "stringUnit": { "state": "translated", - "value": "สถานะเครือข่ายส่วนตัว" + "value": "บิลด์นี้ไม่สามารถเริ่มการส่งต่อ Cloud ที่ยืนยันตัวตนแล้วของ cmux ได้ อัปเดต cmux แล้วลองอีกครั้ง" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Özel ağ durumu" + "value": "Bu derleme cmux’un kimliği doğrulanmış Cloud yönlendirmesini başlatamıyor. cmux’u güncelleyin, ardından yeniden deneyin." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Стан приватної мережі" + "value": "Ця збірка не може запустити автентифіковане перенаправлення Cloud у cmux. Оновіть cmux і повторіть спробу." } } } }, - "cloud.vpn.setup.title": { + "cloudTree.ports.link.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Port discovery could not connect to this machine. Existing cmux ports may still work. Refresh to reconnect; Cloud VPN is not required." } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-VPN" + "value": "Die Porterkennung konnte diese Maschine nicht erreichen. Bereits geöffnete cmux-Ports funktionieren möglicherweise weiter. Aktualisieren Sie zum erneuten Verbinden; Cloud-VPN ist nicht erforderlich." } }, "fr": { "stringUnit": { "state": "translated", - "value": "VPN Cloud" + "value": "La découverte des ports n’a pas pu se connecter à cette machine. Les ports cmux existants peuvent encore fonctionner. Actualisez pour reconnecter ; le VPN Cloud n’est pas nécessaire." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "VPN de Cloud" + "value": "تعذر اتصال اكتشاف المنافذ بهذا الجهاز. قد تظل منافذ cmux الحالية تعمل. حدّث لإعادة الاتصال؛ Cloud VPN غير مطلوب." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "クラウドVPN" + "value": "El descubrimiento de puertos no pudo conectar con esta máquina. Los puertos de cmux existentes pueden seguir funcionando. Actualiza para reconectar; Cloud VPN no es necesario." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "云端 VPN" + "value": "連接埠探索無法連線到此機器。現有 cmux 連接埠可能仍可使用。請重新整理以重新連線;不需要 Cloud VPN。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "雲端 VPN" + "value": "端口发现无法连接到此机器。现有 cmux 端口可能仍可使用。请刷新以重新连接;无需 Cloud VPN。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 VPN" + "value": "포트 검색이 이 머신에 연결하지 못했습니다. 기존 cmux 포트는 계속 작동할 수 있습니다. 새로 고쳐 다시 연결하세요. Cloud VPN은 필요하지 않습니다." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "شبكة Cloud الخاصة" + "value": "ポート検出がこのマシンに接続できませんでした。既存の cmux ポートは引き続き動作する可能性があります。更新して再接続してください。Cloud VPN は不要です。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Otkrivanje portova nije se moglo povezati s ovom mašinom. Postojeći cmux portovi možda i dalje rade. Osvježite za ponovno povezivanje; Cloud VPN nije potreban." } }, "da": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Portregistrering kunne ikke oprette forbindelse til denne maskine. Eksisterende cmux-porte virker muligvis stadig. Opdater for at genoprette forbindelsen; Cloud VPN er ikke påkrævet." } }, "it": { "stringUnit": { "state": "translated", - "value": "VPN Cloud" + "value": "Il rilevamento delle porte non è riuscito a connettersi a questa macchina. Le porte cmux esistenti potrebbero funzionare ancora. Aggiorna per riconnetterti; la VPN Cloud non è necessaria." } }, "km": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "ការស្វែងរកច្រកមិនអាចភ្ជាប់ទៅម៉ាស៊ីននេះបានទេ។ ច្រក cmux ដែលមានស្រាប់អាចនៅតែដំណើរការ។ ផ្ទុកឡើងវិញដើម្បីភ្ជាប់ម្តងទៀត; មិនត្រូវការ Cloud VPN ទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Portoppdagelse kunne ikke koble til denne maskinen. Eksisterende cmux-porter kan fortsatt fungere. Oppdater for å koble til på nytt; Cloud VPN er ikke nødvendig." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Wykrywanie portów nie mogło połączyć się z tą maszyną. Istniejące porty cmux mogą nadal działać. Odśwież, aby połączyć ponownie; Cloud VPN nie jest wymagany." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "A descoberta de portas não conseguiu se conectar a esta máquina. As portas existentes do cmux ainda podem funcionar. Atualize para reconectar; o Cloud VPN não é necessário." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Обнаружению портов не удалось подключиться к этой машине. Существующие порты cmux могут по-прежнему работать. Обновите, чтобы переподключиться; Cloud VPN не требуется." } }, "th": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "การค้นหาพอร์ตไม่สามารถเชื่อมต่อกับเครื่องนี้ได้ พอร์ต cmux ที่มีอยู่อาจยังใช้งานได้ รีเฟรชเพื่อเชื่อมต่อใหม่ ไม่จำเป็นต้องใช้ Cloud VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Port keşfi bu makineye bağlanamadı. Mevcut cmux portları hâlâ çalışıyor olabilir. Yeniden bağlanmak için yenileyin; Cloud VPN gerekmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Cloud VPN" + "value": "Виявленню портів не вдалося підключитися до цієї машини. Наявні порти cmux можуть і далі працювати. Оновіть, щоб підключитися знову; Cloud VPN не потрібен." } } } }, - "cloud.vpn.setup.unavailable": { + "cloudTree.ports.link.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "This copy of cmux does not include a signed VPN extension. Use a cmux release with Cloud VPN support. Cloud terminals, Ports, and Desktop remain available without the VPN." + "value": "Cloud link unavailable" } }, "de": { "stringUnit": { "state": "translated", - "value": "Diese cmux-Version enthält keine signierte VPN-Erweiterung. Verwenden Sie eine cmux-Version mit Cloud-VPN-Unterstützung. Cloud-Terminals, Ports und Desktop bleiben ohne VPN verfügbar." + "value": "Cloud-Verbindung nicht verfügbar" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Cette copie de cmux ne contient pas d’extension VPN signée. Utilisez une version de cmux qui prend en charge le VPN Cloud. Les terminaux Cloud, Ports et Bureau restent disponibles sans VPN." + "value": "Connexion Cloud indisponible" } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Esta copia de cmux no incluye una extensión VPN firmada. Usa una versión de cmux compatible con VPN de Cloud. Los terminales Cloud, Puertos y Escritorio siguen disponibles sin VPN." + "value": "اتصال Cloud غير متاح" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "このcmuxには署名済みのVPN機能拡張が含まれていません。Cloud VPN対応のcmuxリリースを使用してください。Cloudのターミナル、ポート、デスクトップはVPNなしでも使えます。" + "value": "Conexión de Cloud no disponible" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "此 cmux 副本未包含已签名的 VPN 扩展。请使用支持 Cloud VPN 的 cmux 版本。Cloud 终端、端口和桌面无需 VPN 仍可使用。" + "value": "Cloud 連線無法使用" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "此 cmux 副本未包含已簽署的 VPN 延伸功能。請使用支援 Cloud VPN 的 cmux 版本。Cloud 終端機、連接埠和桌面不需要 VPN 仍可使用。" + "value": "Cloud 连接不可用" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 cmux에는 서명된 VPN 확장이 포함되어 있지 않습니다. Cloud VPN을 지원하는 cmux 릴리스를 사용하세요. Cloud 터미널, 포트 및 데스크탑은 VPN 없이도 사용할 수 있습니다." + "value": "Cloud 연결을 사용할 수 없음" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "لا تتضمن هذه النسخة من cmux امتداد VPN موقعًا. استخدم إصدار cmux يدعم VPN الخاص بـ Cloud. تظل طرفيات Cloud والمنافذ وسطح المكتب متاحة بدون VPN." + "value": "Cloud 接続を利用できません" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ova kopija cmux-a nema potpisani VPN dodatak. Koristite cmux izdanje sa Cloud VPN podrškom. Cloud terminali, portovi i radna površina ostaju dostupni bez VPN-a." + "value": "Cloud veza nije dostupna" } }, "da": { "stringUnit": { "state": "translated", - "value": "Denne cmux-kopi indeholder ikke en signeret VPN-udvidelse. Brug en cmux-udgave med Cloud VPN-understøttelse. Cloud-terminaler, porte og skrivebord er stadig tilgængelige uden VPN." + "value": "Cloud-forbindelse utilgængelig" } }, "it": { "stringUnit": { "state": "translated", - "value": "Questa copia di cmux non include un’estensione VPN firmata. Usa una versione di cmux con supporto Cloud VPN. Terminali Cloud, porte e desktop restano disponibili senza VPN." + "value": "Collegamento Cloud non disponibile" } }, "km": { "stringUnit": { "state": "translated", - "value": "cmux ច្បាប់នេះមិនមានផ្នែកបន្ថែម VPN ដែលបានចុះហត្ថលេខាទេ។ ប្រើកំណែ cmux ដែលគាំទ្រ Cloud VPN។ Terminal, Ports និង Desktop របស់ Cloud នៅតែប្រើបានដោយគ្មាន VPN។" + "value": "តំណ Cloud មិនអាចប្រើបាន" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Denne cmux-kopien har ingen signert VPN-utvidelse. Bruk en cmux-versjon med Cloud VPN-støtte. Cloud-terminaler, porter og skrivebord er tilgjengelige uten VPN." + "value": "Cloud-tilkobling utilgjengelig" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Ta kopia cmux nie zawiera podpisanego rozszerzenia VPN. Użyj wydania cmux z obsługą Cloud VPN. Terminale Cloud, porty i pulpit pozostają dostępne bez VPN." + "value": "Połączenie Cloud niedostępne" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Esta cópia do cmux não inclui uma extensão VPN assinada. Use uma versão do cmux com suporte a Cloud VPN. Terminais Cloud, portas e área de trabalho continuam disponíveis sem VPN." + "value": "Conexão Cloud indisponível" } }, "ru": { "stringUnit": { "state": "translated", - "value": "В этой копии cmux нет подписанного VPN-расширения. Используйте выпуск cmux с поддержкой Cloud VPN. Cloud-терминалы, порты и рабочий стол доступны без VPN." + "value": "Связь с Cloud недоступна" } }, "th": { "stringUnit": { "state": "translated", - "value": "cmux รุ่นนี้ไม่มีส่วนขยาย VPN ที่ลงนามแล้ว ใช้รุ่น cmux ที่รองรับ Cloud VPN เทอร์มินัล Cloud พอร์ต และเดสก์ท็อปยังใช้ได้โดยไม่ต้องมี VPN" + "value": "ลิงก์ Cloud ไม่พร้อมใช้งาน" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu cmux kopyasında imzalı VPN uzantısı bulunmuyor. Cloud VPN destekli bir cmux sürümü kullanın. Cloud terminalleri, portlar ve masaüstü VPN olmadan da kullanılabilir." + "value": "Cloud bağlantısı kullanılamıyor" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Ця копія cmux не містить підписаного VPN-розширення. Використовуйте випуск cmux із підтримкою Cloud VPN. Cloud-термінали, порти й робочий стіл доступні без VPN." + "value": "Зв’язок із Cloud недоступний" } } } }, - "cloud.vpn.setup.waiting": { + "cloudTree.ports.loading.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Waiting" + "value": "Checking services through cmux’s authenticated Cloud link. No system VPN is needed." } }, "de": { "stringUnit": { "state": "translated", - "value": "Warten" + "value": "Dienste werden über die authentifizierte Cloud-Verbindung von cmux geprüft. Ein System-VPN ist nicht erforderlich." } }, "fr": { "stringUnit": { "state": "translated", - "value": "En attente" + "value": "Vérification des services via la connexion Cloud authentifiée de cmux. Aucun VPN système n’est nécessaire." } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "En espera" + "value": "جارٍ فحص الخدمات عبر اتصال Cloud الموثّق من cmux. لا حاجة إلى VPN النظام." } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "待機中" + "value": "Comprobando servicios mediante la conexión autenticada de Cloud de cmux. No se necesita una VPN del sistema." } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "等待中" + "value": "正在透過 cmux 的已驗證 Cloud 連線檢查服務。不需要系統 VPN。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "等待中" + "value": "正在通过 cmux 的已验证 Cloud 连接检查服务。无需系统 VPN。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "대기 중" + "value": "cmux의 인증된 Cloud 연결로 서비스를 확인하고 있습니다. 시스템 VPN은 필요하지 않습니다." } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "قيد الانتظار" + "value": "cmux の認証済み Cloud 接続でサービスを確認しています。システム VPN は不要です。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Čekanje" + "value": "Provjera servisa putem autentificirane Cloud veze cmux-a. Sistemski VPN nije potreban." } }, "da": { "stringUnit": { "state": "translated", - "value": "Venter" + "value": "Kontrollerer tjenester via cmux’ godkendte Cloud-forbindelse. Der kræves ingen system-VPN." } }, "it": { "stringUnit": { "state": "translated", - "value": "In attesa" + "value": "Controllo dei servizi tramite il collegamento Cloud autenticato di cmux. Non serve una VPN di sistema." } }, "km": { "stringUnit": { "state": "translated", - "value": "កំពុងរង់ចាំ" + "value": "កំពុងពិនិត្យសេវាកម្មតាមរយៈតំណ Cloud ដែលបានផ្ទៀងផ្ទាត់របស់ cmux។ មិនត្រូវការ VPN របស់ប្រព័ន្ធទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Venter" + "value": "Sjekker tjenester via cmux sin autentiserte Cloud-tilkobling. Ingen system-VPN er nødvendig." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Oczekiwanie" + "value": "Sprawdzanie usług przez uwierzytelnione połączenie Cloud w cmux. Systemowa sieć VPN nie jest potrzebna." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Aguardando" + "value": "Verificando serviços pela conexão Cloud autenticada do cmux. Nenhuma VPN do sistema é necessária." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Ожидание" + "value": "Проверка служб через аутентифицированную связь cmux с Cloud. Системный VPN не нужен." } }, "th": { "stringUnit": { "state": "translated", - "value": "กำลังรอ" + "value": "กำลังตรวจสอบบริการผ่านลิงก์ Cloud ที่ยืนยันตัวตนแล้วของ cmux ไม่ต้องใช้ VPN ของระบบ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bekliyor" + "value": "Hizmetler cmux’un kimliği doğrulanmış Cloud bağlantısı üzerinden denetleniyor. Sistem VPN’i gerekmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Очікування" + "value": "Перевірка служб через автентифікований зв’язок cmux із Cloud. Системний VPN не потрібен." } } } }, - "cloudTree.ports.action.wake": { + "cloudTree.ports.loopback.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Wake Machine" + "value": "These services open in cmux without Cloud VPN. They listen on the machine’s loopback address, so other apps cannot reach them through its private IP, even with VPN connected." } }, "de": { "stringUnit": { "state": "translated", - "value": "Maschine aktivieren" + "value": "Diese Dienste lassen sich in cmux ohne Cloud-VPN öffnen. Sie lauschen auf der Loopback-Adresse der Maschine. Andere Apps erreichen sie daher auch mit VPN nicht über deren private IP." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Réveiller la machine" + "value": "Ces services s’ouvrent dans cmux sans VPN Cloud. Ils écoutent sur l’adresse locale de la machine : les autres apps ne peuvent pas y accéder via son IP privée, même avec le VPN." } }, "ar": { "stringUnit": { "state": "translated", - "value": "إيقاظ الجهاز" + "value": "تُفتح هذه الخدمات داخل cmux دون Cloud VPN. وهي تستمع على عنوان الواجهة المحلية للجهاز، لذا لا تستطيع التطبيقات الأخرى الوصول إليها عبر عنوان IP الخاص به حتى مع اتصال VPN." } }, "es": { "stringUnit": { "state": "translated", - "value": "Activar máquina" + "value": "Estos servicios se abren en cmux sin Cloud VPN. Escuchan en la dirección de bucle local de la máquina, por lo que otras apps no pueden acceder por su IP privada, incluso con la VPN conectada." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "喚醒機器" + "value": "這些服務可在 cmux 中開啟,不需要 Cloud VPN。它們在機器的迴路位址上監聽,因此即使已連線 VPN,其他 App 也無法透過其私人 IP 存取。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "唤醒机器" + "value": "这些服务可在 cmux 中打开,无需 Cloud VPN。它们监听机器的回环地址,因此即使已连接 VPN,其他应用也无法通过其专用 IP 访问。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "머신 깨우기" + "value": "이 서비스는 Cloud VPN 없이 cmux에서 열립니다. 머신의 루프백 주소에서 수신 대기하므로 VPN에 연결해도 다른 앱은 비공개 IP로 접근할 수 없습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "マシンを起動" + "value": "これらのサービスは Cloud VPN なしで cmux から開けます。マシンのループバックアドレスで待ち受けるため、VPN 接続中でも他のアプリからプライベート IP 経由ではアクセスできません。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Probudi mašinu" + "value": "Ovi servisi se otvaraju u cmux-u bez Cloud VPN-a. Slušaju na loopback adresi mašine, pa ih druge aplikacije ne mogu dosegnuti preko njene privatne IP adrese, čak ni uz povezan VPN." } }, "da": { "stringUnit": { "state": "translated", - "value": "Væk maskine" + "value": "Disse tjenester åbnes i cmux uden Cloud VPN. De lytter på maskinens loopback-adresse, så andre apps kan ikke nå dem via dens private IP, heller ikke med VPN forbundet." } }, "it": { "stringUnit": { "state": "translated", - "value": "Riattiva macchina" + "value": "Questi servizi si aprono in cmux senza VPN Cloud. Sono in ascolto sull’indirizzo di loopback della macchina, quindi le altre app non possono raggiungerli tramite il suo IP privato, nemmeno con la VPN connessa." } }, "km": { "stringUnit": { "state": "translated", - "value": "ដាស់ម៉ាស៊ីន" + "value": "សេវាកម្មទាំងនេះបើកនៅក្នុង cmux ដោយមិនត្រូវការ Cloud VPN។ ពួកវាស្តាប់នៅលើអាសយដ្ឋាន loopback របស់ម៉ាស៊ីន ដូច្នេះកម្មវិធីផ្សេងទៀតមិនអាចចូលដល់ពួកវាតាមរយៈ IP ឯកជនរបស់វាបានទេ ទោះបីភ្ជាប់ VPN ក៏ដោយ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Vekk maskin" + "value": "Disse tjenestene åpnes i cmux uten Cloud VPN. De lytter på maskinens loopback-adresse, så andre apper kan ikke nå dem via den private IP-adressen, selv med VPN tilkoblet." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Wybudź maszynę" + "value": "Te usługi otwierają się w cmux bez Cloud VPN. Nasłuchują na adresie pętli zwrotnej maszyny, więc inne aplikacje nie mogą do nich dotrzeć przez jej prywatny adres IP, nawet przy połączonym VPN." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Despertar máquina" + "value": "Esses serviços abrem no cmux sem o Cloud VPN. Eles escutam no endereço de loopback da máquina, então outros apps não conseguem alcançá-los pelo IP privado dela, mesmo com a VPN conectada." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Разбудить машину" + "value": "Эти службы открываются в cmux без Cloud VPN. Они прослушивают loopback-адрес машины, поэтому другие приложения не могут обратиться к ним через её частный IP даже при подключённом VPN." } }, "th": { "stringUnit": { "state": "translated", - "value": "ปลุกเครื่อง" + "value": "บริการเหล่านี้เปิดใน cmux ได้โดยไม่ต้องใช้ Cloud VPN บริการรับฟังบนที่อยู่ loopback ของเครื่อง แอปอื่นจึงเข้าถึงผ่าน IP ส่วนตัวของเครื่องไม่ได้ แม้จะเชื่อมต่อ VPN แล้วก็ตาม" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Makineyi uyandır" + "value": "Bu hizmetler cmux’ta Cloud VPN olmadan açılır. Makinenin geri döngü adresinde dinledikleri için diğer uygulamalar, VPN bağlıyken bile makinenin özel IP’si üzerinden onlara ulaşamaz." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Розбудити машину" + "value": "Ці служби відкриваються в cmux без Cloud VPN. Вони прослуховують loopback-адресу машини, тому інші застосунки не можуть дістатися до них через її приватну IP-адресу, навіть із підключеним VPN." } } } }, - "cloudTree.ports.asleep.detail": { + "cloudTree.ports.loopback.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Wake the machine to check its services. cmux’s in-app forwarding does not need Cloud VPN." + "value": "Loopback services available" } }, "de": { "stringUnit": { "state": "translated", - "value": "Aktivieren Sie die Maschine, um ihre Dienste zu prüfen. Die Weiterleitung in cmux benötigt kein Cloud-VPN." + "value": "Loopback-Dienste verfügbar" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Réveillez la machine pour vérifier ses services. Le transfert intégré à cmux ne nécessite pas de VPN Cloud." + "value": "Services locaux disponibles" } }, "ar": { "stringUnit": { "state": "translated", - "value": "أيقظ الجهاز لفحص خدماته. لا تحتاج إعادة التوجيه داخل cmux إلى Cloud VPN." + "value": "خدمات الواجهة المحلية متاحة" } }, "es": { "stringUnit": { "state": "translated", - "value": "Activa la máquina para comprobar sus servicios. El reenvío integrado de cmux no necesita Cloud VPN." + "value": "Servicios de bucle local disponibles" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "喚醒機器以檢查其服務。cmux 的應用程式內轉送不需要 Cloud VPN。" + "value": "可使用迴路服務" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "唤醒机器以检查其服务。cmux 的应用内转发无需 Cloud VPN。" + "value": "回环服务可用" } }, "ko": { "stringUnit": { "state": "translated", - "value": "머신을 깨워 서비스를 확인하세요. cmux 앱 내 전달에는 Cloud VPN이 필요하지 않습니다." + "value": "루프백 서비스 사용 가능" } }, "ja": { "stringUnit": { "state": "translated", - "value": "マシンを起動してサービスを確認してください。cmux のアプリ内転送に Cloud VPN は不要です。" + "value": "ループバックのサービスを利用できます" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Probudite mašinu da provjerite njene servise. Prosljeđivanje unutar cmux-a ne treba Cloud VPN." + "value": "Dostupni loopback servisi" } }, "da": { "stringUnit": { "state": "translated", - "value": "Væk maskinen for at kontrollere dens tjenester. Videresendelse i cmux kræver ikke Cloud VPN." + "value": "Loopback-tjenester tilgængelige" } }, "it": { "stringUnit": { "state": "translated", - "value": "Riattiva la macchina per controllarne i servizi. L’inoltro all’interno di cmux non richiede la VPN Cloud." + "value": "Servizi di loopback disponibili" } }, "km": { "stringUnit": { "state": "translated", - "value": "ដាស់ម៉ាស៊ីនដើម្បីពិនិត្យសេវាកម្មរបស់វា។ ការបញ្ជូនបន្តនៅក្នុង cmux មិនត្រូវការ Cloud VPN ទេ។" + "value": "មានសេវាកម្ម loopback" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Vekk maskinen for å sjekke tjenestene. Videresending i cmux trenger ikke Cloud VPN." + "value": "Loopback-tjenester tilgjengelige" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Wybudź maszynę, aby sprawdzić jej usługi. Przekierowywanie w cmux nie wymaga Cloud VPN." + "value": "Dostępne usługi pętli zwrotnej" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Desperte a máquina para verificar os serviços. O encaminhamento dentro do cmux não precisa do Cloud VPN." + "value": "Serviços de loopback disponíveis" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Разбудите машину, чтобы проверить её службы. Перенаправлению внутри cmux Cloud VPN не нужен." + "value": "Доступны loopback-службы" } }, "th": { "stringUnit": { "state": "translated", - "value": "ปลุกเครื่องเพื่อตรวจสอบบริการ การส่งต่อภายใน cmux ไม่ต้องใช้ Cloud VPN" + "value": "มีบริการ loopback พร้อมใช้งาน" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Hizmetlerini denetlemek için makineyi uyandırın. cmux içi yönlendirme Cloud VPN gerektirmez." + "value": "Geri döngü hizmetleri kullanılabilir" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Розбудіть машину, щоб перевірити її служби. Перенаправлення всередині cmux не потребує Cloud VPN." + "value": "Доступні loopback-служби" } } } }, - "cloudTree.ports.available.title": { + "cloudTree.ports.notRequested.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Listening services" + "value": "Ports not checked yet" } }, "de": { "stringUnit": { "state": "translated", - "value": "Lauschende Dienste" + "value": "Ports noch nicht geprüft" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Services en écoute" + "value": "Ports pas encore vérifiés" } }, "ar": { "stringUnit": { "state": "translated", - "value": "الخدمات المستمعة" + "value": "لم يتم فحص المنافذ بعد" } }, "es": { "stringUnit": { "state": "translated", - "value": "Servicios en escucha" + "value": "Puertos aún sin comprobar" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "監聽中的服務" + "value": "尚未檢查連接埠" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "监听中的服务" + "value": "尚未检查端口" } }, "ko": { "stringUnit": { "state": "translated", - "value": "수신 대기 서비스" + "value": "아직 포트를 확인하지 않음" } }, "ja": { "stringUnit": { "state": "translated", - "value": "待ち受け中のサービス" + "value": "ポートは未確認です" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Servisi koji slušaju" + "value": "Portovi još nisu provjereni" } }, "da": { "stringUnit": { "state": "translated", - "value": "Lyttende tjenester" + "value": "Porte er ikke kontrolleret endnu" } }, "it": { "stringUnit": { "state": "translated", - "value": "Servizi in ascolto" + "value": "Porte non ancora controllate" } }, "km": { "stringUnit": { "state": "translated", - "value": "សេវាកម្មដែលកំពុងស្តាប់" + "value": "មិនទាន់បានពិនិត្យច្រកនៅឡើយ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Lyttende tjenester" + "value": "Porter er ikke sjekket ennå" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Nasłuchujące usługi" + "value": "Porty nie zostały jeszcze sprawdzone" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Serviços em escuta" + "value": "Portas ainda não verificadas" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Прослушивающие службы" + "value": "Порты ещё не проверены" } }, "th": { "stringUnit": { "state": "translated", - "value": "บริการที่กำลังรับฟัง" + "value": "ยังไม่ได้ตรวจสอบพอร์ต" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Dinleyen hizmetler" + "value": "Portlar henüz denetlenmedi" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Служби, що прослуховують" + "value": "Порти ще не перевірено" } } } }, - "cloudTree.ports.binding.detail": { + "cloudTree.ports.privateAddress": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux’s browser route connects to 127.0.0.1 on the machine. Bind the service to 127.0.0.1 or 0.0.0.0, then refresh. Turning on Cloud VPN does not change this route." + "value": "Private address unavailable" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die Browser-Verbindung von cmux verwendet 127.0.0.1 auf der Maschine. Binden Sie den Dienst an 127.0.0.1 oder 0.0.0.0 und aktualisieren Sie. Cloud-VPN ändert diese Route nicht." + "value": "Private Adresse nicht verfügbar" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Le navigateur cmux se connecte à 127.0.0.1 sur la machine. Liez le service à 127.0.0.1 ou 0.0.0.0, puis actualisez. Activer le VPN Cloud ne change pas cette route." + "value": "Adresse privée indisponible" } }, "ar": { "stringUnit": { "state": "translated", - "value": "يتصل مسار متصفح cmux بالعنوان 127.0.0.1 على الجهاز. اربط الخدمة بالعنوان 127.0.0.1 أو 0.0.0.0 ثم حدّث. تشغيل Cloud VPN لا يغير هذا المسار." + "value": "العنوان الخاص غير متاح" } }, "es": { "stringUnit": { "state": "translated", - "value": "La ruta del navegador de cmux conecta a 127.0.0.1 en la máquina. Enlaza el servicio a 127.0.0.1 o 0.0.0.0 y actualiza. Activar Cloud VPN no cambia esta ruta." + "value": "Dirección privada no disponible" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux 的瀏覽器路徑會連線到機器上的 127.0.0.1。請將服務繫結至 127.0.0.1 或 0.0.0.0 後重新整理。開啟 Cloud VPN 不會改變此路徑。" + "value": "私人位址無法使用" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 的浏览器路由连接到机器上的 127.0.0.1。请将服务绑定到 127.0.0.1 或 0.0.0.0 后刷新。开启 Cloud VPN 不会改变此路由。" + "value": "专用地址不可用" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux 브라우저 경로는 머신의 127.0.0.1에 연결합니다. 서비스를 127.0.0.1 또는 0.0.0.0에 바인딩한 후 새로 고치세요. Cloud VPN을 켜도 이 경로는 바뀌지 않습니다." + "value": "비공개 주소를 사용할 수 없음" } }, "ja": { "stringUnit": { "state": "translated", - "value": "cmux のブラウザはマシン上の 127.0.0.1 に接続します。サービスを 127.0.0.1 または 0.0.0.0 にバインドして更新してください。Cloud VPN を有効にしてもこの経路は変わりません。" + "value": "プライベートアドレスを利用できません" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ruta preglednika u cmux-u povezuje se na 127.0.0.1 na mašini. Vežite servis na 127.0.0.1 ili 0.0.0.0, zatim osvježite. Uključivanje Cloud VPN-a ne mijenja ovu rutu." + "value": "Privatna adresa nije dostupna" } }, "da": { "stringUnit": { "state": "translated", - "value": "cmux’ browserrute forbinder til 127.0.0.1 på maskinen. Bind tjenesten til 127.0.0.1 eller 0.0.0.0, og opdater derefter. Aktivering af Cloud VPN ændrer ikke denne rute." + "value": "Privat adresse utilgængelig" } }, "it": { "stringUnit": { "state": "translated", - "value": "Il percorso del browser di cmux si connette a 127.0.0.1 sulla macchina. Associa il servizio a 127.0.0.1 o 0.0.0.0, quindi aggiorna. L’attivazione della VPN Cloud non modifica questo percorso." + "value": "Indirizzo privato non disponibile" } }, "km": { "stringUnit": { "state": "translated", - "value": "ផ្លូវកម្មវិធីរុករករបស់ cmux ភ្ជាប់ទៅ 127.0.0.1 នៅលើម៉ាស៊ីន។ ចងសេវាកម្មទៅ 127.0.0.1 ឬ 0.0.0.0 រួចផ្ទុកឡើងវិញ។ ការបើក Cloud VPN មិនផ្លាស់ប្តូរផ្លូវនេះទេ។" + "value": "អាសយដ្ឋានឯកជនមិនអាចប្រើបាន" } }, "nb": { "stringUnit": { "state": "translated", - "value": "cmux sin nettleserrute kobler til 127.0.0.1 på maskinen. Bind tjenesten til 127.0.0.1 eller 0.0.0.0, og oppdater deretter. Å slå på Cloud VPN endrer ikke denne ruten." + "value": "Privat adresse utilgjengelig" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Trasa przeglądarki cmux łączy się z 127.0.0.1 na maszynie. Powiąż usługę z 127.0.0.1 lub 0.0.0.0, a następnie odśwież. Włączenie Cloud VPN nie zmienia tej trasy." + "value": "Adres prywatny niedostępny" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A rota de navegador do cmux se conecta a 127.0.0.1 na máquina. Vincule o serviço a 127.0.0.1 ou 0.0.0.0 e atualize. Ativar o Cloud VPN não altera essa rota." + "value": "Endereço privado indisponível" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Браузерный маршрут cmux подключается к 127.0.0.1 на машине. Привяжите службу к 127.0.0.1 или 0.0.0.0, затем обновите. Включение Cloud VPN не меняет этот маршрут." + "value": "Частный адрес недоступен" } }, "th": { "stringUnit": { "state": "translated", - "value": "เส้นทางเบราว์เซอร์ของ cmux เชื่อมต่อกับ 127.0.0.1 บนเครื่อง ผูกบริการกับ 127.0.0.1 หรือ 0.0.0.0 แล้วรีเฟรช การเปิด Cloud VPN ไม่ได้เปลี่ยนเส้นทางนี้" + "value": "ไม่มีที่อยู่ส่วนตัว" } }, "tr": { "stringUnit": { "state": "translated", - "value": "cmux’un tarayıcı yolu makinedeki 127.0.0.1 adresine bağlanır. Hizmeti 127.0.0.1 veya 0.0.0.0 adresine bağlayın, ardından yenileyin. Cloud VPN’i açmak bu yolu değiştirmez." + "value": "Özel adres kullanılamıyor" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Браузерний маршрут cmux підключається до 127.0.0.1 на машині. Прив’яжіть службу до 127.0.0.1 або 0.0.0.0, потім оновіть. Увімкнення Cloud VPN не змінює цей маршрут." + "value": "Приватна адреса недоступна" } } } }, - "cloudTree.ports.binding.title": { + "cloudTree.ports.privateAddress.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Services use another interface" + "value": "cmux’s authenticated route needs this machine’s private address. Refresh to retrieve it. Turning on Cloud VPN does not assign a missing address." } }, "de": { "stringUnit": { "state": "translated", - "value": "Dienste verwenden eine andere Schnittstelle" + "value": "Die authentifizierte Route von cmux benötigt die private Adresse dieser Maschine. Aktualisieren Sie, um sie abzurufen. Cloud-VPN weist keine fehlende Adresse zu." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les services utilisent une autre interface" + "value": "La route authentifiée de cmux nécessite l’adresse privée de cette machine. Actualisez pour la récupérer. Activer le VPN Cloud n’attribue pas d’adresse manquante." } }, "ar": { "stringUnit": { "state": "translated", - "value": "تستخدم الخدمات واجهة أخرى" + "value": "يحتاج مسار cmux الموثّق إلى العنوان الخاص لهذا الجهاز. حدّث لاسترجاعه. تشغيل Cloud VPN لا يعيّن عنوانًا مفقودًا." } }, "es": { "stringUnit": { "state": "translated", - "value": "Los servicios usan otra interfaz" + "value": "La ruta autenticada de cmux necesita la dirección privada de esta máquina. Actualiza para obtenerla. Activar Cloud VPN no asigna una dirección que falta." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "服務使用其他介面" + "value": "cmux 的已驗證路徑需要此機器的私人位址。請重新整理以取得位址。開啟 Cloud VPN 不會指派缺少的位址。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "服务使用其他接口" + "value": "cmux 的已验证路由需要此机器的专用地址。请刷新以获取地址。开启 Cloud VPN 不会分配缺失的地址。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "서비스가 다른 인터페이스를 사용함" + "value": "cmux의 인증된 경로에는 이 머신의 비공개 주소가 필요합니다. 새로 고쳐 주소를 가져오세요. Cloud VPN을 켜도 누락된 주소가 할당되지는 않습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "サービスが別のインターフェイスを使用しています" + "value": "cmux の認証済み経路にはこのマシンのプライベートアドレスが必要です。更新して取得してください。Cloud VPN を有効にしても不足しているアドレスは割り当てられません。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Servisi koriste drugi interfejs" + "value": "Autentificirana ruta cmux-a treba privatnu adresu ove mašine. Osvježite da je preuzmete. Uključivanje Cloud VPN-a ne dodjeljuje adresu koja nedostaje." } }, "da": { "stringUnit": { "state": "translated", - "value": "Tjenester bruger en anden grænseflade" + "value": "cmux’ godkendte rute kræver denne maskines private adresse. Opdater for at hente den. Aktivering af Cloud VPN tildeler ikke en manglende adresse." } }, "it": { "stringUnit": { "state": "translated", - "value": "I servizi usano un’altra interfaccia" + "value": "Il percorso autenticato di cmux richiede l’indirizzo privato di questa macchina. Aggiorna per recuperarlo. L’attivazione della VPN Cloud non assegna un indirizzo mancante." } }, "km": { "stringUnit": { "state": "translated", - "value": "សេវាកម្មប្រើចំណុចប្រទាក់ផ្សេង" + "value": "ផ្លូវដែលបានផ្ទៀងផ្ទាត់របស់ cmux ត្រូវការអាសយដ្ឋានឯកជនរបស់ម៉ាស៊ីននេះ។ ផ្ទុកឡើងវិញដើម្បីទាញយកវា។ ការបើក Cloud VPN មិនផ្តល់អាសយដ្ឋានដែលបាត់ទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Tjenester bruker et annet grensesnitt" + "value": "cmux sin autentiserte rute trenger denne maskinens private adresse. Oppdater for å hente den. Å slå på Cloud VPN tildeler ikke en manglende adresse." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Usługi używają innego interfejsu" + "value": "Uwierzytelniona trasa cmux wymaga prywatnego adresu tej maszyny. Odśwież, aby go pobrać. Włączenie Cloud VPN nie przypisuje brakującego adresu." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Os serviços usam outra interface" + "value": "A rota autenticada do cmux precisa do endereço privado desta máquina. Atualize para obtê-lo. Ativar o Cloud VPN não atribui um endereço ausente." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Службы используют другой интерфейс" + "value": "Аутентифицированному маршруту cmux нужен частный адрес этой машины. Обновите, чтобы получить его. Включение Cloud VPN не назначает отсутствующий адрес." } }, "th": { "stringUnit": { "state": "translated", - "value": "บริการใช้อินเทอร์เฟซอื่น" + "value": "เส้นทางที่ยืนยันตัวตนแล้วของ cmux ต้องใช้ที่อยู่ส่วนตัวของเครื่องนี้ รีเฟรชเพื่อดึงข้อมูล การเปิด Cloud VPN ไม่ได้กำหนดที่อยู่ที่ขาดหายไป" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Hizmetler başka bir arabirim kullanıyor" + "value": "cmux’un kimliği doğrulanmış yolu bu makinenin özel adresine ihtiyaç duyar. Adresi almak için yenileyin. Cloud VPN’i açmak eksik bir adres atamaz." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Служби використовують інший інтерфейс" + "value": "Автентифікованому маршруту cmux потрібна приватна адреса цієї машини. Оновіть, щоб отримати її. Увімкнення Cloud VPN не призначає відсутню адресу." } } } }, - "cloudTree.ports.empty.noService": { + "cloudTree.ports.routeNote": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Start a web server on this machine, then refresh." + "value": "cmux forwards ports without Cloud VPN. Web browsers and other Mac apps need Cloud VPN to reach services bound to the machine’s private address." } }, "de": { "stringUnit": { "state": "translated", - "value": "Starte einen Webserver auf diesem Rechner und aktualisiere dann die Liste." + "value": "cmux leitet Ports ohne Cloud-VPN weiter. Webbrowser und andere Mac-Apps benötigen Cloud-VPN, um Dienste an der privaten Adresse der Maschine zu erreichen." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Démarrez un serveur web sur cette machine, puis actualisez." + "value": "cmux transfère les ports sans VPN Cloud. Les navigateurs web et les autres apps Mac ont besoin du VPN Cloud pour atteindre les services liés à l’adresse privée de la machine." } }, "ar": { "stringUnit": { "state": "translated", - "value": "شغّل خادم ويب على هذا الجهاز، ثم حدّث القائمة." + "value": "يعيد cmux توجيه المنافذ دون Cloud VPN. تحتاج متصفحات الويب وتطبيقات Mac الأخرى إلى Cloud VPN للوصول إلى الخدمات المرتبطة بالعنوان الخاص للجهاز." } }, "es": { "stringUnit": { "state": "translated", - "value": "Inicia un servidor web en esta máquina y luego actualiza." + "value": "cmux reenvía puertos sin Cloud VPN. Los navegadores web y otras apps de Mac necesitan Cloud VPN para acceder a servicios enlazados a la dirección privada de la máquina." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "在這台機器上啟動網頁伺服器,然後重新整理。" + "value": "cmux 可轉送連接埠,不需要 Cloud VPN。網頁瀏覽器和其他 Mac App 需要 Cloud VPN,才能存取繫結至機器私人位址的服務。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "在此机器上启动网页服务器,然后刷新。" + "value": "cmux 可转发端口,无需 Cloud VPN。网页浏览器和其他 Mac 应用需要 Cloud VPN,才能访问绑定到机器专用地址的服务。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 머신에서 웹 서버를 시작한 다음 새로 고치세요." + "value": "cmux는 Cloud VPN 없이 포트를 전달합니다. 웹 브라우저 및 다른 Mac 앱이 머신의 비공개 주소에 바인딩된 서비스에 접근하려면 Cloud VPN이 필요합니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "このマシンで Web サーバーを起動してから、更新してください。" + "value": "cmux は Cloud VPN なしでポートを転送します。Web ブラウザやその他の Mac アプリからマシンのプライベートアドレスにバインドされたサービスにアクセスするには Cloud VPN が必要です。" } }, "bs": { "stringUnit": { - "state": "needs_review", - "value": "Pokrenite web server na ovoj mašini, zatim osvježite." + "state": "translated", + "value": "cmux prosljeđuje portove bez Cloud VPN-a. Web preglednicima i drugim Mac aplikacijama potreban je Cloud VPN za pristup servisima vezanim za privatnu adresu mašine." } }, "da": { "stringUnit": { - "state": "needs_review", - "value": "Start en webserver på denne maskine, og opdater derefter." + "state": "translated", + "value": "cmux videresender porte uden Cloud VPN. Webbrowsere og andre Mac-apps skal bruge Cloud VPN for at nå tjenester, der er bundet til maskinens private adresse." } }, "it": { "stringUnit": { - "state": "needs_review", - "value": "Avvia un server web su questa macchina, poi aggiorna." + "state": "translated", + "value": "cmux inoltra le porte senza VPN Cloud. I browser web e le altre app per Mac hanno bisogno della VPN Cloud per raggiungere i servizi associati all’indirizzo privato della macchina." } }, "km": { "stringUnit": { - "state": "needs_review", - "value": "ចាប់ផ្តើមម៉ាស៊ីនមេបណ្តាញនៅលើម៉ាស៊ីននេះ រួចផ្ទុកឡើងវិញ។" + "state": "translated", + "value": "cmux បញ្ជូនបន្តច្រកដោយមិនត្រូវការ Cloud VPN។ កម្មវិធីរុករកបណ្តាញ និងកម្មវិធី Mac ផ្សេងទៀតត្រូវការ Cloud VPN ដើម្បីចូលដល់សេវាកម្មដែលចងទៅអាសយដ្ឋានឯកជនរបស់ម៉ាស៊ីន។" } }, "nb": { "stringUnit": { - "state": "needs_review", - "value": "Start en webserver på denne maskinen, og oppdater deretter." + "state": "translated", + "value": "cmux videresender porter uten Cloud VPN. Nettlesere og andre Mac-apper trenger Cloud VPN for å nå tjenester som er bundet til maskinens private adresse." } }, "pl": { "stringUnit": { - "state": "needs_review", - "value": "Uruchom serwer WWW na tej maszynie, a następnie odśwież." + "state": "translated", + "value": "cmux przekierowuje porty bez Cloud VPN. Przeglądarki internetowe i inne aplikacje na Maca potrzebują Cloud VPN, aby dotrzeć do usług powiązanych z prywatnym adresem maszyny." } }, "pt-BR": { "stringUnit": { - "state": "needs_review", - "value": "Inicie um servidor web nesta máquina e atualize." + "state": "translated", + "value": "O cmux encaminha portas sem o Cloud VPN. Navegadores e outros apps do Mac precisam do Cloud VPN para acessar serviços vinculados ao endereço privado da máquina." } }, "ru": { "stringUnit": { - "state": "needs_review", - "value": "Запустите веб-сервер на этой машине, затем обновите список." + "state": "translated", + "value": "cmux перенаправляет порты без Cloud VPN. Веб-браузерам и другим приложениям Mac нужен Cloud VPN, чтобы обращаться к службам, привязанным к частному адресу машины." } }, "th": { "stringUnit": { - "state": "needs_review", - "value": "เริ่มเว็บเซิร์ฟเวอร์บนเครื่องนี้ แล้วรีเฟรช" + "state": "translated", + "value": "cmux ส่งต่อพอร์ตได้โดยไม่ต้องใช้ Cloud VPN เว็บเบราว์เซอร์และแอป Mac อื่นๆ ต้องใช้ Cloud VPN เพื่อเข้าถึงบริการที่ผูกกับที่อยู่ส่วนตัวของเครื่อง" } }, "tr": { "stringUnit": { - "state": "needs_review", - "value": "Bu makinede bir web sunucusu başlatın, ardından yenileyin." + "state": "translated", + "value": "cmux, portları Cloud VPN olmadan yönlendirir. Web tarayıcıları ve diğer Mac uygulamaları, makinenin özel adresine bağlı hizmetlere ulaşmak için Cloud VPN’e ihtiyaç duyar." } }, "uk": { "stringUnit": { - "state": "needs_review", - "value": "Запустіть вебсервер на цій машині, а потім оновіть список." + "state": "translated", + "value": "cmux перенаправляє порти без Cloud VPN. Веббраузерам та іншим застосункам Mac потрібен Cloud VPN, щоб звертатися до служб, прив’язаних до приватної адреси машини." } } } }, - "cloudTree.ports.hub.detail": { + "cloudTree.ports.setupVPN": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "This build cannot start cmux’s authenticated Cloud forward. Update cmux, then retry." + "value": "Set Up VPN…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Dieser Build kann die authentifizierte Cloud-Weiterleitung von cmux nicht starten. Aktualisieren Sie cmux und versuchen Sie es erneut." + "value": "VPN einrichten…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Cette version ne peut pas démarrer le transfert Cloud authentifié de cmux. Mettez cmux à jour, puis réessayez." + "value": "Configurer le VPN…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "لا يمكن لهذا الإصدار بدء إعادة توجيه Cloud الموثّقة من cmux. حدّث cmux ثم أعد المحاولة." + "value": "إعداد VPN…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Esta compilación no puede iniciar el reenvío autenticado de Cloud de cmux. Actualiza cmux y vuelve a intentarlo." + "value": "Configurar VPN…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "此版本無法啟動 cmux 的已驗證 Cloud 轉送。請更新 cmux 後重試。" + "value": "設定 VPN…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "此版本无法启动 cmux 的已验证 Cloud 转发。请更新 cmux 后重试。" + "value": "设置 VPN…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 빌드에서는 cmux 인증 Cloud 전달을 시작할 수 없습니다. cmux를 업데이트한 후 다시 시도하세요." + "value": "VPN 설정…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "このビルドでは cmux の認証済み Cloud 転送を開始できません。cmux を更新して再試行してください。" + "value": "VPN を設定…" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ova verzija ne može pokrenuti autentificirano Cloud prosljeđivanje cmux-a. Ažurirajte cmux, zatim pokušajte ponovo." + "value": "Postavi VPN…" } }, "da": { "stringUnit": { "state": "translated", - "value": "Denne build kan ikke starte cmux’ godkendte Cloud-videresendelse. Opdater cmux, og prøv igen." + "value": "Konfigurer VPN…" } }, "it": { "stringUnit": { "state": "translated", - "value": "Questa build non può avviare l’inoltro Cloud autenticato di cmux. Aggiorna cmux, quindi riprova." + "value": "Configura VPN…" } }, "km": { "stringUnit": { "state": "translated", - "value": "កំណែនេះមិនអាចចាប់ផ្តើមការបញ្ជូនបន្ត Cloud ដែលបានផ្ទៀងផ្ទាត់របស់ cmux បានទេ។ ធ្វើបច្ចុប្បន្នភាព cmux រួចព្យាយាមម្តងទៀត។" + "value": "រៀបចំ VPN…" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Denne versjonen kan ikke starte cmux sin autentiserte Cloud-videresending. Oppdater cmux, og prøv igjen." + "value": "Konfigurer VPN…" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Ta kompilacja nie może uruchomić uwierzytelnionego przekierowania Cloud w cmux. Zaktualizuj cmux i spróbuj ponownie." + "value": "Skonfiguruj VPN…" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Esta versão não consegue iniciar o encaminhamento Cloud autenticado do cmux. Atualize o cmux e tente novamente." + "value": "Configurar VPN…" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Эта сборка не может запустить аутентифицированное перенаправление Cloud в cmux. Обновите cmux и повторите попытку." + "value": "Настроить VPN…" } }, "th": { "stringUnit": { "state": "translated", - "value": "บิลด์นี้ไม่สามารถเริ่มการส่งต่อ Cloud ที่ยืนยันตัวตนแล้วของ cmux ได้ อัปเดต cmux แล้วลองอีกครั้ง" + "value": "ตั้งค่า VPN…" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu derleme cmux’un kimliği doğrulanmış Cloud yönlendirmesini başlatamıyor. cmux’u güncelleyin, ardından yeniden deneyin." + "value": "VPN’i Kur…" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Ця збірка не може запустити автентифіковане перенаправлення Cloud у cmux. Оновіть cmux і повторіть спробу." + "value": "Налаштувати VPN…" } } } }, - "cloudTree.ports.link.detail": { + "cloudTree.ports.stale": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Port discovery could not connect to this machine. Existing cmux ports may still work. Refresh to reconnect; Cloud VPN is not required." + "value": "Port list may be out of date" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die Porterkennung konnte diese Maschine nicht erreichen. Bereits geöffnete cmux-Ports funktionieren möglicherweise weiter. Aktualisieren Sie zum erneuten Verbinden; Cloud-VPN ist nicht erforderlich." + "value": "Portliste möglicherweise veraltet" } }, "fr": { "stringUnit": { "state": "translated", - "value": "La découverte des ports n’a pas pu se connecter à cette machine. Les ports cmux existants peuvent encore fonctionner. Actualisez pour reconnecter ; le VPN Cloud n’est pas nécessaire." + "value": "La liste des ports peut être obsolète" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تعذر اتصال اكتشاف المنافذ بهذا الجهاز. قد تظل منافذ cmux الحالية تعمل. حدّث لإعادة الاتصال؛ Cloud VPN غير مطلوب." + "value": "قد تكون قائمة المنافذ قديمة" } }, "es": { "stringUnit": { "state": "translated", - "value": "El descubrimiento de puertos no pudo conectar con esta máquina. Los puertos de cmux existentes pueden seguir funcionando. Actualiza para reconectar; Cloud VPN no es necesario." + "value": "La lista de puertos puede estar desactualizada" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "連接埠探索無法連線到此機器。現有 cmux 連接埠可能仍可使用。請重新整理以重新連線;不需要 Cloud VPN。" + "value": "連接埠清單可能已過時" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "端口发现无法连接到此机器。现有 cmux 端口可能仍可使用。请刷新以重新连接;无需 Cloud VPN。" + "value": "端口列表可能已过期" } }, "ko": { "stringUnit": { "state": "translated", - "value": "포트 검색이 이 머신에 연결하지 못했습니다. 기존 cmux 포트는 계속 작동할 수 있습니다. 새로 고쳐 다시 연결하세요. Cloud VPN은 필요하지 않습니다." + "value": "포트 목록이 오래되었을 수 있음" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ポート検出がこのマシンに接続できませんでした。既存の cmux ポートは引き続き動作する可能性があります。更新して再接続してください。Cloud VPN は不要です。" + "value": "ポートリストが古い可能性があります" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Otkrivanje portova nije se moglo povezati s ovom mašinom. Postojeći cmux portovi možda i dalje rade. Osvježite za ponovno povezivanje; Cloud VPN nije potreban." + "value": "Lista portova je možda zastarjela" } }, "da": { "stringUnit": { "state": "translated", - "value": "Portregistrering kunne ikke oprette forbindelse til denne maskine. Eksisterende cmux-porte virker muligvis stadig. Opdater for at genoprette forbindelsen; Cloud VPN er ikke påkrævet." + "value": "Portlisten er muligvis forældet" } }, "it": { "stringUnit": { "state": "translated", - "value": "Il rilevamento delle porte non è riuscito a connettersi a questa macchina. Le porte cmux esistenti potrebbero funzionare ancora. Aggiorna per riconnetterti; la VPN Cloud non è necessaria." + "value": "L’elenco delle porte potrebbe non essere aggiornato" } }, "km": { "stringUnit": { "state": "translated", - "value": "ការស្វែងរកច្រកមិនអាចភ្ជាប់ទៅម៉ាស៊ីននេះបានទេ។ ច្រក cmux ដែលមានស្រាប់អាចនៅតែដំណើរការ។ ផ្ទុកឡើងវិញដើម្បីភ្ជាប់ម្តងទៀត; មិនត្រូវការ Cloud VPN ទេ។" + "value": "បញ្ជីច្រកអាចហួសសម័យ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Portoppdagelse kunne ikke koble til denne maskinen. Eksisterende cmux-porter kan fortsatt fungere. Oppdater for å koble til på nytt; Cloud VPN er ikke nødvendig." + "value": "Portlisten kan være utdatert" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Wykrywanie portów nie mogło połączyć się z tą maszyną. Istniejące porty cmux mogą nadal działać. Odśwież, aby połączyć ponownie; Cloud VPN nie jest wymagany." + "value": "Lista portów może być nieaktualna" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A descoberta de portas não conseguiu se conectar a esta máquina. As portas existentes do cmux ainda podem funcionar. Atualize para reconectar; o Cloud VPN não é necessário." + "value": "A lista de portas pode estar desatualizada" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Обнаружению портов не удалось подключиться к этой машине. Существующие порты cmux могут по-прежнему работать. Обновите, чтобы переподключиться; Cloud VPN не требуется." + "value": "Список портов может быть устаревшим" } }, "th": { "stringUnit": { "state": "translated", - "value": "การค้นหาพอร์ตไม่สามารถเชื่อมต่อกับเครื่องนี้ได้ พอร์ต cmux ที่มีอยู่อาจยังใช้งานได้ รีเฟรชเพื่อเชื่อมต่อใหม่ ไม่จำเป็นต้องใช้ Cloud VPN" + "value": "รายการพอร์ตอาจไม่เป็นปัจจุบัน" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Port keşfi bu makineye bağlanamadı. Mevcut cmux portları hâlâ çalışıyor olabilir. Yeniden bağlanmak için yenileyin; Cloud VPN gerekmez." + "value": "Port listesi güncel olmayabilir" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Виявленню портів не вдалося підключитися до цієї машини. Наявні порти cmux можуть і далі працювати. Оновіть, щоб підключитися знову; Cloud VPN не потрібен." + "value": "Список портів може бути застарілим" } } } }, - "cloudTree.ports.link.title": { + "cloudTree.ports.stale.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud link unavailable" + "value": "The last scan could not be refreshed. Listed services may have changed; refresh to check again. cmux forwarding does not need Cloud VPN." } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Verbindung nicht verfügbar" + "value": "Der letzte Scan konnte nicht aktualisiert werden. Die aufgeführten Dienste könnten sich geändert haben. Aktualisieren Sie erneut. Die cmux-Weiterleitung benötigt kein Cloud-VPN." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Connexion Cloud indisponible" + "value": "La dernière analyse n’a pas pu être actualisée. Les services listés peuvent avoir changé ; actualisez pour vérifier. Le transfert cmux ne nécessite pas de VPN Cloud." } }, "ar": { "stringUnit": { "state": "translated", - "value": "اتصال Cloud غير متاح" + "value": "تعذر تحديث آخر فحص. ربما تغيرت الخدمات المدرجة؛ حدّث للفحص مجددًا. لا تحتاج إعادة توجيه cmux إلى Cloud VPN." } }, "es": { "stringUnit": { "state": "translated", - "value": "Conexión de Cloud no disponible" + "value": "No se pudo actualizar el último escaneo. Los servicios listados pueden haber cambiado; actualiza para comprobarlos. El reenvío de cmux no necesita Cloud VPN." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Cloud 連線無法使用" + "value": "無法重新整理上次掃描結果。列出的服務可能已變更;請重新整理以再次檢查。cmux 轉送不需要 Cloud VPN。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Cloud 连接不可用" + "value": "无法刷新上次扫描结果。列出的服务可能已更改;请刷新以再次检查。cmux 转发无需 Cloud VPN。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Cloud 연결을 사용할 수 없음" + "value": "마지막 검색 결과를 새로 고치지 못했습니다. 나열된 서비스가 변경되었을 수 있으니 새로 고쳐 확인하세요. cmux 전달에는 Cloud VPN이 필요하지 않습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "Cloud 接続を利用できません" + "value": "前回のスキャンを更新できませんでした。表示されたサービスが変わっている可能性があります。更新して再確認してください。cmux の転送に Cloud VPN は不要です。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Cloud veza nije dostupna" + "value": "Posljednje skeniranje nije se moglo osvježiti. Navedeni servisi su se možda promijenili; osvježite da ponovo provjerite. Prosljeđivanje u cmux-u ne treba Cloud VPN." } }, "da": { "stringUnit": { "state": "translated", - "value": "Cloud-forbindelse utilgængelig" + "value": "Den seneste scanning kunne ikke opdateres. De viste tjenester kan have ændret sig; opdater for at kontrollere igen. Videresendelse i cmux kræver ikke Cloud VPN." } }, "it": { "stringUnit": { "state": "translated", - "value": "Collegamento Cloud non disponibile" + "value": "Non è stato possibile aggiornare l’ultima scansione. I servizi elencati potrebbero essere cambiati; aggiorna per controllare di nuovo. L’inoltro di cmux non richiede la VPN Cloud." } }, "km": { "stringUnit": { "state": "translated", - "value": "តំណ Cloud មិនអាចប្រើបាន" + "value": "មិនអាចផ្ទុកការស្កេនចុងក្រោយឡើងវិញបានទេ។ សេវាកម្មដែលបានរាយអាចបានផ្លាស់ប្តូរ; ផ្ទុកឡើងវិញដើម្បីពិនិត្យម្តងទៀត។ ការបញ្ជូនបន្តរបស់ cmux មិនត្រូវការ Cloud VPN ទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Cloud-tilkobling utilgjengelig" + "value": "Den siste skanningen kunne ikke oppdateres. De oppførte tjenestene kan ha endret seg; oppdater for å sjekke på nytt. Videresending i cmux trenger ikke Cloud VPN." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Połączenie Cloud niedostępne" + "value": "Nie udało się odświeżyć ostatniego skanowania. Wymienione usługi mogły się zmienić; odśwież, aby sprawdzić ponownie. Przekierowywanie w cmux nie wymaga Cloud VPN." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Conexão Cloud indisponível" + "value": "Não foi possível atualizar a última verificação. Os serviços listados podem ter mudado; atualize para verificar de novo. O encaminhamento do cmux não precisa do Cloud VPN." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Связь с Cloud недоступна" + "value": "Не удалось обновить последнее сканирование. Перечисленные службы могли измениться; обновите, чтобы проверить снова. Перенаправлению cmux Cloud VPN не нужен." } }, "th": { "stringUnit": { "state": "translated", - "value": "ลิงก์ Cloud ไม่พร้อมใช้งาน" + "value": "ไม่สามารถรีเฟรชการสแกนครั้งล่าสุดได้ บริการที่แสดงอาจเปลี่ยนไปแล้ว รีเฟรชเพื่อตรวจสอบอีกครั้ง การส่งต่อของ cmux ไม่ต้องใช้ Cloud VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Cloud bağlantısı kullanılamıyor" + "value": "Son tarama yenilenemedi. Listelenen hizmetler değişmiş olabilir; yeniden denetlemek için yenileyin. cmux yönlendirmesi Cloud VPN gerektirmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Зв’язок із Cloud недоступний" + "value": "Не вдалося оновити останнє сканування. Перелічені служби могли змінитися; оновіть, щоб перевірити знову. Перенаправлення cmux не потребує Cloud VPN." } } } }, - "cloudTree.ports.loading.detail": { + "cloudTree.ports.unavailable.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Checking services through cmux’s authenticated Cloud link. No system VPN is needed." + "value": "The port scan failed; this does not mean no service is listening. Existing cmux ports may still work. Refresh to retry; Cloud VPN is not required." } }, "de": { "stringUnit": { "state": "translated", - "value": "Dienste werden über die authentifizierte Cloud-Verbindung von cmux geprüft. Ein System-VPN ist nicht erforderlich." + "value": "Der Portscan ist fehlgeschlagen; das bedeutet nicht, dass kein Dienst lauscht. Vorhandene cmux-Ports funktionieren möglicherweise weiter. Aktualisieren Sie; Cloud-VPN ist nicht erforderlich." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Vérification des services via la connexion Cloud authentifiée de cmux. Aucun VPN système n’est nécessaire." + "value": "L’analyse des ports a échoué ; cela ne signifie pas qu’aucun service n’écoute. Les ports cmux existants peuvent encore fonctionner. Actualisez pour réessayer ; le VPN Cloud n’est pas nécessaire." } }, "ar": { "stringUnit": { "state": "translated", - "value": "جارٍ فحص الخدمات عبر اتصال Cloud الموثّق من cmux. لا حاجة إلى VPN النظام." + "value": "فشل فحص المنافذ؛ هذا لا يعني عدم وجود خدمة تستمع. قد تظل منافذ cmux الحالية تعمل. حدّث للمحاولة مجددًا؛ Cloud VPN غير مطلوب." } }, "es": { "stringUnit": { "state": "translated", - "value": "Comprobando servicios mediante la conexión autenticada de Cloud de cmux. No se necesita una VPN del sistema." + "value": "Falló el escaneo de puertos; no significa que no haya servicios en escucha. Los puertos de cmux existentes pueden seguir funcionando. Actualiza para reintentar; Cloud VPN no es necesario." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "正在透過 cmux 的已驗證 Cloud 連線檢查服務。不需要系統 VPN。" + "value": "連接埠掃描失敗;這不代表沒有服務正在監聽。現有 cmux 連接埠可能仍可使用。請重新整理以重試;不需要 Cloud VPN。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "正在通过 cmux 的已验证 Cloud 连接检查服务。无需系统 VPN。" + "value": "端口扫描失败;这并不代表没有服务正在监听。现有 cmux 端口可能仍可使用。请刷新以重试;无需 Cloud VPN。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux의 인증된 Cloud 연결로 서비스를 확인하고 있습니다. 시스템 VPN은 필요하지 않습니다." + "value": "포트 검색이 실패했지만 수신 대기 서비스가 없다는 뜻은 아닙니다. 기존 cmux 포트는 계속 작동할 수 있습니다. 새로 고쳐 다시 시도하세요. Cloud VPN은 필요하지 않습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "cmux の認証済み Cloud 接続でサービスを確認しています。システム VPN は不要です。" + "value": "ポートスキャンが失敗しましたが、サービスが待ち受けていないとは限りません。既存の cmux ポートは引き続き動作する可能性があります。更新して再試行してください。Cloud VPN は不要です。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Provjera servisa putem autentificirane Cloud veze cmux-a. Sistemski VPN nije potreban." + "value": "Skeniranje portova nije uspjelo; to ne znači da nijedan servis ne sluša. Postojeći cmux portovi možda i dalje rade. Osvježite za ponovni pokušaj; Cloud VPN nije potreban." } }, "da": { "stringUnit": { "state": "translated", - "value": "Kontrollerer tjenester via cmux’ godkendte Cloud-forbindelse. Der kræves ingen system-VPN." + "value": "Portscanningen mislykkedes; det betyder ikke, at ingen tjeneste lytter. Eksisterende cmux-porte virker muligvis stadig. Opdater for at prøve igen; Cloud VPN er ikke påkrævet." } }, "it": { "stringUnit": { "state": "translated", - "value": "Controllo dei servizi tramite il collegamento Cloud autenticato di cmux. Non serve una VPN di sistema." + "value": "La scansione delle porte non è riuscita; ciò non significa che nessun servizio sia in ascolto. Le porte cmux esistenti potrebbero funzionare ancora. Aggiorna per riprovare; la VPN Cloud non è necessaria." } }, "km": { "stringUnit": { "state": "translated", - "value": "កំពុងពិនិត្យសេវាកម្មតាមរយៈតំណ Cloud ដែលបានផ្ទៀងផ្ទាត់របស់ cmux។ មិនត្រូវការ VPN របស់ប្រព័ន្ធទេ។" + "value": "ការស្កេនច្រកបានបរាជ័យ; នេះមិនមានន័យថាគ្មានសេវាកម្មណាកំពុងស្តាប់ទេ។ ច្រក cmux ដែលមានស្រាប់អាចនៅតែដំណើរការ។ ផ្ទុកឡើងវិញដើម្បីព្យាយាមម្តងទៀត; មិនត្រូវការ Cloud VPN ទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Sjekker tjenester via cmux sin autentiserte Cloud-tilkobling. Ingen system-VPN er nødvendig." + "value": "Portskanningen mislyktes; det betyr ikke at ingen tjeneste lytter. Eksisterende cmux-porter kan fortsatt fungere. Oppdater for å prøve igjen; Cloud VPN er ikke nødvendig." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Sprawdzanie usług przez uwierzytelnione połączenie Cloud w cmux. Systemowa sieć VPN nie jest potrzebna." + "value": "Skanowanie portów nie powiodło się; nie oznacza to, że żadna usługa nie nasłuchuje. Istniejące porty cmux mogą nadal działać. Odśwież, aby spróbować ponownie; Cloud VPN nie jest wymagany." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Verificando serviços pela conexão Cloud autenticada do cmux. Nenhuma VPN do sistema é necessária." + "value": "A verificação de portas falhou; isso não significa que nenhum serviço esteja em escuta. As portas existentes do cmux ainda podem funcionar. Atualize para tentar de novo; o Cloud VPN não é necessário." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Проверка служб через аутентифицированную связь cmux с Cloud. Системный VPN не нужен." + "value": "Сканирование портов не удалось; это не значит, что ни одна служба не прослушивает порты. Существующие порты cmux могут по-прежнему работать. Обновите, чтобы повторить; Cloud VPN не требуется." } }, "th": { "stringUnit": { "state": "translated", - "value": "กำลังตรวจสอบบริการผ่านลิงก์ Cloud ที่ยืนยันตัวตนแล้วของ cmux ไม่ต้องใช้ VPN ของระบบ" + "value": "การสแกนพอร์ตล้มเหลว ไม่ได้หมายความว่าไม่มีบริการที่กำลังรับฟัง พอร์ต cmux ที่มีอยู่อาจยังใช้งานได้ รีเฟรชเพื่อลองอีกครั้ง ไม่จำเป็นต้องใช้ Cloud VPN" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Hizmetler cmux’un kimliği doğrulanmış Cloud bağlantısı üzerinden denetleniyor. Sistem VPN’i gerekmez." + "value": "Port taraması başarısız oldu; bu, dinleyen bir hizmet olmadığı anlamına gelmez. Mevcut cmux portları hâlâ çalışıyor olabilir. Yeniden denemek için yenileyin; Cloud VPN gerekmez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Перевірка служб через автентифікований зв’язок cmux із Cloud. Системний VPN не потрібен." + "value": "Сканування портів не вдалося; це не означає, що жодна служба не прослуховує. Наявні порти cmux можуть і далі працювати. Оновіть, щоб повторити; Cloud VPN не потрібен." } } } }, - "cloudTree.ports.loopback.detail": { + "cloudTree.ports.unsupported": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "These services open in cmux without Cloud VPN. They listen on the machine’s loopback address, so other apps cannot reach them through its private IP, even with VPN connected." + "value": "Ports are not supported by this provider." } }, "de": { "stringUnit": { "state": "translated", - "value": "Diese Dienste lassen sich in cmux ohne Cloud-VPN öffnen. Sie lauschen auf der Loopback-Adresse der Maschine. Andere Apps erreichen sie daher auch mit VPN nicht über deren private IP." + "value": "Ports werden von diesem Anbieter nicht unterstützt." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ces services s’ouvrent dans cmux sans VPN Cloud. Ils écoutent sur l’adresse locale de la machine : les autres apps ne peuvent pas y accéder via son IP privée, même avec le VPN." + "value": "Les ports ne sont pas pris en charge par ce fournisseur." } }, "ar": { "stringUnit": { "state": "translated", - "value": "تُفتح هذه الخدمات داخل cmux دون Cloud VPN. وهي تستمع على عنوان الواجهة المحلية للجهاز، لذا لا تستطيع التطبيقات الأخرى الوصول إليها عبر عنوان IP الخاص به حتى مع اتصال VPN." + "value": "لا يدعم هذا الموفر المنافذ." } }, "es": { "stringUnit": { "state": "translated", - "value": "Estos servicios se abren en cmux sin Cloud VPN. Escuchan en la dirección de bucle local de la máquina, por lo que otras apps no pueden acceder por su IP privada, incluso con la VPN conectada." + "value": "Este proveedor no admite puertos." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "這些服務可在 cmux 中開啟,不需要 Cloud VPN。它們在機器的迴路位址上監聽,因此即使已連線 VPN,其他 App 也無法透過其私人 IP 存取。" + "value": "此提供者不支援連接埠。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "这些服务可在 cmux 中打开,无需 Cloud VPN。它们监听机器的回环地址,因此即使已连接 VPN,其他应用也无法通过其专用 IP 访问。" + "value": "此提供商不支持端口。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 서비스는 Cloud VPN 없이 cmux에서 열립니다. 머신의 루프백 주소에서 수신 대기하므로 VPN에 연결해도 다른 앱은 비공개 IP로 접근할 수 없습니다." + "value": "이 제공자는 포트를 지원하지 않습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "これらのサービスは Cloud VPN なしで cmux から開けます。マシンのループバックアドレスで待ち受けるため、VPN 接続中でも他のアプリからプライベート IP 経由ではアクセスできません。" + "value": "このプロバイダーはポートをサポートしていません。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ovi servisi se otvaraju u cmux-u bez Cloud VPN-a. Slušaju na loopback adresi mašine, pa ih druge aplikacije ne mogu dosegnuti preko njene privatne IP adrese, čak ni uz povezan VPN." + "value": "Ovaj pružalac ne podržava portove." } }, "da": { "stringUnit": { "state": "translated", - "value": "Disse tjenester åbnes i cmux uden Cloud VPN. De lytter på maskinens loopback-adresse, så andre apps kan ikke nå dem via dens private IP, heller ikke med VPN forbundet." + "value": "Porte understøttes ikke af denne udbyder." } }, "it": { "stringUnit": { "state": "translated", - "value": "Questi servizi si aprono in cmux senza VPN Cloud. Sono in ascolto sull’indirizzo di loopback della macchina, quindi le altre app non possono raggiungerli tramite il suo IP privato, nemmeno con la VPN connessa." + "value": "Le porte non sono supportate da questo provider." } }, "km": { "stringUnit": { "state": "translated", - "value": "សេវាកម្មទាំងនេះបើកនៅក្នុង cmux ដោយមិនត្រូវការ Cloud VPN។ ពួកវាស្តាប់នៅលើអាសយដ្ឋាន loopback របស់ម៉ាស៊ីន ដូច្នេះកម្មវិធីផ្សេងទៀតមិនអាចចូលដល់ពួកវាតាមរយៈ IP ឯកជនរបស់វាបានទេ ទោះបីភ្ជាប់ VPN ក៏ដោយ។" + "value": "អ្នកផ្តល់សេវានេះមិនគាំទ្រច្រកទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Disse tjenestene åpnes i cmux uten Cloud VPN. De lytter på maskinens loopback-adresse, så andre apper kan ikke nå dem via den private IP-adressen, selv med VPN tilkoblet." + "value": "Porter støttes ikke av denne leverandøren." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Te usługi otwierają się w cmux bez Cloud VPN. Nasłuchują na adresie pętli zwrotnej maszyny, więc inne aplikacje nie mogą do nich dotrzeć przez jej prywatny adres IP, nawet przy połączonym VPN." + "value": "Ten dostawca nie obsługuje portów." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Esses serviços abrem no cmux sem o Cloud VPN. Eles escutam no endereço de loopback da máquina, então outros apps não conseguem alcançá-los pelo IP privado dela, mesmo com a VPN conectada." + "value": "Este provedor não oferece suporte a portas." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Эти службы открываются в cmux без Cloud VPN. Они прослушивают loopback-адрес машины, поэтому другие приложения не могут обратиться к ним через её частный IP даже при подключённом VPN." + "value": "Этот провайдер не поддерживает порты." } }, "th": { "stringUnit": { "state": "translated", - "value": "บริการเหล่านี้เปิดใน cmux ได้โดยไม่ต้องใช้ Cloud VPN บริการรับฟังบนที่อยู่ loopback ของเครื่อง แอปอื่นจึงเข้าถึงผ่าน IP ส่วนตัวของเครื่องไม่ได้ แม้จะเชื่อมต่อ VPN แล้วก็ตาม" + "value": "ผู้ให้บริการนี้ไม่รองรับพอร์ต" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu hizmetler cmux’ta Cloud VPN olmadan açılır. Makinenin geri döngü adresinde dinledikleri için diğer uygulamalar, VPN bağlıyken bile makinenin özel IP’si üzerinden onlara ulaşamaz." + "value": "Bu sağlayıcı portları desteklemiyor." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Ці служби відкриваються в cmux без Cloud VPN. Вони прослуховують loopback-адресу машини, тому інші застосунки не можуть дістатися до них через її приватну IP-адресу, навіть із підключеним VPN." + "value": "Цей постачальник не підтримує порти." } } } }, - "cloudTree.ports.loopback.title": { + "cloudTree.ports.unsupported.detail": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Loopback services available" + "value": "This provider has no supported in-app port route. Open a shell to access the service inside the machine. Cloud VPN does not add provider support." } }, "de": { "stringUnit": { "state": "translated", - "value": "Loopback-Dienste verfügbar" + "value": "Dieser Anbieter unterstützt keine Portverbindung in der App. Öffnen Sie eine Shell, um innerhalb der Maschine auf den Dienst zuzugreifen. Cloud-VPN fügt keine Anbieterunterstützung hinzu." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Services locaux disponibles" + "value": "Ce fournisseur ne prend pas en charge les ports dans l’app. Ouvrez un shell pour accéder au service dans la machine. Le VPN Cloud n’ajoute pas cette prise en charge." } }, "ar": { "stringUnit": { "state": "translated", - "value": "خدمات الواجهة المحلية متاحة" + "value": "لا يدعم هذا الموفر مسار منافذ داخل التطبيق. افتح صدفة للوصول إلى الخدمة داخل الجهاز. لا يضيف Cloud VPN دعمًا للموفر." } }, "es": { "stringUnit": { "state": "translated", - "value": "Servicios de bucle local disponibles" + "value": "Este proveedor no admite una ruta de puertos dentro de la app. Abre una shell para acceder al servicio dentro de la máquina. Cloud VPN no añade soporte al proveedor." } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "可使用迴路服務" + "value": "此提供者不支援應用程式內連接埠路徑。請開啟 Shell 以在機器內存取服務。Cloud VPN 不會新增提供者支援。" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "回环服务可用" + "value": "此提供商不支持应用内端口路由。请打开 Shell 以在机器内部访问服务。Cloud VPN 不会添加提供商支持。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "루프백 서비스 사용 가능" + "value": "이 제공자는 앱 내 포트 경로를 지원하지 않습니다. 셸을 열어 머신 내부의 서비스에 접근하세요. Cloud VPN으로 제공자 지원이 추가되지는 않습니다." } }, "ja": { "stringUnit": { "state": "translated", - "value": "ループバックのサービスを利用できます" + "value": "このプロバイダーはアプリ内のポート経路に対応していません。シェルを開き、マシン内でサービスにアクセスしてください。Cloud VPN を有効にしても対応は追加されません。" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Dostupni loopback servisi" + "value": "Ovaj pružalac nema podržanu rutu portova unutar aplikacije. Otvorite shell da pristupite servisu unutar mašine. Cloud VPN ne dodaje podršku pružaoca." } }, "da": { "stringUnit": { "state": "translated", - "value": "Loopback-tjenester tilgængelige" + "value": "Denne udbyder har ingen understøttet portrute i appen. Åbn en shell for at få adgang til tjenesten inde i maskinen. Cloud VPN tilføjer ikke understøttelse for udbyderen." } }, "it": { "stringUnit": { "state": "translated", - "value": "Servizi di loopback disponibili" + "value": "Questo provider non ha un percorso delle porte supportato nell’app. Apri una shell per accedere al servizio all’interno della macchina. La VPN Cloud non aggiunge il supporto del provider." } }, "km": { "stringUnit": { "state": "translated", - "value": "មានសេវាកម្ម loopback" + "value": "អ្នកផ្តល់សេវានេះគ្មានផ្លូវច្រកក្នុងកម្មវិធីដែលគាំទ្រទេ។ បើក shell ដើម្បីចូលប្រើសេវាកម្មនៅខាងក្នុងម៉ាស៊ីន។ Cloud VPN មិនបន្ថែមការគាំទ្រអ្នកផ្តល់សេវាទេ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Loopback-tjenester tilgjengelige" + "value": "Denne leverandøren har ingen støttet portrute i appen. Åpne et skall for å få tilgang til tjenesten inne i maskinen. Cloud VPN legger ikke til støtte for leverandøren." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Dostępne usługi pętli zwrotnej" + "value": "Ten dostawca nie ma obsługiwanej trasy portów w aplikacji. Otwórz powłokę, aby uzyskać dostęp do usługi wewnątrz maszyny. Cloud VPN nie dodaje obsługi dostawcy." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Serviços de loopback disponíveis" + "value": "Este provedor não tem uma rota de portas compatível no app. Abra um shell para acessar o serviço dentro da máquina. O Cloud VPN não adiciona suporte ao provedor." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Доступны loopback-службы" + "value": "У этого провайдера нет поддерживаемого маршрута портов в приложении. Откройте оболочку, чтобы получить доступ к службе внутри машины. Cloud VPN не добавляет поддержку провайдера." } }, "th": { "stringUnit": { "state": "translated", - "value": "มีบริการ loopback พร้อมใช้งาน" + "value": "ผู้ให้บริการนี้ไม่มีเส้นทางพอร์ตในแอปที่รองรับ เปิดเชลล์เพื่อเข้าถึงบริการภายในเครื่อง Cloud VPN ไม่ได้เพิ่มการรองรับผู้ให้บริการ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Geri döngü hizmetleri kullanılabilir" + "value": "Bu sağlayıcının desteklenen bir uygulama içi port yolu yok. Makinenin içindeki hizmete erişmek için bir kabuk açın. Cloud VPN sağlayıcı desteği eklemez." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Доступні loopback-служби" + "value": "Цей постачальник не має підтримуваного маршруту портів у застосунку. Відкрийте оболонку, щоб отримати доступ до служби всередині машини. Cloud VPN не додає підтримку постачальника." } } } }, - "cloudTree.ports.notRequested.title": { + "cloudTree.port.openInCmux": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Ports not checked yet" - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Ports noch nicht geprüft" + "value": "Open in cmux" } }, - "fr": { + "ar": { "stringUnit": { "state": "translated", - "value": "Ports pas encore vérifiés" + "value": "فتح في cmux" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "لم يتم فحص المنافذ بعد" + "value": "In cmux öffnen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Puertos aún sin comprobar" + "value": "Abrir en cmux" } }, - "zh-Hant": { + "fr": { "stringUnit": { "state": "translated", - "value": "尚未檢查連接埠" + "value": "Ouvrir dans cmux" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "尚未检查端口" + "value": "cmuxで開く" } }, "ko": { "stringUnit": { "state": "translated", - "value": "아직 포트를 확인하지 않음" + "value": "cmux에서 열기" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "ポートは未確認です" + "value": "在 cmux 中打开" } }, - "bs": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Portovi još nisu provjereni" + "value": "在 cmux 中開啟" } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Porte er ikke kontrolleret endnu" - } - }, - "it": { + } + } + }, + "cloudTree.port.openInCmux.help": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Porte non ancora controllate" + "value": "Open in cmux. No VPN setup needed." } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "មិនទាន់បានពិនិត្យច្រកនៅឡើយ" + "value": "افتح في cmux. لا يلزم إعداد VPN." } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Porter er ikke sjekket ennå" + "value": "In cmux öffnen. Keine VPN-Einrichtung nötig." } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Porty nie zostały jeszcze sprawdzone" + "value": "Abrir en cmux. No hace falta configurar una VPN." } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Portas ainda não verificadas" + "value": "Ouvrir dans cmux. Aucune configuration VPN nécessaire." } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Порты ещё не проверены" + "value": "cmux で開きます。VPN の設定は不要です。" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ยังไม่ได้ตรวจสอบพอร์ต" + "value": "cmux에서 열기. VPN 설정이 필요하지 않습니다." } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Portlar henüz denetlenmedi" + "value": "在 cmux 中打开。无需设置 VPN。" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Порти ще не перевірено" + "value": "在 cmux 中開啟。無需設定 VPN。" } } } }, - "cloudTree.ports.privateAddress": { + "cloudTree.port.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Private address unavailable" - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Private Adresse nicht verfügbar" + "value": "Port %@" } }, - "fr": { + "ar": { "stringUnit": { "state": "translated", - "value": "Adresse privée indisponible" + "value": "المنفذ %@" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "العنوان الخاص غير متاح" + "value": "Port-Nr. %@" } }, "es": { "stringUnit": { "state": "translated", - "value": "Dirección privada no disponible" + "value": "Puerto %@" } }, - "zh-Hant": { + "fr": { "stringUnit": { "state": "translated", - "value": "私人位址無法使用" + "value": "Port n° %@" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "专用地址不可用" + "value": "ポート %@" } }, "ko": { "stringUnit": { "state": "translated", - "value": "비공개 주소를 사용할 수 없음" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "プライベートアドレスを利用できません" + "value": "포트 %@" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Privatna adresa nije dostupna" + "value": "端口 %@" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Privat adresse utilgængelig" + "value": "連接埠 %@" } - }, - "it": { + } + } + }, + "cloudTree.placeholder.deviceOffline": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Indirizzo privato non disponibile" + "value": "Offline — its workspaces return when it does" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "អាសយដ្ឋានឯកជនមិនអាចប្រើបាន" + "value": "غير متصل — ستعود مساحات عمله عند اتصاله مجددًا" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Privat adresse utilgjengelig" + "value": "Offline — die Arbeitsbereiche erscheinen wieder, sobald das Gerät online ist" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Adres prywatny niedostępny" + "value": "Sin conexión — sus espacios de trabajo volverán cuando se conecte" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Endereço privado indisponível" + "value": "Hors ligne — ses espaces de travail réapparaîtront à sa reconnexion" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Частный адрес недоступен" + "value": "オフライン — 再接続するとワークスペースが戻ります" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ไม่มีที่อยู่ส่วนตัว" + "value": "오프라인 — 다시 연결되면 작업 공간이 돌아옵니다" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Özel adres kullanılamıyor" + "value": "离线 — 重新连接后会恢复工作区" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Приватна адреса недоступна" + "value": "離線 — 重新連線後會恢復工作區" } } } }, - "cloudTree.ports.privateAddress.detail": { + "cloud.vpn.setup.heading": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux’s authenticated route needs this machine’s private address. Refresh to retrieve it. Turning on Cloud VPN does not assign a missing address." + "value": "Use Cloud machines from any app" } }, "de": { "stringUnit": { "state": "translated", - "value": "Die authentifizierte Route von cmux benötigt die private Adresse dieser Maschine. Aktualisieren Sie, um sie abzurufen. Cloud-VPN weist keine fehlende Adresse zu." + "value": "Cloud-Maschinen aus jeder App verwenden" } }, "fr": { "stringUnit": { "state": "translated", - "value": "La route authentifiée de cmux nécessite l’adresse privée de cette machine. Actualisez pour la récupérer. Activer le VPN Cloud n’attribue pas d’adresse manquante." + "value": "Utiliser les machines Cloud depuis toute app" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "يحتاج مسار cmux الموثّق إلى العنوان الخاص لهذا الجهاز. حدّث لاسترجاعه. تشغيل Cloud VPN لا يعيّن عنوانًا مفقودًا." + "value": "Usar máquinas Cloud desde cualquier app" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "La ruta autenticada de cmux necesita la dirección privada de esta máquina. Actualiza para obtenerla. Activar Cloud VPN no asigna una dirección que falta." + "value": "ほかのアプリからCloudマシンを使う" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 的已驗證路徑需要此機器的私人位址。請重新整理以取得位址。開啟 Cloud VPN 不會指派缺少的位址。" + "value": "从任何应用使用 Cloud 机器" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux 的已验证路由需要此机器的专用地址。请刷新以获取地址。开启 Cloud VPN 不会分配缺失的地址。" + "value": "從任何 App 使用 Cloud 機器" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux의 인증된 경로에는 이 머신의 비공개 주소가 필요합니다. 새로 고쳐 주소를 가져오세요. Cloud VPN을 켜도 누락된 주소가 할당되지는 않습니다." + "value": "모든 앱에서 Cloud 머신 사용" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "cmux の認証済み経路にはこのマシンのプライベートアドレスが必要です。更新して取得してください。Cloud VPN を有効にしても不足しているアドレスは割り当てられません。" + "value": "استخدام أجهزة Cloud من أي تطبيق" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Autentificirana ruta cmux-a treba privatnu adresu ove mašine. Osvježite da je preuzmete. Uključivanje Cloud VPN-a ne dodjeljuje adresu koja nedostaje." + "value": "Koristite Cloud mašine iz bilo koje aplikacije" } }, "da": { "stringUnit": { "state": "translated", - "value": "cmux’ godkendte rute kræver denne maskines private adresse. Opdater for at hente den. Aktivering af Cloud VPN tildeler ikke en manglende adresse." + "value": "Brug Cloud-maskiner fra alle apps" } }, "it": { "stringUnit": { "state": "translated", - "value": "Il percorso autenticato di cmux richiede l’indirizzo privato di questa macchina. Aggiorna per recuperarlo. L’attivazione della VPN Cloud non assegna un indirizzo mancante." + "value": "Usa le macchine Cloud da qualsiasi app" } }, "km": { "stringUnit": { "state": "translated", - "value": "ផ្លូវដែលបានផ្ទៀងផ្ទាត់របស់ cmux ត្រូវការអាសយដ្ឋានឯកជនរបស់ម៉ាស៊ីននេះ។ ផ្ទុកឡើងវិញដើម្បីទាញយកវា។ ការបើក Cloud VPN មិនផ្តល់អាសយដ្ឋានដែលបាត់ទេ។" + "value": "ប្រើម៉ាស៊ីន Cloud ពីកម្មវិធីណាមួយ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "cmux sin autentiserte rute trenger denne maskinens private adresse. Oppdater for å hente den. Å slå på Cloud VPN tildeler ikke en manglende adresse." + "value": "Bruk Cloud-maskiner fra alle apper" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Uwierzytelniona trasa cmux wymaga prywatnego adresu tej maszyny. Odśwież, aby go pobrać. Włączenie Cloud VPN nie przypisuje brakującego adresu." + "value": "Używaj maszyn Cloud z dowolnej aplikacji" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A rota autenticada do cmux precisa do endereço privado desta máquina. Atualize para obtê-lo. Ativar o Cloud VPN não atribui um endereço ausente." + "value": "Use máquinas Cloud em qualquer app" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Аутентифицированному маршруту cmux нужен частный адрес этой машины. Обновите, чтобы получить его. Включение Cloud VPN не назначает отсутствующий адрес." + "value": "Используйте Cloud-машины из любого приложения" } }, "th": { "stringUnit": { "state": "translated", - "value": "เส้นทางที่ยืนยันตัวตนแล้วของ cmux ต้องใช้ที่อยู่ส่วนตัวของเครื่องนี้ รีเฟรชเพื่อดึงข้อมูล การเปิด Cloud VPN ไม่ได้กำหนดที่อยู่ที่ขาดหายไป" + "value": "ใช้เครื่อง Cloud จากทุกแอป" } }, "tr": { "stringUnit": { "state": "translated", - "value": "cmux’un kimliği doğrulanmış yolu bu makinenin özel adresine ihtiyaç duyar. Adresi almak için yenileyin. Cloud VPN’i açmak eksik bir adres atamaz." + "value": "Cloud makinelerini her uygulamadan kullanın" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Автентифікованому маршруту cmux потрібна приватна адреса цієї машини. Оновіть, щоб отримати її. Увімкнення Cloud VPN не призначає відсутню адресу." + "value": "Використовуйте Cloud-машини з будь-якої програми" } } } }, - "cloudTree.ports.routeNote": { + "cloud.vpn.setup.subtitle": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "cmux forwards ports without Cloud VPN. Web browsers and other Mac apps need Cloud VPN to reach services bound to the machine’s private address." + "value": "Optional access to each VM's private address and original ports, such as 10.40.0.10:3000." } }, "de": { "stringUnit": { "state": "translated", - "value": "cmux leitet Ports ohne Cloud-VPN weiter. Webbrowser und andere Mac-Apps benötigen Cloud-VPN, um Dienste an der privaten Adresse der Maschine zu erreichen." + "value": "Optionaler Zugriff auf die private Adresse und die ursprünglichen Ports jeder VM, etwa 10.40.0.10:3000." } }, "fr": { "stringUnit": { "state": "translated", - "value": "cmux transfère les ports sans VPN Cloud. Les navigateurs web et les autres apps Mac ont besoin du VPN Cloud pour atteindre les services liés à l’adresse privée de la machine." + "value": "Accès facultatif à chaque adresse privée et aux ports d’origine des VM, comme 10.40.0.10:3000." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "يعيد cmux توجيه المنافذ دون Cloud VPN. تحتاج متصفحات الويب وتطبيقات Mac الأخرى إلى Cloud VPN للوصول إلى الخدمات المرتبطة بالعنوان الخاص للجهاز." + "value": "Acceso opcional a la dirección privada y los puertos originales de cada VM, como 10.40.0.10:3000." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "cmux reenvía puertos sin Cloud VPN. Los navegadores web y otras apps de Mac necesitan Cloud VPN para acceder a servicios enlazados a la dirección privada de la máquina." + "value": "各VMのプライベートアドレスと元のポート(例:10.40.0.10:3000)にアクセスするための任意の設定です。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux 可轉送連接埠,不需要 Cloud VPN。網頁瀏覽器和其他 Mac App 需要 Cloud VPN,才能存取繫結至機器私人位址的服務。" + "value": "可选设置,用于访问每台 VM 的私有地址和原始端口,例如 10.40.0.10:3000。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "cmux 可转发端口,无需 Cloud VPN。网页浏览器和其他 Mac 应用需要 Cloud VPN,才能访问绑定到机器专用地址的服务。" + "value": "選用設定,可存取每台 VM 的私有位址和原始連接埠,例如 10.40.0.10:3000。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux는 Cloud VPN 없이 포트를 전달합니다. 웹 브라우저 및 다른 Mac 앱이 머신의 비공개 주소에 바인딩된 서비스에 접근하려면 Cloud VPN이 필요합니다." + "value": "각 VM의 비공개 주소와 원래 포트(예: 10.40.0.10:3000)에 접근하기 위한 선택 설정입니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "cmux は Cloud VPN なしでポートを転送します。Web ブラウザやその他の Mac アプリからマシンのプライベートアドレスにバインドされたサービスにアクセスするには Cloud VPN が必要です。" + "value": "وصول اختياري إلى العنوان الخاص والمنافذ الأصلية لكل جهاز افتراضي، مثل 10.40.0.10:3000." } }, "bs": { "stringUnit": { "state": "translated", - "value": "cmux prosljeđuje portove bez Cloud VPN-a. Web preglednicima i drugim Mac aplikacijama potreban je Cloud VPN za pristup servisima vezanim za privatnu adresu mašine." + "value": "Opcionalni pristup privatnoj adresi i izvornim portovima svake VM, na primjer 10.40.0.10:3000." } }, "da": { "stringUnit": { "state": "translated", - "value": "cmux videresender porte uden Cloud VPN. Webbrowsere og andre Mac-apps skal bruge Cloud VPN for at nå tjenester, der er bundet til maskinens private adresse." + "value": "Valgfri adgang til hver VM’s private adresse og oprindelige porte, f.eks. 10.40.0.10:3000." } }, "it": { "stringUnit": { "state": "translated", - "value": "cmux inoltra le porte senza VPN Cloud. I browser web e le altre app per Mac hanno bisogno della VPN Cloud per raggiungere i servizi associati all’indirizzo privato della macchina." + "value": "Accesso facoltativo all’indirizzo privato e alle porte originali di ogni VM, ad esempio 10.40.0.10:3000." } }, "km": { "stringUnit": { "state": "translated", - "value": "cmux បញ្ជូនបន្តច្រកដោយមិនត្រូវការ Cloud VPN។ កម្មវិធីរុករកបណ្តាញ និងកម្មវិធី Mac ផ្សេងទៀតត្រូវការ Cloud VPN ដើម្បីចូលដល់សេវាកម្មដែលចងទៅអាសយដ្ឋានឯកជនរបស់ម៉ាស៊ីន។" + "value": "ចូលប្រើអាសយដ្ឋានឯកជន និងច្រកដើមរបស់ VM នីមួយៗ ដូចជា 10.40.0.10:3000 ជាជម្រើស។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "cmux videresender porter uten Cloud VPN. Nettlesere og andre Mac-apper trenger Cloud VPN for å nå tjenester som er bundet til maskinens private adresse." + "value": "Valgfri tilgang til hver VMs private adresse og opprinnelige porter, som 10.40.0.10:3000." } }, "pl": { "stringUnit": { "state": "translated", - "value": "cmux przekierowuje porty bez Cloud VPN. Przeglądarki internetowe i inne aplikacje na Maca potrzebują Cloud VPN, aby dotrzeć do usług powiązanych z prywatnym adresem maszyny." + "value": "Opcjonalny dostęp do prywatnego adresu i oryginalnych portów każdej maszyny VM, na przykład 10.40.0.10:3000." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "O cmux encaminha portas sem o Cloud VPN. Navegadores e outros apps do Mac precisam do Cloud VPN para acessar serviços vinculados ao endereço privado da máquina." + "value": "Acesso opcional ao endereço privado e às portas originais de cada VM, como 10.40.0.10:3000." } }, "ru": { "stringUnit": { "state": "translated", - "value": "cmux перенаправляет порты без Cloud VPN. Веб-браузерам и другим приложениям Mac нужен Cloud VPN, чтобы обращаться к службам, привязанным к частному адресу машины." + "value": "Необязательный доступ к частному адресу и исходным портам каждой VM, например 10.40.0.10:3000." } }, "th": { "stringUnit": { "state": "translated", - "value": "cmux ส่งต่อพอร์ตได้โดยไม่ต้องใช้ Cloud VPN เว็บเบราว์เซอร์และแอป Mac อื่นๆ ต้องใช้ Cloud VPN เพื่อเข้าถึงบริการที่ผูกกับที่อยู่ส่วนตัวของเครื่อง" + "value": "การเข้าถึงที่ไม่บังคับไปยังที่อยู่ส่วนตัวและพอร์ตเดิมของ VM แต่ละเครื่อง เช่น 10.40.0.10:3000" } }, "tr": { "stringUnit": { "state": "translated", - "value": "cmux, portları Cloud VPN olmadan yönlendirir. Web tarayıcıları ve diğer Mac uygulamaları, makinenin özel adresine bağlı hizmetlere ulaşmak için Cloud VPN’e ihtiyaç duyar." + "value": "Her VM’nin özel adresine ve özgün bağlantı noktalarına isteğe bağlı erişim; örneğin 10.40.0.10:3000." } }, "uk": { "stringUnit": { "state": "translated", - "value": "cmux перенаправляє порти без Cloud VPN. Веббраузерам та іншим застосункам Mac потрібен Cloud VPN, щоб звертатися до служб, прив’язаних до приватної адреси машини." + "value": "Необов’язковий доступ до приватної адреси та початкових портів кожної VM, наприклад 10.40.0.10:3000." } } } }, - "cloudTree.ports.setupVPN": { + "cloud.vpn.setup.howItWorks.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Set Up VPN…" + "value": "How it works" } }, "de": { "stringUnit": { "state": "translated", - "value": "VPN einrichten…" + "value": "So funktioniert es" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Configurer le VPN…" - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "إعداد VPN…" + "value": "Fonctionnement" } }, "es": { "stringUnit": { "state": "translated", - "value": "Configurar VPN…" + "value": "Cómo funciona" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "設定 VPN…" + "value": "仕組み" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "设置 VPN…" + "value": "工作原理" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "運作方式" } }, "ko": { "stringUnit": { "state": "translated", - "value": "VPN 설정…" + "value": "작동 방식" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "VPN を設定…" + "value": "طريقة العمل" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Postavi VPN…" + "value": "Kako radi" } }, "da": { "stringUnit": { "state": "translated", - "value": "Konfigurer VPN…" + "value": "Sådan fungerer det" } }, "it": { "stringUnit": { "state": "translated", - "value": "Configura VPN…" + "value": "Come funziona" } }, "km": { "stringUnit": { "state": "translated", - "value": "រៀបចំ VPN…" + "value": "របៀបដំណើរការ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Konfigurer VPN…" + "value": "Slik fungerer det" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Skonfiguruj VPN…" + "value": "Jak to działa" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Configurar VPN…" + "value": "Como funciona" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Настроить VPN…" + "value": "Как это работает" } }, "th": { "stringUnit": { "state": "translated", - "value": "ตั้งค่า VPN…" + "value": "วิธีการทำงาน" } }, "tr": { "stringUnit": { "state": "translated", - "value": "VPN’i Kur…" + "value": "Nasıl çalışır" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Налаштувати VPN…" + "value": "Як це працює" } } } }, - "cloudTree.ports.stale": { + "cloud.vpn.setup.status.off": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Port list may be out of date" + "value": "Off. Your Cloud panes continue to work through cmux's built-in route." } }, "de": { "stringUnit": { "state": "translated", - "value": "Portliste möglicherweise veraltet" + "value": "Aus. Ihre Cloud-Bereiche funktionieren weiterhin über die integrierte Verbindung von cmux." } }, "fr": { "stringUnit": { "state": "translated", - "value": "La liste des ports peut être obsolète" + "value": "Désactivé. Vos volets Cloud continuent de fonctionner via la connexion intégrée de cmux." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "قد تكون قائمة المنافذ قديمة" + "value": "Desactivada. Tus paneles Cloud siguen funcionando mediante la conexión integrada de cmux." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "La lista de puertos puede estar desactualizada" + "value": "オフ。Cloudペインは引き続きcmux内蔵の接続経路で動作します。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "連接埠清單可能已過時" + "value": "已关闭。Cloud 面板仍通过 cmux 内置连接工作。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "端口列表可能已过期" + "value": "已關閉。Cloud 面板仍透過 cmux 內建連線運作。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "포트 목록이 오래되었을 수 있음" + "value": "꺼짐. Cloud 패널은 cmux의 내장 연결을 통해 계속 작동합니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "ポートリストが古い可能性があります" + "value": "متوقف. تستمر لوحات Cloud في العمل عبر اتصال cmux المضمن." } }, "bs": { "stringUnit": { "state": "translated", - "value": "Lista portova je možda zastarjela" + "value": "Isključeno. Cloud paneli i dalje rade preko ugrađene cmux veze." } }, "da": { "stringUnit": { "state": "translated", - "value": "Portlisten er muligvis forældet" + "value": "Fra. Dine Cloud-paneler fungerer stadig via cmux’ indbyggede forbindelse." } }, "it": { "stringUnit": { "state": "translated", - "value": "L’elenco delle porte potrebbe non essere aggiornato" + "value": "Disattivata. I pannelli Cloud continuano a funzionare tramite la connessione integrata di cmux." } }, "km": { "stringUnit": { "state": "translated", - "value": "បញ្ជីច្រកអាចហួសសម័យ" + "value": "បិទ។ ផ្ទាំង Cloud របស់អ្នកនៅតែដំណើរការតាមការភ្ជាប់ដែលមានស្រាប់របស់ cmux។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Portlisten kan være utdatert" + "value": "Av. Cloud-panelene dine fortsetter å fungere gjennom cmux sin innebygde forbindelse." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Lista portów może być nieaktualna" + "value": "Wyłączona. Panele Cloud nadal działają przez wbudowane połączenie cmux." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A lista de portas pode estar desatualizada" + "value": "Desativada. Seus painéis Cloud continuam funcionando pela conexão integrada do cmux." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Список портов может быть устаревшим" + "value": "Выключено. Панели Cloud продолжают работать через встроенное соединение cmux." } }, "th": { "stringUnit": { "state": "translated", - "value": "รายการพอร์ตอาจไม่เป็นปัจจุบัน" + "value": "ปิดอยู่ แผง Cloud ยังคงทำงานผ่านการเชื่อมต่อในตัวของ cmux" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Port listesi güncel olmayabilir" + "value": "Kapalı. Cloud panelleriniz cmux’un yerleşik bağlantısıyla çalışmaya devam eder." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Список портів може бути застарілим" + "value": "Вимкнено. Панелі Cloud продовжують працювати через вбудоване з’єднання cmux." } } } }, - "cloudTree.ports.stale.detail": { + "cloud.vpn.setup.steps.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The last scan could not be refreshed. Listed services may have changed; refresh to check again. cmux forwarding does not need Cloud VPN." + "value": "First-time setup" } }, "de": { "stringUnit": { "state": "translated", - "value": "Der letzte Scan konnte nicht aktualisiert werden. Die aufgeführten Dienste könnten sich geändert haben. Aktualisieren Sie erneut. Die cmux-Weiterleitung benötigt kein Cloud-VPN." + "value": "Ersteinrichtung" } }, "fr": { "stringUnit": { "state": "translated", - "value": "La dernière analyse n’a pas pu être actualisée. Les services listés peuvent avoir changé ; actualisez pour vérifier. Le transfert cmux ne nécessite pas de VPN Cloud." + "value": "Première configuration" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "تعذر تحديث آخر فحص. ربما تغيرت الخدمات المدرجة؛ حدّث للفحص مجددًا. لا تحتاج إعادة توجيه cmux إلى Cloud VPN." + "value": "Configuración inicial" } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "No se pudo actualizar el último escaneo. Los servicios listados pueden haber cambiado; actualiza para comprobarlos. El reenvío de cmux no necesita Cloud VPN." + "value": "初回設定" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "無法重新整理上次掃描結果。列出的服務可能已變更;請重新整理以再次檢查。cmux 轉送不需要 Cloud VPN。" + "value": "首次设置" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "无法刷新上次扫描结果。列出的服务可能已更改;请刷新以再次检查。cmux 转发无需 Cloud VPN。" + "value": "首次設定" } }, "ko": { "stringUnit": { "state": "translated", - "value": "마지막 검색 결과를 새로 고치지 못했습니다. 나열된 서비스가 변경되었을 수 있으니 새로 고쳐 확인하세요. cmux 전달에는 Cloud VPN이 필요하지 않습니다." + "value": "최초 설정" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "前回のスキャンを更新できませんでした。表示されたサービスが変わっている可能性があります。更新して再確認してください。cmux の転送に Cloud VPN は不要です。" + "value": "الإعداد الأولي" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Posljednje skeniranje nije se moglo osvježiti. Navedeni servisi su se možda promijenili; osvježite da ponovo provjerite. Prosljeđivanje u cmux-u ne treba Cloud VPN." + "value": "Prvo podešavanje" } }, "da": { "stringUnit": { "state": "translated", - "value": "Den seneste scanning kunne ikke opdateres. De viste tjenester kan have ændret sig; opdater for at kontrollere igen. Videresendelse i cmux kræver ikke Cloud VPN." + "value": "Første opsætning" } }, "it": { "stringUnit": { "state": "translated", - "value": "Non è stato possibile aggiornare l’ultima scansione. I servizi elencati potrebbero essere cambiati; aggiorna per controllare di nuovo. L’inoltro di cmux non richiede la VPN Cloud." + "value": "Prima configurazione" } }, "km": { "stringUnit": { "state": "translated", - "value": "មិនអាចផ្ទុកការស្កេនចុងក្រោយឡើងវិញបានទេ។ សេវាកម្មដែលបានរាយអាចបានផ្លាស់ប្តូរ; ផ្ទុកឡើងវិញដើម្បីពិនិត្យម្តងទៀត។ ការបញ្ជូនបន្តរបស់ cmux មិនត្រូវការ Cloud VPN ទេ។" + "value": "ការរៀបចំលើកដំបូង" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Den siste skanningen kunne ikke oppdateres. De oppførte tjenestene kan ha endret seg; oppdater for å sjekke på nytt. Videresending i cmux trenger ikke Cloud VPN." + "value": "Førstegangsoppsett" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Nie udało się odświeżyć ostatniego skanowania. Wymienione usługi mogły się zmienić; odśwież, aby sprawdzić ponownie. Przekierowywanie w cmux nie wymaga Cloud VPN." + "value": "Pierwsza konfiguracja" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Não foi possível atualizar a última verificação. Os serviços listados podem ter mudado; atualize para verificar de novo. O encaminhamento do cmux não precisa do Cloud VPN." + "value": "Primeira configuração" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Не удалось обновить последнее сканирование. Перечисленные службы могли измениться; обновите, чтобы проверить снова. Перенаправлению cmux Cloud VPN не нужен." + "value": "Первая настройка" } }, "th": { "stringUnit": { "state": "translated", - "value": "ไม่สามารถรีเฟรชการสแกนครั้งล่าสุดได้ บริการที่แสดงอาจเปลี่ยนไปแล้ว รีเฟรชเพื่อตรวจสอบอีกครั้ง การส่งต่อของ cmux ไม่ต้องใช้ Cloud VPN" + "value": "การตั้งค่าครั้งแรก" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Son tarama yenilenemedi. Listelenen hizmetler değişmiş olabilir; yeniden denetlemek için yenileyin. cmux yönlendirmesi Cloud VPN gerektirmez." + "value": "İlk kurulum" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Не вдалося оновити останнє сканування. Перелічені служби могли змінитися; оновіть, щоб перевірити знову. Перенаправлення cmux не потребує Cloud VPN." + "value": "Перше налаштування" } } } }, - "cloudTree.ports.unavailable.detail": { + "cloud.vpn.setup.steps.extension": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The port scan failed; this does not mean no service is listening. Existing cmux ports may still work. Refresh to retry; Cloud VPN is not required." + "value": "1. Click Connect Cloud VPN. When macOS asks, allow the cmux network extension in System Settings." } }, "de": { "stringUnit": { "state": "translated", - "value": "Der Portscan ist fehlgeschlagen; das bedeutet nicht, dass kein Dienst lauscht. Vorhandene cmux-Ports funktionieren möglicherweise weiter. Aktualisieren Sie; Cloud-VPN ist nicht erforderlich." + "value": "1. Klicken Sie auf Cloud-VPN verbinden. Erlauben Sie auf Aufforderung von macOS die cmux-Netzwerkerweiterung in den Systemeinstellungen." } }, "fr": { "stringUnit": { "state": "translated", - "value": "L’analyse des ports a échoué ; cela ne signifie pas qu’aucun service n’écoute. Les ports cmux existants peuvent encore fonctionner. Actualisez pour réessayer ; le VPN Cloud n’est pas nécessaire." + "value": "1. Cliquez sur Connecter le VPN Cloud. Lorsque macOS le demande, autorisez l’extension réseau cmux dans Réglages Système." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "فشل فحص المنافذ؛ هذا لا يعني عدم وجود خدمة تستمع. قد تظل منافذ cmux الحالية تعمل. حدّث للمحاولة مجددًا؛ Cloud VPN غير مطلوب." + "value": "1. Haz clic en Conectar VPN de Cloud. Cuando macOS lo solicite, permite la extensión de red de cmux en Ajustes del Sistema." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Falló el escaneo de puertos; no significa que no haya servicios en escucha. Los puertos de cmux existentes pueden seguir funcionando. Actualiza para reintentar; Cloud VPN no es necesario." + "value": "1. 「Cloud VPNに接続」をクリックします。macOSに求められたら、システム設定でcmuxのネットワーク機能拡張を許可します。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "連接埠掃描失敗;這不代表沒有服務正在監聽。現有 cmux 連接埠可能仍可使用。請重新整理以重試;不需要 Cloud VPN。" + "value": "1. 点击“连接 Cloud VPN”。macOS 提示时,在系统设置中允许 cmux 网络扩展。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "端口扫描失败;这并不代表没有服务正在监听。现有 cmux 端口可能仍可使用。请刷新以重试;无需 Cloud VPN。" + "value": "1. 按一下「連接 Cloud VPN」。macOS 提示時,請在系統設定中允許 cmux 網路延伸功能。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "포트 검색이 실패했지만 수신 대기 서비스가 없다는 뜻은 아닙니다. 기존 cmux 포트는 계속 작동할 수 있습니다. 새로 고쳐 다시 시도하세요. Cloud VPN은 필요하지 않습니다." + "value": "1. Cloud VPN 연결을 클릭합니다. macOS에서 요청하면 시스템 설정에서 cmux 네트워크 확장을 허용합니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "ポートスキャンが失敗しましたが、サービスが待ち受けていないとは限りません。既存の cmux ポートは引き続き動作する可能性があります。更新して再試行してください。Cloud VPN は不要です。" + "value": "1. انقر على توصيل VPN الخاص بـ Cloud. عندما يطلب macOS ذلك، اسمح بامتداد شبكة cmux في إعدادات النظام." } }, "bs": { "stringUnit": { "state": "translated", - "value": "Skeniranje portova nije uspjelo; to ne znači da nijedan servis ne sluša. Postojeći cmux portovi možda i dalje rade. Osvježite za ponovni pokušaj; Cloud VPN nije potreban." + "value": "1. Kliknite Poveži Cloud VPN. Kada macOS zatraži, dozvolite cmux mrežni dodatak u Postavkama sistema." } }, "da": { "stringUnit": { "state": "translated", - "value": "Portscanningen mislykkedes; det betyder ikke, at ingen tjeneste lytter. Eksisterende cmux-porte virker muligvis stadig. Opdater for at prøve igen; Cloud VPN er ikke påkrævet." + "value": "1. Klik på Forbind Cloud VPN. Når macOS spørger, skal du tillade cmux-netværksudvidelsen i Systemindstillinger." } }, "it": { "stringUnit": { "state": "translated", - "value": "La scansione delle porte non è riuscita; ciò non significa che nessun servizio sia in ascolto. Le porte cmux esistenti potrebbero funzionare ancora. Aggiorna per riprovare; la VPN Cloud non è necessaria." + "value": "1. Fai clic su Connetti VPN Cloud. Quando macOS lo richiede, consenti l’estensione di rete cmux nelle Impostazioni di Sistema." } }, "km": { "stringUnit": { "state": "translated", - "value": "ការស្កេនច្រកបានបរាជ័យ; នេះមិនមានន័យថាគ្មានសេវាកម្មណាកំពុងស្តាប់ទេ។ ច្រក cmux ដែលមានស្រាប់អាចនៅតែដំណើរការ។ ផ្ទុកឡើងវិញដើម្បីព្យាយាមម្តងទៀត; មិនត្រូវការ Cloud VPN ទេ។" + "value": "1. ចុច ភ្ជាប់ Cloud VPN។ ពេល macOS ស្នើ សូមអនុញ្ញាតផ្នែកបន្ថែមបណ្តាញ cmux ក្នុងការកំណត់ប្រព័ន្ធ។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Portskanningen mislyktes; det betyr ikke at ingen tjeneste lytter. Eksisterende cmux-porter kan fortsatt fungere. Oppdater for å prøve igjen; Cloud VPN er ikke nødvendig." + "value": "1. Klikk Koble til Cloud VPN. Når macOS spør, tillat cmux-nettverksutvidelsen i Systeminnstillinger." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Skanowanie portów nie powiodło się; nie oznacza to, że żadna usługa nie nasłuchuje. Istniejące porty cmux mogą nadal działać. Odśwież, aby spróbować ponownie; Cloud VPN nie jest wymagany." + "value": "1. Kliknij Połącz z Cloud VPN. Gdy macOS poprosi, zezwól na rozszerzenie sieci cmux w Ustawieniach systemowych." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A verificação de portas falhou; isso não significa que nenhum serviço esteja em escuta. As portas existentes do cmux ainda podem funcionar. Atualize para tentar de novo; o Cloud VPN não é necessário." + "value": "1. Clique em Conectar Cloud VPN. Quando o macOS pedir, permita a extensão de rede do cmux nos Ajustes do Sistema." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Сканирование портов не удалось; это не значит, что ни одна служба не прослушивает порты. Существующие порты cmux могут по-прежнему работать. Обновите, чтобы повторить; Cloud VPN не требуется." + "value": "1. Нажмите Подключить Cloud VPN. Когда macOS попросит, разрешите сетевое расширение cmux в системных настройках." } }, "th": { "stringUnit": { "state": "translated", - "value": "การสแกนพอร์ตล้มเหลว ไม่ได้หมายความว่าไม่มีบริการที่กำลังรับฟัง พอร์ต cmux ที่มีอยู่อาจยังใช้งานได้ รีเฟรชเพื่อลองอีกครั้ง ไม่จำเป็นต้องใช้ Cloud VPN" + "value": "1. คลิก เชื่อมต่อ Cloud VPN เมื่อ macOS ขอ ให้อนุญาตส่วนขยายเครือข่าย cmux ในการตั้งค่าระบบ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Port taraması başarısız oldu; bu, dinleyen bir hizmet olmadığı anlamına gelmez. Mevcut cmux portları hâlâ çalışıyor olabilir. Yeniden denemek için yenileyin; Cloud VPN gerekmez." + "value": "1. Cloud VPN’e bağlan’a tıklayın. macOS istediğinde Sistem Ayarları’nda cmux ağ uzantısına izin verin." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Сканування портів не вдалося; це не означає, що жодна служба не прослуховує. Наявні порти cmux можуть і далі працювати. Оновіть, щоб повторити; Cloud VPN не потрібен." + "value": "1. Натисніть Підключити Cloud VPN. Коли macOS попросить, дозвольте мережеве розширення cmux у Системних параметрах." } } } }, - "cloudTree.ports.unsupported": { + "cloud.vpn.setup.steps.settings": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Ports are not supported by this provider." + "value": "Open General > Login Items & Extensions > Network Extensions, then enable cmux." } }, "de": { "stringUnit": { "state": "translated", - "value": "Ports werden von diesem Anbieter nicht unterstützt." + "value": "Öffnen Sie Allgemein > Anmeldeobjekte & Erweiterungen > Netzwerkerweiterungen und aktivieren Sie cmux." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les ports ne sont pas pris en charge par ce fournisseur." + "value": "Ouvrez Général > Ouverture et extensions > Extensions réseau, puis activez cmux." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "لا يدعم هذا الموفر المنافذ." + "value": "Abre General > Ítems de inicio y extensiones > Extensiones de red y activa cmux." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Este proveedor no admite puertos." + "value": "「一般」>「ログイン項目と機能拡張」>「ネットワーク機能拡張」を開き、cmuxを有効にします。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "此提供者不支援連接埠。" + "value": "打开“通用”>“登录项与扩展”>“网络扩展”,然后启用 cmux。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "此提供商不支持端口。" + "value": "打開「一般」>「登入項目與延伸功能」>「網路延伸功能」,然後啟用 cmux。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 제공자는 포트를 지원하지 않습니다." + "value": "일반 > 로그인 항목 및 확장 프로그램 > 네트워크 확장을 열고 cmux를 활성화합니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "このプロバイダーはポートをサポートしていません。" + "value": "افتح عام > عناصر الدخول والامتدادات > امتدادات الشبكة، ثم فعّل cmux." } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ovaj pružalac ne podržava portove." + "value": "Otvorite Opšte > Stavke za prijavu i dodaci > Mrežni dodaci, pa omogućite cmux." } }, "da": { "stringUnit": { "state": "translated", - "value": "Porte understøttes ikke af denne udbyder." + "value": "Åbn Generelt > Loginemner og udvidelser > Netværksudvidelser, og aktivér cmux." } }, "it": { "stringUnit": { "state": "translated", - "value": "Le porte non sono supportate da questo provider." + "value": "Apri Generali > Elementi login ed estensioni > Estensioni di rete, quindi abilita cmux." } }, "km": { "stringUnit": { "state": "translated", - "value": "អ្នកផ្តល់សេវានេះមិនគាំទ្រច្រកទេ។" + "value": "បើក ទូទៅ > ធាតុចូល និងផ្នែកបន្ថែម > ផ្នែកបន្ថែមបណ្តាញ ហើយបើក cmux។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Porter støttes ikke av denne leverandøren." + "value": "Åpne Generelt > Påloggingselementer og utvidelser > Nettverksutvidelser, og aktiver cmux." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Ten dostawca nie obsługuje portów." + "value": "Otwórz Ogólne > Elementy logowania i rozszerzenia > Rozszerzenia sieciowe, a następnie włącz cmux." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Este provedor não oferece suporte a portas." + "value": "Abra Geral > Itens de Início e Extensões > Extensões de Rede e ative o cmux." } }, "ru": { "stringUnit": { "state": "translated", - "value": "Этот провайдер не поддерживает порты." + "value": "Откройте Основные > Объекты входа и расширения > Сетевые расширения и включите cmux." } }, "th": { "stringUnit": { "state": "translated", - "value": "ผู้ให้บริการนี้ไม่รองรับพอร์ต" + "value": "เปิด ทั่วไป > รายการเข้าสู่ระบบและส่วนขยาย > ส่วนขยายเครือข่าย แล้วเปิดใช้ cmux" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu sağlayıcı portları desteklemiyor." + "value": "Genel > Giriş Öğeleri ve Uzantılar > Ağ Uzantıları’nı açın ve cmux’u etkinleştirin." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Цей постачальник не підтримує порти." + "value": "Відкрийте Загальні > Об’єкти входу та розширення > Мережеві розширення й увімкніть cmux." } } } }, - "cloudTree.ports.unsupported.detail": { + "cloud.vpn.setup.steps.settingsLegacy": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "This provider has no supported in-app port route. Open a shell to access the service inside the machine. Cloud VPN does not add provider support." + "value": "Open Privacy & Security and allow the cmux extension." } }, "de": { "stringUnit": { "state": "translated", - "value": "Dieser Anbieter unterstützt keine Portverbindung in der App. Öffnen Sie eine Shell, um innerhalb der Maschine auf den Dienst zuzugreifen. Cloud-VPN fügt keine Anbieterunterstützung hinzu." + "value": "Öffnen Sie Datenschutz & Sicherheit und erlauben Sie die cmux-Erweiterung." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ce fournisseur ne prend pas en charge les ports dans l’app. Ouvrez un shell pour accéder au service dans la machine. Le VPN Cloud n’ajoute pas cette prise en charge." + "value": "Ouvrez Confidentialité et sécurité et autorisez l’extension cmux." } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "لا يدعم هذا الموفر مسار منافذ داخل التطبيق. افتح صدفة للوصول إلى الخدمة داخل الجهاز. لا يضيف Cloud VPN دعمًا للموفر." + "value": "Abre Privacidad y seguridad y permite la extensión de cmux." } }, - "es": { + "ja": { "stringUnit": { "state": "translated", - "value": "Este proveedor no admite una ruta de puertos dentro de la app. Abre una shell para acceder al servicio dentro de la máquina. Cloud VPN no añade soporte al proveedor." + "value": "「プライバシーとセキュリティ」を開き、cmuxの機能拡張を許可します。" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "此提供者不支援應用程式內連接埠路徑。請開啟 Shell 以在機器內存取服務。Cloud VPN 不會新增提供者支援。" + "value": "打开“隐私与安全性”,然后允许 cmux 扩展。" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "此提供商不支持应用内端口路由。请打开 Shell 以在机器内部访问服务。Cloud VPN 不会添加提供商支持。" + "value": "打開「隱私權與安全性」,然後允許 cmux 延伸功能。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 제공자는 앱 내 포트 경로를 지원하지 않습니다. 셸을 열어 머신 내부의 서비스에 접근하세요. Cloud VPN으로 제공자 지원이 추가되지는 않습니다." + "value": "개인정보 보호 및 보안을 열고 cmux 확장을 허용합니다." } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "このプロバイダーはアプリ内のポート経路に対応していません。シェルを開き、マシン内でサービスにアクセスしてください。Cloud VPN を有効にしても対応は追加されません。" + "value": "افتح الخصوصية والأمان واسمح بامتداد cmux." } }, "bs": { "stringUnit": { "state": "translated", - "value": "Ovaj pružalac nema podržanu rutu portova unutar aplikacije. Otvorite shell da pristupite servisu unutar mašine. Cloud VPN ne dodaje podršku pružaoca." + "value": "Otvorite Privatnost i sigurnost i dozvolite cmux dodatak." } }, "da": { "stringUnit": { "state": "translated", - "value": "Denne udbyder har ingen understøttet portrute i appen. Åbn en shell for at få adgang til tjenesten inde i maskinen. Cloud VPN tilføjer ikke understøttelse for udbyderen." + "value": "Åbn Anonymitet og sikkerhed, og tillad cmux-udvidelsen." } }, "it": { "stringUnit": { "state": "translated", - "value": "Questo provider non ha un percorso delle porte supportato nell’app. Apri una shell per accedere al servizio all’interno della macchina. La VPN Cloud non aggiunge il supporto del provider." + "value": "Apri Privacy e sicurezza e consenti l’estensione cmux." } }, "km": { "stringUnit": { "state": "translated", - "value": "អ្នកផ្តល់សេវានេះគ្មានផ្លូវច្រកក្នុងកម្មវិធីដែលគាំទ្រទេ។ បើក shell ដើម្បីចូលប្រើសេវាកម្មនៅខាងក្នុងម៉ាស៊ីន។ Cloud VPN មិនបន្ថែមការគាំទ្រអ្នកផ្តល់សេវាទេ។" + "value": "បើក ឯកជនភាព និងសុវត្ថិភាព ហើយអនុញ្ញាតផ្នែកបន្ថែម cmux។" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Denne leverandøren har ingen støttet portrute i appen. Åpne et skall for å få tilgang til tjenesten inne i maskinen. Cloud VPN legger ikke til støtte for leverandøren." + "value": "Åpne Personvern og sikkerhet og tillat cmux-utvidelsen." } }, "pl": { "stringUnit": { "state": "translated", - "value": "Ten dostawca nie ma obsługiwanej trasy portów w aplikacji. Otwórz powłokę, aby uzyskać dostęp do usługi wewnątrz maszyny. Cloud VPN nie dodaje obsługi dostawcy." + "value": "Otwórz Prywatność i ochrona i zezwól na rozszerzenie cmux." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Este provedor não tem uma rota de portas compatível no app. Abra um shell para acessar o serviço dentro da máquina. O Cloud VPN não adiciona suporte ao provedor." + "value": "Abra Privacidade e Segurança e permita a extensão do cmux." } }, "ru": { "stringUnit": { "state": "translated", - "value": "У этого провайдера нет поддерживаемого маршрута портов в приложении. Откройте оболочку, чтобы получить доступ к службе внутри машины. Cloud VPN не добавляет поддержку провайдера." + "value": "Откройте Конфиденциальность и безопасность и разрешите расширение cmux." } }, "th": { "stringUnit": { "state": "translated", - "value": "ผู้ให้บริการนี้ไม่มีเส้นทางพอร์ตในแอปที่รองรับ เปิดเชลล์เพื่อเข้าถึงบริการภายในเครื่อง Cloud VPN ไม่ได้เพิ่มการรองรับผู้ให้บริการ" + "value": "เปิด ความเป็นส่วนตัวและความปลอดภัย แล้วอนุญาตส่วนขยาย cmux" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Bu sağlayıcının desteklenen bir uygulama içi port yolu yok. Makinenin içindeki hizmete erişmek için bir kabuk açın. Cloud VPN sağlayıcı desteği eklemez." + "value": "Gizlilik ve Güvenlik’i açın ve cmux uzantısına izin verin." } }, "uk": { "stringUnit": { "state": "translated", - "value": "Цей постачальник не має підтримуваного маршруту портів у застосунку. Відкрийте оболонку, щоб отримати доступ до служби всередині машини. Cloud VPN не додає підтримку постачальника." + "value": "Відкрийте Конфіденційність і безпека та дозвольте розширення cmux." } } } }, - "cloudTree.port.openInCmux": { + "cloud.vpn.setup.steps.configuration": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open in cmux" + "value": "2. Allow cmux to add a VPN configuration named cmux Cloud. This is a separate macOS permission." } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "فتح في cmux" + "value": "2. Erlauben Sie cmux, eine VPN-Konfiguration namens cmux Cloud hinzuzufügen. Dies ist eine separate macOS-Berechtigung." } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "In cmux öffnen" + "value": "2. Autorisez cmux à ajouter une configuration VPN nommée cmux Cloud. Il s’agit d’une autorisation macOS distincte." } }, "es": { "stringUnit": { "state": "translated", - "value": "Abrir en cmux" + "value": "2. Permite que cmux añada una configuración VPN llamada cmux Cloud. Este es un permiso independiente de macOS." } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Ouvrir dans cmux" + "value": "2. cmux Cloudという名前のVPN構成の追加を許可します。これは別のmacOS権限です。" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmuxで開く" + "value": "2. 允许 cmux 添加名为 cmux Cloud 的 VPN 配置。这是单独的 macOS 权限。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "2. 允許 cmux 加入名為 cmux Cloud 的 VPN 設定。這是另一項 macOS 權限。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux에서 열기" + "value": "2. cmux가 cmux Cloud라는 VPN 구성을 추가하도록 허용합니다. 이는 별도의 macOS 권한입니다." } }, - "zh-Hans": { + "ar": { "stringUnit": { "state": "translated", - "value": "在 cmux 中打开" + "value": "2. اسمح لـ cmux بإضافة إعداد VPN باسم cmux Cloud. هذا إذن منفصل في macOS." } }, - "zh-Hant": { + "bs": { "stringUnit": { "state": "translated", - "value": "在 cmux 中開啟" + "value": "2. Dozvolite cmux-u da doda VPN konfiguraciju pod imenom cmux Cloud. Ovo je posebna macOS dozvola." } - } - } - }, - "cloudTree.port.openInCmux.help": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "da": { "stringUnit": { "state": "translated", - "value": "Open in cmux. No VPN setup needed." + "value": "2. Tillad cmux at tilføje en VPN-konfiguration med navnet cmux Cloud. Dette er en separat macOS-tilladelse." } }, - "ar": { + "it": { "stringUnit": { "state": "translated", - "value": "افتح في cmux. لا يلزم إعداد VPN." + "value": "2. Consenti a cmux di aggiungere una configurazione VPN chiamata cmux Cloud. È un’autorizzazione macOS separata." } }, - "de": { + "km": { "stringUnit": { "state": "translated", - "value": "In cmux öffnen. Keine VPN-Einrichtung nötig." + "value": "2. អនុញ្ញាតឱ្យ cmux បន្ថែមការកំណត់ VPN ឈ្មោះ cmux Cloud។ នេះជាសិទ្ធិ macOS ផ្សេងមួយ។" } }, - "es": { + "nb": { "stringUnit": { "state": "translated", - "value": "Abrir en cmux. No hace falta configurar una VPN." + "value": "2. Tillat cmux å legge til en VPN-konfigurasjon kalt cmux Cloud. Dette er en separat macOS-tillatelse." } }, - "fr": { + "pl": { "stringUnit": { "state": "translated", - "value": "Ouvrir dans cmux. Aucune configuration VPN nécessaire." + "value": "2. Zezwól cmux dodać konfigurację VPN o nazwie cmux Cloud. To osobne uprawnienie macOS." } }, - "ja": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "cmux で開きます。VPN の設定は不要です。" + "value": "2. Permita que o cmux adicione uma configuração VPN chamada cmux Cloud. Esta é uma permissão separada do macOS." } }, - "ko": { + "ru": { "stringUnit": { "state": "translated", - "value": "cmux에서 열기. VPN 설정이 필요하지 않습니다." + "value": "2. Разрешите cmux добавить VPN-конфигурацию с именем cmux Cloud. Это отдельное разрешение macOS." } }, - "zh-Hans": { + "th": { "stringUnit": { "state": "translated", - "value": "在 cmux 中打开。无需设置 VPN。" + "value": "2. อนุญาตให้ cmux เพิ่มการกำหนดค่า VPN ชื่อ cmux Cloud นี่เป็นสิทธิ์ macOS แยกต่างหาก" } }, - "zh-Hant": { + "tr": { "stringUnit": { "state": "translated", - "value": "在 cmux 中開啟。無需設定 VPN。" + "value": "2. cmux’un cmux Cloud adlı bir VPN yapılandırması eklemesine izin verin. Bu ayrı bir macOS iznidir." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "2. Дозвольте cmux додати конфігурацію VPN з назвою cmux Cloud. Це окремий дозвіл macOS." } } } }, - "cloudTree.port.title": { + "cloud.vpn.setup.steps.return": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Port %@" + "value": "3. Return to this pane. The connection continues automatically after approval. Disconnect here when finished. Quitting cmux or signing out also disconnects it." } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "المنفذ %@" + "value": "3. Kehren Sie zu diesem Bereich zurück. Die Verbindung wird nach der Genehmigung automatisch fortgesetzt. Trennen Sie sie hier, wenn Sie fertig sind. Das Beenden von cmux oder Abmelden trennt sie ebenfalls." } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Port-Nr. %@" + "value": "3. Revenez à ce volet. La connexion reprend automatiquement après autorisation. Déconnectez-la ici lorsque vous avez terminé. Quitter cmux ou fermer la session la déconnecte aussi." } }, "es": { "stringUnit": { "state": "translated", - "value": "Puerto %@" + "value": "3. Vuelve a este panel. La conexión continúa automáticamente tras la autorización. Desconéctala aquí cuando termines. Salir de cmux o cerrar sesión también la desconecta." } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Port n° %@" + "value": "3. このペインに戻ります。承認後、接続は自動的に続行されます。使い終わったらここで切断してください。cmuxの終了やサインアウトでも切断されます。" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "ポート %@" + "value": "3. 返回此面板。批准后连接会自动继续。完成后可在此断开连接。退出 cmux 或退出登录也会断开连接。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "3. 返回此面板。核准後連線會自動繼續。完成後可在此中斷連線。結束 cmux 或登出也會中斷連線。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "포트 %@" + "value": "3. 이 패널로 돌아옵니다. 승인 후 연결이 자동으로 계속됩니다. 사용을 마치면 여기에서 연결을 해제하세요. cmux를 종료하거나 로그아웃해도 연결이 해제됩니다." } }, - "zh-Hans": { + "ar": { "stringUnit": { "state": "translated", - "value": "端口 %@" + "value": "3. ارجع إلى هذه اللوحة. يستمر الاتصال تلقائيًا بعد الموافقة. اقطع الاتصال هنا عند الانتهاء. يؤدي إنهاء cmux أو تسجيل الخروج أيضًا إلى قطع الاتصال." } }, - "zh-Hant": { + "bs": { "stringUnit": { "state": "translated", - "value": "連接埠 %@" + "value": "3. Vratite se na ovaj panel. Veza se nastavlja automatski nakon odobrenja. Ovdje prekinite vezu kada završite. Izlazak iz cmux-a ili odjava takođe prekida vezu." } - } - } - }, - "cloudTree.placeholder.deviceOffline": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "da": { "stringUnit": { "state": "translated", - "value": "Offline — its workspaces return when it does" + "value": "3. Gå tilbage til dette panel. Forbindelsen fortsætter automatisk efter godkendelsen. Afbryd her, når du er færdig. Hvis du afslutter cmux eller logger ud, afbrydes forbindelsen også." } }, - "ar": { + "it": { "stringUnit": { "state": "translated", - "value": "غير متصل — ستعود مساحات عمله عند اتصاله مجددًا" + "value": "3. Torna a questo pannello. La connessione continua automaticamente dopo l’autorizzazione. Disconnettila qui quando hai finito. Anche uscire da cmux o effettuare il logout la disconnette." } }, - "de": { + "km": { "stringUnit": { "state": "translated", - "value": "Offline — die Arbeitsbereiche erscheinen wieder, sobald das Gerät online ist" + "value": "3. ត្រឡប់ទៅផ្ទាំងនេះ។ ការភ្ជាប់នឹងបន្តដោយស្វ័យប្រវត្តិបន្ទាប់ពីអនុម័ត។ ផ្តាច់នៅទីនេះពេលបញ្ចប់។ ការបិទ cmux ឬចាកចេញក៏ផ្តាច់ការភ្ជាប់ដែរ។" } }, - "es": { + "nb": { "stringUnit": { "state": "translated", - "value": "Sin conexión — sus espacios de trabajo volverán cuando se conecte" + "value": "3. Gå tilbake til dette panelet. Forbindelsen fortsetter automatisk etter godkjenning. Koble fra her når du er ferdig. Avslutning av cmux eller utlogging kobler også fra." } }, - "fr": { + "pl": { "stringUnit": { "state": "translated", - "value": "Hors ligne — ses espaces de travail réapparaîtront à sa reconnexion" + "value": "3. Wróć do tego panelu. Połączenie będzie kontynuowane automatycznie po zatwierdzeniu. Po zakończeniu rozłącz je tutaj. Zamknięcie cmux lub wylogowanie również rozłączy połączenie." } }, - "ja": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "オフライン — 再接続するとワークスペースが戻ります" + "value": "3. Volte a este painel. A conexão continuará automaticamente após a aprovação. Desconecte aqui quando terminar. Sair do cmux ou encerrar a sessão também desconecta." } }, - "ko": { + "ru": { "stringUnit": { "state": "translated", - "value": "오프라인 — 다시 연결되면 작업 공간이 돌아옵니다" + "value": "3. Вернитесь в эту панель. После подтверждения соединение продолжится автоматически. Завершив работу, отключите его здесь. Выход из cmux или системы также отключает соединение." } }, - "zh-Hans": { + "th": { "stringUnit": { "state": "translated", - "value": "离线 — 重新连接后会恢复工作区" + "value": "3. กลับมาที่แผงนี้ การเชื่อมต่อจะดำเนินต่อโดยอัตโนมัติหลังการอนุมัติ ตัดการเชื่อมต่อที่นี่เมื่อเสร็จแล้ว การออกจาก cmux หรือออกจากระบบจะตัดการเชื่อมต่อด้วย" } }, - "zh-Hant": { + "tr": { "stringUnit": { "state": "translated", - "value": "離線 — 重新連線後會恢復工作區" + "value": "3. Bu panele dönün. Onaydan sonra bağlantı otomatik olarak devam eder. Bitirdiğinizde buradan bağlantıyı kesin. cmux’tan çıkmak veya oturumu kapatmak da bağlantıyı keser." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "3. Поверніться до цієї панелі. Після схвалення з’єднання продовжиться автоматично. Завершивши роботу, від’єднайте його тут. Вихід із cmux або системи також від’єднає з’єднання." } } } }, - "cloud.vpn.setup.heading": { + "cloud.vpn.setup.address.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Use Cloud machines from any app" + "value": "Private addresses" } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Maschinen aus jeder App verwenden" + "value": "Private Adressen" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Utiliser les machines Cloud depuis toute app" + "value": "Adresses privées" } }, "es": { "stringUnit": { "state": "translated", - "value": "Usar máquinas Cloud desde cualquier app" + "value": "Direcciones privadas" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ほかのアプリからCloudマシンを使う" + "value": "プライベートアドレス" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "从任何应用使用 Cloud 机器" + "value": "私有地址" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "從任何 App 使用 Cloud 機器" + "value": "私有位址" } }, "ko": { "stringUnit": { "state": "translated", - "value": "모든 앱에서 Cloud 머신 사용" + "value": "비공개 주소" } }, "ar": { "stringUnit": { "state": "translated", - "value": "استخدام أجهزة Cloud من أي تطبيق" + "value": "العناوين الخاصة" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Koristite Cloud mašine iz bilo koje aplikacije" + "value": "Privatne adrese" } }, "da": { "stringUnit": { "state": "translated", - "value": "Brug Cloud-maskiner fra alle apps" + "value": "Private adresser" } }, "it": { "stringUnit": { "state": "translated", - "value": "Usa le macchine Cloud da qualsiasi app" + "value": "Indirizzi privati" } }, "km": { "stringUnit": { "state": "translated", - "value": "ប្រើម៉ាស៊ីន Cloud ពីកម្មវិធីណាមួយ" + "value": "អាសយដ្ឋានឯកជន" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Bruk Cloud-maskiner fra alle apper" + "value": "Private adresser" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Używaj maszyn Cloud z dowolnej aplikacji" + "value": "Prywatne adresy" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Use máquinas Cloud em qualquer app" + "value": "Endereços privados" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Используйте Cloud-машины из любого приложения" + "value": "Частные адреса" } }, "th": { "stringUnit": { "state": "translated", - "value": "ใช้เครื่อง Cloud จากทุกแอป" + "value": "ที่อยู่ส่วนตัว" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Cloud makinelerini her uygulamadan kullanın" + "value": "Özel adresler" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Використовуйте Cloud-машини з будь-якої програми" + "value": "Приватні адреси" } } } }, - "cloud.vpn.setup.subtitle": { + "cloud.vpn.setup.openSettings": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Optional access to each VM's private address and original ports, such as 10.40.0.10:3000." + "value": "Open System Settings" } }, "de": { "stringUnit": { "state": "translated", - "value": "Optionaler Zugriff auf die private Adresse und die ursprünglichen Ports jeder VM, etwa 10.40.0.10:3000." + "value": "Systemeinstellungen öffnen" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Accès facultatif à chaque adresse privée et aux ports d’origine des VM, comme 10.40.0.10:3000." + "value": "Ouvrir Réglages Système" } }, "es": { "stringUnit": { "state": "translated", - "value": "Acceso opcional a la dirección privada y los puertos originales de cada VM, como 10.40.0.10:3000." + "value": "Abrir Ajustes del Sistema" } }, "ja": { "stringUnit": { "state": "translated", - "value": "各VMのプライベートアドレスと元のポート(例:10.40.0.10:3000)にアクセスするための任意の設定です。" + "value": "システム設定を開く" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "可选设置,用于访问每台 VM 的私有地址和原始端口,例如 10.40.0.10:3000。" + "value": "打开系统设置" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "選用設定,可存取每台 VM 的私有位址和原始連接埠,例如 10.40.0.10:3000。" + "value": "打開系統設定" } }, "ko": { "stringUnit": { "state": "translated", - "value": "각 VM의 비공개 주소와 원래 포트(예: 10.40.0.10:3000)에 접근하기 위한 선택 설정입니다." + "value": "시스템 설정 열기" } }, "ar": { "stringUnit": { "state": "translated", - "value": "وصول اختياري إلى العنوان الخاص والمنافذ الأصلية لكل جهاز افتراضي، مثل 10.40.0.10:3000." + "value": "فتح إعدادات النظام" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Opcionalni pristup privatnoj adresi i izvornim portovima svake VM, na primjer 10.40.0.10:3000." + "value": "Otvori Postavke sistema" } }, "da": { "stringUnit": { "state": "translated", - "value": "Valgfri adgang til hver VM’s private adresse og oprindelige porte, f.eks. 10.40.0.10:3000." + "value": "Åbn Systemindstillinger" } }, "it": { "stringUnit": { "state": "translated", - "value": "Accesso facoltativo all’indirizzo privato e alle porte originali di ogni VM, ad esempio 10.40.0.10:3000." + "value": "Apri Impostazioni di Sistema" } }, "km": { "stringUnit": { "state": "translated", - "value": "ចូលប្រើអាសយដ្ឋានឯកជន និងច្រកដើមរបស់ VM នីមួយៗ ដូចជា 10.40.0.10:3000 ជាជម្រើស។" + "value": "បើកការកំណត់ប្រព័ន្ធ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Valgfri tilgang til hver VMs private adresse og opprinnelige porter, som 10.40.0.10:3000." + "value": "Åpne Systeminnstillinger" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Opcjonalny dostęp do prywatnego adresu i oryginalnych portów każdej maszyny VM, na przykład 10.40.0.10:3000." + "value": "Otwórz Ustawienia systemowe" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Acesso opcional ao endereço privado e às portas originais de cada VM, como 10.40.0.10:3000." + "value": "Abrir Ajustes do Sistema" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Необязательный доступ к частному адресу и исходным портам каждой VM, например 10.40.0.10:3000." + "value": "Открыть системные настройки" } }, "th": { "stringUnit": { "state": "translated", - "value": "การเข้าถึงที่ไม่บังคับไปยังที่อยู่ส่วนตัวและพอร์ตเดิมของ VM แต่ละเครื่อง เช่น 10.40.0.10:3000" + "value": "เปิดการตั้งค่าระบบ" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Her VM’nin özel adresine ve özgün bağlantı noktalarına isteğe bağlı erişim; örneğin 10.40.0.10:3000." + "value": "Sistem Ayarlarını aç" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Необов’язковий доступ до приватної адреси та початкових портів кожної VM, наприклад 10.40.0.10:3000." + "value": "Відкрити Системні параметри" } } } }, - "cloud.vpn.setup.howItWorks.title": { - "extractionState": "manual", + "settings.app.accentColor.custom": { "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "How it works" - } - }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "So funktioniert es" + "value": "مخصص" } }, - "fr": { + "bs": { "stringUnit": { "state": "translated", - "value": "Fonctionnement" + "value": "Prilagođeno" } }, - "es": { + "da": { "stringUnit": { "state": "translated", - "value": "Cómo funciona" + "value": "Tilpasset" } }, - "ja": { + "de": { "stringUnit": { "state": "translated", - "value": "仕組み" + "value": "Benutzerdefiniert" } }, - "zh-Hans": { + "en": { "stringUnit": { "state": "translated", - "value": "工作原理" + "value": "Custom" } }, - "zh-Hant": { + "es": { "stringUnit": { "state": "translated", - "value": "運作方式" + "value": "Personalizado" } }, - "ko": { + "fr": { "stringUnit": { "state": "translated", - "value": "작동 방식" + "value": "Personnalisée" } }, - "ar": { + "it": { "stringUnit": { "state": "translated", - "value": "طريقة العمل" + "value": "Personalizzato" } }, - "bs": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kako radi" + "value": "カスタム" } }, - "da": { + "ko": { "stringUnit": { "state": "translated", - "value": "Sådan fungerer det" + "value": "사용자 지정" } }, - "it": { + "nb": { "stringUnit": { "state": "translated", - "value": "Come funziona" + "value": "Egendefinert" } }, - "km": { + "pl": { "stringUnit": { "state": "translated", - "value": "របៀបដំណើរការ" + "value": "Niestandardowy" } }, - "nb": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Slik fungerer det" + "value": "Personalizado" } }, - "pl": { + "ru": { "stringUnit": { "state": "translated", - "value": "Jak to działa" + "value": "Пользовательский" } }, - "pt-BR": { + "th": { "stringUnit": { "state": "translated", - "value": "Como funciona" + "value": "กำหนดเอง" } }, - "ru": { + "tr": { "stringUnit": { "state": "translated", - "value": "Как это работает" + "value": "Özel" } }, - "th": { + "uk": { "stringUnit": { "state": "translated", - "value": "วิธีการทำงาน" + "value": "Власний" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Nasıl çalışır" + "value": "自定义" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Як це працює" + "value": "自訂" } } } }, - "cloud.vpn.setup.status.off": { + "socket.sidebar.closeSurface.confirmationRequired": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Off. Your Cloud panes continue to work through cmux's built-in route." + "value": "Surface has a running process; retry with --force" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Aus. Ihre Cloud-Bereiche funktionieren weiterhin über die integrierte Verbindung von cmux." + "value": "تحتوي السطح على عملية قيد التشغيل؛ أعد المحاولة باستخدام --force" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Désactivé. Vos volets Cloud continuent de fonctionner via la connexion intégrée de cmux." + "value": "Die Oberfläche hat einen laufenden Prozess; erneut mit --force versuchen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Desactivada. Tus paneles Cloud siguen funcionando mediante la conexión integrada de cmux." - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "オフ。Cloudペインは引き続きcmux内蔵の接続経路で動作します。" + "value": "La superficie tiene un proceso en ejecución; vuelve a intentarlo con --force" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "已关闭。Cloud 面板仍通过 cmux 内置连接工作。" + "value": "La surface a un processus en cours d’exécution ; réessayez avec --force" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "已關閉。Cloud 面板仍透過 cmux 內建連線運作。" + "value": "サーフェスでプロセスが実行中です。--force を指定して再試行してください" } }, "ko": { "stringUnit": { "state": "translated", - "value": "꺼짐. Cloud 패널은 cmux의 내장 연결을 통해 계속 작동합니다." - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "متوقف. تستمر لوحات Cloud في العمل عبر اتصال cmux المضمن." + "value": "표면에서 실행 중인 프로세스가 있습니다. --force로 다시 시도하세요" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Isključeno. Cloud paneli i dalje rade preko ugrađene cmux veze." + "value": "此表面有正在运行的进程;请使用 --force 重试" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Fra. Dine Cloud-paneler fungerer stadig via cmux’ indbyggede forbindelse." + "value": "此表面有正在執行的程序;請使用 --force 重試" } - }, - "it": { + } + } + }, + "socket.sidebar.closeSurface.failed": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Disattivata. I pannelli Cloud continuano a funzionare tramite la connessione integrata di cmux." + "value": "Failed to close surface" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "បិទ។ ផ្ទាំង Cloud របស់អ្នកនៅតែដំណើរការតាមការភ្ជាប់ដែលមានស្រាប់របស់ cmux។" + "value": "تعذر إغلاق السطح" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Av. Cloud-panelene dine fortsetter å fungere gjennom cmux sin innebygde forbindelse." + "value": "Die Oberfläche konnte nicht geschlossen werden" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Wyłączona. Panele Cloud nadal działają przez wbudowane połączenie cmux." + "value": "No se pudo cerrar la superficie" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Desativada. Seus painéis Cloud continuam funcionando pela conexão integrada do cmux." + "value": "Échec de la fermeture de la surface" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Выключено. Панели Cloud продолжают работать через встроенное соединение cmux." + "value": "サーフェスを閉じられませんでした" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ปิดอยู่ แผง Cloud ยังคงทำงานผ่านการเชื่อมต่อในตัวของ cmux" + "value": "표면을 닫지 못했습니다" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Kapalı. Cloud panelleriniz cmux’un yerleşik bağlantısıyla çalışmaya devam eder." + "value": "无法关闭此表面" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Вимкнено. Панелі Cloud продовжують працювати через вбудоване з’єднання cmux." + "value": "無法關閉表面" } } } }, - "cloud.vpn.setup.steps.title": { + "socket.surface.close.confirmationRequired": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "First-time setup" + "value": "Surface has a running process; retry with force=true" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Ersteinrichtung" + "value": "تحتوي السطح على عملية قيد التشغيل؛ أعد المحاولة باستخدام force=true" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Première configuration" + "value": "Die Oberfläche hat einen laufenden Prozess; erneut mit force=true versuchen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Configuración inicial" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "初回設定" + "value": "La superficie tiene un proceso en ejecución; vuelve a intentarlo con force=true" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "首次设置" + "value": "La surface a un processus en cours d’exécution ; réessayez avec force=true" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "首次設定" + "value": "サーフェスでプロセスが実行中です。force=true を指定して再試行してください" } }, "ko": { "stringUnit": { "state": "translated", - "value": "최초 설정" + "value": "표면에서 실행 중인 프로세스가 있습니다. force=true로 다시 시도하세요" } }, - "ar": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "الإعداد الأولي" + "value": "此表面有正在运行的进程;请使用 force=true 重试" } }, - "bs": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Prvo podešavanje" + "value": "此表面有正在執行的程序;請使用 force=true 重試" } - }, - "da": { + } + } + }, + "socket.surface.close.failed": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Første opsætning" + "value": "Failed to close surface" } }, - "it": { + "ar": { "stringUnit": { "state": "translated", - "value": "Prima configurazione" + "value": "تعذر إغلاق السطح" } }, - "km": { + "de": { "stringUnit": { "state": "translated", - "value": "ការរៀបចំលើកដំបូង" + "value": "Die Oberfläche konnte nicht geschlossen werden" } }, - "nb": { + "es": { "stringUnit": { "state": "translated", - "value": "Førstegangsoppsett" + "value": "No se pudo cerrar la superficie" } }, - "pl": { + "fr": { "stringUnit": { "state": "translated", - "value": "Pierwsza konfiguracja" + "value": "Échec de la fermeture de la surface" } }, - "pt-BR": { + "ja": { "stringUnit": { "state": "translated", - "value": "Primeira configuração" + "value": "サーフェスを閉じられませんでした" } }, - "ru": { + "ko": { "stringUnit": { "state": "translated", - "value": "Первая настройка" + "value": "표면을 닫지 못했습니다" } }, - "th": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "การตั้งค่าครั้งแรก" + "value": "无法关闭此表面" } }, - "tr": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "İlk kurulum" - } - }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Перше налаштування" + "value": "無法關閉表面" } } } }, - "cloud.vpn.setup.steps.extension": { + "socket.tabAction.close.confirmationRequired": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "1. Click Connect Cloud VPN. When macOS asks, allow the cmux network extension in System Settings." + "value": "One or more surfaces have a running process; retry with force=true" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "1. Klicken Sie auf Cloud-VPN verbinden. Erlauben Sie auf Aufforderung von macOS die cmux-Netzwerkerweiterung in den Systemeinstellungen." + "value": "سطح واحد أو أكثر يحتوي على عملية قيد التشغيل؛ أعد المحاولة باستخدام force=true" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "1. Cliquez sur Connecter le VPN Cloud. Lorsque macOS le demande, autorisez l’extension réseau cmux dans Réglages Système." + "value": "Mindestens eine Oberfläche hat einen laufenden Prozess; erneut mit force=true versuchen" } }, "es": { "stringUnit": { "state": "translated", - "value": "1. Haz clic en Conectar VPN de Cloud. Cuando macOS lo solicite, permite la extensión de red de cmux en Ajustes del Sistema." + "value": "Una o más superficies tienen un proceso en ejecución; vuelve a intentarlo con force=true" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une ou plusieurs surfaces ont un processus en cours d’exécution ; réessayez avec force=true" } }, "ja": { "stringUnit": { "state": "translated", - "value": "1. 「Cloud VPNに接続」をクリックします。macOSに求められたら、システム設定でcmuxのネットワーク機能拡張を許可します。" + "value": "1 つ以上のサーフェスでプロセスが実行中です。force=true を指定して再試行してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "하나 이상의 표면에서 프로세스가 실행 중입니다. force=true로 다시 시도하세요" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "1. 点击“连接 Cloud VPN”。macOS 提示时,在系统设置中允许 cmux 网络扩展。" + "value": "一个或多个表面有正在运行的进程;请使用 force=true 重试" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "1. 按一下「連接 Cloud VPN」。macOS 提示時,請在系統設定中允許 cmux 網路延伸功能。" + "value": "一個或多個表面有正在執行的程序;請使用 force=true 重試" } - }, - "ko": { + } + } + }, + "cli.socket.error.workspaceCloseConfirmationRequired": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "1. Cloud VPN 연결을 클릭합니다. macOS에서 요청하면 시스템 설정에서 cmux 네트워크 확장을 허용합니다." + "value": "Workspace has a running process; retry with --force" } }, "ar": { "stringUnit": { "state": "translated", - "value": "1. انقر على توصيل VPN الخاص بـ Cloud. عندما يطلب macOS ذلك، اسمح بامتداد شبكة cmux في إعدادات النظام." + "value": "تحتوي مساحة العمل على عملية قيد التشغيل؛ أعد المحاولة باستخدام --force" } }, - "bs": { + "de": { "stringUnit": { "state": "translated", - "value": "1. Kliknite Poveži Cloud VPN. Kada macOS zatraži, dozvolite cmux mrežni dodatak u Postavkama sistema." + "value": "Arbeitsbereich mit laufendem Prozess; erneut mit --force versuchen" } }, - "da": { + "es": { "stringUnit": { "state": "translated", - "value": "1. Klik på Forbind Cloud VPN. Når macOS spørger, skal du tillade cmux-netværksudvidelsen i Systemindstillinger." + "value": "El espacio de trabajo tiene un proceso en ejecución; vuelve a intentarlo con --force" } }, - "it": { + "fr": { "stringUnit": { "state": "translated", - "value": "1. Fai clic su Connetti VPN Cloud. Quando macOS lo richiede, consenti l’estensione di rete cmux nelle Impostazioni di Sistema." + "value": "L’espace de travail a un processus en cours d’exécution ; réessayez avec --force" } }, - "km": { + "ja": { "stringUnit": { "state": "translated", - "value": "1. ចុច ភ្ជាប់ Cloud VPN។ ពេល macOS ស្នើ សូមអនុញ្ញាតផ្នែកបន្ថែមបណ្តាញ cmux ក្នុងការកំណត់ប្រព័ន្ធ។" + "value": "ワークスペースでプロセスが実行中です。--force を指定して再試行してください" } }, - "nb": { + "ko": { "stringUnit": { "state": "translated", - "value": "1. Klikk Koble til Cloud VPN. Når macOS spør, tillat cmux-nettverksutvidelsen i Systeminnstillinger." + "value": "워크스페이스에서 프로세스가 실행 중입니다. --force로 다시 시도하세요" } }, - "pl": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "1. Kliknij Połącz z Cloud VPN. Gdy macOS poprosi, zezwól na rozszerzenie sieci cmux w Ustawieniach systemowych." + "value": "此工作区有正在运行的进程;请使用 --force 重试" } }, - "pt-BR": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "1. Clique em Conectar Cloud VPN. Quando o macOS pedir, permita a extensão de rede do cmux nos Ajustes do Sistema." + "value": "此工作區有正在執行的程序;請使用 --force 重試" + } + } + } + }, + "cli.socket.error.windowCloseConfirmationRequired": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "One or more workspaces or Dock surfaces have a running process; retry with --force" } }, - "ru": { + "ar": { "stringUnit": { "state": "translated", - "value": "1. Нажмите Подключить Cloud VPN. Когда macOS попросит, разрешите сетевое расширение cmux в системных настройках." + "value": "تحتوي مساحة عمل واحدة أو أكثر أو أسطح Dock على عملية قيد التشغيل؛ أعد المحاولة باستخدام --force" } }, - "th": { + "de": { "stringUnit": { "state": "translated", - "value": "1. คลิก เชื่อมต่อ Cloud VPN เมื่อ macOS ขอ ให้อนุญาตส่วนขยายเครือข่าย cmux ในการตั้งค่าระบบ" + "value": "Mindestens ein Workspace oder eine Dock-Oberfläche hat einen laufenden Prozess; erneut mit --force versuchen" } }, - "tr": { + "es": { "stringUnit": { "state": "translated", - "value": "1. Cloud VPN’e bağlan’a tıklayın. macOS istediğinde Sistem Ayarları’nda cmux ağ uzantısına izin verin." + "value": "Uno o más espacios de trabajo o superficies del Dock tienen un proceso en ejecución; vuelve a intentarlo con --force" } }, - "uk": { + "fr": { "stringUnit": { "state": "translated", - "value": "1. Натисніть Підключити Cloud VPN. Коли macOS попросить, дозвольте мережеве розширення cmux у Системних параметрах." + "value": "Un ou plusieurs espaces de travail ou surfaces du Dock ont un processus en cours d’exécution ; réessayez avec --force" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "1 つ以上のワークスペースまたは Dock サーフェスでプロセスが実行中です。--force を指定して再試行してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "하나 이상의 워크스페이스 또는 Dock 표면에서 실행 중인 프로세스가 있습니다. --force로 다시 시도하세요" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "一个或多个工作区或 Dock 表面有正在运行的进程;请使用 --force 重试" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "一個或多個工作區或 Dock 表面有正在執行的程序;請使用 --force 重試" } } } }, - "cloud.vpn.setup.steps.settings": { + "devices.incoming.confirm.enable": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open General > Login Items & Extensions > Network Extensions, then enable cmux." + "value": "Make Discoverable" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Öffnen Sie Allgemein > Anmeldeobjekte & Erweiterungen > Netzwerkerweiterungen und aktivieren Sie cmux." + "value": "جعل الجهاز قابلاً للاكتشاف" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Ouvrez Général > Ouverture et extensions > Extensions réseau, puis activez cmux." + "value": "Auffindbar machen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abre General > Ítems de inicio y extensiones > Extensiones de red y activa cmux." + "value": "Hacer detectable" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "「一般」>「ログイン項目と機能拡張」>「ネットワーク機能拡張」を開き、cmuxを有効にします。" + "value": "Rendre détectable" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "打开“通用”>“登录项与扩展”>“网络扩展”,然后启用 cmux。" + "value": "検出可能にする" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "打開「一般」>「登入項目與延伸功能」>「網路延伸功能」,然後啟用 cmux。" + "value": "검색 허용" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "일반 > 로그인 항목 및 확장 프로그램 > 네트워크 확장을 열고 cmux를 활성화합니다." + "value": "允许发现" } }, - "ar": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "افتح عام > عناصر الدخول والامتدادات > امتدادات الشبكة، ثم فعّل cmux." + "value": "允許探索" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Otvorite Opšte > Stavke za prijavu i dodaci > Mrežni dodaci, pa omogućite cmux." + "value": "Učini dostupnim" } }, "da": { "stringUnit": { "state": "translated", - "value": "Åbn Generelt > Loginemner og udvidelser > Netværksudvidelser, og aktivér cmux." + "value": "Gør synlig" } }, "it": { "stringUnit": { "state": "translated", - "value": "Apri Generali > Elementi login ed estensioni > Estensioni di rete, quindi abilita cmux." + "value": "Rendi individuabile" } }, "km": { "stringUnit": { "state": "translated", - "value": "បើក ទូទៅ > ធាតុចូល និងផ្នែកបន្ថែម > ផ្នែកបន្ថែមបណ្តាញ ហើយបើក cmux។" + "value": "ធ្វើឲ្យអាចរកឃើញ" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Åpne Generelt > Påloggingselementer og utvidelser > Nettverksutvidelser, og aktiver cmux." + "value": "Gjør denne Mac-en synlig" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Otwórz Ogólne > Elementy logowania i rozszerzenia > Rozszerzenia sieciowe, a następnie włącz cmux." + "value": "Włącz wykrywanie" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Abra Geral > Itens de Início e Extensões > Extensões de Rede e ative o cmux." + "value": "Tornar detectável" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Откройте Основные > Объекты входа и расширения > Сетевые расширения и включите cmux." + "value": "Сделать доступным для обнаружения" } }, "th": { "stringUnit": { "state": "translated", - "value": "เปิด ทั่วไป > รายการเข้าสู่ระบบและส่วนขยาย > ส่วนขยายเครือข่าย แล้วเปิดใช้ cmux" + "value": "ทำให้ Mac เครื่องนี้ค้นพบได้" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Genel > Giriş Öğeleri ve Uzantılar > Ağ Uzantıları’nı açın ve cmux’u etkinleştirin." + "value": "Keşfedilebilir yap" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Відкрийте Загальні > Об’єкти входу та розширення > Мережеві розширення й увімкніть cmux." + "value": "Зробити цей Mac видимим" } } } }, - "cloud.vpn.setup.steps.settingsLegacy": { + "devices.incoming.confirm.message": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open Privacy & Security and allow the cmux extension." + "value": "Other Macs signed in to your cmux account may discover this Mac and connect to its workspaces. Do you want to continue?" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Öffnen Sie Datenschutz & Sicherheit und erlauben Sie die cmux-Erweiterung." + "value": "قد تكتشف أجهزة Mac الأخرى التي سجّلت الدخول إلى حساب cmux هذا الـ Mac وتتصل بمساحات العمل فيه. هل تريد المتابعة؟" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Ouvrez Confidentialité et sécurité et autorisez l’extension cmux." + "value": "Andere Macs, die bei deinem cmux-Konto angemeldet sind, können diesen Mac finden und sich mit seinen Arbeitsbereichen verbinden. Möchtest du fortfahren?" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abre Privacidad y seguridad y permite la extensión de cmux." + "value": "Otros Mac que hayan iniciado sesión en tu cuenta de cmux podrán descubrir este Mac y conectarse a sus espacios de trabajo. ¿Quieres continuar?" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "「プライバシーとセキュリティ」を開き、cmuxの機能拡張を許可します。" + "value": "Les autres Mac connectés à votre compte cmux pourront détecter ce Mac et se connecter à ses espaces de travail. Voulez-vous continuer ?" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "打开“隐私与安全性”,然后允许 cmux 扩展。" + "value": "cmuxアカウントにサインインしているほかのMacから、このMacが検出され、ワークスペースに接続されることがあります。続けますか?" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "打開「隱私權與安全性」,然後允許 cmux 延伸功能。" + "value": "cmux 계정에 로그인한 다른 Mac에서 이 Mac을 검색하고 작업 공간에 연결할 수 있습니다. 계속하시겠습니까?" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "개인정보 보호 및 보안을 열고 cmux 확장을 허용합니다." + "value": "登录你 cmux 帐户的其他 Mac 可能会发现此 Mac 并连接到其工作区。要继续吗?" } }, - "ar": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "افتح الخصوصية والأمان واسمح بامتداد cmux." + "value": "登入您 cmux 帳戶的其他 Mac 可能會探索此 Mac 並連線至其工作區。要繼續嗎?" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Otvorite Privatnost i sigurnost i dozvolite cmux dodatak." + "value": "Drugi Mac računari prijavljeni na vaš cmux nalog možda će otkriti ovaj Mac i povezati se s njegovim radnim prostorima. Želite li nastaviti?" } }, "da": { "stringUnit": { "state": "translated", - "value": "Åbn Anonymitet og sikkerhed, og tillad cmux-udvidelsen." + "value": "Andre Mac-computere, der er logget ind på din cmux-konto, kan muligvis finde denne Mac og oprette forbindelse til dens arbejdsområder. Vil du fortsætte?" } }, "it": { "stringUnit": { "state": "translated", - "value": "Apri Privacy e sicurezza e consenti l’estensione cmux." + "value": "Gli altri Mac che hanno effettuato l’accesso al tuo account cmux potrebbero rilevare questo Mac e connettersi ai suoi spazi di lavoro. Vuoi continuare?" } }, "km": { "stringUnit": { "state": "translated", - "value": "បើក ឯកជនភាព និងសុវត្ថិភាព ហើយអនុញ្ញាតផ្នែកបន្ថែម cmux។" + "value": "Mac ផ្សេងទៀតដែលបានចូលគណនី cmux របស់អ្នក អាចរកឃើញ Mac នេះ និងភ្ជាប់ទៅកាន់ workspace របស់វា។ តើអ្នកចង់បន្តឬទេ?" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Åpne Personvern og sikkerhet og tillat cmux-utvidelsen." + "value": "Andre Mac-maskiner som er logget på cmux-kontoen din, kan finne denne Mac-en og koble til arbeidsområdene. Vil du fortsette?" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Otwórz Prywatność i ochrona i zezwól na rozszerzenie cmux." + "value": "Inne Maki zalogowane na Twoje konto cmux mogą wykryć tego Maca i połączyć się z jego obszarami roboczymi. Czy chcesz kontynuować?" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Abra Privacidade e Segurança e permita a extensão do cmux." + "value": "Outros Macs conectados à sua conta cmux poderão descobrir este Mac e se conectar aos seus espaços de trabalho. Deseja continuar?" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Откройте Конфиденциальность и безопасность и разрешите расширение cmux." + "value": "Другие Mac, вошедшие в вашу учётную запись cmux, могут обнаружить этот Mac и подключиться к его рабочим пространствам. Продолжить?" } }, "th": { "stringUnit": { "state": "translated", - "value": "เปิด ความเป็นส่วนตัวและความปลอดภัย แล้วอนุญาตส่วนขยาย cmux" + "value": "Mac เครื่องอื่นที่ลงชื่อเข้าใช้บัญชี cmux ของคุณอาจค้นพบ Mac เครื่องนี้และเชื่อมต่อกับพื้นที่ทำงานของเครื่องนี้ คุณต้องการดำเนินการต่อหรือไม่" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Gizlilik ve Güvenlik’i açın ve cmux uzantısına izin verin." + "value": "cmux hesabınızda oturum açmış diğer Mac’ler bu Mac’i keşfedebilir ve çalışma alanlarına bağlanabilir. Devam etmek istiyor musunuz?" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Відкрийте Конфіденційність і безпека та дозвольте розширення cmux." + "value": "Інші Mac, на яких виконано вхід у ваш обліковий запис cmux, можуть виявити цей Mac і підключитися до його робочих просторів. Продовжити?" } } } }, - "cloud.vpn.setup.steps.configuration": { + "devices.incoming.confirm.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "2. Allow cmux to add a VPN configuration named cmux Cloud. This is a separate macOS permission." + "value": "Make this Mac discoverable?" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "2. Erlauben Sie cmux, eine VPN-Konfiguration namens cmux Cloud hinzuzufügen. Dies ist eine separate macOS-Berechtigung." + "value": "هل تريد جعل جهاز Mac هذا قابلاً للاكتشاف؟" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "2. Autorisez cmux à ajouter une configuration VPN nommée cmux Cloud. Il s’agit d’une autorisation macOS distincte." + "value": "Diesen Mac auffindbar machen?" } }, "es": { "stringUnit": { "state": "translated", - "value": "2. Permite que cmux añada una configuración VPN llamada cmux Cloud. Este es un permiso independiente de macOS." + "value": "¿Hacer que este Mac sea detectable?" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "2. cmux Cloudという名前のVPN構成の追加を許可します。これは別のmacOS権限です。" + "value": "Rendre ce Mac détectable ?" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "2. 允许 cmux 添加名为 cmux Cloud 的 VPN 配置。这是单独的 macOS 权限。" + "value": "このMacを検出可能にしますか?" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "2. 允許 cmux 加入名為 cmux Cloud 的 VPN 設定。這是另一項 macOS 權限。" + "value": "이 Mac을 검색 가능하게 할까요?" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "2. cmux가 cmux Cloud라는 VPN 구성을 추가하도록 허용합니다. 이는 별도의 macOS 권한입니다." + "value": "允许发现此 Mac 吗?" } }, - "ar": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "2. اسمح لـ cmux بإضافة إعداد VPN باسم cmux Cloud. هذا إذن منفصل في macOS." + "value": "要允許探索此 Mac 嗎?" } }, "bs": { "stringUnit": { "state": "translated", - "value": "2. Dozvolite cmux-u da doda VPN konfiguraciju pod imenom cmux Cloud. Ovo je posebna macOS dozvola." + "value": "Učiniti ovaj Mac dostupnim?" } }, "da": { "stringUnit": { "state": "translated", - "value": "2. Tillad cmux at tilføje en VPN-konfiguration med navnet cmux Cloud. Dette er en separat macOS-tilladelse." + "value": "Gør denne Mac synlig?" } }, "it": { "stringUnit": { "state": "translated", - "value": "2. Consenti a cmux di aggiungere una configurazione VPN chiamata cmux Cloud. È un’autorizzazione macOS separata." + "value": "Rendere individuabile questo Mac?" } }, "km": { "stringUnit": { "state": "translated", - "value": "2. អនុញ្ញាតឱ្យ cmux បន្ថែមការកំណត់ VPN ឈ្មោះ cmux Cloud។ នេះជាសិទ្ធិ macOS ផ្សេងមួយ។" + "value": "ធ្វើឲ្យ Mac នេះអាចរកឃើញ?" } }, "nb": { "stringUnit": { "state": "translated", - "value": "2. Tillat cmux å legge til en VPN-konfigurasjon kalt cmux Cloud. Dette er en separat macOS-tillatelse." + "value": "Gjøre denne Mac-en synlig?" } }, "pl": { "stringUnit": { "state": "translated", - "value": "2. Zezwól cmux dodać konfigurację VPN o nazwie cmux Cloud. To osobne uprawnienie macOS." + "value": "Uwidocznić tego Maca?" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "2. Permita que o cmux adicione uma configuração VPN chamada cmux Cloud. Esta é uma permissão separada do macOS." + "value": "Tornar este Mac detectável?" } }, "ru": { "stringUnit": { "state": "translated", - "value": "2. Разрешите cmux добавить VPN-конфигурацию с именем cmux Cloud. Это отдельное разрешение macOS." + "value": "Сделать этот Mac доступным для обнаружения?" } }, "th": { "stringUnit": { "state": "translated", - "value": "2. อนุญาตให้ cmux เพิ่มการกำหนดค่า VPN ชื่อ cmux Cloud นี่เป็นสิทธิ์ macOS แยกต่างหาก" + "value": "ทำให้ Mac เครื่องนี้ค้นพบได้หรือไม่" } }, "tr": { "stringUnit": { "state": "translated", - "value": "2. cmux’un cmux Cloud adlı bir VPN yapılandırması eklemesine izin verin. Bu ayrı bir macOS iznidir." + "value": "Bu Mac keşfedilebilir yapılsın mı?" } }, "uk": { "stringUnit": { "state": "translated", - "value": "2. Дозвольте cmux додати конфігурацію VPN з назвою cmux Cloud. Це окремий дозвіл macOS." + "value": "Зробити цей Mac доступним для виявлення?" } } } }, - "cloud.vpn.setup.steps.return": { + "cloudTree.device.status.connecting": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "3. Return to this pane. The connection continues automatically after approval. Disconnect here when finished. Quitting cmux or signing out also disconnects it." + "value": "Connecting…" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "3. Kehren Sie zu diesem Bereich zurück. Die Verbindung wird nach der Genehmigung automatisch fortgesetzt. Trennen Sie sie hier, wenn Sie fertig sind. Das Beenden von cmux oder Abmelden trennt sie ebenfalls." + "value": "جارٍ الاتصال…" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "3. Revenez à ce volet. La connexion reprend automatiquement après autorisation. Déconnectez-la ici lorsque vous avez terminé. Quitter cmux ou fermer la session la déconnecte aussi." + "value": "Wird verbunden…" } }, "es": { "stringUnit": { "state": "translated", - "value": "3. Vuelve a este panel. La conexión continúa automáticamente tras la autorización. Desconéctala aquí cuando termines. Salir de cmux o cerrar sesión también la desconecta." - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "3. このペインに戻ります。承認後、接続は自動的に続行されます。使い終わったらここで切断してください。cmuxの終了やサインアウトでも切断されます。" + "value": "Conectando…" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "3. 返回此面板。批准后连接会自动继续。完成后可在此断开连接。退出 cmux 或退出登录也会断开连接。" + "value": "Connexion…" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "3. 返回此面板。核准後連線會自動繼續。完成後可在此中斷連線。結束 cmux 或登出也會中斷連線。" + "value": "接続中…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "3. 이 패널로 돌아옵니다. 승인 후 연결이 자동으로 계속됩니다. 사용을 마치면 여기에서 연결을 해제하세요. cmux를 종료하거나 로그아웃해도 연결이 해제됩니다." - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "3. ارجع إلى هذه اللوحة. يستمر الاتصال تلقائيًا بعد الموافقة. اقطع الاتصال هنا عند الانتهاء. يؤدي إنهاء cmux أو تسجيل الخروج أيضًا إلى قطع الاتصال." + "value": "연결 중…" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "3. Vratite se na ovaj panel. Veza se nastavlja automatski nakon odobrenja. Ovdje prekinite vezu kada završite. Izlazak iz cmux-a ili odjava takođe prekida vezu." + "value": "正在连接…" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "3. Gå tilbage til dette panel. Forbindelsen fortsætter automatisk efter godkendelsen. Afbryd her, når du er færdig. Hvis du afslutter cmux eller logger ud, afbrydes forbindelsen også." + "value": "正在連線…" } - }, - "it": { + } + } + }, + "cloud.teamPicker.createSheet.create": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "3. Torna a questo pannello. La connessione continua automaticamente dopo l’autorizzazione. Disconnettila qui quando hai finito. Anche uscire da cmux o effettuare il logout la disconnette." + "value": "Create" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "3. ត្រឡប់ទៅផ្ទាំងនេះ។ ការភ្ជាប់នឹងបន្តដោយស្វ័យប្រវត្តិបន្ទាប់ពីអនុម័ត។ ផ្តាច់នៅទីនេះពេលបញ្ចប់។ ការបិទ cmux ឬចាកចេញក៏ផ្តាច់ការភ្ជាប់ដែរ។" + "value": "إنشاء" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "3. Gå tilbake til dette panelet. Forbindelsen fortsetter automatisk etter godkjenning. Koble fra her når du er ferdig. Avslutning av cmux eller utlogging kobler også fra." + "value": "Erstellen" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "3. Wróć do tego panelu. Połączenie będzie kontynuowane automatycznie po zatwierdzeniu. Po zakończeniu rozłącz je tutaj. Zamknięcie cmux lub wylogowanie również rozłączy połączenie." + "value": "Crear" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "3. Volte a este painel. A conexão continuará automaticamente após a aprovação. Desconecte aqui quando terminar. Sair do cmux ou encerrar a sessão também desconecta." + "value": "Créer" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "3. Вернитесь в эту панель. После подтверждения соединение продолжится автоматически. Завершив работу, отключите его здесь. Выход из cmux или системы также отключает соединение." + "value": "作成" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "3. กลับมาที่แผงนี้ การเชื่อมต่อจะดำเนินต่อโดยอัตโนมัติหลังการอนุมัติ ตัดการเชื่อมต่อที่นี่เมื่อเสร็จแล้ว การออกจาก cmux หรือออกจากระบบจะตัดการเชื่อมต่อด้วย" + "value": "만들기" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "3. Bu panele dönün. Onaydan sonra bağlantı otomatik olarak devam eder. Bitirdiğinizde buradan bağlantıyı kesin. cmux’tan çıkmak veya oturumu kapatmak da bağlantıyı keser." + "value": "创建" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "3. Поверніться до цієї панелі. Після схвалення з’єднання продовжиться автоматично. Завершивши роботу, від’єднайте його тут. Вихід із cmux або системи також від’єднає з’єднання." + "value": "建立" } } } }, - "cloud.vpn.setup.address.title": { + "cloud.teamPicker.createSheet.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Private addresses" + "value": "Create Team" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Private Adressen" + "value": "إنشاء فريق" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Adresses privées" + "value": "Team erstellen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Direcciones privadas" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "プライベートアドレス" + "value": "Crear equipo" } }, - "zh-Hans": { + "fr": { "stringUnit": { "state": "translated", - "value": "私有地址" + "value": "Créer une équipe" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "私有位址" + "value": "チームを作成" } }, "ko": { "stringUnit": { "state": "translated", - "value": "비공개 주소" - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "العناوين الخاصة" + "value": "팀 만들기" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Privatne adrese" + "value": "创建团队" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Private adresser" + "value": "建立團隊" } - }, - "it": { + } + } + }, + "cloud.teamPicker.createTeam": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Indirizzi privati" + "value": "Create Team…" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "អាសយដ្ឋានឯកជន" + "value": "إنشاء فريق…" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Private adresser" + "value": "Team erstellen…" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Prywatne adresy" + "value": "Crear equipo…" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Endereços privados" + "value": "Créer une équipe…" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Частные адреса" + "value": "チームを作成…" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ที่อยู่ส่วนตัว" + "value": "팀 만들기…" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Özel adresler" + "value": "创建团队…" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Приватні адреси" + "value": "建立團隊…" } } } }, - "cloud.vpn.setup.openSettings": { + "cloud.teamPicker.switching": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open System Settings" + "value": "Switching teams…" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Systemeinstellungen öffnen" + "value": "جارٍ تبديل الفريق…" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Ouvrir Réglages Système" + "value": "Team wird gewechselt…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abrir Ajustes del Sistema" + "value": "Cambiando de equipo…" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "システム設定を開く" + "value": "Changement d’équipe…" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "打开系统设置" + "value": "チームを切り替え中…" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "打開系統設定" + "value": "팀 전환 중…" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "시스템 설정 열기" + "value": "正在切换团队…" } }, - "ar": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "فتح إعدادات النظام" + "value": "正在切換團隊…" } - }, - "bs": { + } + } + }, + "cloud.teamPicker.creating": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Otvori Postavke sistema" + "value": "Creating team…" } }, - "da": { + "ar": { "stringUnit": { "state": "translated", - "value": "Åbn Systemindstillinger" + "value": "جارٍ إنشاء الفريق…" } }, - "it": { + "de": { "stringUnit": { "state": "translated", - "value": "Apri Impostazioni di Sistema" + "value": "Team wird erstellt…" } }, - "km": { + "es": { "stringUnit": { "state": "translated", - "value": "បើកការកំណត់ប្រព័ន្ធ" + "value": "Creando equipo…" } }, - "nb": { + "fr": { "stringUnit": { "state": "translated", - "value": "Åpne Systeminnstillinger" + "value": "Création de l’équipe…" } }, - "pl": { + "ja": { "stringUnit": { "state": "translated", - "value": "Otwórz Ustawienia systemowe" + "value": "チームを作成中…" } }, - "pt-BR": { + "ko": { "stringUnit": { "state": "translated", - "value": "Abrir Ajustes do Sistema" + "value": "팀 만드는 중…" } }, - "ru": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Открыть системные настройки" - } - }, - "th": { - "stringUnit": { - "state": "translated", - "value": "เปิดการตั้งค่าระบบ" - } - }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Sistem Ayarlarını aç" + "value": "正在创建团队…" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Відкрити Системні параметри" + "value": "正在建立團隊…" } } } }, - "settings.app.accentColor.custom": { + "socket.authTeam.busy": { + "extractionState": "manual", "localizations": { - "ar": { - "stringUnit": { - "state": "translated", - "value": "مخصص" - } - }, - "bs": { + "en": { "stringUnit": { "state": "translated", - "value": "Prilagođeno" + "value": "Another team change is in progress. Try again when it finishes." } }, - "da": { + "ar": { "stringUnit": { "state": "translated", - "value": "Tilpasset" + "value": "هناك تغيير آخر في الفريق قيد التنفيذ. حاول مرة أخرى عند انتهائه." } }, "de": { "stringUnit": { "state": "translated", - "value": "Benutzerdefiniert" + "value": "Eine andere Teamänderung läuft noch. Versuche es erneut, wenn sie abgeschlossen ist." } }, - "en": { + "es": { "stringUnit": { "state": "translated", - "value": "Custom" + "value": "Hay otro cambio de equipo en curso. Inténtalo de nuevo cuando termine." } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "Personalizado" + "value": "Une autre modification d’équipe est en cours. Réessayez une fois terminée." } }, - "fr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Personnalisée" + "value": "別のチーム変更を処理中です。完了してからもう一度お試しください。" } }, - "it": { + "ko": { "stringUnit": { "state": "translated", - "value": "Personalizzato" + "value": "다른 팀 변경이 진행 중입니다. 완료된 후 다시 시도하세요." } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "カスタム" + "value": "另一项团队更改正在进行中,请在完成后重试。" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "사용자 지정" + "value": "另一項團隊變更正在進行中,請在完成後再試一次。" } - }, - "nb": { + } + } + }, + "cloud.teamPicker.createSheet.message": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Egendefinert" + "value": "The new team becomes your active team." } }, - "pl": { + "ar": { "stringUnit": { "state": "translated", - "value": "Niestandardowy" + "value": "يصبح الفريق الجديد فريقك النشط." } }, - "pt-BR": { + "de": { "stringUnit": { "state": "translated", - "value": "Personalizado" + "value": "Das neue Team wird Ihr aktives Team." } }, - "ru": { + "es": { "stringUnit": { "state": "translated", - "value": "Пользовательский" + "value": "El nuevo equipo pasa a ser su equipo activo." } }, - "th": { + "fr": { "stringUnit": { "state": "translated", - "value": "กำหนดเอง" + "value": "La nouvelle équipe devient votre équipe active." } }, - "tr": { + "ja": { "stringUnit": { "state": "translated", - "value": "Özel" + "value": "新しいチームがアクティブなチームになります。" } }, - "uk": { + "ko": { "stringUnit": { "state": "translated", - "value": "Власний" + "value": "새 팀이 활성 팀이 됩니다." } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "自定义" + "value": "新团队将成为你的当前团队。" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "自訂" + "value": "新團隊會成為你使用中的團隊。" } } } @@ -580709,2144 +580789,2411 @@ } }, "zh-Hant": { - "variations": { - "plural": { - "other": { - "stringUnit": { - "state": "translated", - "value": "%lld 個執行中的命令" - } - } - } + "variations": { + "plural": { + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld 個執行中的命令" + } + } + } + } + }, + "zh-Hans": { + "variations": { + "plural": { + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld 个正在运行的命令" + } + } + } + } + }, + "ko": { + "variations": { + "plural": { + "other": { + "stringUnit": { + "state": "translated", + "value": "실행 중인 명령 %lld개" + } + } + } + } + }, + "ja": { + "variations": { + "plural": { + "other": { + "stringUnit": { + "state": "translated", + "value": "実行中のコマンド %lld 個" + } + } + } + } + } + } + }, + "update.safety.safe": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Safe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sicher" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sûr" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "آمن" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seguro" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "安全" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "安全" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "안전" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "安全" + } + } + } + }, + "update.safety.care": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Resumes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird fortgesetzt" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Reprend" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "يُستأنف" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Se reanuda" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "會繼續" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "会继续" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재개됨" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "再開" + } + } + } + }, + "update.safety.risky": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Risky" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Riskant" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Risqué" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "خطر" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Arriesgado" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "有風險" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "有风险" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "위험" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リスクあり" + } + } + } + }, + "update.wait": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Wait" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Warten" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Attendre" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "انتظار" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Esperar" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "等待" } }, "zh-Hans": { - "variations": { - "plural": { - "other": { - "stringUnit": { - "state": "translated", - "value": "%lld 个正在运行的命令" - } - } - } + "stringUnit": { + "state": "translated", + "value": "等待" } }, "ko": { - "variations": { - "plural": { - "other": { - "stringUnit": { - "state": "translated", - "value": "실행 중인 명령 %lld개" - } - } - } + "stringUnit": { + "state": "translated", + "value": "대기" } }, "ja": { - "variations": { - "plural": { - "other": { - "stringUnit": { - "state": "translated", - "value": "実行中のコマンド %lld 個" - } - } - } + "stringUnit": { + "state": "translated", + "value": "待機" } } } }, - "update.safety.safe": { + "update.updateWhenFinished": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Safe" + "value": "Update When These Finish" } }, "de": { "stringUnit": { "state": "translated", - "value": "Sicher" + "value": "Aktualisieren, wenn diese fertig sind" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Sûr" + "value": "Mettre à jour quand ils auront terminé" } }, "ar": { "stringUnit": { "state": "translated", - "value": "آمن" + "value": "التحديث عند انتهاء هذه العناصر" } }, "es": { "stringUnit": { "state": "translated", - "value": "Seguro" + "value": "Actualizar cuando terminen" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "安全" + "value": "在這些完成後更新" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "安全" + "value": "在这些完成后更新" } }, "ko": { "stringUnit": { "state": "translated", - "value": "안전" + "value": "완료되면 업데이트" } }, "ja": { "stringUnit": { "state": "translated", - "value": "安全" + "value": "終了後にアップデート" } } } }, - "update.safety.care": { + "update.updateAnyway": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Resumes" + "value": "Update Anyway" } }, "de": { "stringUnit": { "state": "translated", - "value": "Wird fortgesetzt" + "value": "Trotzdem aktualisieren" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Reprend" + "value": "Mettre à jour quand même" } }, "ar": { "stringUnit": { "state": "translated", - "value": "يُستأنف" + "value": "التحديث على أي حال" } }, "es": { "stringUnit": { "state": "translated", - "value": "Se reanuda" + "value": "Actualizar de todos modos" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "會繼續" + "value": "仍要更新" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "会继续" + "value": "仍要更新" } }, "ko": { "stringUnit": { "state": "translated", - "value": "재개됨" + "value": "그래도 업데이트" } }, "ja": { "stringUnit": { "state": "translated", - "value": "再開" + "value": "それでもアップデート" } } } }, - "update.safety.risky": { + "update.agentActivity.remote": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Risky" + "value": "Keeps running on the remote host" } }, "de": { "stringUnit": { "state": "translated", - "value": "Riskant" + "value": "Läuft auf dem Remote-Host weiter" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Risqué" + "value": "Continue de s’exécuter sur l’hôte distant" } }, "ar": { "stringUnit": { "state": "translated", - "value": "خطر" + "value": "يستمر في العمل على المضيف البعيد" } }, "es": { "stringUnit": { "state": "translated", - "value": "Arriesgado" + "value": "Sigue ejecutándose en el host remoto" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "有風險" + "value": "在遠端主機上持續執行" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "有风险" + "value": "在远程主机上继续运行" } }, "ko": { "stringUnit": { "state": "translated", - "value": "위험" + "value": "원격 호스트에서 계속 실행됨" } }, "ja": { "stringUnit": { "state": "translated", - "value": "リスクあり" + "value": "リモートホストで実行を継続" } } } }, - "update.wait": { + "update.agentActivity.needsInput": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Wait" + "value": "Waiting for your answer" } }, "de": { "stringUnit": { "state": "translated", - "value": "Warten" + "value": "Wartet auf deine Antwort" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Attendre" + "value": "En attente de votre réponse" } }, "ar": { "stringUnit": { "state": "translated", - "value": "انتظار" + "value": "في انتظار إجابتك" } }, "es": { "stringUnit": { "state": "translated", - "value": "Esperar" + "value": "Esperando tu respuesta" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "等待" + "value": "正在等待你的回答" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "等待" + "value": "正在等待你的回答" } }, "ko": { "stringUnit": { "state": "translated", - "value": "대기" + "value": "답변을 기다리는 중" } }, "ja": { "stringUnit": { "state": "translated", - "value": "待機" + "value": "回答を待っています" } } } }, - "update.updateWhenFinished": { + "update.agentActivity.working": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Update When These Finish" + "value": "Working" } }, "de": { "stringUnit": { "state": "translated", - "value": "Aktualisieren, wenn diese fertig sind" + "value": "Arbeitet" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Mettre à jour quand ils auront terminé" + "value": "En cours" } }, "ar": { "stringUnit": { "state": "translated", - "value": "التحديث عند انتهاء هذه العناصر" + "value": "قيد العمل" } }, "es": { "stringUnit": { "state": "translated", - "value": "Actualizar cuando terminen" + "value": "Trabajando" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "在這些完成後更新" + "value": "處理中" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "在这些完成后更新" + "value": "处理中" } }, "ko": { "stringUnit": { "state": "translated", - "value": "완료되면 업데이트" + "value": "작업 중" } }, "ja": { "stringUnit": { "state": "translated", - "value": "終了後にアップデート" + "value": "作業中" } } } }, - "update.updateAnyway": { + "update.agentActivity.idle": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Update Anyway" + "value": "Idle" } }, "de": { "stringUnit": { "state": "translated", - "value": "Trotzdem aktualisieren" + "value": "Inaktiv" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Mettre à jour quand même" + "value": "Inactif" } }, "ar": { "stringUnit": { "state": "translated", - "value": "التحديث على أي حال" + "value": "خامل" } }, "es": { "stringUnit": { "state": "translated", - "value": "Actualizar de todos modos" + "value": "Inactivo" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "仍要更新" + "value": "閒置" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "仍要更新" + "value": "空闲" } }, "ko": { "stringUnit": { "state": "translated", - "value": "그래도 업데이트" + "value": "유휴" } }, "ja": { "stringUnit": { "state": "translated", - "value": "それでもアップデート" + "value": "アイドル" } } } }, - "update.agentActivity.remote": { + "cloudMenu.machine.freeAccess": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Keeps running on the remote host" + "value": "Free access" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "وصول مجاني" } }, "de": { "stringUnit": { "state": "translated", - "value": "Läuft auf dem Remote-Host weiter" + "value": "Kostenloser Zugang" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Acceso gratuito" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Continue de s’exécuter sur l’hôte distant" + "value": "Accès gratuit" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料アクセス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료 이용" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "免费访问" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "免費存取" + } + } + } + }, + "cloudMenu.machine.locked": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Locked" } }, "ar": { "stringUnit": { "state": "translated", - "value": "يستمر في العمل على المضيف البعيد" + "value": "مقفلة" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gesperrt" } }, "es": { "stringUnit": { "state": "translated", - "value": "Sigue ejecutándose en el host remoto" + "value": "Bloqueada" } }, - "zh-Hant": { + "fr": { "stringUnit": { "state": "translated", - "value": "在遠端主機上持續執行" + "value": "Verrouillée" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "在远程主机上继续运行" + "value": "ロック中" } }, "ko": { "stringUnit": { "state": "translated", - "value": "원격 호스트에서 계속 실행됨" + "value": "잠김" } }, - "ja": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "リモートホストで実行を継続" + "value": "已锁定" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "已鎖定" } } } }, - "update.agentActivity.needsInput": { + "cloudMenu.dashboard": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Waiting for your answer" + "value": "Open Cloud Dashboard" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Wartet auf deine Antwort" + "value": "فتح لوحة تحكم السحابة" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "En attente de votre réponse" + "value": "Cloud-Dashboard öffnen" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "في انتظار إجابتك" + "value": "Abrir el panel de Cloud" } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "Esperando tu respuesta" + "value": "Ouvrir le tableau de bord Cloud" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "正在等待你的回答" + "value": "クラウドダッシュボードを開く" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "正在等待你的回答" + "value": "클라우드 대시보드 열기" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "답변을 기다리는 중" + "value": "打开云端控制面板" } }, - "ja": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "回答を待っています" + "value": "打開雲端控制面板" } } } }, - "update.agentActivity.working": { + "cloudMenu.diagnostics": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Working" + "value": "Cloud Diagnostics" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Arbeitet" + "value": "تشخيصات السحابة" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "En cours" + "value": "Cloud-Diagnose" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "قيد العمل" + "value": "Diagnóstico de Cloud" } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "Trabajando" + "value": "Diagnostics Cloud" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "處理中" + "value": "クラウド診断" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "处理中" + "value": "클라우드 진단" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "작업 중" + "value": "云端诊断" } }, - "ja": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "作業中" + "value": "雲端診斷" } } } }, - "update.agentActivity.idle": { + "cloudMenu.machines.empty": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Idle" + "value": "No machines yet" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "Inaktiv" + "value": "لا توجد أجهزة بعد" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Inactif" + "value": "Noch keine Maschinen" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "خامل" + "value": "Aún no hay máquinas" } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "Inactivo" + "value": "Aucune machine pour le moment" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "閒置" + "value": "マシンはまだありません" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "空闲" + "value": "아직 머신이 없습니다" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "유휴" + "value": "还没有机器" } }, - "ja": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "アイドル" + "value": "尚無機器" } } } }, - "devices.incoming.confirm.enable": { + "cloudMenu.machines.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Make Discoverable" + "value": "Cloud Machines" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جعل الجهاز قابلاً للاكتشاف" + "value": "أجهزة السحابة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Auffindbar machen" + "value": "Cloud-Maschinen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Hacer detectable" + "value": "Máquinas de Cloud" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Rendre détectable" + "value": "Machines Cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "検出可能にする" + "value": "クラウドマシン" } }, "ko": { "stringUnit": { "state": "translated", - "value": "검색 허용" + "value": "클라우드 머신" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "允许发现" + "value": "云端机器" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "允許探索" - } - }, - "bs": { - "stringUnit": { - "state": "translated", - "value": "Učini dostupnim" - } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Gør synlig" + "value": "雲端機器" } - }, - "it": { + } + } + }, + "cloudMenu.more": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Rendi individuabile" + "value": "More Cloud" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "ធ្វើឲ្យអាចរកឃើញ" + "value": "المزيد من السحابة" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Gjør denne Mac-en synlig" + "value": "Mehr Cloud" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Włącz wykrywanie" + "value": "Más de Cloud" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Tornar detectável" + "value": "Plus de Cloud" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Сделать доступным для обнаружения" + "value": "その他のクラウド" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ทำให้ Mac เครื่องนี้ค้นพบได้" + "value": "클라우드 더 보기" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Keşfedilebilir yap" + "value": "更多云端项目" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Зробити цей Mac видимим" + "value": "更多雲端項目" } } } }, - "devices.incoming.confirm.message": { + "cloudMenu.problem.requiresPro": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Other Macs signed in to your cmux account may discover this Mac and connect to its workspaces. Do you want to continue?" + "value": "Cloud machines need cmux Pro" } }, "ar": { "stringUnit": { "state": "translated", - "value": "قد تكتشف أجهزة Mac الأخرى التي سجّلت الدخول إلى حساب cmux هذا الـ Mac وتتصل بمساحات العمل فيه. هل تريد المتابعة؟" + "value": "تتطلب أجهزة السحابة cmux Pro" } }, "de": { "stringUnit": { "state": "translated", - "value": "Andere Macs, die bei deinem cmux-Konto angemeldet sind, können diesen Mac finden und sich mit seinen Arbeitsbereichen verbinden. Möchtest du fortfahren?" + "value": "Cloud-Maschinen erfordern cmux Pro" } }, "es": { "stringUnit": { "state": "translated", - "value": "Otros Mac que hayan iniciado sesión en tu cuenta de cmux podrán descubrir este Mac y conectarse a sus espacios de trabajo. ¿Quieres continuar?" + "value": "Las máquinas de Cloud requieren cmux Pro" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les autres Mac connectés à votre compte cmux pourront détecter ce Mac et se connecter à ses espaces de travail. Voulez-vous continuer ?" + "value": "Les machines Cloud nécessitent cmux Pro" } }, "ja": { "stringUnit": { "state": "translated", - "value": "cmuxアカウントにサインインしているほかのMacから、このMacが検出され、ワークスペースに接続されることがあります。続けますか?" + "value": "クラウドマシンには cmux Pro が必要です" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux 계정에 로그인한 다른 Mac에서 이 Mac을 검색하고 작업 공간에 연결할 수 있습니다. 계속하시겠습니까?" + "value": "클라우드 머신에는 cmux Pro가 필요합니다" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "登录你 cmux 帐户的其他 Mac 可能会发现此 Mac 并连接到其工作区。要继续吗?" + "value": "云端机器需要 cmux Pro" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "登入您 cmux 帳戶的其他 Mac 可能會探索此 Mac 並連線至其工作區。要繼續嗎?" - } - }, - "bs": { - "stringUnit": { - "state": "translated", - "value": "Drugi Mac računari prijavljeni na vaš cmux nalog možda će otkriti ovaj Mac i povezati se s njegovim radnim prostorima. Želite li nastaviti?" - } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Andre Mac-computere, der er logget ind på din cmux-konto, kan muligvis finde denne Mac og oprette forbindelse til dens arbejdsområder. Vil du fortsætte?" + "value": "雲端機器需要 cmux Pro" } - }, - "it": { + } + } + }, + "cloudMenu.problem.session": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Gli altri Mac che hanno effettuato l’accesso al tuo account cmux potrebbero rilevare questo Mac e connettersi ai suoi spazi di lavoro. Vuoi continuare?" + "value": "Your Cloud session expired" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "Mac ផ្សេងទៀតដែលបានចូលគណនី cmux របស់អ្នក អាចរកឃើញ Mac នេះ និងភ្ជាប់ទៅកាន់ workspace របស់វា។ តើអ្នកចង់បន្តឬទេ?" + "value": "انتهت صلاحية جلسة السحابة" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Andre Mac-maskiner som er logget på cmux-kontoen din, kan finne denne Mac-en og koble til arbeidsområdene. Vil du fortsette?" + "value": "Deine Cloud-Sitzung ist abgelaufen" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Inne Maki zalogowane na Twoje konto cmux mogą wykryć tego Maca i połączyć się z jego obszarami roboczymi. Czy chcesz kontynuować?" + "value": "Tu sesión de Cloud ha caducado" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Outros Macs conectados à sua conta cmux poderão descobrir este Mac e se conectar aos seus espaços de trabalho. Deseja continuar?" + "value": "Votre session Cloud a expiré" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Другие Mac, вошедшие в вашу учётную запись cmux, могут обнаружить этот Mac и подключиться к его рабочим пространствам. Продолжить?" + "value": "クラウドのセッションが期限切れです" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "Mac เครื่องอื่นที่ลงชื่อเข้าใช้บัญชี cmux ของคุณอาจค้นพบ Mac เครื่องนี้และเชื่อมต่อกับพื้นที่ทำงานของเครื่องนี้ คุณต้องการดำเนินการต่อหรือไม่" + "value": "클라우드 세션이 만료되었습니다" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "cmux hesabınızda oturum açmış diğer Mac’ler bu Mac’i keşfedebilir ve çalışma alanlarına bağlanabilir. Devam etmek istiyor musunuz?" + "value": "你的云端会话已过期" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Інші Mac, на яких виконано вхід у ваш обліковий запис cmux, можуть виявити цей Mac і підключитися до його робочих просторів. Продовжити?" + "value": "你的雲端工作階段已過期" } } } }, - "devices.incoming.confirm.title": { + "cloudMenu.problem.unreachable": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Make this Mac discoverable?" + "value": "Could not reach cmux Cloud" } }, "ar": { "stringUnit": { "state": "translated", - "value": "هل تريد جعل جهاز Mac هذا قابلاً للاكتشاف؟" + "value": "تعذر الوصول إلى cmux Cloud" } }, "de": { "stringUnit": { "state": "translated", - "value": "Diesen Mac auffindbar machen?" + "value": "cmux Cloud ist nicht erreichbar" } }, "es": { "stringUnit": { "state": "translated", - "value": "¿Hacer que este Mac sea detectable?" + "value": "No se pudo conectar con cmux Cloud" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Rendre ce Mac détectable ?" + "value": "Impossible de joindre cmux Cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "このMacを検出可能にしますか?" + "value": "cmux Cloud に接続できません" } }, "ko": { "stringUnit": { "state": "translated", - "value": "이 Mac을 검색 가능하게 할까요?" + "value": "cmux Cloud에 연결할 수 없습니다" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "允许发现此 Mac 吗?" + "value": "无法连接 cmux Cloud" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "要允許探索此 Mac 嗎?" - } - }, - "bs": { - "stringUnit": { - "state": "translated", - "value": "Učiniti ovaj Mac dostupnim?" - } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Gør denne Mac synlig?" + "value": "無法連線到 cmux Cloud" } - }, - "it": { + } + } + }, + "cloudMenu.retry": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Rendere individuabile questo Mac?" + "value": "Try Again" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "ធ្វើឲ្យ Mac នេះអាចរកឃើញ?" + "value": "إعادة المحاولة" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Gjøre denne Mac-en synlig?" + "value": "Erneut versuchen" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Uwidocznić tego Maca?" + "value": "Reintentar" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Tornar este Mac detectável?" + "value": "Réessayer" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Сделать этот Mac доступным для обнаружения?" + "value": "再試行" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "ทำให้ Mac เครื่องนี้ค้นพบได้หรือไม่" + "value": "다시 시도" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Bu Mac keşfedilebilir yapılsın mı?" + "value": "重试" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Зробити цей Mac доступним для виявлення?" + "value": "再試一次" } } } }, - "cloudTree.device.status.connecting": { + "cloudMenu.showMachines": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Connecting…" + "value": "Show Machines Sidebar" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جارٍ الاتصال…" + "value": "إظهار الشريط الجانبي للأجهزة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Wird verbunden…" + "value": "Maschinen-Seitenleiste anzeigen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Conectando…" + "value": "Mostrar la barra lateral de máquinas" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Connexion…" + "value": "Afficher la barre latérale des machines" } }, "ja": { "stringUnit": { "state": "translated", - "value": "接続中…" + "value": "マシンのサイドバーを表示" } }, "ko": { "stringUnit": { "state": "translated", - "value": "연결 중…" + "value": "머신 사이드바 보기" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "正在连接…" + "value": "显示机器侧边栏" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "正在連線…" + "value": "顯示機器側邊欄" } } } }, - "cloud.teamPicker.createSheet.create": { + "cloudMenu.signOut": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Create" + "value": "Sign Out" } }, "ar": { "stringUnit": { "state": "translated", - "value": "إنشاء" + "value": "تسجيل الخروج" } }, "de": { "stringUnit": { "state": "translated", - "value": "Erstellen" + "value": "Abmelden" } }, "es": { "stringUnit": { "state": "translated", - "value": "Crear" + "value": "Cerrar sesión" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Créer" + "value": "Se déconnecter" } }, "ja": { "stringUnit": { "state": "translated", - "value": "作成" + "value": "サインアウト" } }, "ko": { "stringUnit": { "state": "translated", - "value": "만들기" + "value": "로그아웃" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "创建" + "value": "退出登录" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "建立" + "value": "登出" } } } }, - "cloud.teamPicker.createSheet.title": { + "cloudMenu.signedIn": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Create Team" + "value": "Signed In" } }, "ar": { "stringUnit": { "state": "translated", - "value": "إنشاء فريق" + "value": "تم تسجيل الدخول" } }, "de": { "stringUnit": { "state": "translated", - "value": "Team erstellen" + "value": "Angemeldet" } }, "es": { "stringUnit": { "state": "translated", - "value": "Crear equipo" + "value": "Sesión iniciada" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Créer une équipe" + "value": "Connecté" } }, "ja": { "stringUnit": { "state": "translated", - "value": "チームを作成" + "value": "サインイン済み" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팀 만들기" + "value": "로그인됨" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "创建团队" + "value": "已登录" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "建立團隊" + "value": "已登入" } } } }, - "cloud.teamPicker.createTeam": { + "cloudMenu.team": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Create Team…" + "value": "Team" } }, "ar": { "stringUnit": { "state": "translated", - "value": "إنشاء فريق…" + "value": "الفريق" } }, "de": { "stringUnit": { "state": "translated", - "value": "Team erstellen…" + "value": "Team" } }, "es": { "stringUnit": { "state": "translated", - "value": "Crear equipo…" + "value": "Equipo" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Créer une équipe…" + "value": "Équipe" } }, "ja": { "stringUnit": { "state": "translated", - "value": "チームを作成…" + "value": "チーム" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팀 만들기…" + "value": "팀" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "创建团队…" + "value": "团队" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "建立團隊…" + "value": "團隊" } } } }, - "cloud.teamPicker.switching": { + "cloudMenu.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Switching teams…" + "value": "Cloud" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جارٍ تبديل الفريق…" + "value": "السحابة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Team wird gewechselt…" + "value": "Cloud" } }, "es": { "stringUnit": { "state": "translated", - "value": "Cambiando de equipo…" + "value": "Cloud" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Changement d’équipe…" + "value": "Cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "チームを切り替え中…" + "value": "クラウド" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팀 전환 중…" + "value": "클라우드" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "正在切换团队…" + "value": "云端" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "正在切換團隊…" + "value": "雲端" } } } }, - "cloud.teamPicker.creating": { + "cloudMenu.tone.attention": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Creating team…" + "value": "Needs attention" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جارٍ إنشاء الفريق…" + "value": "يحتاج إلى انتباه" } }, "de": { "stringUnit": { "state": "translated", - "value": "Team wird erstellt…" + "value": "Erfordert Aufmerksamkeit" } }, "es": { "stringUnit": { "state": "translated", - "value": "Creando equipo…" + "value": "Requiere atención" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Création de l’équipe…" + "value": "Nécessite une attention" } }, "ja": { "stringUnit": { "state": "translated", - "value": "チームを作成中…" + "value": "対応が必要" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팀 만드는 중…" + "value": "확인 필요" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "正在创建团队…" + "value": "需要处理" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "正在建立團隊…" + "value": "需要處理" } } } }, - "socket.authTeam.busy": { + "menu.cloud.title": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Another team change is in progress. Try again when it finishes." + "value": "Cloud" } }, "ar": { "stringUnit": { "state": "translated", - "value": "هناك تغيير آخر في الفريق قيد التنفيذ. حاول مرة أخرى عند انتهائه." + "value": "السحابة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Eine andere Teamänderung läuft noch. Versuche es erneut, wenn sie abgeschlossen ist." + "value": "Cloud" } }, "es": { "stringUnit": { "state": "translated", - "value": "Hay otro cambio de equipo en curso. Inténtalo de nuevo cuando termine." + "value": "Cloud" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Une autre modification d’équipe est en cours. Réessayez une fois terminée." + "value": "Cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "別のチーム変更を処理中です。完了してからもう一度お試しください。" + "value": "クラウド" } }, "ko": { "stringUnit": { "state": "translated", - "value": "다른 팀 변경이 진행 중입니다. 완료된 후 다시 시도하세요." + "value": "클라우드" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "另一项团队更改正在进行中,请在完成后重试。" + "value": "云端" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "另一項團隊變更正在進行中,請在完成後再試一次。" + "value": "雲端" } } } }, - "cloud.teamPicker.createSheet.message": { + "cloudMenu.machines.loading": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "The new team becomes your active team." + "value": "Cloud Machines · Loading…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "يصبح الفريق الجديد فريقك النشط." + "value": "أجهزة السحابة · جارٍ التحميل…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Das neue Team wird Ihr aktives Team." + "value": "Cloud-Maschinen · Wird geladen…" } }, "es": { "stringUnit": { "state": "translated", - "value": "El nuevo equipo pasa a ser su equipo activo." + "value": "Máquinas de Cloud · Cargando…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "La nouvelle équipe devient votre équipe active." + "value": "Machines Cloud · Chargement…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "新しいチームがアクティブなチームになります。" + "value": "クラウドマシン · 読み込み中…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "새 팀이 활성 팀이 됩니다." + "value": "클라우드 머신 · 불러오는 중…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "新团队将成为你的当前团队。" + "value": "云端机器 · 正在加载…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "新團隊會成為你使用中的團隊。" + "value": "雲端機器 · 正在載入…" } } } }, - "settings.search.alias.section.themes": { + "cloudMenu.machines.showAll": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent" + "value": "Show All Machines…" } }, - "de": { + "ar": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent design designs farbschema farben palette hell dunkel akzent" + "value": "عرض كل الأجهزة…" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent thème thèmes couleurs palette clair sombre accent" + "value": "Alle Maschinen anzeigen…" } }, - "ar": { + "es": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent سمة سمات ألوان لوحة فاتح داكن تمييز" + "value": "Mostrar todas las máquinas…" } }, - "es": { + "fr": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent tema temas colores paleta claro oscuro acento" + "value": "Afficher toutes les machines…" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent 主題 配色 顏色 調色盤 淺色 深色 強調色" + "value": "すべてのマシンを表示…" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent 主题 配色 颜色 调色板 浅色 深色 强调色" + "value": "모든 머신 보기…" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent 테마 색상 팔레트 라이트 다크 강조색" + "value": "显示所有机器…" } }, - "ja": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "theme themes color scheme colors palette ghostty light dark mode accent テーマ 配色 カラー パレット ライト ダーク アクセント" + "value": "顯示所有機器…" } } } }, - "settings.section.themes": { + "cloudMenu.newMachine": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Themes" + "value": "New Cloud Machine…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "السمات" + "value": "جهاز سحابي جديد…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Designs" + "value": "Neue Cloud-Maschine…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Temas" + "value": "Nueva máquina de Cloud…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Thèmes" + "value": "Nouvelle machine Cloud…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "テーマ" + "value": "新規クラウドマシン…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "테마" + "value": "새 클라우드 머신…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "主题" + "value": "新建云端机器…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "主題" + "value": "新增雲端機器…" } } } }, - "settings.terminal.theme": { + "cloudMenu.signIn": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Terminal Theme" + "value": "Sign In to cmux Cloud…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "سمة الطرفية" + "value": "تسجيل الدخول إلى cmux Cloud…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Terminal-Design" + "value": "Bei cmux Cloud anmelden…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Tema del terminal" + "value": "Iniciar sesión en cmux Cloud…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Thème du terminal" + "value": "Se connecter à cmux Cloud…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ターミナルテーマ" + "value": "cmux Cloud にサインイン…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "터미널 테마" + "value": "cmux Cloud에 로그인…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "终端主题" + "value": "登录 cmux Cloud…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "終端機主題" + "value": "登入 cmux Cloud…" } } } }, - "cli.restore.error.routedLauncherNotFound": { + "cloudMenu.signInAgain": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "restore: this session was started with '%1$@ claude proxy', but '%1$@' is not on PATH in this shell. Add it to PATH, then retry." + "value": "Sign In Again…" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "restore: このセッションは「%1$@ claude proxy」で起動されましたが、このシェルの PATH に「%1$@」がありません。PATH に追加してから、再試行してください。" + "value": "تسجيل الدخول مجددًا…" } }, - "zh-Hans": { + "de": { "stringUnit": { "state": "translated", - "value": "restore:此会话是通过“%1$@ claude proxy”启动的,但此 shell 的 PATH 中没有“%1$@”。请将其添加到 PATH,然后重试。" + "value": "Erneut anmelden…" } }, - "de": { + "es": { "stringUnit": { "state": "translated", - "value": "restore: Diese Sitzung wurde mit „%1$@ claude proxy“ gestartet, aber „%1$@“ ist in dieser Shell nicht im PATH. Fügen Sie es zum PATH hinzu und versuchen Sie es dann erneut." + "value": "Volver a iniciar sesión…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "restore : cette session a été démarrée avec « %1$@ claude proxy », mais « %1$@ » n'est pas dans le PATH de ce shell. Ajoutez-le au PATH, puis réessayez." + "value": "Se reconnecter…" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "restore: بدأت هذه الجلسة باستخدام '%1$@ claude proxy'، لكن '%1$@' غير موجود في PATH في هذه الصدفة. أضفه إلى PATH، ثم أعد المحاولة." + "value": "もう一度サインイン…" } }, - "es": { + "ko": { "stringUnit": { "state": "translated", - "value": "restore: esta sesión se inició con '%1$@ claude proxy', pero '%1$@' no está en el PATH de este shell. Agréguelo al PATH y vuelva a intentarlo." + "value": "다시 로그인…" } }, - "zh-Hant": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "restore:此工作階段是以「%1$@ claude proxy」啟動的,但此 shell 的 PATH 中沒有「%1$@」。請將其加入 PATH,然後重試。" + "value": "重新登录…" } }, - "ko": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "restore: 이 세션은 '%1$@ claude proxy'로 시작되었지만 이 셸의 PATH에 '%1$@'이(가) 없습니다. PATH에 추가한 후 다시 시도하십시오." + "value": "重新登入…" } } } }, - "settings.terminal.textEditingCommandMovesByWord": { + "cloudMenu.signingIn": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Command Moves by Word" + "value": "Signing In…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "Command ينقل حسب الكلمة" + "value": "جارٍ تسجيل الدخول…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Befehlstaste bewegt wortweise" + "value": "Anmeldung läuft…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Comando mueve por palabra" + "value": "Iniciando sesión…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Commande déplace par mot" + "value": "Connexion…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Command で単語単位に移動" + "value": "サインイン中…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Command로 단어 단위 이동" + "value": "로그인 중…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Command 按词移动" + "value": "正在登录…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Command 依字移動" + "value": "正在登入…" } } } }, - "settings.terminal.textEditingCommandMovesByWord.subtitleOn": { + "cloudMenu.upgrade": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Command arrow and delete keys move and delete by word, like Option. Control Left and Right Arrow move to the start and end of the line." + "value": "Upgrade to Pro…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تنقل مفاتيح الأسهم والحذف مع Command وتحذف حسب الكلمة، مثل Option. وينقل Control مع السهمين الأيسر والأيمن إلى بداية السطر ونهايته." + "value": "الترقية إلى Pro…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Befehlstaste mit Pfeil- und Löschtasten bewegt und löscht wortweise, wie die Wahltaste. Control mit Links- und Rechtspfeil springt an Anfang und Ende der Zeile." + "value": "Auf Pro upgraden…" } }, "es": { "stringUnit": { "state": "translated", - "value": "Las flechas y la tecla Eliminar con Comando mueven y borran por palabra, como Opción. Control con las flechas izquierda y derecha va al inicio y al final de la línea." + "value": "Mejorar a Pro…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les flèches et la touche Supprimer avec Commande déplacent et suppriment par mot, comme Option. Contrôle avec les flèches gauche et droite va au début et à la fin de la ligne." + "value": "Passer à Pro…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Command と矢印キー・削除キーで、Option と同じく単語単位に移動・削除します。Control と左右矢印キーで行頭・行末に移動します。" + "value": "Pro にアップグレード…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Command 화살표 및 삭제 키가 Option처럼 단어 단위로 이동하고 삭제합니다. Control 왼쪽 및 오른쪽 화살표는 줄의 시작과 끝으로 이동합니다." + "value": "Pro로 업그레이드…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Command 加方向键和删除键按词移动和删除,与 Option 相同。Control 加左右方向键移到行首和行尾。" + "value": "升级到 Pro…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Command 加方向鍵與刪除鍵會依字移動與刪除,與 Option 相同。Control 加左右方向鍵會移到行首與行尾。" + "value": "升級至 Pro…" } } } }, - "settings.terminal.textEditingCommandMovesByWord.subtitleOff": { + "shortcut.diffViewerNextHunk.label": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Command arrow and delete keys move and delete by line, as in macOS text fields." + "value": "Diff Viewer: Next Hunk" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "تنقل مفاتيح الأسهم والحذف مع Command وتحذف حسب السطر، كما في حقول النص في macOS." + "value": "差分ビューア: 次のハンク" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Befehlstaste mit Pfeil- und Löschtasten bewegt und löscht zeilenweise, wie in macOS-Textfeldern." + "value": "差异查看器:下一个块" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Las flechas y la tecla Eliminar con Comando mueven y borran por línea, como en los campos de texto de macOS." + "value": "Diff-Viewer: Nächster Hunk" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les flèches et la touche Supprimer avec Commande déplacent et suppriment par ligne, comme dans les champs de texte de macOS." + "value": "Visionneuse de diff : Bloc suivant" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "Command と矢印キー・削除キーで、macOS のテキストフィールドと同じく行単位に移動・削除します。" + "value": "عارض الفروق: المقطع التالي" } }, - "ko": { + "es": { "stringUnit": { "state": "translated", - "value": "Command 화살표 및 삭제 키가 macOS 텍스트 필드처럼 줄 단위로 이동하고 삭제합니다." + "value": "Visor de diff: Siguiente bloque" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Command 加方向键和删除键按行移动和删除,与 macOS 文本框相同。" + "value": "差異檢視器:下一個區塊" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "Command 加方向鍵與刪除鍵會依行移動與刪除,與 macOS 文字欄位相同。" + "value": "비교 뷰어: 다음 헝크" } } } }, - "settings.terminal.textEditingGesturesInFullScreenApps": { + "shortcut.diffViewerPreviousHunk.label": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Text Editing Gestures in Full-Screen Apps" + "value": "Diff Viewer: Previous Hunk" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "إيماءات تحرير النص في التطبيقات بملء الشاشة" + "value": "差分ビューア: 前のハンク" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Textbearbeitungsgesten in Vollbild-Apps" + "value": "差异查看器:上一个块" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Gestos de edición de texto en apps a pantalla completa" + "value": "Diff-Viewer: Vorheriger Hunk" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Gestes d’édition de texte dans les apps plein écran" + "value": "Visionneuse de diff : Bloc précédent" } }, - "ja": { + "ar": { "stringUnit": { "state": "translated", - "value": "フルスクリーンアプリでのテキスト編集ジェスチャー" + "value": "عارض الفروق: المقطع السابق" } }, - "ko": { + "es": { "stringUnit": { "state": "translated", - "value": "전체 화면 앱에서 텍스트 편집 제스처" + "value": "Visor de diff: Bloque anterior" } }, - "zh-Hans": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "全屏应用中的文本编辑手势" + "value": "差異檢視器:上一個區塊" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "全螢幕 App 中的文字編輯手勢" + "value": "비교 뷰어: 이전 헝크" } } } }, - "settings.terminal.textEditingGesturesInFullScreenApps.subtitle": { + "settings.search.alias.section.themes": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Gestures also apply while a full-screen app such as vim, less, or tmux is running, so they keep working at a shell inside tmux, screen, or zellij." + "value": "theme themes color scheme colors palette ghostty light dark mode accent" } }, - "ar": { + "de": { "stringUnit": { "state": "translated", - "value": "تنطبق الإيماءات أيضًا أثناء تشغيل تطبيق بملء الشاشة مثل vim أو less أو tmux، فتظل تعمل في الصدفة داخل tmux أو screen أو zellij." + "value": "theme themes color scheme colors palette ghostty light dark mode accent design designs farbschema farben palette hell dunkel akzent" } }, - "de": { + "fr": { "stringUnit": { "state": "translated", - "value": "Gesten gelten auch, während eine Vollbild-App wie vim, less oder tmux läuft, und funktionieren so weiter an einer Shell in tmux, screen oder zellij." + "value": "theme themes color scheme colors palette ghostty light dark mode accent thème thèmes couleurs palette clair sombre accent" } }, - "es": { + "ar": { "stringUnit": { "state": "translated", - "value": "Los gestos también se aplican mientras se ejecuta una app a pantalla completa como vim, less o tmux, así que siguen funcionando en una shell dentro de tmux, screen o zellij." + "value": "theme themes color scheme colors palette ghostty light dark mode accent سمة سمات ألوان لوحة فاتح داكن تمييز" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "Les gestes s’appliquent aussi lorsqu’une app plein écran comme vim, less ou tmux est en cours d’exécution, et continuent donc de fonctionner dans un shell sous tmux, screen ou zellij." + "value": "theme themes color scheme colors palette ghostty light dark mode accent tema temas colores paleta claro oscuro acento" } }, - "ja": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "vim、less、tmux などのフルスクリーンアプリの実行中もジェスチャーが有効になるため、tmux、screen、zellij 内のシェルでも引き続き使えます。" + "value": "theme themes color scheme colors palette ghostty light dark mode accent 主題 配色 顏色 調色盤 淺色 深色 強調色" } }, - "ko": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "vim, less, tmux 같은 전체 화면 앱이 실행 중일 때도 제스처가 적용되므로 tmux, screen, zellij 안의 셸에서도 계속 작동합니다." + "value": "theme themes color scheme colors palette ghostty light dark mode accent 主题 配色 颜色 调色板 浅色 深色 强调色" } }, - "zh-Hans": { + "ko": { "stringUnit": { "state": "translated", - "value": "在 vim、less 或 tmux 等全屏应用运行时手势也会生效,因此在 tmux、screen 或 zellij 中的 shell 里仍可使用。" + "value": "theme themes color scheme colors palette ghostty light dark mode accent 테마 색상 팔레트 라이트 다크 강조색" } }, - "zh-Hant": { + "ja": { "stringUnit": { "state": "translated", - "value": "在 vim、less 或 tmux 等全螢幕 App 執行時手勢也會生效,因此在 tmux、screen 或 zellij 中的 shell 裡仍可使用。" + "value": "theme themes color scheme colors palette ghostty light dark mode accent テーマ 配色 カラー パレット ライト ダーク アクセント" } } } }, - "cloudTree.action.newCloudMachine": { + "settings.section.themes": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "New Cloud Machine" + "value": "Themes" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جهاز سحابي جديد" + "value": "السمات" } }, "de": { "stringUnit": { "state": "translated", - "value": "Neue Cloud-Maschine" + "value": "Designs" } }, "es": { "stringUnit": { "state": "translated", - "value": "Nueva máquina en la nube" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Nouvelle machine cloud" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "新しいクラウドマシン" + "value": "Temas" } }, - "ko": { + "fr": { "stringUnit": { "state": "translated", - "value": "새 클라우드 머신" + "value": "Thèmes" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "新建云主机" + "value": "テーマ" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "新增雲端機器" + "value": "테마" } }, - "bs": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Nova cloud mašina" + "value": "主题" } }, - "da": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Ny cloud-maskine" + "value": "主題" } - }, - "it": { + } + } + }, + "settings.terminal.theme": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Nuova macchina cloud" + "value": "Terminal Theme" } }, - "km": { + "ar": { "stringUnit": { "state": "translated", - "value": "ម៉ាស៊ីន Cloud ថ្មី" + "value": "سمة الطرفية" } }, - "nb": { + "de": { "stringUnit": { "state": "translated", - "value": "Ny sky-maskin" + "value": "Terminal-Design" } }, - "pl": { + "es": { "stringUnit": { "state": "translated", - "value": "Nowa maszyna w chmurze" + "value": "Tema del terminal" } }, - "pt-BR": { + "fr": { "stringUnit": { "state": "translated", - "value": "Nova máquina na nuvem" + "value": "Thème du terminal" } }, - "ru": { + "ja": { "stringUnit": { "state": "translated", - "value": "Новая облачная машина" + "value": "ターミナルテーマ" } }, - "th": { + "ko": { "stringUnit": { "state": "translated", - "value": "เครื่องคลาวด์ใหม่" + "value": "터미널 테마" } }, - "tr": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Yeni bulut makinesi" + "value": "终端主题" } }, - "uk": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Нова хмарна машина" + "value": "終端機主題" } } } @@ -585576,2011 +585923,2077 @@ } } }, - "cloudMenu.machine.freeAccess": { + "cli.restore.error.routedLauncherNotFound": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Free access" + "value": "restore: this session was started with '%1$@ claude proxy', but '%1$@' is not on PATH in this shell. Add it to PATH, then retry." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "restore: このセッションは「%1$@ claude proxy」で起動されましたが、このシェルの PATH に「%1$@」がありません。PATH に追加してから、再試行してください。" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "restore:此会话是通过“%1$@ claude proxy”启动的,但此 shell 的 PATH 中没有“%1$@”。请将其添加到 PATH,然后重试。" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "restore: Diese Sitzung wurde mit „%1$@ claude proxy“ gestartet, aber „%1$@“ ist in dieser Shell nicht im PATH. Fügen Sie es zum PATH hinzu und versuchen Sie es dann erneut." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "restore : cette session a été démarrée avec « %1$@ claude proxy », mais « %1$@ » n'est pas dans le PATH de ce shell. Ajoutez-le au PATH, puis réessayez." } }, "ar": { "stringUnit": { "state": "translated", - "value": "وصول مجاني" + "value": "restore: بدأت هذه الجلسة باستخدام '%1$@ claude proxy'، لكن '%1$@' غير موجود في PATH في هذه الصدفة. أضفه إلى PATH، ثم أعد المحاولة." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "restore: esta sesión se inició con '%1$@ claude proxy', pero '%1$@' no está en el PATH de este shell. Agréguelo al PATH y vuelva a intentarlo." + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "restore:此工作階段是以「%1$@ claude proxy」啟動的,但此 shell 的 PATH 中沒有「%1$@」。請將其加入 PATH,然後重試。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "restore: 이 세션은 '%1$@ claude proxy'로 시작되었지만 이 셸의 PATH에 '%1$@'이(가) 없습니다. PATH에 추가한 후 다시 시도하십시오." + } + } + } + }, + "settings.terminal.textEditingCommandMovesByWord": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Command Moves by Word" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "Command ينقل حسب الكلمة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Kostenloser Zugang" + "value": "Befehlstaste bewegt wortweise" } }, "es": { "stringUnit": { "state": "translated", - "value": "Acceso gratuito" + "value": "Comando mueve por palabra" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Accès gratuit" + "value": "Commande déplace par mot" } }, "ja": { "stringUnit": { "state": "translated", - "value": "無料アクセス" + "value": "Command で単語単位に移動" } }, "ko": { "stringUnit": { "state": "translated", - "value": "무료 이용" + "value": "Command로 단어 단위 이동" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "免费访问" + "value": "Command 按词移动" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "免費存取" + "value": "Command 依字移動" } } } }, - "cloudMenu.machine.locked": { + "settings.terminal.textEditingCommandMovesByWord.subtitleOn": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Locked" + "value": "Command arrow and delete keys move and delete by word, like Option. Control Left and Right Arrow move to the start and end of the line." } }, "ar": { "stringUnit": { "state": "translated", - "value": "مقفلة" + "value": "تنقل مفاتيح الأسهم والحذف مع Command وتحذف حسب الكلمة، مثل Option. وينقل Control مع السهمين الأيسر والأيمن إلى بداية السطر ونهايته." } }, "de": { "stringUnit": { "state": "translated", - "value": "Gesperrt" + "value": "Befehlstaste mit Pfeil- und Löschtasten bewegt und löscht wortweise, wie die Wahltaste. Control mit Links- und Rechtspfeil springt an Anfang und Ende der Zeile." } }, "es": { "stringUnit": { "state": "translated", - "value": "Bloqueada" + "value": "Las flechas y la tecla Eliminar con Comando mueven y borran por palabra, como Opción. Control con las flechas izquierda y derecha va al inicio y al final de la línea." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Verrouillée" + "value": "Les flèches et la touche Supprimer avec Commande déplacent et suppriment par mot, comme Option. Contrôle avec les flèches gauche et droite va au début et à la fin de la ligne." } }, "ja": { "stringUnit": { "state": "translated", - "value": "ロック中" + "value": "Command と矢印キー・削除キーで、Option と同じく単語単位に移動・削除します。Control と左右矢印キーで行頭・行末に移動します。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "잠김" + "value": "Command 화살표 및 삭제 키가 Option처럼 단어 단위로 이동하고 삭제합니다. Control 왼쪽 및 오른쪽 화살표는 줄의 시작과 끝으로 이동합니다." } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "已锁定" + "value": "Command 加方向键和删除键按词移动和删除,与 Option 相同。Control 加左右方向键移到行首和行尾。" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "已鎖定" + "value": "Command 加方向鍵與刪除鍵會依字移動與刪除,與 Option 相同。Control 加左右方向鍵會移到行首與行尾。" } } } }, - "cloudMenu.dashboard": { + "settings.terminal.textEditingCommandMovesByWord.subtitleOff": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open Cloud Dashboard" + "value": "Command arrow and delete keys move and delete by line, as in macOS text fields." } }, "ar": { "stringUnit": { "state": "translated", - "value": "فتح لوحة تحكم السحابة" + "value": "تنقل مفاتيح الأسهم والحذف مع Command وتحذف حسب السطر، كما في حقول النص في macOS." } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Dashboard öffnen" + "value": "Befehlstaste mit Pfeil- und Löschtasten bewegt und löscht zeilenweise, wie in macOS-Textfeldern." } }, "es": { "stringUnit": { "state": "translated", - "value": "Abrir el panel de Cloud" + "value": "Las flechas y la tecla Eliminar con Comando mueven y borran por línea, como en los campos de texto de macOS." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ouvrir le tableau de bord Cloud" + "value": "Les flèches et la touche Supprimer avec Commande déplacent et suppriment par ligne, comme dans les champs de texte de macOS." } }, "ja": { "stringUnit": { "state": "translated", - "value": "クラウドダッシュボードを開く" + "value": "Command と矢印キー・削除キーで、macOS のテキストフィールドと同じく行単位に移動・削除します。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 대시보드 열기" + "value": "Command 화살표 및 삭제 키가 macOS 텍스트 필드처럼 줄 단위로 이동하고 삭제합니다." } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "打开云端控制面板" + "value": "Command 加方向键和删除键按行移动和删除,与 macOS 文本框相同。" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "打開雲端控制面板" + "value": "Command 加方向鍵與刪除鍵會依行移動與刪除,與 macOS 文字欄位相同。" } } } }, - "cloudMenu.diagnostics": { + "settings.terminal.textEditingGesturesInFullScreenApps": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud Diagnostics" + "value": "Text Editing Gestures in Full-Screen Apps" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تشخيصات السحابة" + "value": "إيماءات تحرير النص في التطبيقات بملء الشاشة" } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Diagnose" + "value": "Textbearbeitungsgesten in Vollbild-Apps" } }, "es": { "stringUnit": { "state": "translated", - "value": "Diagnóstico de Cloud" + "value": "Gestos de edición de texto en apps a pantalla completa" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Diagnostics Cloud" + "value": "Gestes d’édition de texte dans les apps plein écran" } }, "ja": { "stringUnit": { "state": "translated", - "value": "クラウド診断" + "value": "フルスクリーンアプリでのテキスト編集ジェスチャー" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 진단" + "value": "전체 화면 앱에서 텍스트 편집 제스처" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "云端诊断" + "value": "全屏应用中的文本编辑手势" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "雲端診斷" + "value": "全螢幕 App 中的文字編輯手勢" } } } }, - "cloudMenu.machines.empty": { + "settings.terminal.textEditingGesturesInFullScreenApps.subtitle": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "No machines yet" + "value": "Gestures also apply while a full-screen app such as vim, less, or tmux is running, so they keep working at a shell inside tmux, screen, or zellij." } }, "ar": { "stringUnit": { "state": "translated", - "value": "لا توجد أجهزة بعد" + "value": "تنطبق الإيماءات أيضًا أثناء تشغيل تطبيق بملء الشاشة مثل vim أو less أو tmux، فتظل تعمل في الصدفة داخل tmux أو screen أو zellij." } }, "de": { "stringUnit": { "state": "translated", - "value": "Noch keine Maschinen" + "value": "Gesten gelten auch, während eine Vollbild-App wie vim, less oder tmux läuft, und funktionieren so weiter an einer Shell in tmux, screen oder zellij." } }, "es": { "stringUnit": { "state": "translated", - "value": "Aún no hay máquinas" + "value": "Los gestos también se aplican mientras se ejecuta una app a pantalla completa como vim, less o tmux, así que siguen funcionando en una shell dentro de tmux, screen o zellij." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Aucune machine pour le moment" + "value": "Les gestes s’appliquent aussi lorsqu’une app plein écran comme vim, less ou tmux est en cours d’exécution, et continuent donc de fonctionner dans un shell sous tmux, screen ou zellij." } }, "ja": { "stringUnit": { "state": "translated", - "value": "マシンはまだありません" + "value": "vim、less、tmux などのフルスクリーンアプリの実行中もジェスチャーが有効になるため、tmux、screen、zellij 内のシェルでも引き続き使えます。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "아직 머신이 없습니다" + "value": "vim, less, tmux 같은 전체 화면 앱이 실행 중일 때도 제스처가 적용되므로 tmux, screen, zellij 안의 셸에서도 계속 작동합니다." } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "还没有机器" + "value": "在 vim、less 或 tmux 等全屏应用运行时手势也会生效,因此在 tmux、screen 或 zellij 中的 shell 里仍可使用。" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "尚無機器" + "value": "在 vim、less 或 tmux 等全螢幕 App 執行時手勢也會生效,因此在 tmux、screen 或 zellij 中的 shell 裡仍可使用。" } } } }, - "cloudMenu.machines.title": { + "cloudTree.action.newCloudMachine": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud Machines" + "value": "New Cloud Machine" } }, "ar": { "stringUnit": { "state": "translated", - "value": "أجهزة السحابة" + "value": "جهاز سحابي جديد" } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Maschinen" + "value": "Neue Cloud-Maschine" } }, "es": { "stringUnit": { "state": "translated", - "value": "Máquinas de Cloud" + "value": "Nueva máquina en la nube" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Machines Cloud" + "value": "Nouvelle machine cloud" } }, "ja": { "stringUnit": { "state": "translated", - "value": "クラウドマシン" + "value": "新しいクラウドマシン" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 머신" + "value": "새 클라우드 머신" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "云端机器" + "value": "新建云主机" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "雲端機器" + "value": "新增雲端機器" } - } - } - }, - "cloudMenu.more": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Nova cloud mašina" + } + }, + "da": { "stringUnit": { "state": "translated", - "value": "More Cloud" + "value": "Ny cloud-maskine" } }, - "ar": { + "it": { "stringUnit": { "state": "translated", - "value": "المزيد من السحابة" + "value": "Nuova macchina cloud" } }, - "de": { + "km": { "stringUnit": { "state": "translated", - "value": "Mehr Cloud" + "value": "ម៉ាស៊ីន Cloud ថ្មី" } }, - "es": { + "nb": { "stringUnit": { "state": "translated", - "value": "Más de Cloud" + "value": "Ny sky-maskin" } }, - "fr": { + "pl": { "stringUnit": { "state": "translated", - "value": "Plus de Cloud" + "value": "Nowa maszyna w chmurze" } }, - "ja": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "その他のクラウド" + "value": "Nova máquina na nuvem" } }, - "ko": { + "ru": { "stringUnit": { "state": "translated", - "value": "클라우드 더 보기" + "value": "Новая облачная машина" } }, - "zh-Hans": { + "th": { "stringUnit": { "state": "translated", - "value": "更多云端项目" + "value": "เครื่องคลาวด์ใหม่" } }, - "zh-Hant": { + "tr": { "stringUnit": { "state": "translated", - "value": "更多雲端項目" + "value": "Yeni bulut makinesi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Нова хмарна машина" } } } }, - "cloudMenu.problem.requiresPro": { + "terminalContextMenu.copyLink": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud machines need cmux Pro" + "value": "Copy Link" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تتطلب أجهزة السحابة cmux Pro" + "value": "نسخ الرابط" } }, "de": { "stringUnit": { "state": "translated", - "value": "Cloud-Maschinen erfordern cmux Pro" + "value": "Link kopieren" } }, "es": { "stringUnit": { "state": "translated", - "value": "Las máquinas de Cloud requieren cmux Pro" + "value": "Copiar enlace" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Les machines Cloud nécessitent cmux Pro" + "value": "Copier le lien" } }, "ja": { "stringUnit": { "state": "translated", - "value": "クラウドマシンには cmux Pro が必要です" + "value": "リンクをコピー" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 머신에는 cmux Pro가 필요합니다" + "value": "링크 복사" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "云端机器需要 cmux Pro" + "value": "复制链接" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "雲端機器需要 cmux Pro" + "value": "複製連結" } } } }, - "cloudMenu.problem.session": { + "terminalContextMenu.openLinkInCmuxBrowser": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Your Cloud session expired" + "value": "Open Link in cmux Browser" } }, "ar": { "stringUnit": { "state": "translated", - "value": "انتهت صلاحية جلسة السحابة" + "value": "فتح الرابط في متصفح cmux" } }, "de": { "stringUnit": { "state": "translated", - "value": "Deine Cloud-Sitzung ist abgelaufen" + "value": "Link im cmux-Browser öffnen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Tu sesión de Cloud ha caducado" + "value": "Abrir enlace en el navegador de cmux" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Votre session Cloud a expiré" + "value": "Ouvrir le lien dans le navigateur cmux" } }, "ja": { "stringUnit": { "state": "translated", - "value": "クラウドのセッションが期限切れです" + "value": "リンクをcmuxブラウザで開く" } }, "ko": { "stringUnit": { "state": "translated", - "value": "클라우드 세션이 만료되었습니다" + "value": "링크를 cmux 브라우저에서 열기" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "你的云端会话已过期" + "value": "在 cmux 浏览器中打开链接" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "你的雲端工作階段已過期" + "value": "在 cmux 瀏覽器中開啟連結" } } } }, - "cloudMenu.problem.unreachable": { + "terminalContextMenu.openLinkInDefaultBrowser": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Could not reach cmux Cloud" + "value": "Open Link in Default Browser" } }, "ar": { "stringUnit": { "state": "translated", - "value": "تعذر الوصول إلى cmux Cloud" + "value": "فتح الرابط في المتصفح الافتراضي" } }, "de": { "stringUnit": { "state": "translated", - "value": "cmux Cloud ist nicht erreichbar" + "value": "Link im Standardbrowser öffnen" } }, "es": { "stringUnit": { "state": "translated", - "value": "No se pudo conectar con cmux Cloud" + "value": "Abrir enlace en el navegador predeterminado" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Impossible de joindre cmux Cloud" + "value": "Ouvrir le lien dans le navigateur par défaut" } }, "ja": { "stringUnit": { "state": "translated", - "value": "cmux Cloud に接続できません" + "value": "リンクをデフォルトブラウザで開く" } }, "ko": { "stringUnit": { "state": "translated", - "value": "cmux Cloud에 연결할 수 없습니다" + "value": "링크를 기본 브라우저에서 열기" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "无法连接 cmux Cloud" + "value": "在默认浏览器中打开链接" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "無法連線到 cmux Cloud" + "value": "在預設瀏覽器中開啟連結" } } } }, - "cloudMenu.retry": { + "command.copyWorkingDirectory.title": { "extractionState": "manual", "localizations": { - "en": { + "ar": { "stringUnit": { "state": "translated", - "value": "Try Again" + "value": "نسخ دليل العمل" } }, - "ar": { + "bs": { "stringUnit": { "state": "translated", - "value": "إعادة المحاولة" + "value": "Kopiraj radni direktorij" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Kopiér arbejdsmappe" } }, "de": { "stringUnit": { "state": "translated", - "value": "Erneut versuchen" + "value": "Arbeitsverzeichnis kopieren" } }, - "es": { + "en": { "stringUnit": { "state": "translated", - "value": "Reintentar" + "value": "Copy Working Directory" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "Réessayer" + "value": "Copiar directorio de trabajo" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "再試行" + "value": "Copier le répertoire de travail" } }, - "ko": { + "it": { "stringUnit": { "state": "translated", - "value": "다시 시도" + "value": "Copia directory di lavoro" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "重试" + "value": "作業ディレクトリをコピー" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "再試一次" + "value": "작업 디렉터리 복사" } - } - } - }, - "cloudMenu.showMachines": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "nb": { "stringUnit": { "state": "translated", - "value": "Show Machines Sidebar" + "value": "Kopier arbeidsmappe" } }, - "ar": { + "pl": { "stringUnit": { "state": "translated", - "value": "إظهار الشريط الجانبي للأجهزة" + "value": "Kopiuj katalog roboczy" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Maschinen-Seitenleiste anzeigen" + "value": "Copiar Diretório de Trabalho" } }, - "es": { + "ru": { "stringUnit": { "state": "translated", - "value": "Mostrar la barra lateral de máquinas" + "value": "Копировать рабочий каталог" } }, - "fr": { + "th": { "stringUnit": { "state": "translated", - "value": "Afficher la barre latérale des machines" + "value": "คัดลอกไดเรกทอรีทำงาน" } }, - "ja": { + "tr": { "stringUnit": { "state": "translated", - "value": "マシンのサイドバーを表示" + "value": "Çalışma Dizinini Kopyala" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "머신 사이드바 보기" + "value": "Копіювати робочий каталог" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "显示机器侧边栏" + "value": "复制工作目录" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "顯示機器側邊欄" + "value": "複製工作目錄" } } } }, - "cloudMenu.signOut": { + "command.copyProjectRoot.title": { "extractionState": "manual", "localizations": { - "en": { + "ar": { "stringUnit": { "state": "translated", - "value": "Sign Out" + "value": "نسخ جذر المشروع" } }, - "ar": { + "bs": { "stringUnit": { "state": "translated", - "value": "تسجيل الخروج" + "value": "Kopiraj korijen projekta" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Kopiér projektrod" } }, "de": { "stringUnit": { "state": "translated", - "value": "Abmelden" + "value": "Projektstamm kopieren" } }, - "es": { + "en": { "stringUnit": { "state": "translated", - "value": "Cerrar sesión" + "value": "Copy Project Root" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "Se déconnecter" + "value": "Copiar raíz del proyecto" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "サインアウト" + "value": "Copier la racine du projet" } }, - "ko": { + "it": { "stringUnit": { "state": "translated", - "value": "로그아웃" + "value": "Copia radice del progetto" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "退出登录" + "value": "プロジェクトのルートをコピー" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "登出" + "value": "프로젝트 루트 복사" } - } - } - }, - "cloudMenu.signedIn": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "nb": { "stringUnit": { "state": "translated", - "value": "Signed In" + "value": "Kopier prosjektrot" } }, - "ar": { + "pl": { "stringUnit": { "state": "translated", - "value": "تم تسجيل الدخول" + "value": "Kopiuj katalog główny projektu" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Angemeldet" + "value": "Copiar Raiz do Projeto" } }, - "es": { + "ru": { "stringUnit": { "state": "translated", - "value": "Sesión iniciada" + "value": "Копировать корень проекта" } }, - "fr": { + "th": { "stringUnit": { "state": "translated", - "value": "Connecté" + "value": "คัดลอกรากโปรเจกต์" } }, - "ja": { + "tr": { "stringUnit": { "state": "translated", - "value": "サインイン済み" + "value": "Proje Kökünü Kopyala" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "로그인됨" + "value": "Копіювати корінь проєкту" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "已登录" + "value": "复制项目根目录" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "已登入" + "value": "複製專案根目錄" } } } }, - "cloudMenu.team": { + "command.copyScreen.title": { "extractionState": "manual", "localizations": { - "en": { + "ar": { "stringUnit": { "state": "translated", - "value": "Team" + "value": "نسخ الشاشة المرئية" } }, - "ar": { + "bs": { "stringUnit": { "state": "translated", - "value": "الفريق" + "value": "Kopiraj vidljivi ekran" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Kopiér synlig skærm" } }, "de": { "stringUnit": { "state": "translated", - "value": "Team" + "value": "Sichtbaren Bildschirm kopieren" } }, - "es": { + "en": { "stringUnit": { "state": "translated", - "value": "Equipo" + "value": "Copy Visible Screen" } }, - "fr": { + "es": { "stringUnit": { "state": "translated", - "value": "Équipe" + "value": "Copiar pantalla visible" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "チーム" + "value": "Copier l'écran visible" } }, - "ko": { + "it": { "stringUnit": { "state": "translated", - "value": "팀" + "value": "Copia schermo visibile" } }, - "zh-Hans": { + "ja": { "stringUnit": { "state": "translated", - "value": "团队" + "value": "表示中の画面をコピー" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "團隊" + "value": "보이는 화면 복사" } - } - } - }, - "cloudMenu.title": { - "extractionState": "manual", - "localizations": { - "en": { + }, + "nb": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "Kopier synlig skjerm" } }, - "ar": { + "pl": { "stringUnit": { "state": "translated", - "value": "السحابة" + "value": "Kopiuj widoczny ekran" } }, - "de": { + "pt-BR": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "Copiar Tela Visível" } }, - "es": { + "ru": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "Копировать видимый экран" } }, - "fr": { + "th": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "คัดลอกหน้าจอที่มองเห็น" } }, - "ja": { + "tr": { "stringUnit": { "state": "translated", - "value": "クラウド" + "value": "Görünür Ekranı Kopyala" } }, - "ko": { + "uk": { "stringUnit": { "state": "translated", - "value": "클라우드" + "value": "Копіювати видимий екран" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "云端" + "value": "复制可见屏幕" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "雲端" + "value": "複製可見畫面" } } } }, - "cloudMenu.tone.attention": { + "shortcut.diffViewerToggleViewed.label": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Needs attention" + "value": "Diff Viewer: Toggle Viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "يحتاج إلى انتباه" + "value": "差分ビューア: 確認済みを切り替え" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Erfordert Aufmerksamkeit" + "value": "差异查看器:切换已查看" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Requiere atención" + "value": "差異檢視器:切換已檢視" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Nécessite une attention" + "value": "Diff-Viewer: Angesehen umschalten" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "対応が必要" + "value": "Visionneuse de diff : Basculer « vu »" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "확인 필요" + "value": "عارض الفروق: تبديل حالة المشاهدة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "需要处理" + "value": "Visor de diff: Alternar visto" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "需要處理" + "value": "차이 뷰어: 확인함 전환" } } } }, - "menu.cloud.title": { + "diffViewer.viewed": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "Viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "السحابة" + "value": "確認済み" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "已查看" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "已檢視" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Cloud" + "value": "Angesehen" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "クラウド" + "value": "Vu" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "클라우드" + "value": "تمت المشاهدة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "云端" + "value": "Visto" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "雲端" + "value": "확인함" } } } }, - "cloudMenu.machines.loading": { + "diffViewer.markViewed": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Cloud Machines · Loading…" + "value": "Mark as viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "أجهزة السحابة · جارٍ التحميل…" + "value": "確認済みにする" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Cloud-Maschinen · Wird geladen…" + "value": "标记为已查看" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Máquinas de Cloud · Cargando…" + "value": "標記為已檢視" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Machines Cloud · Chargement…" + "value": "Als angesehen markieren" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "クラウドマシン · 読み込み中…" + "value": "Marquer comme vu" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "클라우드 머신 · 불러오는 중…" + "value": "وضع علامة تمت المشاهدة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "云端机器 · 正在加载…" + "value": "Marcar como visto" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "雲端機器 · 正在載入…" + "value": "확인함으로 표시" } } } }, - "cloudMenu.machines.showAll": { + "diffViewer.markNotViewed": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Show All Machines…" + "value": "Mark as not viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "عرض كل الأجهزة…" + "value": "未確認にする" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Alle Maschinen anzeigen…" + "value": "标记为未查看" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Mostrar todas las máquinas…" + "value": "標記為未檢視" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Afficher toutes les machines…" + "value": "Als nicht angesehen markieren" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "すべてのマシンを表示…" + "value": "Marquer comme non vu" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "모든 머신 보기…" + "value": "إزالة علامة تمت المشاهدة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "显示所有机器…" + "value": "Marcar como no visto" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "顯示所有機器…" + "value": "확인 안 함으로 표시" } } } }, - "cloudMenu.newMachine": { + "diffViewer.changedSinceViewed": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "New Cloud Machine…" + "value": "Changed since viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "جهاز سحابي جديد…" + "value": "確認後に変更あり" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Neue Cloud-Maschine…" + "value": "查看后已更改" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Nueva máquina de Cloud…" + "value": "檢視後已變更" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Nouvelle machine Cloud…" + "value": "Seit dem Ansehen geändert" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "新規クラウドマシン…" + "value": "Modifié depuis la consultation" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "새 클라우드 머신…" + "value": "تغيّر منذ المشاهدة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "新建云端机器…" + "value": "Cambiado desde que se vio" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "新增雲端機器…" + "value": "확인 후 변경됨" } } } }, - "cloudMenu.signIn": { + "diffViewer.filesViewedProgress": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Sign In to cmux Cloud…" + "value": "{viewed} of {total} files viewed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "تسجيل الدخول إلى cmux Cloud…" + "value": "{total} 件中 {viewed} 件のファイルを確認済み" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Bei cmux Cloud anmelden…" + "value": "已查看 {viewed}/{total} 个文件" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Iniciar sesión en cmux Cloud…" + "value": "已檢視 {viewed}/{total} 個檔案" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Se connecter à cmux Cloud…" + "value": "{viewed} von {total} Dateien angesehen" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "cmux Cloud にサインイン…" + "value": "{viewed} fichiers sur {total} vus" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "cmux Cloud에 로그인…" + "value": "تمت مشاهدة {viewed} من {total} ملفات" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "登录 cmux Cloud…" + "value": "{viewed} de {total} archivos vistos" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "登入 cmux Cloud…" + "value": "{total}개 중 {viewed}개 파일 확인함" } } } }, - "cloudMenu.signInAgain": { + "diffViewer.filterFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Sign In Again…" + "value": "Filter files" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "تسجيل الدخول مجددًا…" + "value": "ファイルを絞り込む" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Erneut anmelden…" + "value": "筛选文件" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Volver a iniciar sesión…" + "value": "篩選檔案" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Se reconnecter…" + "value": "Dateien filtern" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "もう一度サインイン…" + "value": "Filtrer les fichiers" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "다시 로그인…" + "value": "تصفية الملفات" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "重新登录…" + "value": "Filtrar archivos" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "重新登入…" + "value": "파일 필터" } } } }, - "cloudMenu.signingIn": { + "diffViewer.filterAddedFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Signing In…" + "value": "Added" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "جارٍ تسجيل الدخول…" + "value": "追加" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Anmeldung läuft…" + "value": "新增" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Iniciando sesión…" + "value": "新增" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Connexion…" + "value": "Hinzugefügt" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "サインイン中…" + "value": "Ajoutés" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "로그인 중…" + "value": "مضافة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "正在登录…" + "value": "Añadidos" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "正在登入…" + "value": "추가됨" } } } }, - "cloudMenu.upgrade": { + "diffViewer.filterModifiedFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Upgrade to Pro…" + "value": "Modified" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "الترقية إلى Pro…" + "value": "変更" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Auf Pro upgraden…" + "value": "已修改" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Mejorar a Pro…" + "value": "已修改" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Passer à Pro…" + "value": "Geändert" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "Pro にアップグレード…" + "value": "Modifiés" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "Pro로 업그레이드…" + "value": "معدّلة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "升级到 Pro…" + "value": "Modificados" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "升級至 Pro…" + "value": "수정됨" } } } }, - "terminalContextMenu.copyLink": { + "diffViewer.filterDeletedFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Copy Link" + "value": "Deleted" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "نسخ الرابط" + "value": "削除" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Link kopieren" + "value": "已删除" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Copiar enlace" + "value": "已刪除" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Copier le lien" + "value": "Gelöscht" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "リンクをコピー" + "value": "Supprimés" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "링크 복사" + "value": "محذوفة" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "复制链接" + "value": "Eliminados" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "複製連結" + "value": "삭제됨" } } } }, - "terminalContextMenu.openLinkInCmuxBrowser": { + "diffViewer.filterRenamedFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open Link in cmux Browser" + "value": "Renamed" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "فتح الرابط في متصفح cmux" + "value": "名前変更" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Link im cmux-Browser öffnen" + "value": "已重命名" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Abrir enlace en el navegador de cmux" + "value": "已重新命名" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Ouvrir le lien dans le navigateur cmux" + "value": "Umbenannt" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "リンクをcmuxブラウザで開く" + "value": "Renommés" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "링크를 cmux 브라우저에서 열기" + "value": "معاد تسميتها" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "在 cmux 浏览器中打开链接" + "value": "Renombrados" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "在 cmux 瀏覽器中開啟連結" + "value": "이름 변경됨" } } } }, - "terminalContextMenu.openLinkInDefaultBrowser": { + "diffViewer.hideViewedFiles": { "extractionState": "manual", "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "Open Link in Default Browser" + "value": "Hide viewed files" } }, - "ar": { + "ja": { "stringUnit": { "state": "translated", - "value": "فتح الرابط في المتصفح الافتراضي" + "value": "確認済みのファイルを隠す" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Link im Standardbrowser öffnen" + "value": "隐藏已查看的文件" } }, - "es": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Abrir enlace en el navegador predeterminado" + "value": "隱藏已檢視的檔案" } }, - "fr": { + "de": { "stringUnit": { "state": "translated", - "value": "Ouvrir le lien dans le navigateur par défaut" + "value": "Angesehene Dateien ausblenden" } }, - "ja": { + "fr": { "stringUnit": { "state": "translated", - "value": "リンクをデフォルトブラウザで開く" + "value": "Masquer les fichiers vus" } }, - "ko": { + "ar": { "stringUnit": { "state": "translated", - "value": "링크를 기본 브라우저에서 열기" + "value": "إخفاء الملفات التي تمت مشاهدتها" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "在默认浏览器中打开链接" + "value": "Ocultar archivos vistos" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "在預設瀏覽器中開啟連結" + "value": "확인한 파일 숨기기" } } } }, - "command.copyWorkingDirectory.title": { + "diffViewer.showViewedFiles": { "extractionState": "manual", "localizations": { - "ar": { - "stringUnit": { - "state": "translated", - "value": "نسخ دليل العمل" - } - }, - "bs": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopiraj radni direktorij" + "value": "Show viewed files" } }, - "da": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiér arbejdsmappe" + "value": "確認済みのファイルを表示" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Arbeitsverzeichnis kopieren" + "value": "显示已查看的文件" } }, - "en": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Copy Working Directory" + "value": "顯示已檢視的檔案" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Copiar directorio de trabajo" + "value": "Angesehene Dateien anzeigen" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Copier le répertoire de travail" + "value": "Afficher les fichiers vus" } }, - "it": { + "ar": { "stringUnit": { "state": "translated", - "value": "Copia directory di lavoro" + "value": "إظهار الملفات التي تمت مشاهدتها" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "作業ディレクトリをコピー" + "value": "Mostrar archivos vistos" } }, "ko": { "stringUnit": { "state": "translated", - "value": "작업 디렉터리 복사" + "value": "확인한 파일 표시" } - }, - "nb": { + } + } + }, + "diffViewer.noFilesMatchFilter": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopier arbeidsmappe" + "value": "No files match the filter." } }, - "pl": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiuj katalog roboczy" + "value": "絞り込み条件に一致するファイルはありません。" } }, - "pt-BR": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Copiar Diretório de Trabalho" + "value": "没有符合筛选条件的文件。" } }, - "ru": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Копировать рабочий каталог" + "value": "沒有符合篩選條件的檔案。" } }, - "th": { + "de": { "stringUnit": { "state": "translated", - "value": "คัดลอกไดเรกทอรีทำงาน" + "value": "Keine Dateien entsprechen dem Filter." } }, - "tr": { + "fr": { "stringUnit": { "state": "translated", - "value": "Çalışma Dizinini Kopyala" + "value": "Aucun fichier ne correspond au filtre." } }, - "uk": { + "ar": { "stringUnit": { "state": "translated", - "value": "Копіювати робочий каталог" + "value": "لا توجد ملفات مطابقة للتصفية." } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "复制工作目录" + "value": "Ningún archivo coincide con el filtro." } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "複製工作目錄" + "value": "필터와 일치하는 파일이 없습니다." } } } }, - "command.copyProjectRoot.title": { + "diffViewer.generatedFile": { "extractionState": "manual", "localizations": { - "ar": { - "stringUnit": { - "state": "translated", - "value": "نسخ جذر المشروع" - } - }, - "bs": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopiraj korijen projekta" + "value": "Generated file" } }, - "da": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiér projektrod" + "value": "自動生成ファイル" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Projektstamm kopieren" + "value": "生成的文件" } }, - "en": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Copy Project Root" + "value": "產生的檔案" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Copiar raíz del proyecto" + "value": "Generierte Datei" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Copier la racine du projet" + "value": "Fichier généré" } }, - "it": { + "ar": { "stringUnit": { "state": "translated", - "value": "Copia radice del progetto" + "value": "ملف مُولَّد" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "プロジェクトのルートをコピー" + "value": "Archivo generado" } }, "ko": { "stringUnit": { "state": "translated", - "value": "프로젝트 루트 복사" + "value": "생성된 파일" } - }, - "nb": { + } + } + }, + "diffViewer.largeDiff": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopier prosjektrot" + "value": "Large diff" } }, - "pl": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiuj katalog główny projektu" + "value": "大きな差分" } }, - "pt-BR": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Copiar Raiz do Projeto" + "value": "大型差异" } }, - "ru": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Копировать корень проекта" + "value": "大型差異" } }, - "th": { + "de": { "stringUnit": { "state": "translated", - "value": "คัดลอกรากโปรเจกต์" + "value": "Großer Diff" } }, - "tr": { + "fr": { "stringUnit": { "state": "translated", - "value": "Proje Kökünü Kopyala" + "value": "Diff volumineux" } }, - "uk": { + "ar": { "stringUnit": { "state": "translated", - "value": "Копіювати корінь проєкту" + "value": "فرق كبير" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "复制项目根目录" + "value": "Diff grande" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "複製專案根目錄" + "value": "큰 변경 사항" } } } }, - "command.copyScreen.title": { + "diffViewer.loadDiff": { "extractionState": "manual", "localizations": { - "ar": { - "stringUnit": { - "state": "translated", - "value": "نسخ الشاشة المرئية" - } - }, - "bs": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopiraj vidljivi ekran" + "value": "Load diff" } }, - "da": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiér synlig skærm" + "value": "差分を読み込む" } }, - "de": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Sichtbaren Bildschirm kopieren" + "value": "加载差异" } }, - "en": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Copy Visible Screen" + "value": "載入差異" } }, - "es": { + "de": { "stringUnit": { "state": "translated", - "value": "Copiar pantalla visible" + "value": "Diff laden" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Copier l'écran visible" + "value": "Charger le diff" } }, - "it": { + "ar": { "stringUnit": { "state": "translated", - "value": "Copia schermo visibile" + "value": "تحميل الفرق" } }, - "ja": { + "es": { "stringUnit": { "state": "translated", - "value": "表示中の画面をコピー" + "value": "Cargar diff" } }, "ko": { "stringUnit": { "state": "translated", - "value": "보이는 화면 복사" + "value": "변경 사항 불러오기" } - }, - "nb": { + } + } + }, + "diffViewer.clearFileFilter": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", - "value": "Kopier synlig skjerm" + "value": "Clear filter" } }, - "pl": { + "ja": { "stringUnit": { "state": "translated", - "value": "Kopiuj widoczny ekran" + "value": "絞り込みを解除" } }, - "pt-BR": { + "zh-Hans": { "stringUnit": { "state": "translated", - "value": "Copiar Tela Visível" + "value": "清除筛选" } }, - "ru": { + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Копировать видимый экран" + "value": "清除篩選" } }, - "th": { + "de": { "stringUnit": { "state": "translated", - "value": "คัดลอกหน้าจอที่มองเห็น" + "value": "Filter zurücksetzen" } }, - "tr": { + "fr": { "stringUnit": { "state": "translated", - "value": "Görünür Ekranı Kopyala" + "value": "Effacer le filtre" } }, - "uk": { + "ar": { "stringUnit": { "state": "translated", - "value": "Копіювати видимий екран" + "value": "مسح التصفية" } }, - "zh-Hans": { + "es": { "stringUnit": { "state": "translated", - "value": "复制可见屏幕" + "value": "Borrar filtro" } }, - "zh-Hant": { + "ko": { "stringUnit": { "state": "translated", - "value": "複製可見畫面" + "value": "필터 지우기" } } } diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 47b25f222ad4..42a9f769b73b 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -6802,8 +6802,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } - private func confirmCloseMainWindow(_ window: NSWindow, warningDefaults: UserDefaults) -> Bool { - let dontAskAgain: CloseWarningKinds = .window + private func confirmCloseMainWindow( + _ window: NSWindow, + warningDefaults: UserDefaults, + dontAskAgain: CloseWarningKinds + ) -> Bool { #if DEBUG if let debugCloseMainWindowConfirmationHandler { let accepted = debugCloseMainWindowConfirmationHandler(window) @@ -6850,12 +6853,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // preconfirmed, so the last-window quit policy still applies. Without a // context there is no way to tell, so only the setting decides. let shouldConfirm: Bool + var dontAskAgain: CloseWarningKinds = .window let warningDefaults: UserDefaults if let context = mainWindowContext(forExactWindowIdentity: window) { warningDefaults = context.tabManager.closeTabWarningDefaults + let windowDockNeedsConfirmation = context.existingWindowDock()?.needsConfirmClose() == true shouldConfirm = context.tabManager.shouldConfirmWindowClose( - windowDockNeedsConfirmation: context.existingWindowDock()?.needsConfirmClose() == true + windowDockNeedsConfirmation: windowDockNeedsConfirmation ) + if windowDockNeedsConfirmation + || context.tabManager.tabs.contains(where: { + context.tabManager.workspaceNeedsConfirmClose($0) + }) { + dontAskAgain.insert(.safety) + } } else { warningDefaults = .standard shouldConfirm = CloseTabWarningStore(defaults: warningDefaults).warnsBeforeClosingWindow @@ -6864,7 +6875,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent window.performClose(nil) return true } - guard confirmCloseMainWindow(window, warningDefaults: warningDefaults) else { return true } + guard confirmCloseMainWindow( + window, + warningDefaults: warningDefaults, + dontAskAgain: dontAskAgain + ) else { return true } performPreconfirmedMainWindowClose(window) return true } diff --git a/Sources/DockSplitStore+CloseConfirmation.swift b/Sources/DockSplitStore+CloseConfirmation.swift index ca181b8b206a..693fa39ab58e 100644 --- a/Sources/DockSplitStore+CloseConfirmation.swift +++ b/Sources/DockSplitStore+CloseConfirmation.swift @@ -2,7 +2,7 @@ import AppKit import Bonsplit import CmuxSettings -private struct DockPaneCloseConfirmationPrompt: Sendable { +struct DockPaneCloseConfirmationPrompt: Sendable { let title: String let message: String let details: String @@ -49,11 +49,10 @@ extension DockSplitStore { let closeWarningStore = CloseTabWarningStore( defaults: confirmationManager?.closeTabWarningDefaults ?? .standard ) - let warningKinds = closeWarningStore.warningKinds( + guard closeWarningStore.shouldConfirmCloseIncludingSafety( requiresConfirmation: dockPanelNeedsConfirmClose(panel), source: closeSource - ) - guard !warningKinds.isEmpty else { + ) else { if closeHistoryEligibleDockTabIds.contains(tab.id) { stageDockClosedPanelHistory( tabIds: Set([tab.id]), @@ -84,7 +83,6 @@ extension DockSplitStore { } guard self.confirmCloseDockPanel( panel, - dontAskAgain: warningKinds, confirmationManager: confirmationManager ) else { self.discardDockClosedPanelHistory(tabId: tabId) @@ -122,18 +120,15 @@ extension DockSplitStore { ) var paneTitles: [String] = [] var confirmableTabIds = Set() - var warningKinds: CloseWarningKinds = [] for tab in tabs { let panel = panel(for: tab.id) paneTitles.append(CloseOtherTabsConfirmationPrompt.displayTitle(panel?.displayTitle ?? tab.title)) guard userCloseTabIds.contains(tab.id), let panel else { continue } - let tabWarningKinds = closeWarningStore.warningKinds( + if closeWarningStore.shouldConfirmCloseIncludingSafety( requiresConfirmation: dockPanelNeedsConfirmClose(panel), source: .shortcut - ) - if !tabWarningKinds.isEmpty { + ) { confirmableTabIds.insert(tab.id) - warningKinds.formUnion(tabWarningKinds) } } guard !confirmableTabIds.isEmpty else { @@ -155,7 +150,6 @@ extension DockSplitStore { defer { self.pendingCloseConfirmDockTabIds.subtract(confirmableTabIds) } guard self.confirmCloseDockPane( prompt, - dontAskAgain: warningKinds, confirmationManager: confirmationManager ) else { self.discardDockClosedPaneHistory(pane) @@ -233,11 +227,7 @@ extension DockSplitStore { return false } - private func confirmCloseDockPanel( - _ panel: any Panel, - dontAskAgain: CloseWarningKinds, - confirmationManager: TabManager? - ) -> Bool { + private func confirmCloseDockPanel(_ panel: any Panel, confirmationManager: TabManager?) -> Bool { let title = String(localized: "dialog.closeTab.title", defaultValue: "Close tab?") let panelName = panel.displayTitle.trimmingCharacters(in: .whitespacesAndNewlines) let message: String @@ -246,24 +236,14 @@ extension DockSplitStore { } else { message = String(localized: "dialog.closeTab.message", defaultValue: "This will close the current tab.") } - return confirmCloseDockPrompt( - title: title, - message: message, - dontAskAgain: dontAskAgain, - confirmationManager: confirmationManager - ) + return confirmCloseDockPrompt(title: title, message: message, confirmationManager: confirmationManager) } - private func confirmCloseDockPane( - _ prompt: DockPaneCloseConfirmationPrompt, - dontAskAgain: CloseWarningKinds, - confirmationManager: TabManager? - ) -> Bool { + private func confirmCloseDockPane(_ prompt: DockPaneCloseConfirmationPrompt, confirmationManager: TabManager?) -> Bool { confirmCloseDockPrompt( title: prompt.title, message: prompt.message, scrollableDetails: prompt.details, - dontAskAgain: dontAskAgain, confirmationManager: confirmationManager ) } @@ -272,7 +252,6 @@ extension DockSplitStore { title: String, message: String, scrollableDetails: String? = nil, - dontAskAgain: CloseWarningKinds, confirmationManager: TabManager? ) -> Bool { if let confirmationManager { @@ -280,8 +259,7 @@ extension DockSplitStore { title: title, message: message, scrollableDetails: scrollableDetails, - acceptCmdD: false, - dontAskAgain: dontAskAgain + acceptCmdD: false ) } @@ -289,13 +267,10 @@ extension DockSplitStore { alert.messageText = title alert.alertStyle = .warning alert.addButton(withTitle: String(localized: "dialog.closeTab.close", defaultValue: "Close")) - alert.addButton(withTitle: String(localized: "common.cancel", defaultValue: "Cancel")) + alert.addButton(withTitle: String(localized: "dialog.closeTab.cancel", defaultValue: "Cancel")) let content = scrollableDetails.map { CmuxAlertContent(flattenedText: message, separatingScrollableDetails: $0) } ?? CmuxAlertContent(informativeText: message) - CloseDontAskAgainCheckbox.add(to: alert, offering: dontAskAgain) - let accepted = alert.runCmuxModal(content: content) == .alertFirstButtonReturn - CloseDontAskAgainCheckbox.apply(from: alert, offering: dontAskAgain, defaults: .standard) - return accepted + return alert.runCmuxModal(content: content) == .alertFirstButtonReturn } } diff --git a/Sources/DockSplitStore+TabContextActions.swift b/Sources/DockSplitStore+TabContextActions.swift index 50f2de892a59..6c646f10d537 100644 --- a/Sources/DockSplitStore+TabContextActions.swift +++ b/Sources/DockSplitStore+TabContextActions.swift @@ -31,6 +31,8 @@ extension DockSplitStore { _ = setDockPanelCustomTitle(panelId: panelId, title: nil) case .copyIdentifiers: copyDockIdentifiers(panelId: panelId, paneId: pane) + case .close: + _ = closePanel(panelId, force: false) case .closeToLeft: _ = closeDockTabs( dockTabIds(toLeftOf: tab.id, inPane: pane), @@ -176,10 +178,14 @@ extension DockSplitStore { let warningStore = CloseTabWarningStore( defaults: manager?.closeTabWarningDefaults ?? .standard ) - let warningKinds = warningStore.warningKinds( + let hasActiveProcess = candidates.contains { $0.needsConfirmation } + var warningKinds = warningStore.warningKinds( requiresConfirmation: needsConfirmation, source: .shortcut ) + if hasActiveProcess { + warningKinds.insert(.safety) + } if !warningKinds.isEmpty { guard let manager else { return false } let prompt = CloseOtherTabsConfirmationPrompt( diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 96da87f4f1ba..f7d5014e8f95 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2729,8 +2729,17 @@ class TabManager: ObservableObject { guard !closeConfirmationInFlight else { return } guard let plan = closeOtherTabsInFocusedPanePlan() else { return } - let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults) - .warningKinds(requiresConfirmation: true, source: .shortcut) + let warningStore = CloseTabWarningStore(defaults: closeTabWarningDefaults) + let hasActiveProcess = plan.panelIds.contains { + plan.workspace.panelNeedsConfirmClose(panelId: $0) + } + var warningKinds = warningStore.warningKinds( + requiresConfirmation: true, + source: .shortcut + ) + if hasActiveProcess { + warningKinds.insert(.safety) + } if !warningKinds.isEmpty { let prompt = CloseOtherTabsConfirmationPrompt(titles: plan.titles) guard confirmClose( @@ -2848,19 +2857,28 @@ class TabManager: ObservableObject { // "Don't ask again": no setting may silence the protection pinning // asked for. let containsPinned = plan.workspaces.contains(where: \.isPinned) + let windowDockNeedsConfirmation = plan.willCloseWindow + && AppDelegate.shared?.existingWindowDock(for: self)?.needsConfirmClose() == true + let hasActiveProcess = plan.workspaces.contains(where: workspaceNeedsConfirmClose) + || windowDockNeedsConfirmation let showsBatchConfirmation: Bool - let dontAskAgain: CloseWarningKinds + var dontAskAgain: CloseWarningKinds if containsPinned { - showsBatchConfirmation = shouldConfirmClose(requiresConfirmation: true, source: .tabClose) + showsBatchConfirmation = CloseTabWarningStore(defaults: closeTabWarningDefaults) + .shouldConfirmCloseIncludingSafety(requiresConfirmation: true, source: .shortcut) dontAskAgain = [] } else if plan.willCloseWindow { // A batch that closes the whole window follows the window warning // policy. The tab warning must not suppress this prompt. showsBatchConfirmation = CloseTabWarningStore(defaults: closeTabWarningDefaults).warnsBeforeClosingWindow + || hasActiveProcess dontAskAgain = .window + if hasActiveProcess { dontAskAgain.insert(.safety) } } else { showsBatchConfirmation = shouldConfirmWorkspaceClose(requiresConfirmation: true, source: .tabClose) + || hasActiveProcess dontAskAgain = .workspace + if hasActiveProcess { dontAskAgain.insert(.safety) } } if showsBatchConfirmation { guard confirmClose( @@ -3146,15 +3164,24 @@ class TabManager: ObservableObject { // grouped instead of scattering to root. No special anchor prompt is // needed; the normal running-process confirmation below still applies. let willCloseWindow = tabs.count <= 1 + let windowDockNeedsConfirmation = willCloseWindow + && AppDelegate.shared?.existingWindowDock(for: self)?.needsConfirmClose() == true let needsCloseConfirmation = workspaceNeedsConfirmClose(workspace) + || windowDockNeedsConfirmation let showsCloseConfirmation = requiresConfirmation - && shouldConfirmWorkspaceClose(requiresConfirmation: needsCloseConfirmation, source: source) + && (needsCloseConfirmation + || shouldConfirmWorkspaceClose( + requiresConfirmation: needsCloseConfirmation, + source: source + )) + var dontAskAgain: CloseWarningKinds = .workspace + if needsCloseConfirmation { dontAskAgain.insert(.safety) } if showsCloseConfirmation, !confirmClose( title: String(localized: "dialog.closeWorkspace.title", defaultValue: "Close workspace?"), message: String(localized: "dialog.closeWorkspace.message", defaultValue: "This will close the workspace and all of its panels."), acceptCmdD: willCloseWindow, - dontAskAgain: .workspace + dontAskAgain: dontAskAgain ) { return false } @@ -3182,12 +3209,12 @@ class TabManager: ObservableObject { case .workspace: return requiresConfirmation case .tabClose: - return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( + return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmCloseIncludingSafety( requiresConfirmation: requiresConfirmation, source: .shortcut ) case .tabCloseButton: - return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( + return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmCloseIncludingSafety( requiresConfirmation: requiresConfirmation, source: .tabCloseButton ) @@ -3200,7 +3227,30 @@ class TabManager: ObservableObject { /// never removes the protection a user asked for by pinning. private func shouldConfirmWorkspaceClose(requiresConfirmation: Bool, source: CloseConfirmationSource) -> Bool { AppCatalogSection().warnBeforeClosingWorkspace.value(in: closeTabWarningDefaults) - && shouldConfirmClose(requiresConfirmation: requiresConfirmation, source: source) + && shouldConfirmConfiguredClose(requiresConfirmation: requiresConfirmation, source: source) + } + + /// Applies the user-configured warning toggles without turning the + /// `requiresConfirmation` argument into a safety warning. Workspace and + /// batch gates use this seam before they have established whether any + /// panel contains a live process; the actual close path uses + /// `shouldConfirmClose`, which also includes the non-suppressible safety + /// gate. + private func shouldConfirmConfiguredClose(requiresConfirmation: Bool, source: CloseConfirmationSource) -> Bool { + switch source { + case .workspace: + return requiresConfirmation + case .tabClose: + return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( + requiresConfirmation: requiresConfirmation, + source: .shortcut + ) + case .tabCloseButton: + return CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( + requiresConfirmation: requiresConfirmation, + source: .tabCloseButton + ) + } } /// Whether the Close Window command should ask before closing this @@ -3208,10 +3258,15 @@ class TabManager: ObservableObject { /// closes with the window needs close confirmation, either in a workspace /// or in the window Dock (which the caller owns and checks). func shouldConfirmWindowClose(windowDockNeedsConfirmation: Bool) -> Bool { - CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmWindowClose( - anyPanelNeedsConfirmation: windowDockNeedsConfirmation - || tabs.contains(where: workspaceNeedsConfirmClose) - ) + let anyPanelNeedsConfirmation = windowDockNeedsConfirmation + || tabs.contains(where: workspaceNeedsConfirmClose) + if anyPanelNeedsConfirmation { + // A live foreground process must always get a chance to survive a + // window close, even when the ordinary window warning is disabled. + return true + } + return CloseTabWarningStore(defaults: closeTabWarningDefaults) + .shouldConfirmWindowClose(anyPanelNeedsConfirmation: false) } private enum PinnedWorkspaceCloseConfirmation { @@ -3357,7 +3412,7 @@ class TabManager: ObservableObject { requiresConfirmation = false } - let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: requiresConfirmation, source: .shortcut ) @@ -3536,7 +3591,7 @@ class TabManager: ObservableObject { } } - private func workspaceNeedsConfirmClose(_ workspace: Workspace) -> Bool { + func workspaceNeedsConfirmClose(_ workspace: Workspace) -> Bool { #if DEBUG if ProcessInfo.processInfo.environment["CMUX_UI_TEST_FORCE_CONFIRM_CLOSE_WORKSPACE"] == "1" { return true @@ -3545,6 +3600,10 @@ class TabManager: ObservableObject { return workspace.needsConfirmClose() } + func workspaceNeedsConfirmCloseForClose(_ workspace: Workspace) -> Bool { + workspaceNeedsConfirmClose(workspace) + } + func titleForTab(_ tabId: UUID) -> String? { workspacesById[tabId]?.title } @@ -7259,7 +7318,7 @@ enum WelcomeBannerDelivery: Equatable { /// button closes the dialog, like the Cmd+Q warning's checkbox. enum CloseDontAskAgainCheckbox { static func add(to alert: NSAlert, offering kinds: CloseWarningKinds) { - guard !kinds.isEmpty else { return } + guard !kinds.subtracting(.safety).isEmpty else { return } alert.showsSuppressionButton = true alert.suppressionButton?.title = String( localized: "dialog.close.dontAskAgain", @@ -7268,7 +7327,8 @@ enum CloseDontAskAgainCheckbox { } static func apply(from alert: NSAlert, offering kinds: CloseWarningKinds, defaults: UserDefaults) { - guard !kinds.isEmpty, alert.suppressionButton?.state == .on else { return } - CloseTabWarningStore(defaults: defaults).disableWarnings(kinds) + let dismissibleKinds = kinds.subtracting(.safety) + guard !dismissibleKinds.isEmpty, alert.suppressionButton?.state == .on else { return } + CloseTabWarningStore(defaults: defaults).disableWarnings(dismissibleKinds) } } diff --git a/Sources/TerminalController+ControlSidebarContext3.swift b/Sources/TerminalController+ControlSidebarContext3.swift index 7b9023061c08..1629e3f5bdfc 100644 --- a/Sources/TerminalController+ControlSidebarContext3.swift +++ b/Sources/TerminalController+ControlSidebarContext3.swift @@ -11,6 +11,19 @@ import CmuxTerminal /// `surface_health`): the exact bodies the former `TerminalController` v1 /// handlers ran. extension TerminalController { + func controlSidebarCloseStrings() -> ControlSidebarCloseStrings { + ControlSidebarCloseStrings( + failed: String( + localized: "socket.sidebar.closeSurface.failed", + defaultValue: "Failed to close surface" + ), + confirmationRequired: String( + localized: "socket.sidebar.closeSurface.confirmationRequired", + defaultValue: "Surface has a running process; retry with --force" + ) + ) + } + // MARK: - Pane listings / focus func controlSidebarPaneList() -> ControlSidebarPaneListSnapshot? { @@ -292,7 +305,7 @@ extension TerminalController { } } - func controlSidebarCloseSurface(surfaceArg: String?) -> ControlSidebarCloseSurfaceResolution { + func controlSidebarCloseSurface(surfaceArg: String?, force: Bool = false) -> ControlSidebarCloseSurfaceResolution { guard let tabManager, let tabId = tabManager.selectedTabId, let tab = tabManager.tabs.first(where: { $0.id == tabId }) else { @@ -316,8 +329,10 @@ extension TerminalController { return .lastSurface } - // Socket commands must be non-interactive: bypass close-confirmation gating. - guard controlSidebarCloseSurfaceRecordingHistory(in: tab, surfaceId: targetSurfaceId, force: true) else { + if !force, tab.panelNeedsConfirmClose(panelId: targetSurfaceId) { + return .confirmationRequired + } + guard controlSidebarCloseSurfaceRecordingHistory(in: tab, surfaceId: targetSurfaceId, force: force) else { return .closeFailed } return .closed diff --git a/Sources/TerminalController+ControlSurfaceContext2.swift b/Sources/TerminalController+ControlSurfaceContext2.swift index aa1e064caa3d..9baaac0b1a9d 100644 --- a/Sources/TerminalController+ControlSurfaceContext2.swift +++ b/Sources/TerminalController+ControlSurfaceContext2.swift @@ -8,6 +8,19 @@ import Foundation /// localized respawn strings. Split out of `TerminalController+ControlSurfaceContext` /// to keep the conformance readable; see that file's doc comment for the overview. extension TerminalController { + func controlSurfaceCloseStrings() -> ControlSurfaceCloseStrings { + ControlSurfaceCloseStrings( + confirmationRequired: String( + localized: "socket.surface.close.confirmationRequired", + defaultValue: "Surface has a running process; retry with force=true" + ), + failed: String( + localized: "socket.surface.close.failed", + defaultValue: "Failed to close surface" + ) + ) + } + func controlSurfaceRespawnStrings() -> ControlSurfaceRespawnStrings { ControlSurfaceRespawnStrings( invalidFocus: String( @@ -500,7 +513,8 @@ extension TerminalController { func controlSurfaceClose( routing: ControlRoutingSelectors, surfaceID: UUID?, - hasSurfaceIDParam: Bool + hasSurfaceIDParam: Bool, + force: Bool = false ) -> ControlSurfaceCloseResolution { guard let tabManager = resolveTabManager(routing: routing) else { return .tabManagerUnavailable @@ -517,7 +531,8 @@ extension TerminalController { routing: routing, surfaceID: surfaceID, hasSurfaceIDParam: hasSurfaceIDParam, - tabManager: tabManager + tabManager: tabManager, + force: force ) { return resolution } @@ -544,7 +559,8 @@ extension TerminalController { tabManager: tabManager, surfaceID: surfaceId, isImplicitTarget: surfaceID == nil && routing.surfaceID == nil, - routedPaneID: routing.paneID + routedPaneID: routing.paneID, + force: force ) { return remote } @@ -552,7 +568,11 @@ extension TerminalController { if windowDockMismatchesExplicitWindow(routing, dock: windowDock) { return .surfaceNotFound(surfaceId) } - guard windowDock.closePanel(surfaceId, force: true) else { + if !force, + windowDock.panel(for: TabID(uuid: surfaceId)).map({ windowDock.dockPanelNeedsConfirmClose($0) }) == true { + return .confirmationRequired(surfaceId) + } + guard windowDock.closePanel(surfaceId, force: force) else { return .closeFailed(surfaceId) } AppDelegate.shared?.notificationStore?.clearNotifications( @@ -565,7 +585,13 @@ extension TerminalController { surfaceID: surfaceId ) } else if ws.containsDockPanel(surfaceId) { - guard ws.closeDockPanelAndClearNotifications(surfaceId, force: true) else { + if !force, + let dock = ws.dockSplit, + let panel = dock.panel(for: TabID(uuid: surfaceId)), + dock.dockPanelNeedsConfirmClose(panel) { + return .confirmationRequired(surfaceId) + } + guard ws.closeDockPanelAndClearNotifications(surfaceId, force: force) else { return .closeFailed(surfaceId) } return .closed( @@ -580,8 +606,10 @@ extension TerminalController { if ws.panels.count <= 1 { return .lastSurface } - // Socket API must be non-interactive: bypass close-confirmation gating. - guard controlCloseSurfaceRecordingHistory(in: ws, surfaceId: surfaceId, force: true) else { + if !force, ws.panelNeedsConfirmClose(panelId: surfaceId) { + return .confirmationRequired(surfaceId) + } + guard controlCloseSurfaceRecordingHistory(in: ws, surfaceId: surfaceId, force: force) else { return .closeFailed(surfaceId) } return .closed( diff --git a/Sources/TerminalController+ControlSurfaceDock.swift b/Sources/TerminalController+ControlSurfaceDock.swift index 6f33f51d30c4..e6b526891a04 100644 --- a/Sources/TerminalController+ControlSurfaceDock.swift +++ b/Sources/TerminalController+ControlSurfaceDock.swift @@ -1,4 +1,5 @@ import AppKit +import Bonsplit import CmuxControlSocket import Foundation @@ -350,7 +351,8 @@ extension TerminalController { routing: ControlRoutingSelectors, surfaceID: UUID?, hasSurfaceIDParam: Bool, - tabManager: TabManager + tabManager: TabManager, + force: Bool ) -> ControlSurfaceCloseResolution? { guard let windowDock = windowDockForRouting(routing, tabManager: tabManager) else { return nil } let resolved = resolvedWindowDockSurfaceId( @@ -368,7 +370,12 @@ extension TerminalController { guard windowDock.containsPanel(surfaceId) else { return .closeFailed(surfaceId) } - guard windowDock.closePanel(surfaceId, force: true) else { + if !force, + let panel = windowDock.panel(for: TabID(uuid: surfaceId)), + windowDock.dockPanelNeedsConfirmClose(panel) { + return .confirmationRequired(surfaceId) + } + guard windowDock.closePanel(surfaceId, force: force) else { return .closeFailed(surfaceId) } AppDelegate.shared?.notificationStore?.clearNotifications( diff --git a/Sources/TerminalController+ControlSystemContext.swift b/Sources/TerminalController+ControlSystemContext.swift index d31b495241e0..ccd1a9ea9170 100644 --- a/Sources/TerminalController+ControlSystemContext.swift +++ b/Sources/TerminalController+ControlSystemContext.swift @@ -18,6 +18,15 @@ import Foundation /// `drag_surface_to_split`), so their witnesses bridge. extension TerminalController: ControlSystemContext { + func controlSystemCloseStrings() -> ControlSystemCloseStrings { + ControlSystemCloseStrings( + confirmationRequired: String( + localized: "socket.tabAction.close.confirmationRequired", + defaultValue: "One or more surfaces have a running process; retry with force=true" + ) + ) + } + func controlSystemSurfaceNotFoundMessage() -> String { String(localized: "socket.tabAction.error.surfaceNotFound", defaultValue: "Surface not found") } diff --git a/Sources/TerminalController+ControlSystemContext2.swift b/Sources/TerminalController+ControlSystemContext2.swift index 5f7989beea44..96ae467235f5 100644 --- a/Sources/TerminalController+ControlSystemContext2.swift +++ b/Sources/TerminalController+ControlSystemContext2.swift @@ -35,6 +35,7 @@ extension TerminalController { rawURL: String?, surfaceID: UUID?, requestedFocus: Bool, + force: Bool = false, moveParams: [String: JSONValue] ) -> ControlTabActionResolution { guard let tabManager = resolveTabManager(routing: routing) else { @@ -112,7 +113,16 @@ extension TerminalController { return max(rawTarget, pinnedCount) } - func closeTabs(_ tabIds: [TabID]) -> (closed: Int, skippedPinned: Int) { + func closeTabs(_ tabIds: [TabID]) -> ControlTabActionResolution { + let activeSurfaceIDs = tabIds.compactMap { tabId -> UUID? in + guard let targetPanelID = workspace.panelIdFromSurfaceId(tabId), + !workspace.isPanelPinned(targetPanelID), + workspace.panelNeedsConfirmClose(panelId: targetPanelID) else { return nil } + return targetPanelID + } + if !force, !activeSurfaceIDs.isEmpty { + return .confirmationRequired(activeSurfaceIDs) + } var closed = 0 var skippedPinned = 0 for tabId in tabIds { @@ -128,7 +138,7 @@ extension TerminalController { closed += 1 } } - return (closed, skippedPinned) + return finish(.closed(closed: closed, skippedPinned: skippedPinned)) } switch action { @@ -280,8 +290,7 @@ extension TerminalController { return .tabNotFoundInPane } let targetIds = Array(tabs.prefix(index).map(\.id)) - let closeResult = closeTabs(targetIds) - return finish(.closed(closed: closeResult.closed, skippedPinned: closeResult.skippedPinned)) + return closeTabs(targetIds) case "close_right", "close_to_right": guard let anchorTabId = workspace.surfaceIdFromPanelId(panelId), @@ -293,8 +302,7 @@ extension TerminalController { return .tabNotFoundInPane } let targetIds = (index + 1 < tabs.count) ? Array(tabs.suffix(from: index + 1).map(\.id)) : [] - let closeResult = closeTabs(targetIds) - return finish(.closed(closed: closeResult.closed, skippedPinned: closeResult.skippedPinned)) + return closeTabs(targetIds) case "close_others", "close_other_tabs": guard let anchorTabId = workspace.surfaceIdFromPanelId(panelId), @@ -304,8 +312,7 @@ extension TerminalController { let targetIds = workspace.bonsplitController.tabs(inPane: paneId) .map(\.id) .filter { $0 != anchorTabId } - let closeResult = closeTabs(targetIds) - return finish(.closed(closed: closeResult.closed, skippedPinned: closeResult.skippedPinned)) + return closeTabs(targetIds) default: return .unknownAction diff --git a/Sources/TerminalController+ControlWorkspaceContext.swift b/Sources/TerminalController+ControlWorkspaceContext.swift index 81359d2549f1..c6b13626771a 100644 --- a/Sources/TerminalController+ControlWorkspaceContext.swift +++ b/Sources/TerminalController+ControlWorkspaceContext.swift @@ -92,7 +92,8 @@ extension TerminalController: ControlWorkspaceContext { func controlCloseWorkspace( routing: ControlRoutingSelectors, - workspaceID: UUID + workspaceID: UUID, + force: Bool ) -> ControlWorkspaceCloseResolution { guard let tabManager = resolveTabManager(routing: routing) else { return .tabManagerUnavailable @@ -104,6 +105,12 @@ extension TerminalController: ControlWorkspaceContext { guard tabManager.canCloseWorkspace(ws) else { return .protected(windowID: windowId) } + let windowDockNeedsConfirmation = tabManager.tabs.count == 1 + && AppDelegate.shared?.existingWindowDock(for: tabManager)?.needsConfirmClose() == true + if !force, + tabManager.workspaceNeedsConfirmCloseForClose(ws) || windowDockNeedsConfirmation { + return .confirmationRequired + } guard tabManager.closeWorkspaceNonInteractively(ws) else { return .closeFailed(windowID: windowId) } diff --git a/Sources/TerminalController+ControlWorkspaceStrings.swift b/Sources/TerminalController+ControlWorkspaceStrings.swift index 81285ad83c2d..0fcfb1c4d96e 100644 --- a/Sources/TerminalController+ControlWorkspaceStrings.swift +++ b/Sources/TerminalController+ControlWorkspaceStrings.swift @@ -12,6 +12,10 @@ extension TerminalController { localized: "cli.socket.error.workspaceNotClosed", defaultValue: "Workspace not closed" ), + closeConfirmationRequired: String( + localized: "cli.socket.error.workspaceCloseConfirmationRequired", + defaultValue: "Workspace has a running process; retry with --force" + ), reorderManyMissingOrder: String( localized: "socket.workspace.reorderMany.missingOrder", defaultValue: "Missing workspace_ids" diff --git a/Sources/TerminalController+MobileWorkspaceList.swift b/Sources/TerminalController+MobileWorkspaceList.swift index 736c67f791d5..c61fc94910ce 100644 --- a/Sources/TerminalController+MobileWorkspaceList.swift +++ b/Sources/TerminalController+MobileWorkspaceList.swift @@ -324,6 +324,7 @@ extension TerminalController { guard let workspaceID = v2UUID(params, "workspace_id") else { return .err(code: "invalid_params", message: "Missing or invalid workspace_id", data: nil) } + let force = v2Bool(params, "force") ?? false guard let tabManager = v2ResolveTabManager(params: params) else { return .err(code: "unavailable", message: "Workspace context is unavailable", data: nil) } @@ -353,7 +354,18 @@ extension TerminalController { ) return } - tabManager.closeWorkspace(workspace) + if !force, tabManager.workspaceNeedsConfirmCloseForClose(workspace) { + result = .err( + code: "confirmation_required", + message: String( + localized: "cli.socket.error.workspaceCloseConfirmationRequired", + defaultValue: "Workspace has a running process; retry with --force" + ), + data: ["workspace_id": workspaceID.uuidString] + ) + return + } + _ = tabManager.closeWorkspaceNonInteractively(workspace) result = .ok([ "closed": true, "workspace_id": workspaceID.uuidString, diff --git a/Sources/TerminalController+RemoteTmuxControlMutations.swift b/Sources/TerminalController+RemoteTmuxControlMutations.swift index 5483665ca780..0b172f3d8a91 100644 --- a/Sources/TerminalController+RemoteTmuxControlMutations.swift +++ b/Sources/TerminalController+RemoteTmuxControlMutations.swift @@ -247,7 +247,8 @@ extension TerminalController { tabManager: TabManager, surfaceID: UUID, isImplicitTarget: Bool, - routedPaneID: UUID? + routedPaneID: UUID?, + force: Bool ) -> ControlSurfaceCloseResolution? { let location: RemoteTmuxControlPaneLocation if isImplicitTarget, @@ -264,6 +265,10 @@ extension TerminalController { return nil } } + if !force, + location.windowMirror?.paneForegroundState(location.pane.tmuxPaneID)?.hasActiveCommand == true { + return .confirmationRequired(location.pane.panel.id) + } guard location.requestKill() else { return .closeFailed(location.pane.panel.id) } diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 783c4b39442a..62ba9f476e5b 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -5056,9 +5056,19 @@ class TerminalController { } let windowId = v2ResolveWindowId(tabManager: tabManager) + let force = v2Bool(params, "force") ?? false @MainActor - func closeWorkspaces(_ workspaces: [Workspace]) -> Int { + func closeWorkspaces(_ workspaces: [Workspace]) -> Int? { + let activeWorkspaceIDs = workspaces + .filter { $0.needsConfirmClose() } + .map { $0.id } + guard force || activeWorkspaceIDs.isEmpty else { + result = .err(code: "confirmation_required", message: "One or more workspaces have a running process; retry with force=true", data: [ + "workspace_ids": activeWorkspaceIDs.map { $0.uuidString } + ]) + return nil + } var closed = 0 // Drain non-anchor members before group anchors so a range close // that targets a group promotes at most once per group instead of @@ -5139,7 +5149,7 @@ class TerminalController { case "close_others": let candidates = tabManager.tabs.filter { $0.id != workspace.id && !$0.isPinned } - let closed = closeWorkspaces(candidates) + guard let closed = closeWorkspaces(candidates) else { return } finish(["closed": closed]) case "close_above": @@ -5148,7 +5158,7 @@ class TerminalController { return } let candidates = Array(tabManager.tabs.prefix(index)).filter { !$0.isPinned } - let closed = closeWorkspaces(candidates) + guard let closed = closeWorkspaces(candidates) else { return } finish(["closed": closed]) case "close_below": @@ -5162,7 +5172,7 @@ class TerminalController { } else { candidates = [] } - let closed = closeWorkspaces(candidates) + guard let closed = closeWorkspaces(candidates) else { return } finish(["closed": closed]) case "mark_read": @@ -12814,10 +12824,21 @@ class TerminalController { } private func closeWindow(_ arg: String) -> String { - let trimmed = arg.trimmingCharacters(in: .whitespacesAndNewlines) - guard let windowId = UUID(uuidString: trimmed) else { return "ERROR: Invalid window id" } - let ok = v2MainSync { AppDelegate.shared?.closeMainWindow(windowId: windowId) ?? false } - return ok ? "OK" : "ERROR: Window not found" + let parts = arg.split(whereSeparator: { $0 == " " || $0 == "\t" }).map(String.init) + guard let windowId = parts.first.flatMap(UUID.init(uuidString:)), + parts.dropFirst().allSatisfy({ $0 == "--force" }) else { + return "ERROR: Invalid window id" + } + let force = parts.dropFirst().contains("--force") + let outcome = v2MainSync { controlCloseWindow(id: windowId, force: force) } + switch outcome { + case .resolved: + return "OK" + case .notFound: + return "ERROR: Window not found" + case .confirmationRequired: + return "ERROR: \(controlWindowCloseStrings().confirmationRequired)" + } } private func moveWorkspaceToWindow(_ args: String) -> String { @@ -14126,7 +14147,10 @@ class TerminalController { private func closeWorkspace(_ tabId: String) -> String { guard let tabManager = tabManager else { return "ERROR: TabManager not available" } - guard let uuid = UUID(uuidString: tabId) else { return "ERROR: Invalid tab ID" } + let tokens = tabId.split(whereSeparator: { $0 == " " || $0 == "\t" }).map(String.init) + guard let rawID = tokens.first, + let uuid = UUID(uuidString: rawID) else { return "ERROR: Invalid tab ID" } + let force = tokens.contains("--force") var result = "ERROR: Tab not found" v2MainSync { @@ -14135,6 +14159,13 @@ class TerminalController { result = "ERROR: \(workspaceCloseProtectedMessage())" return } + if !force, tabManager.workspaceNeedsConfirmCloseForClose(tab) { + result = "ERROR: " + String( + localized: "cli.socket.error.workspaceCloseConfirmationRequired", + defaultValue: "Workspace has a running process; retry with --force" + ) + return + } let closeFailure = String(localized: "cli.socket.error.workspaceNotClosed", defaultValue: "Workspace not closed") result = tabManager.closeWorkspaceNonInteractively(tab) ? "OK" : "ERROR: \(closeFailure)" } diff --git a/Sources/TerminalControllerControlCommandContext.swift b/Sources/TerminalControllerControlCommandContext.swift index d69986ab2883..2c49d1b4be87 100644 --- a/Sources/TerminalControllerControlCommandContext.swift +++ b/Sources/TerminalControllerControlCommandContext.swift @@ -39,6 +39,15 @@ extension TerminalController: ControlCommandContext { /// already runs on the main actor inside the socket-command policy scope, so each /// hop would re-apply the identical thread-local focus-allowance stack — a no-op. extension TerminalController: ControlWindowContext { + func controlWindowCloseStrings() -> ControlWindowCloseStrings { + ControlWindowCloseStrings( + confirmationRequired: String( + localized: "cli.socket.error.windowCloseConfirmationRequired", + defaultValue: "One or more workspaces or Dock surfaces have a running process; retry with --force" + ) + ) + } + func controlWindowSummaries() -> [ControlWindowSummary] { (AppDelegate.shared?.listMainWindowSummaries() ?? []).map { summary in ControlWindowSummary( @@ -81,6 +90,21 @@ extension TerminalController: ControlWindowContext { AppDelegate.shared?.closeMainWindow(windowId: id) ?? false } + func controlCloseWindow(id: UUID, force: Bool) -> ControlWindowCloseResolution { + guard let app = AppDelegate.shared, + let manager = app.tabManagerFor(windowId: id) else { + return .notFound + } + let activeWorkspaceIDs = manager.tabs + .filter { $0.needsConfirmClose() } + .map(\.id) + let dockNeedsConfirmation = app.existingWindowDock(for: manager)?.needsConfirmClose() == true + guard force || (activeWorkspaceIDs.isEmpty && !dockNeedsConfirmation) else { + return .confirmationRequired(workspaceIDs: activeWorkspaceIDs) + } + return app.closeMainWindow(windowId: id) ? .resolved : .notFound + } + func controlAvailableDisplays() -> [ControlDisplayInfo] { (AppDelegate.shared?.availableDisplays() ?? []).map { display in ControlDisplayInfo( diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 93cf448fb4fc..336a9c0620c1 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -9657,9 +9657,7 @@ final class Workspace: Identifiable, ObservableObject, FilePreviewTabMetadataHos /// down. The pane is removed by the resulting `%layout-change` (or /// `%window-close` for the window's last pane), never locally. func requestRemoteTmuxPaneClose(windowMirror: RemoteTmuxWindowMirror, tmuxPaneId: Int) { - // Close warnings disabled → even an active command wouldn't confirm; - // kill with no added round trip. - guard CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( + guard CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmCloseIncludingSafety( requiresConfirmation: true, source: .tabCloseButton ) else { windowMirror.requestKillPane(tmuxPaneId) @@ -9675,7 +9673,7 @@ final class Workspace: Identifiable, ObservableObject, FilePreviewTabMetadataHos defer { self.pendingRemoteTmuxPaneCloseIds.remove(tmuxPaneId) } guard let windowMirror else { return } let state = states?[tmuxPaneId] ?? windowMirror.paneForegroundState(tmuxPaneId) - let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: state?.hasActiveCommand ?? false, source: .tabCloseButton ) @@ -11938,6 +11936,7 @@ final class Workspace: Identifiable, ObservableObject, FilePreviewTabMetadataHos var shortcuts: [TabContextAction: KeyboardShortcut] = [:] let mappings: [(TabContextAction, KeyboardShortcutSettings.Action)] = [ (.rename, .renameTab), + (.close, .closeTab), (.toggleZoom, .toggleSplitZoom), (.newTerminalToRight, .newSurface), (.sizeToMyWindow, .sizeTerminalToMyWindow), @@ -14098,7 +14097,7 @@ extension Workspace: BonsplitDelegate { remoteTmuxController.cachedMirrorTabActivity(workspaceId: id, panelId: panelId) != nil { let confirmationSource: CloseTabCloseSource = tabCloseButtonClose == true ? .tabCloseButton : .shortcut - let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: true, source: confirmationSource ) if warningKinds.isEmpty { @@ -14158,11 +14157,11 @@ extension Workspace: BonsplitDelegate { // The X-button warning asks even when nothing is running; the // cached activity adds the running-process warning when busy. let cached = remoteTmuxController.cachedMirrorTabActivity(workspaceId: id, panelId: panelId) - let unconditionalWarningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let unconditionalWarningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: false, source: confirmationSource ) if !unconditionalWarningKinds.isEmpty { - let promptWarningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let promptWarningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: cached?.hasActiveCommand ?? false, source: confirmationSource ) presentConfirmation(cached?.activeCommandName, promptWarningKinds) @@ -14245,7 +14244,7 @@ extension Workspace: BonsplitDelegate { // Show an app-level confirmation, then re-attempt the close with forceCloseTabIds to bypass // this gating on the second pass. let confirmationSource: CloseTabCloseSource = tabCloseButtonClose == true ? .tabCloseButton : .shortcut - let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKinds( + let warningKinds = CloseTabWarningStore(defaults: closeTabWarningDefaults).warningKindsIncludingSafety( requiresConfirmation: panelNeedsConfirmClose(panelId: panelId), source: confirmationSource ) @@ -14653,19 +14652,33 @@ extension Workspace: BonsplitDelegate { } func splitTabBar(_ controller: BonsplitController, shouldClosePane pane: PaneID) -> Bool { - // Check if any panel in this pane needs close confirmation let tabs = controller.tabs(inPane: pane) + var promptTitles: [String] = [] + var needsPrompt = false for tab in tabs { if forceCloseTabIds.contains(tab.id) { continue } - if let panelId = panelIdFromSurfaceId(tab.id), - CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmClose( - requiresConfirmation: panelNeedsConfirmClose(panelId: panelId), - source: .shortcut - ) { - pendingPaneClosePanelIds.removeValue(forKey: pane.id) - pendingPaneCloseHistoryEntries.removeValue(forKey: pane.id) - return false - } + guard let panelId = panelIdFromSurfaceId(tab.id) else { continue } + promptTitles.append(CloseOtherTabsConfirmationPrompt.displayTitle(panelTitle(panelId: panelId))) + if CloseTabWarningStore(defaults: closeTabWarningDefaults).shouldConfirmCloseIncludingSafety( + requiresConfirmation: panelNeedsConfirmClose(panelId: panelId), + source: .shortcut + ) { + needsPrompt = true + } + } + if needsPrompt { + let manager = owningTabManager + ?? AppDelegate.shared?.tabManagerFor(tabId: id) + ?? AppDelegate.shared?.tabManager + guard let manager, + !manager.isCloseConfirmationInFlight else { return false } + let prompt = DockPaneCloseConfirmationPrompt(titles: promptTitles) + guard manager.confirmClose( + title: prompt.title, + message: prompt.message, + scrollableDetails: prompt.details, + acceptCmdD: false + ) else { return false } } let panelIds = tabs.compactMap { panelIdFromSurfaceId($0.id) } pendingPaneClosePanelIds[pane.id] = panelIds @@ -15020,6 +15033,8 @@ extension Workspace: BonsplitDelegate { case .copyIdentifiers: guard let panelId = panelIdFromSurfaceId(tab.id) else { return } copyIdentifiersToPasteboard(surfaceId: panelId) + case .close: + closeTabsFromContextMenu([tab.id]) case .closeToLeft: closeTabs(tabIdsToLeft(of: tab.id, inPane: pane)) case .closeToRight: diff --git a/Sources/WorkspaceCloseTabsBatching.swift b/Sources/WorkspaceCloseTabsBatching.swift index d884e0a05dd6..ce8ead77ecba 100644 --- a/Sources/WorkspaceCloseTabsBatching.swift +++ b/Sources/WorkspaceCloseTabsBatching.swift @@ -62,13 +62,10 @@ extension Workspace { return panelNeedsConfirmClose(panelId: panelId) } - let warningKinds = CloseTabWarningStore( - defaults: confirmationManager?.closeTabWarningDefaults ?? closeTabWarningDefaults - ).warningKinds( + if CloseTabWarningStore(defaults: confirmationManager?.closeTabWarningDefaults ?? closeTabWarningDefaults).shouldConfirmCloseIncludingSafety( requiresConfirmation: needsConfirmation, source: .shortcut - ) - if !warningKinds.isEmpty { + ) { guard let confirmationManager else { return } let prompt = CloseOtherTabsConfirmationPrompt( titles: candidates.map { candidate in @@ -81,8 +78,7 @@ extension Workspace { title: prompt.title, message: prompt.message, scrollableDetails: prompt.details, - acceptCmdD: false, - dontAskAgain: warningKinds + acceptCmdD: false ) else { return } } diff --git a/artifacts/tabclose-context-menu.png b/artifacts/tabclose-context-menu.png new file mode 100644 index 000000000000..283800bd6170 Binary files /dev/null and b/artifacts/tabclose-context-menu.png differ diff --git a/artifacts/tabclose-demo.mp4 b/artifacts/tabclose-demo.mp4 new file mode 100644 index 000000000000..259b0188f602 Binary files /dev/null and b/artifacts/tabclose-demo.mp4 differ diff --git a/artifacts/tabclose-tabbar.png b/artifacts/tabclose-tabbar.png new file mode 100644 index 000000000000..054f9818a826 Binary files /dev/null and b/artifacts/tabclose-tabbar.png differ diff --git a/cmuxTests/MainWindowCloseConfirmationTests.swift b/cmuxTests/MainWindowCloseConfirmationTests.swift index e011b0e18d50..4c8c73ac893d 100644 --- a/cmuxTests/MainWindowCloseConfirmationTests.swift +++ b/cmuxTests/MainWindowCloseConfirmationTests.swift @@ -100,7 +100,7 @@ final class MainWindowCloseConfirmationTests: XCTestCase { ) } - func testWindowWarningOffClosesRunningWindowWithoutPrompt() throws { + func testWindowWarningOffStillPromptsForRunningWindow() throws { let appDelegate = try XCTUnwrap(AppDelegate.shared) let targetWindow = try makeMainWindow(appDelegate) try setShellActivity(.commandRunning, appDelegate) @@ -125,9 +125,8 @@ final class MainWindowCloseConfirmationTests: XCTestCase { appDelegate.closeWindowWithConfirmation(targetWindow) - XCTAssertEqual(prompts, 0) - XCTAssertEqual(requests.values.count, 1) - XCTAssertEqual(requests.values.first?.confirmed, false) + XCTAssertEqual(prompts, 1) + XCTAssertEqual(requests.values.count, 0) } func testTickingDontAskAgainTurnsOffWindowWarning() throws { @@ -156,17 +155,18 @@ final class MainWindowCloseConfirmationTests: XCTestCase { return true } - // Cancel with the box ticked: the window stays, the warning turns off. + // Cancel with the box ticked: the window stays and the ordinary window + // warning turns off, while the live-process safety warning remains. appDelegate.closeWindowWithConfirmation(targetWindow) XCTAssertEqual(prompts, 1) - XCTAssertEqual(offered, [.window]) + XCTAssertEqual(offered, [[.window, .safety]]) XCTAssertFalse(AppCatalogSection().warnBeforeClosingWindow.value(in: defaults)) XCTAssertTrue(targetWindow.isVisible) let requests = recordShouldCloseRequests(appDelegate) appDelegate.closeWindowWithConfirmation(targetWindow) - XCTAssertEqual(prompts, 1, "The next Close Window should not ask") - XCTAssertEqual(requests.values.count, 1) + XCTAssertEqual(prompts, 2, "The safety warning cannot be disabled") + XCTAssertEqual(requests.values.count, 0) } func testUnconfirmedWindowCloseStillReachesShouldCloseUnconfirmed() throws { diff --git a/cmuxTests/RemoteTmuxMirrorCloseDetachTests.swift b/cmuxTests/RemoteTmuxMirrorCloseDetachTests.swift index 9dba37fe3d59..c511398364a3 100644 --- a/cmuxTests/RemoteTmuxMirrorCloseDetachTests.swift +++ b/cmuxTests/RemoteTmuxMirrorCloseDetachTests.swift @@ -122,7 +122,8 @@ import Testing surfaceID: nil, paneID: nil ), - workspaceID: mirrorWorkspace.id + workspaceID: mirrorWorkspace.id, + force: false ) #expect(resolution == .resolved(windowID: harness.windowId)) diff --git a/cmuxTests/RemoteTmuxMirrorLifecycleTests.swift b/cmuxTests/RemoteTmuxMirrorLifecycleTests.swift index c5d2238a523e..fc66a571a0f5 100644 --- a/cmuxTests/RemoteTmuxMirrorLifecycleTests.swift +++ b/cmuxTests/RemoteTmuxMirrorLifecycleTests.swift @@ -191,7 +191,8 @@ struct RemoteTmuxMirrorLifecycleTests { surfaceID: nil, paneID: nil ), - workspaceID: mirrorWorkspace.id + workspaceID: mirrorWorkspace.id, + force: false ) #expect(resolution == .resolved(windowID: windowId)) diff --git a/cmuxTests/TabManagerUnitTests.swift b/cmuxTests/TabManagerUnitTests.swift index 407b8eb687bf..a8e1128cf80b 100644 --- a/cmuxTests/TabManagerUnitTests.swift +++ b/cmuxTests/TabManagerUnitTests.swift @@ -1707,7 +1707,7 @@ final class TabManagerWarnBeforeClosingWorkspaceTests: XCTestCase { XCTAssertTrue(manager.tabs.contains(where: { $0.id == workspace.id })) } - func testRunningProcessWorkspaceCloseSkipsPromptWhenSettingDisabled() { + func testRunningProcessWorkspaceCloseStillWarnsWhenSettingDisabled() { let manager = makeManager(warnBeforeClosingWorkspace: false) let workspace = manager.tabs[1] markRunningProcess(workspace) @@ -1718,9 +1718,9 @@ final class TabManagerWarnBeforeClosingWorkspaceTests: XCTestCase { return false } - XCTAssertTrue(manager.closeWorkspaceWithConfirmation(workspace)) - XCTAssertEqual(prompts, []) - XCTAssertFalse(manager.tabs.contains(where: { $0.id == workspace.id })) + XCTAssertFalse(manager.closeWorkspaceWithConfirmation(workspace)) + XCTAssertEqual(prompts, [closeWorkspaceTitle]) + XCTAssertTrue(manager.tabs.contains(where: { $0.id == workspace.id })) } func testMultiWorkspaceCloseSkipsPromptWhenSettingDisabled() { @@ -1780,8 +1780,8 @@ final class TabManagerWarnBeforeClosingWorkspaceTests: XCTestCase { XCTAssertTrue(manager.shouldConfirmWindowClose(windowDockNeedsConfirmation: false)) manager.closeTabWarningDefaults.set(false, forKey: AppCatalogSection().warnBeforeClosingWindow.userDefaultsKey) - XCTAssertFalse(manager.shouldConfirmWindowClose(windowDockNeedsConfirmation: false), "The window setting turns the prompt off") - XCTAssertFalse(manager.shouldConfirmWindowClose(windowDockNeedsConfirmation: true)) + XCTAssertTrue(manager.shouldConfirmWindowClose(windowDockNeedsConfirmation: false), "Active processes always require a safety prompt") + XCTAssertTrue(manager.shouldConfirmWindowClose(windowDockNeedsConfirmation: true)) } func testClosingEveryWorkspaceFollowsTheWindowSetting() { @@ -1877,12 +1877,13 @@ final class TabManagerCloseDontAskAgainTests: XCTestCase { } XCTAssertTrue(manager.closeWorkspaceWithConfirmation(first)) - XCTAssertEqual(offered, [.workspace]) + XCTAssertEqual(offered, [[.workspace, .safety]]) XCTAssertFalse(AppCatalogSection().warnBeforeClosingWorkspace.value(in: defaults)) XCTAssertTrue(AppCatalogSection().warnBeforeClosingTab.value(in: defaults)) + drainMainQueue() XCTAssertTrue(manager.closeWorkspaceWithConfirmation(second)) - XCTAssertEqual(promptCount, 1, "The second close should not ask") + XCTAssertEqual(promptCount, 2, "The safety warning cannot be disabled") } func testUntickedDontAskAgainKeepsWarningOn() { @@ -1917,7 +1918,7 @@ final class TabManagerCloseDontAskAgainTests: XCTestCase { manager.closeRuntimeSurfaceWithConfirmation(tabId: workspace.id, surfaceId: panelId) - XCTAssertEqual(offered, [.tab]) + XCTAssertEqual(offered, [[.tab, .safety]]) XCTAssertFalse(AppCatalogSection().warnBeforeClosingTab.value(in: defaults)) XCTAssertTrue(AppCatalogSection().warnBeforeClosingWorkspace.value(in: defaults)) XCTAssertNotNil(workspace.panels[panelId], "Cancel still keeps the tab open") @@ -2122,8 +2123,8 @@ final class TabManagerCloseCurrentPanelTests: XCTestCase { func testCloseCurrentPanelHonorsWarnBeforeClosingTabDisabledFromCmuxJSON() throws { try assertCloseCurrentPanelConfirmation( warnBeforeClosingTab: false, - expectedPromptCount: 0, - expectedPanelClosed: true + expectedPromptCount: 1, + expectedPanelClosed: false ) } @@ -2239,8 +2240,8 @@ final class TabManagerCloseCurrentPanelTests: XCTestCase { func testCloseCurrentPanelHonorsWarnBeforeClosingTabDisabledForPinnedWorkspaceLastSurface() throws { try assertPinnedWorkspaceLastSurfaceConfirmation( warnBeforeClosingTab: false, - expectedPromptCount: 0, - expectedWorkspaceClosed: true + expectedPromptCount: 1, + expectedWorkspaceClosed: false ) } diff --git a/cmuxTests/WorkspaceCloseTabsContextMenuTests.swift b/cmuxTests/WorkspaceCloseTabsContextMenuTests.swift index f3becfd1c349..a458160b7416 100644 --- a/cmuxTests/WorkspaceCloseTabsContextMenuTests.swift +++ b/cmuxTests/WorkspaceCloseTabsContextMenuTests.swift @@ -64,6 +64,63 @@ struct WorkspaceCloseTabsContextMenuTests { } } + @Test + func closeTabContextActionUsesTheSameGuardedClosePath() throws { + try withCleanClosedHistory { + let fixture = try makeWorkspaceWithFourConfirmingTabs() + let tabId = fixture.tabIds[2] + let panelId = try #require(fixture.workspace.panelIdFromSurfaceId(tabId)) + fixture.workspace.updatePanelShellActivityState(panelId: panelId, state: .commandRunning) + var promptCount = 0 + fixture.manager.confirmCloseHandler = { _, _, _ in + promptCount += 1 + return true + } + let tab = try #require(fixture.workspace.bonsplitController.tab(tabId)) + + fixture.workspace.splitTabBar( + fixture.workspace.bonsplitController, + didRequestTabContextAction: .close, + for: tab, + inPane: fixture.paneId + ) + drainMainQueue() + drainMainQueue() + + #expect(promptCount == 1) + #expect(fixture.workspace.panelIdFromSurfaceId(tabId) == nil) + } + } + + @Test + func activeProcessStillWarnsWhenShortcutWarningIsDisabled() async throws { + try await withCleanClosedHistory { + let fixture = try makeWorkspaceWithFourConfirmingTabs() + fixture.manager.closeTabWarningDefaults.set(false, forKey: "warnBeforeClosingTabShortcut") + let tabId = fixture.tabIds[2] + let panelId = try #require(fixture.workspace.panelIdFromSurfaceId(tabId)) + fixture.workspace.updatePanelShellActivityState(panelId: panelId, state: .commandRunning) + #expect(fixture.workspace.panelNeedsConfirmClose(panelId: panelId)) + var promptCount = 0 + fixture.manager.confirmCloseHandler = { _, _, _ in + promptCount += 1 + return true + } + let tab = try #require(fixture.workspace.bonsplitController.tab(tabId)) + #expect(!fixture.workspace.splitTabBar( + fixture.workspace.bonsplitController, + shouldCloseTab: tab, + inPane: fixture.paneId + )) + await waitForMainActorWork(timeout: 4) { + promptCount == 1 || fixture.workspace.panelIdFromSurfaceId(tabId) == nil + } + + #expect(promptCount == 1) + #expect(fixture.workspace.panelIdFromSurfaceId(tabId) == nil) + } + } + @Test func sharedCloseHistoryPathRecordsDirectTabActionCloses() throws { try withCleanClosedHistory { @@ -233,6 +290,12 @@ struct WorkspaceCloseTabsContextMenuTests { try body() } + private func withCleanClosedHistory(_ body: () async throws -> Void) async rethrows { + ClosedItemHistoryStore.shared.removeAll() + defer { ClosedItemHistoryStore.shared.removeAll() } + try await body() + } + private func waitForMainQueueWork( timeout: TimeInterval = 4, until condition: () -> Bool diff --git a/vendor/bonsplit b/vendor/bonsplit index bd340add9076..b4fc5e29b4f8 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit bd340add9076addccaf9d4b991e8f142d90877bf +Subproject commit b4fc5e29b4f852f8752f0bb5add5237c8978f325